diff options
author | Willem Jan Palenstijn | 2009-09-27 12:23:14 +0000 |
---|---|---|
committer | Willem Jan Palenstijn | 2009-09-27 12:23:14 +0000 |
commit | 77751a04556547fc65f5b7cb7e007644e2f470fc (patch) | |
tree | 7ce53473d835c9dd15c1d79be66cff3df5bf2593 | |
parent | 56e2e32268859e98263097e669abe2ab104774e9 (diff) | |
download | scummvm-rg350-77751a04556547fc65f5b7cb7e007644e2f470fc.tar.gz scummvm-rg350-77751a04556547fc65f5b7cb7e007644e2f470fc.tar.bz2 scummvm-rg350-77751a04556547fc65f5b7cb7e007644e2f470fc.zip |
SCI: change segment offsets in reg segments to be in half reg_t.
This makes offsets in raw and reg segments consistent, which
fixes string addressing in savegame dialogs.
svn-id: r44396
-rw-r--r-- | engines/sci/engine/seg_manager.cpp | 5 | ||||
-rw-r--r-- | engines/sci/engine/segment.cpp | 4 | ||||
-rw-r--r-- | engines/sci/engine/vm.cpp | 5 |
3 files changed, 5 insertions, 9 deletions
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 942c3f6299..5d81d8ef35 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -859,9 +859,8 @@ byte *SegManager::derefBulkPtr(reg_t pointer, int entries) { } reg_t *SegManager::derefRegPtr(reg_t pointer, int entries) { - const int align = sizeof(reg_t); - if (pointer.offset & (align - 1)) { - warning("Unaligned pointer read: %04x:%04x expected with %d alignment", PRINT_REG(pointer), align); + if (pointer.offset & 1) { + warning("Unaligned pointer read: %04x:%04x expected with word alignment", PRINT_REG(pointer)); return NULL; } diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 793878f7b5..5851ec994a 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -264,7 +264,7 @@ SegmentRef LocalVariables::dereference(reg_t pointer) { SegmentRef ret; ret.isRaw = false; // reg_t based data! ret.maxSize = _locals.size() * sizeof(reg_t); - ret.raw = (byte *)&_locals[0] + pointer.offset; + ret.raw = (byte *)&_locals[pointer.offset/2]; return ret; } @@ -279,7 +279,7 @@ SegmentRef DataStack::dereference(reg_t pointer) { // FIXME: Is this correct? See comment in LocalVariables::dereference if (pointer.offset & 1) warning("LocalVariables::dereference: Odd offset in pointer %04x:%04x", PRINT_REG(pointer)); - ret.raw = (byte *)_entries + pointer.offset; + ret.raw = (byte *)&_entries[pointer.offset/2]; return ret; } diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index ed20c9fed6..78f2d24a1c 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -490,9 +490,6 @@ static reg_t pointer_add(EngineState *s, reg_t base, int offset) { switch (mobj->getType()) { case SEG_TYPE_LOCALS: - base.offset += 2 * offset; - return base; - case SEG_TYPE_SCRIPT: case SEG_TYPE_STACK: case SEG_TYPE_DYNMEM: @@ -1112,7 +1109,7 @@ void run_vm(EngineState *s, int restoring) { r_temp.offset += signed_validate_arithmetic(s->r_acc); r_temp.offset += opparams[1]; // Add index - r_temp.offset *= sizeof(reg_t); + r_temp.offset *= 2; // variables are 16 bit // That's the immediate address now s->r_acc = r_temp; break; |