void op_push_stack(void) { zword space = LOWORD(operand[1]); if(space) { LOWORDwrite(operand[1] + space * ZWORD_SIZE, operand[0]); LOWORDwrite(operand[1], space - 1); mop_take_branch(); } else { mop_skip_branch(); } }
void op_pop_stack(void) { zword i; if(numoperands < 2 || operand[1] == 0) { for(i = 0; i < operand[0]; i++) stack_pop(); } else { zword space = LOWORD(operand[1]) + operand[0]; LOWORDwrite(operand[1], space); } }
static void addparsed(zword *parse_dest, int word_num, int length, int off) { if(zversion <= 4) off+=1; else off+=2; LOWORDwrite(*parse_dest, word_num); *parse_dest+=ZWORD_SIZE; LOBYTEwrite(*parse_dest, length); *parse_dest+=1; LOBYTEwrite(*parse_dest, off); *parse_dest+=1; }
void op_pull(void) { if(zversion == 6) { /* v6 uses user stacks */ if(numoperands == 0 || operand[0] == 0) mop_store_result(stack_pop()); else { zword space = LOWORD(operand[0]) + 1; /* One more slot is free */ LOWORDwrite(operand[0], space); mop_store_result(LOWORD(operand[0] + space * ZWORD_SIZE)); } } else { zword val = stack_pop(); set_var(operand[0], val); } }
N_INLINE void set_var(int var, zword val) { if(var < 0x10) { if(var != 0) { #ifndef FAST if(var > stack_frames[frame_count].num_locals) n_show_error(E_INSTR, "setting nonexistant local", var); #endif local_vars[var - 1] = val; } else { stack_push(val); } } else { LOWORDwrite(z_globaltable + (var - 0x10) * ZWORD_SIZE, val); } }