aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWillem Jan Palenstijn2009-09-27 12:23:14 +0000
committerWillem Jan Palenstijn2009-09-27 12:23:14 +0000
commit77751a04556547fc65f5b7cb7e007644e2f470fc (patch)
tree7ce53473d835c9dd15c1d79be66cff3df5bf2593
parent56e2e32268859e98263097e669abe2ab104774e9 (diff)
downloadscummvm-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.cpp5
-rw-r--r--engines/sci/engine/segment.cpp4
-rw-r--r--engines/sci/engine/vm.cpp5
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;