aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/memobj.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/memobj.cpp')
-rw-r--r--engines/sci/engine/memobj.cpp72
1 files changed, 43 insertions, 29 deletions
diff --git a/engines/sci/engine/memobj.cpp b/engines/sci/engine/memobj.cpp
index ef48270b41..c0775ae51e 100644
--- a/engines/sci/engine/memobj.cpp
+++ b/engines/sci/engine/memobj.cpp
@@ -89,21 +89,6 @@ void Script::freeScript() {
_codeBlocks.clear();
}
-// memory operations
-
-void Script::mcpyInOut(int dst, const void *src, size_t n) {
- if (buf) {
- assert(dst + n <= buf_size);
- memcpy(buf + dst, src, n);
- }
-}
-
-int16 Script::getHeap(uint16 offset) const {
- assert(offset + 1 < (int)buf_size);
- return READ_LE_UINT16(buf + offset);
-// return (buf[offset] | (buf[offset+1]) << 8);
-}
-
void Script::incrementLockers() {
lockers++;
}
@@ -147,12 +132,31 @@ int Script::getSynonymsNr() const {
return synonyms_nr;
}
+// memory operations
+
+void Script::mcpyInOut(int dst, const void *src, size_t n) {
+ if (buf) {
+ assert(dst + n <= buf_size);
+ memcpy(buf + dst, src, n);
+ }
+}
+
+int16 Script::getHeap(uint16 offset) const {
+ assert(offset + 1 < (int)buf_size);
+ return READ_LE_UINT16(buf + offset);
+// return (buf[offset] | (buf[offset+1]) << 8);
+}
+
byte *MemObject::dereference(reg_t pointer, int *size) {
error("Error: Trying to dereference pointer %04x:%04x to inappropriate segment",
PRINT_REG(pointer));
return NULL;
}
+bool Script::isValidOffset(uint16 offset) const {
+ return offset < buf_size;
+}
+
byte *Script::dereference(reg_t pointer, int *size) {
if (pointer.offset > buf_size) {
sciprintf("Error: Attempt to dereference invalid pointer %04x:%04x into script segment (script size=%d)\n",
@@ -161,42 +165,52 @@ byte *Script::dereference(reg_t pointer, int *size) {
}
if (size)
*size = buf_size - pointer.offset;
- return (byte *)(buf + pointer.offset);
+ return buf + pointer.offset;
+}
+
+bool LocalVariables::isValidOffset(uint16 offset) const {
+ return offset < _locals.size() * sizeof(reg_t);
}
byte *LocalVariables::dereference(reg_t pointer, int *size) {
+ if (size)
+ *size = _locals.size() * sizeof(reg_t);
+
// FIXME: The following doesn't seem to be endian safe.
// To fix this, we'd have to always treat the reg_t
// values stored here as in the little endian format.
- int count = _locals.size() * sizeof(reg_t);
byte *base = (byte *)&_locals[0];
-
- if (size)
- *size = count;
-
return base + pointer.offset;
}
-byte *DataStack::dereference(reg_t pointer, int *size) {
- int count = nr * sizeof(reg_t);
- byte *base = (byte *)entries;
+bool DataStack::isValidOffset(uint16 offset) const {
+ return offset < nr * sizeof(reg_t);
+}
+byte *DataStack::dereference(reg_t pointer, int *size) {
if (size)
- *size = count;
+ *size = nr * sizeof(reg_t);
+ byte *base = (byte *)entries;
return base + pointer.offset;
}
-byte *DynMem::dereference(reg_t pointer, int *size) {
- int count = _size;
- byte *base = (byte *)_buf;
+bool DynMem::isValidOffset(uint16 offset) const {
+ return offset < _size;
+}
+byte *DynMem::dereference(reg_t pointer, int *size) {
if (size)
- *size = count;
+ *size = _size;
+ byte *base = (byte *)_buf;
return base + pointer.offset;
}
+bool SystemStrings::isValidOffset(uint16 offset) const {
+ return offset < SYS_STRINGS_MAX && strings[offset].name;
+}
+
byte *SystemStrings::dereference(reg_t pointer, int *size) {
if (size)
*size = strings[pointer.offset].max_size;