diff options
Diffstat (limited to 'engines/sci/engine/vm.cpp')
-rw-r--r-- | engines/sci/engine/vm.cpp | 404 |
1 files changed, 202 insertions, 202 deletions
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index ef57b73214..29ac898abb 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -292,7 +292,7 @@ inline exec_stack_t *execute_method(EngineState *s, uint16 script, uint16 pubfun } -static void _exec_varselectors(EngineState *s) { +static void _exec_varselectors(EngineState *s) { // Executes all varselector read/write ops on the TOS // Now check the TOS to execute all varselector entries if (s->execution_stack_pos >= 0) @@ -461,7 +461,7 @@ exec_stack_t *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, stac // placed on the TOS; as soon as it returns, it will cause the second call to be executed. for (; send_calls_nr >= 0; send_calls_nr--) if (send_calls[send_calls_nr].type == EXEC_STACK_TYPE_VARSELECTOR) // Write/read variable? - retval = add_exec_stack_varselector(s, work_obj, send_calls[send_calls_nr].argc, send_calls[send_calls_nr].argp, + retval = add_exec_stack_varselector(s, work_obj, send_calls[send_calls_nr].argc, send_calls[send_calls_nr].argp, send_calls[send_calls_nr].selector, send_calls[send_calls_nr].address.var, origin); else retval = add_exec_stack_entry(s, send_calls[send_calls_nr].address.func, send_calls[send_calls_nr].sp, work_obj, @@ -600,7 +600,7 @@ void run_vm(EngineState *s, int restoring) { object_t *obj = obj_get(s, xs->objp); script_t *local_script = script_locate_by_segment(s, xs->local_segment); int old_execution_stack_base = s->execution_stack_base; - // Used to detect the stack bottom, for "physical" returns + // Used to detect the stack bottom, for "physical" returns byte *code_buf = NULL; // (Avoid spurious warning) if (!local_script) { @@ -886,7 +886,7 @@ void run_vm(EngineState *s, int restoring) { case 0x0c: // not s->r_acc = make_reg(0, !(s->r_acc.offset || s->r_acc.segment)); - // Must allow pointers to be negated, as this is used for checking whether objects exist + // Must allow pointers to be negated, as this is used for checking whether objects exist break; case 0x0d: // eq? @@ -913,76 +913,76 @@ void run_vm(EngineState *s, int restoring) { s->r_acc = ACC_ARITHMETIC_L((int16)POP() >= (int16)/*acc*/); break; - case 0x11: // lt? + case 0x11: // lt? s->r_prev = s->r_acc; s->r_acc = ACC_ARITHMETIC_L((int16)POP() < (int16)/*acc*/); break; - case 0x12: // le? + case 0x12: // le? s->r_prev = s->r_acc; s->r_acc = ACC_ARITHMETIC_L((int16)POP() <= (int16)/*acc*/); break; - case 0x13: // ugt? + case 0x13: // ugt? s->r_prev = s->r_acc; r_temp = POP32(); s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset > s->r_acc.offset); break; - case 0x14: // uge? + case 0x14: // uge? s->r_prev = s->r_acc; r_temp = POP32(); s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset >= s->r_acc.offset); break; - case 0x15: // ult? + case 0x15: // ult? s->r_prev = s->r_acc; r_temp = POP32(); s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset < s->r_acc.offset); break; - case 0x16: // ule? + case 0x16: // ule? s->r_prev = s->r_acc; r_temp = POP32(); s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset <= s->r_acc.offset); break; - case 0x17: // bt + case 0x17: // bt if (s->r_acc.offset || s->r_acc.segment) xs->addr.pc.offset += opparams[0]; break; - case 0x18: // bnt + case 0x18: // bnt if (!(s->r_acc.offset || s->r_acc.segment)) xs->addr.pc.offset += opparams[0]; break; - case 0x19: // jmp + case 0x19: // jmp xs->addr.pc.offset += opparams[0]; break; - case 0x1a: // ldi + case 0x1a: // ldi s->r_acc = make_reg(0, opparams[0]); break; - case 0x1b: // push + case 0x1b: // push PUSH32(s->r_acc); break; - case 0x1c: // pushi + case 0x1c: // pushi PUSH(opparams[0]); break; - case 0x1d: // toss + case 0x1d: // toss xs->sp--; break; - case 0x1e: // dup + case 0x1e: // dup r_temp = xs->sp[-1]; PUSH32(r_temp); break; - case 0x1f: { // link + case 0x1f: { // link int i; for (i = 0; i < opparams[0]; i++) xs->sp[i] = NULL_REG; @@ -990,8 +990,8 @@ void run_vm(EngineState *s, int restoring) { break; } - case 0x20: { // call - int argc = (opparams[1] >> 1) // Given as offset, but we need count + case 0x20: { // call + int argc = (opparams[1] >> 1) // Given as offset, but we need count + 1 + restadjust; stack_ptr_t call_base = xs->sp - argc; @@ -999,20 +999,20 @@ void run_vm(EngineState *s, int restoring) { xs_new = add_exec_stack_entry(s, make_reg(xs->addr.pc.segment, xs->addr.pc.offset + opparams[0]), xs->sp, xs->objp, (validate_arithmetic(*call_base)) + restadjust, call_base, NULL_SELECTOR, xs->objp, s->execution_stack_pos, xs->local_segment); - restadjust = 0; // Used up the &rest adjustment + restadjust = 0; // Used up the &rest adjustment xs->sp = call_base; s->execution_stack_pos_changed = 1; break; } - case 0x21: // callk + case 0x21: // callk gc_countdown(s); xs->sp -= (opparams[1] >> 1) + 1; if (s->version >= SCI_VERSION_FTU_NEW_SCRIPT_HEADER) { xs->sp -= restadjust; - s->r_amp_rest = 0; // We just used up the restadjust, remember? + s->r_amp_rest = 0; // We just used up the restadjust, remember? } if (opparams[0] >= s->kfunct_nr) { @@ -1031,10 +1031,10 @@ void run_vm(EngineState *s, int restoring) { } else { s->r_acc = s->kfunct_table[opparams[0]].fun(s, opparams[0], argc, xs->sp + 1); } - // Call kernel function + // Call kernel function // Calculate xs again: The kernel function might - // have spawned a new VM + // have spawned a new VM xs_new = s->execution_stack + s->execution_stack_pos; s->execution_stack_pos_changed = 1; @@ -1045,77 +1045,77 @@ void run_vm(EngineState *s, int restoring) { } break; - case 0x22: // callb + case 0x22: // callb temp = ((opparams[1] >> 1) + restadjust + 1); s_temp = xs->sp; xs->sp -= temp; xs->sp[0].offset += restadjust; xs_new = execute_method(s, 0, opparams[0], s_temp, xs->objp, xs->sp[0].offset, xs->sp); - restadjust = 0; // Used up the &rest adjustment - if (xs_new) // in case of error, keep old stack + restadjust = 0; // Used up the &rest adjustment + if (xs_new) // in case of error, keep old stack s->execution_stack_pos_changed = 1; break; - case 0x23: // calle + case 0x23: // calle temp = ((opparams[2] >> 1) + restadjust + 1); s_temp = xs->sp; xs->sp -= temp; xs->sp[0].offset += restadjust; xs_new = execute_method(s, opparams[0], opparams[1], s_temp, xs->objp, xs->sp[0].offset, xs->sp); - restadjust = 0; // Used up the &rest adjustment + restadjust = 0; // Used up the &rest adjustment - if (xs_new) // in case of error, keep old stack + if (xs_new) // in case of error, keep old stack s->execution_stack_pos_changed = 1; break; - case 0x24: // ret + case 0x24: // ret do { stack_ptr_t old_sp2 = xs->sp; stack_ptr_t old_fp = xs->fp; exec_stack_t *old_xs = s->execution_stack + s->execution_stack_pos; - if (s->execution_stack_pos == s->execution_stack_base) { // Have we reached the base? - s->execution_stack_base = old_execution_stack_base; // Restore stack base + if (s->execution_stack_pos == s->execution_stack_base) { // Have we reached the base? + s->execution_stack_base = old_execution_stack_base; // Restore stack base --(s->execution_stack_pos); s->execution_stack_pos_changed = 1; - s->r_amp_rest = restadjust; // Update &rest - return; // "Hard" return + s->r_amp_rest = restadjust; // Update &rest + return; // "Hard" return } if (old_xs->type == EXEC_STACK_TYPE_VARSELECTOR) { - // varselector access? - if (old_xs->argc) // write? + // varselector access? + if (old_xs->argc) // write? *(old_xs->addr.varp) = old_xs->variables_argp[1]; - else // No, read + else // No, read s->r_acc = *(old_xs->addr.varp); } - // Not reached the base, so let's do a soft return + // Not reached the base, so let's do a soft return --(s->execution_stack_pos); xs = old_xs - 1; s->execution_stack_pos_changed = 1; xs = s->execution_stack + s->execution_stack_pos; - if (xs->sp == CALL_SP_CARRY // Used in sends to 'carry' the stack pointer + if (xs->sp == CALL_SP_CARRY // Used in sends to 'carry' the stack pointer || xs->type != EXEC_STACK_TYPE_CALL) { xs->sp = old_sp2; xs->fp = old_fp; } } while (xs->type == EXEC_STACK_TYPE_VARSELECTOR); - // Iterate over all varselector accesses + // Iterate over all varselector accesses s->execution_stack_pos_changed = 1; xs_new = xs; break; - case 0x25: // send + case 0x25: // send s_temp = xs->sp; - xs->sp -= ((opparams[0] >> 1) + restadjust); // Adjust stack + xs->sp -= ((opparams[0] >> 1) + restadjust); // Adjust stack xs->sp[1].offset += restadjust; xs_new = send_selector(s, s->r_acc, s->r_acc, s_temp, (int)(opparams[0] >> 1) + (uint16)restadjust, xs->sp); @@ -1127,13 +1127,13 @@ void run_vm(EngineState *s, int restoring) { break; - case 0x28: // class + case 0x28: // class s->r_acc = get_class_address(s, (unsigned)opparams[0], SCRIPT_GET_LOCK, xs->addr.pc); break; - case 0x2a: // self + case 0x2a: // self s_temp = xs->sp; - xs->sp -= ((opparams[0] >> 1) + restadjust); // Adjust stack + xs->sp -= ((opparams[0] >> 1) + restadjust); // Adjust stack xs->sp[1].offset += restadjust; xs_new = send_selector(s, xs->objp, xs->objp, s_temp, (int)(opparams[0] >> 1) + (uint16)restadjust, xs->sp); @@ -1144,14 +1144,14 @@ void run_vm(EngineState *s, int restoring) { restadjust = 0; break; - case 0x2b: // super + case 0x2b: // super r_temp = get_class_address(s, opparams[0], SCRIPT_GET_LOAD, xs->addr.pc); if (!r_temp.segment) CORE_ERROR("VM", "Invalid superclass in object"); else { s_temp = xs->sp; - xs->sp -= ((opparams[1] >> 1) + restadjust); // Adjust stack + xs->sp -= ((opparams[1] >> 1) + restadjust); // Adjust stack xs->sp[1].offset += restadjust; xs_new = send_selector(s, r_temp, xs->objp, s_temp, (int)(opparams[1] >> 1) + (uint16)restadjust, xs->sp); @@ -1164,9 +1164,9 @@ void run_vm(EngineState *s, int restoring) { break; - case 0x2c: // &rest - temp = (uint16) opparams[0]; // First argument - restadjust = xs->argc - temp + 1; // +1 because temp counts the paramcount while argc doesn't + case 0x2c: // &rest + temp = (uint16) opparams[0]; // First argument + restadjust = xs->argc - temp + 1; // +1 because temp counts the paramcount while argc doesn't if (restadjust < 0) restadjust = 0; @@ -1175,72 +1175,72 @@ void run_vm(EngineState *s, int restoring) { break; - case 0x2d: // lea + case 0x2d: // lea temp = (uint16) opparams[0] >> 1; - var_number = temp & 0x03; // Get variable type + var_number = temp & 0x03; // Get variable type - // Get variable block offset + // Get variable block offset r_temp.segment = variables_seg[var_number]; r_temp.offset = variables[var_number] - variables_base[var_number]; - if (temp & 0x08) // Add accumulator offset if requested + if (temp & 0x08) // Add accumulator offset if requested r_temp.offset += signed_validate_arithmetic(s->r_acc); - r_temp.offset += opparams[1]; // Add index + r_temp.offset += opparams[1]; // Add index r_temp.offset *= sizeof(reg_t); - // That's the immediate address now + // That's the immediate address now s->r_acc = r_temp; break; - case 0x2e: // selfID + case 0x2e: // selfID s->r_acc = xs->objp; break; - case 0x30: // pprev + case 0x30: // pprev PUSH32(s->r_prev); break; - case 0x31: // pToa + case 0x31: // pToa s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)); break; - case 0x32: // aTop + case 0x32: // aTop OBJ_PROPERTY(obj, (opparams[0] >> 1)) = s->r_acc; break; - case 0x33: // pTos + case 0x33: // pTos PUSH32(OBJ_PROPERTY(obj, opparams[0] >> 1)); break; - case 0x34: // sTop + case 0x34: // sTop OBJ_PROPERTY(obj, (opparams[0] >> 1)) = POP32(); break; - case 0x35: // ipToa + case 0x35: // ipToa s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)); s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)) = ACC_ARITHMETIC_L(1 + /*acc*/); break; - case 0x36: // dpToa + case 0x36: // dpToa s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)); s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)) = ACC_ARITHMETIC_L(-1 + /*acc*/); break; - case 0x37: // ipTos + case 0x37: // ipTos ASSERT_ARITHMETIC(OBJ_PROPERTY(obj, (opparams[0] >> 1))); temp = ++OBJ_PROPERTY(obj, (opparams[0] >> 1)).offset; PUSH(temp); break; - case 0x38: // dpTos + case 0x38: // dpTos ASSERT_ARITHMETIC(OBJ_PROPERTY(obj, (opparams[0] >> 1))); temp = --OBJ_PROPERTY(obj, (opparams[0] >> 1)).offset; PUSH(temp); break; - case 0x39: // lofsa + case 0x39: // lofsa s->r_acc.segment = xs->addr.pc.segment; if (s->version >= SCI_VERSION(1, 001, 000)) @@ -1259,7 +1259,7 @@ void run_vm(EngineState *s, int restoring) { #endif break; - case 0x3a: // lofss + case 0x3a: // lofss r_temp.segment = xs->addr.pc.segment; if (s->version >= SCI_VERSION_FTU_LOFS_ABSOLUTE) @@ -1276,175 +1276,175 @@ void run_vm(EngineState *s, int restoring) { PUSH32(r_temp); break; - case 0x3b: // push0 + case 0x3b: // push0 PUSH(0); break; - case 0x3c: // push1 + case 0x3c: // push1 PUSH(1); break; - case 0x3d: // push2 + case 0x3d: // push2 PUSH(2); break; - case 0x3e: // pushSelf + case 0x3e: // pushSelf PUSH32(xs->objp); break; - case 0x40: // lag - case 0x41: // lal - case 0x42: // lat - case 0x43: // lap - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x40: // lag + case 0x41: // lal + case 0x42: // lat + case 0x43: // lap + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; s->r_acc = READ_VAR(var_type, var_number, s->r_acc); break; - case 0x44: // lsg - case 0x45: // lsl - case 0x46: // lst - case 0x47: // lsp - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x44: // lsg + case 0x45: // lsl + case 0x46: // lst + case 0x47: // lsp + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; PUSH32(READ_VAR(var_type, var_number, s->r_acc)); break; - case 0x48: // lagi - case 0x49: // lali - case 0x4a: // lati - case 0x4b: // lapi - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x48: // lagi + case 0x49: // lali + case 0x4a: // lati + case 0x4b: // lapi + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); s->r_acc = READ_VAR(var_type, var_number, s->r_acc); break; - case 0x4c: // lsgi - case 0x4d: // lsli - case 0x4e: // lsti - case 0x4f: // lspi - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x4c: // lsgi + case 0x4d: // lsli + case 0x4e: // lsti + case 0x4f: // lspi + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); PUSH32(READ_VAR(var_type, var_number, s->r_acc)); break; - case 0x50: // sag - case 0x51: // sal - case 0x52: // sat - case 0x53: // sap - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x50: // sag + case 0x51: // sal + case 0x52: // sat + case 0x53: // sap + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; WRITE_VAR(var_type, var_number, s->r_acc); break; - case 0x54: // ssg - case 0x55: // ssl - case 0x56: // sst - case 0x57: // ssp - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x54: // ssg + case 0x55: // ssl + case 0x56: // sst + case 0x57: // ssp + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; WRITE_VAR(var_type, var_number, POP32()); break; - case 0x58: // sagi - case 0x59: // sali - case 0x5a: // sati - case 0x5b: // sapi + case 0x58: // sagi + case 0x59: // sali + case 0x5a: // sati + case 0x5b: // sapi // Special semantics because it wouldn't really make a whole lot // of sense otherwise, with acc being used for two things - // simultaneously... - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + // simultaneously... + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); WRITE_VAR(var_type, var_number, s->r_acc = POP32()); break; - case 0x5c: // ssgi - case 0x5d: // ssli - case 0x5e: // ssti - case 0x5f: // sspi - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x5c: // ssgi + case 0x5d: // ssli + case 0x5e: // ssti + case 0x5f: // sspi + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); WRITE_VAR(var_type, var_number, POP32()); break; - case 0x60: // +ag - case 0x61: // +al - case 0x62: // +at - case 0x63: // +ap - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x60: // +ag + case 0x61: // +al + case 0x62: // +at + case 0x63: // +ap + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; s->r_acc = make_reg(0, 1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc))); WRITE_VAR(var_type, var_number, s->r_acc); break; - case 0x64: // +sg - case 0x65: // +sl - case 0x66: // +st - case 0x67: // +sp - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x64: // +sg + case 0x65: // +sl + case 0x66: // +st + case 0x67: // +sp + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; r_temp = make_reg(0, 1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc))); PUSH32(r_temp); WRITE_VAR(var_type, var_number, r_temp); break; - case 0x68: // +agi - case 0x69: // +ali - case 0x6a: // +ati - case 0x6b: // +api - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x68: // +agi + case 0x69: // +ali + case 0x6a: // +ati + case 0x6b: // +api + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); s->r_acc = make_reg(0, 1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc))); WRITE_VAR(var_type, var_number, s->r_acc); break; - case 0x6c: // +sgi - case 0x6d: // +sli - case 0x6e: // +sti - case 0x6f: // +spi - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x6c: // +sgi + case 0x6d: // +sli + case 0x6e: // +sti + case 0x6f: // +spi + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); r_temp = make_reg(0, 1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc))); PUSH32(r_temp); WRITE_VAR(var_type, var_number, r_temp); break; - case 0x70: // -ag - case 0x71: // -al - case 0x72: // -at - case 0x73: // -ap - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x70: // -ag + case 0x71: // -al + case 0x72: // -at + case 0x73: // -ap + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; s->r_acc = make_reg(0, -1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc))); WRITE_VAR(var_type, var_number, s->r_acc); break; - case 0x74: // -sg - case 0x75: // -sl - case 0x76: // -st - case 0x77: // -sp - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x74: // -sg + case 0x75: // -sl + case 0x76: // -st + case 0x77: // -sp + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; r_temp = make_reg(0, -1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc))); PUSH32(r_temp); WRITE_VAR(var_type, var_number, r_temp); break; - case 0x78: // -agi - case 0x79: // -ali - case 0x7a: // -ati - case 0x7b: // -api - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x78: // -agi + case 0x79: // -ali + case 0x7a: // -ati + case 0x7b: // -api + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); s->r_acc = make_reg(0, -1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc))); WRITE_VAR(var_type, var_number, s->r_acc); break; - case 0x7c: // -sgi - case 0x7d: // -sli - case 0x7e: // -sti - case 0x7f: // -spi - var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p + case 0x7c: // -sgi + case 0x7d: // -sli + case 0x7e: // -sti + case 0x7f: // -spi + var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); r_temp = make_reg(0, -1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc))); PUSH32(r_temp); @@ -1454,9 +1454,9 @@ void run_vm(EngineState *s, int restoring) { default: script_error(s, __FILE__, __LINE__, "Illegal opcode"); - } // switch(opcode >> 1) + } // switch(opcode >> 1) - if (s->execution_stack_pos_changed) // Force initialization + if (s->execution_stack_pos_changed) // Force initialization xs = xs_new; #ifndef DISABLE_VALIDATIONS @@ -1465,8 +1465,8 @@ void run_vm(EngineState *s, int restoring) { } #endif if (script_error_flag) { - _debug_step_running = 0; // Stop multiple execution - _debug_seeking = 0; // Stop special seeks + _debug_step_running = 0; // Stop multiple execution + _debug_seeking = 0; // Stop special seeks xs->addr.pc.offset = old_pc_offset; xs->sp = old_sp; } else @@ -1475,8 +1475,8 @@ void run_vm(EngineState *s, int restoring) { } static inline int _obj_locate_varselector(EngineState *s, object_t *obj, selector_t slc) { - // Determines if obj explicitly defines slc as a varselector - // Returns -1 if not found + // Determines if obj explicitly defines slc as a varselector + // Returns -1 if not found if (s->version < SCI_VERSION(1, 001, 000)) { int varnum = obj->variable_names_nr; @@ -1487,10 +1487,10 @@ static inline int _obj_locate_varselector(EngineState *s, object_t *obj, selecto obj->base_vars = (uint16 *) buf; for (i = 0; i < varnum; i++) - if (getUInt16(buf + (i << 1)) == slc) // Found it? - return i; // report success + if (getUInt16(buf + (i << 1)) == slc) // Found it? + return i; // report success - return -1; // Failed + return -1; // Failed } else { byte *buf = (byte *) obj->base_vars; int i; @@ -1500,31 +1500,31 @@ static inline int _obj_locate_varselector(EngineState *s, object_t *obj, selecto buf = ((byte *) obj_get(s, obj->variables[SCRIPT_SUPERCLASS_SELECTOR])->base_vars); for (i = 0; i < varnum; i++) - if (getUInt16(buf + (i << 1)) == slc) // Found it? - return i; // report success + if (getUInt16(buf + (i << 1)) == slc) // Found it? + return i; // report success - return -1; // Failed + return -1; // Failed } } static inline int _class_locate_funcselector(EngineState *s, object_t *obj, selector_t slc) { - // Determines if obj is a class and explicitly defines slc as a funcselector + // Determines if obj is a class and explicitly defines slc as a funcselector // Does NOT say anything about obj's superclasses, i.e. failure may be - // returned even if one of the superclasses defines the funcselector. + // returned even if one of the superclasses defines the funcselector. int funcnum = obj->methods_nr; int i; for (i = 0; i < funcnum; i++) - if (VM_OBJECT_GET_FUNCSELECTOR(obj, i) == slc) // Found it? - return i; // report success + if (VM_OBJECT_GET_FUNCSELECTOR(obj, i) == slc) // Found it? + return i; // report success - return -1; // Failed + return -1; // Failed } static inline int _lookup_selector_function(EngineState *s, int seg_id, object_t *obj, selector_t selector_id, reg_t *fptr) { int index; - // "recursive" lookup + // "recursive" lookup while (obj) { index = _class_locate_funcselector(s, obj, selector_id); @@ -1553,7 +1553,7 @@ int lookup_selector(EngineState *s, reg_t obj_location, selector_t selector_id, int index; // Early SCI versions used the LSB in the selector ID as a read/write - // toggle, meaning that we must remove it for selector lookup. + // toggle, meaning that we must remove it for selector lookup. if (s->version < SCI_VERSION_FTU_NEW_SCRIPT_HEADER) selector_id &= ~1; @@ -1579,7 +1579,7 @@ int lookup_selector(EngineState *s, reg_t obj_location, selector_t selector_id, index = _obj_locate_varselector(s, obj, selector_id); if (index >= 0) { - // Found it as a variable + // Found it as a variable if (vptr) *vptr = obj->variables + index; return SELECTOR_VARIABLE; @@ -1588,7 +1588,7 @@ int lookup_selector(EngineState *s, reg_t obj_location, selector_t selector_id, return _lookup_selector_function(s, obj_location.segment, obj, selector_id, fptr); } -// Detects SCI versions by their different script header +// Detects SCI versions by their different script header void script_detect_versions(EngineState *s) { int c; resource_t *script = {0}; @@ -1683,7 +1683,7 @@ int script_instantiate_common(EngineState *s, int script_nr, resource_t **script if (!*script || (s->version >= SCI_VERSION(1, 001, 000) && !heap)) { sciprintf("Script 0x%x requested but not found\n", script_nr); - //script_debug_flag = script_error_flag = 1; + //script_debug_flag = script_error_flag = 1; if (s->version >= SCI_VERSION(1, 001, 000)) { if (*heap) sciprintf("Inconsistency: heap resource WAS found\n"); @@ -1709,7 +1709,7 @@ int script_instantiate_common(EngineState *s, int script_nr, resource_t **script mem = s->seg_manager->heap[seg]; s->seg_manager->freeScript(mem); } - } else if (!(mem = s->seg_manager->allocateScript(s, script_nr, &seg_id))) { // ALL YOUR SCRIPT BASE ARE BELONG TO US + } else if (!(mem = s->seg_manager->allocateScript(s, script_nr, &seg_id))) { // ALL YOUR SCRIPT BASE ARE BELONG TO US sciprintf("Not enough heap space for script size 0x%x of script 0x%x, should this happen?`\n", (*script)->size, script_nr); script_debug_flag = script_error_flag = 1; return 0; @@ -1720,7 +1720,7 @@ int script_instantiate_common(EngineState *s, int script_nr, resource_t **script reg.segment = seg_id; reg.offset = 0; - // Set heap position (beyond the size word) + // Set heap position (beyond the size word) s->seg_manager->setLockers(1, reg.segment, SEG_ID); s->seg_manager->setExportTableOffset(0, reg.segment, SEG_ID); s->seg_manager->setSynonymsOffset(0, reg.segment, SEG_ID); @@ -1737,7 +1737,7 @@ int script_instantiate_sci0(EngineState *s, int script_nr) { reg_t reg, reg_tmp; int seg_id; int relocation = -1; - int magic_pos_adder; // Usually 0; 2 for older SCI versions + int magic_pos_adder; // Usually 0; 2 for older SCI versions resource_t *script; int was_new; @@ -1753,13 +1753,13 @@ int script_instantiate_sci0(EngineState *s, int script_nr) { // int locals_nr = getUInt16(script->data); - // Old script block - // There won't be a localvar block in this case + // Old script block + // There won't be a localvar block in this case // Instead, the script starts with a 16 bit int specifying the - // number of locals we need; these are then allocated and zeroed. + // number of locals we need; these are then allocated and zeroed. s->seg_manager->mcpyInOut(0, script->data, script->size, reg.segment, SEG_ID); - magic_pos_adder = 2; // Step over the funny prefix + magic_pos_adder = 2; // Step over the funny prefix if (locals_nr) s->seg_manager->scriptInitialiseLocalsZero(reg.segment, locals_nr); @@ -1779,7 +1779,7 @@ int script_instantiate_sci0(EngineState *s, int script_nr) { do { reg_t data_base; reg_t addr; - reg.offset += objlength; // Step over the last checked object + reg.offset += objlength; // Step over the last checked object objtype = SEG_GET_HEAP(s, reg); if (!objtype) break; @@ -1797,7 +1797,7 @@ int script_instantiate_sci0(EngineState *s, int script_nr) { break; case sci_obj_synonyms: - s->seg_manager->setSynonymsOffset(addr.offset, reg.segment, SEG_ID); // +4 is to step over the header + s->seg_manager->setSynonymsOffset(addr.offset, reg.segment, SEG_ID); // +4 is to step over the header s->seg_manager->setSynonymsNr((objlength) / 4, reg.segment, SEG_ID); break; @@ -1822,7 +1822,7 @@ int script_instantiate_sci0(EngineState *s, int script_nr) { s->classtable[species].script = script_nr; s->classtable[species].reg = addr; s->classtable[species].reg.offset = classpos; - // Set technical class position-- into the block allocated for it + // Set technical class position-- into the block allocated for it } break; @@ -1830,18 +1830,18 @@ int script_instantiate_sci0(EngineState *s, int script_nr) { break; } } while (objtype != 0); - // And now a second pass to adjust objects and class pointers, and the general pointers + // And now a second pass to adjust objects and class pointers, and the general pointers objlength = 0; - reg.offset = magic_pos_adder; // Reset counter + reg.offset = magic_pos_adder; // Reset counter do { reg_t addr; - reg.offset += objlength; // Step over the last checked object + reg.offset += objlength; // Step over the last checked object objtype = SEG_GET_HEAP(s, reg); if (!objtype) break; objlength = SEG_GET_HEAP(s, make_reg(reg.segment, reg.offset + 2)); - reg.offset += 4; // Step over header + reg.offset += 4; // Step over header addr = reg; @@ -1850,22 +1850,22 @@ int script_instantiate_sci0(EngineState *s, int script_nr) { s->seg_manager->scriptAddCodeBlock(addr); break; case sci_obj_object: - case sci_obj_class: { // object or class? + case sci_obj_class: { // object or class? object_t *obj = s->seg_manager->scriptObjInit(s, addr); object_t *base_obj; - // Instantiate the superclass, if neccessary + // Instantiate the superclass, if neccessary obj->variables[SCRIPT_SPECIES_SELECTOR] = INST_LOOKUP_CLASS(obj->variables[SCRIPT_SPECIES_SELECTOR].offset); base_obj = obj_get(s, obj->variables[SCRIPT_SPECIES_SELECTOR]); obj->variable_names_nr = base_obj->variables_nr; obj->base_obj = base_obj->base_obj; - // Copy base from species class, as we need its selector IDs + // Copy base from species class, as we need its selector IDs obj->variables[SCRIPT_SUPERCLASS_SELECTOR] = INST_LOOKUP_CLASS(obj->variables[SCRIPT_SUPERCLASS_SELECTOR].offset); - } // if object or class + } // if object or class break; - case sci_obj_pointers: // A relocation table + case sci_obj_pointers: // A relocation table relocation = addr.offset; break; @@ -1873,7 +1873,7 @@ int script_instantiate_sci0(EngineState *s, int script_nr) { break; } - reg.offset -= 4; // Step back on header + reg.offset -= 4; // Step back on header } while ((objtype != 0) && (((unsigned)reg.offset) < script->size - 2)); @@ -1882,7 +1882,7 @@ int script_instantiate_sci0(EngineState *s, int script_nr) { s->seg_manager->scriptFreeUnusedObjects(reg.segment); - return reg.segment; // instantiation successful + return reg.segment; // instantiation successful } int script_instantiate_sci11(EngineState *s, int script_nr) { @@ -1931,15 +1931,15 @@ void script_uninstantiate_sci0(EngineState *s, int script_nr, seg_id_t seg) { reg_t reg = make_reg(seg, (s->version < SCI_VERSION_FTU_NEW_SCRIPT_HEADER) ? 2 : 0); int objtype, objlength; - // Make a pass over the object in order uninstantiate all superclasses + // Make a pass over the object in order uninstantiate all superclasses objlength = 0; do { - reg.offset += objlength; // Step over the last checked object + reg.offset += objlength; // Step over the last checked object objtype = SEG_GET_HEAP(s, reg); if (!objtype) break; - objlength = SEG_GET_HEAP(s, make_reg(reg.segment, reg.offset + 2)); // use SEG_UGET_HEAP ?? + objlength = SEG_GET_HEAP(s, make_reg(reg.segment, reg.offset + 2)); // use SEG_UGET_HEAP ?? reg.offset += 4; // Step over header |