aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2009-05-18 12:34:03 +0000
committerMax Horn2009-05-18 12:34:03 +0000
commitfc9096ba1d8a08af5e6d84981087c6b506e86b5b (patch)
treeaadfdee42a4cbee29c6a7549114f864518f10f6e
parentdd12c0d06a099b30200e56bf1d58b09221ce5396 (diff)
downloadscummvm-rg350-fc9096ba1d8a08af5e6d84981087c6b506e86b5b.tar.gz
scummvm-rg350-fc9096ba1d8a08af5e6d84981087c6b506e86b5b.tar.bz2
scummvm-rg350-fc9096ba1d8a08af5e6d84981087c6b506e86b5b.zip
SCI: Replaced SegManager::getHeap() by Script::getHeap()
svn-id: r40683
-rw-r--r--engines/sci/engine/seg_manager.cpp23
-rw-r--r--engines/sci/engine/seg_manager.h8
-rw-r--r--engines/sci/engine/vm.cpp29
-rw-r--r--engines/sci/engine/vm.h7
4 files changed, 23 insertions, 44 deletions
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index 80909bba8c..b4b50d4b1e 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -363,23 +363,10 @@ void Script::mcpyInOut(int dst, const void *src, size_t n) {
}
}
-int16 SegManager::getHeap(reg_t reg) {
- MemObject *mobj;
- Script *scr;
-
- VERIFY(check(reg.segment), "Invalid seg id");
- mobj = _heap[reg.segment];
-
- switch (mobj->getType()) {
- case MEM_OBJ_SCRIPT:
- scr = (Script *)mobj;
- VERIFY(reg.offset + 1 < (uint16)scr->buf_size, "invalid offset\n");
- return (scr->buf[reg.offset] | (scr->buf[reg.offset+1]) << 8);
- default:
- error("SegManager::getHeap: unsupported mem obj type %d", mobj->getType());
- break;
- }
- return 0; // never get here
+int16 Script::getHeap(uint16 offset) const {
+ VERIFY(offset + 1 < (int)buf_size, "invalid offset\n");
+ return READ_LE_UINT16(buf + offset);
+// return (buf[offset] | (buf[offset+1]) << 8);
}
// return the seg if script_id is valid and in the map, else -1
@@ -560,7 +547,7 @@ void SegManager::scriptRelocate(reg_t block) {
}
}
-void SegManager::heapRelocate(EngineState *s, reg_t block) {
+void SegManager::heapRelocate(reg_t block) {
Script *scr = getScript(block.segment);
VERIFY(block.offset < (uint16)scr->heap_size && READ_LE_UINT16(scr->heap_start + block.offset) * 2 + block.offset < (uint16)scr->buf_size,
diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h
index 264e39a684..c1d245c1c6 100644
--- a/engines/sci/engine/seg_manager.h
+++ b/engines/sci/engine/seg_manager.h
@@ -161,12 +161,6 @@ public:
// 3. Objects (static, from Scripts, and dynmic, from Clones)
- // Not all of these functions are fully operational for clones ATM
-
- // Retrieves a 16 bit value from within a script's heap representation
- // Parameters: (reg_t) reg: The address to read from
- // Returns : (int16) The value read from the specified location
- int16 getHeap(reg_t reg);
// 4. Stack
@@ -265,7 +259,7 @@ public:
- void heapRelocate(EngineState *s, reg_t block);
+ void heapRelocate(reg_t block);
void scriptRelocateExportsSci11(int seg);
void scriptInitialiseObjectsSci11(EngineState *s, int seg);
int initialiseScript(Script &scr, EngineState *s, int script_nr);
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index 409f7527e4..151e4ff572 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -244,13 +244,6 @@ reg_t get_class_address(EngineState *s, int classnr, int lock, reg_t caller) {
#define GET_OP_SIGNED_WORD() (((int16)READ_LE_UINT16(code_buf + ((xs->addr.pc.offset) += 2) - 2)))
#define GET_OP_SIGNED_FLEX() ((opcode & 1)? GET_OP_SIGNED_BYTE() : GET_OP_SIGNED_WORD())
-#define SEG_GET_HEAP(s, reg) s->seg_manager->getHeap(reg)
-#define OBJ_SPECIES(s, reg) SEG_GET_HEAP(s, make_reg(reg.segment, reg.offset + SCRIPT_SPECIES_OFFSET))
-// Returns an object's species
-
-#define OBJ_SUPERCLASS(s, reg) SEG_GET_HEAP(s, make_reg(reg.segment, reg.offset + SCRIPT_SUPERCLASS_OFFSET))
-// Returns an object's superclass
-
ExecStack *execute_method(EngineState *s, uint16 script, uint16 pubfunct, StackPtr sp, reg_t calling_obj, uint16 argc, StackPtr argp) {
int seg = s->seg_manager->segGet(script);
Script *scr = s->seg_manager->getScriptIfLoaded(seg);
@@ -1704,7 +1697,7 @@ int script_instantiate_common(EngineState *s, int script_nr, Resource **script,
int script_instantiate_sci0(EngineState *s, int script_nr) {
int objtype;
unsigned int objlength;
- reg_t reg, reg_tmp;
+ reg_t reg;
int seg_id;
int relocation = -1;
int magic_pos_adder; // Usually 0; 2 for older SCI versions
@@ -1745,17 +1738,16 @@ int script_instantiate_sci0(EngineState *s, int script_nr) {
// export table and local variable block
objlength = 0;
- reg_tmp = reg;
reg.offset = magic_pos_adder;
do {
reg_t data_base;
reg_t addr;
reg.offset += objlength; // Step over the last checked object
- objtype = SEG_GET_HEAP(s, reg);
+ objtype = scr->getHeap(reg.offset);
if (!objtype) break;
- objlength = SEG_GET_HEAP(s, make_reg(reg.segment, reg.offset + 2));
+ objlength = scr->getHeap(reg.offset + 2);
data_base = reg;
data_base.offset += 4;
@@ -1780,8 +1772,7 @@ int script_instantiate_sci0(EngineState *s, int script_nr) {
case SCI_OBJ_CLASS: {
int classpos = addr.offset - SCRIPT_OBJECT_MAGIC_OFFSET;
int species;
- reg_tmp.offset = addr.offset - SCRIPT_OBJECT_MAGIC_OFFSET;
- species = OBJ_SPECIES(s, reg_tmp);
+ species = scr->getHeap(addr.offset - SCRIPT_OBJECT_MAGIC_OFFSET + SCRIPT_SPECIES_OFFSET);
if (species < 0 || species >= (int)s->_classtable.size()) {
sciprintf("Invalid species %d(0x%x) not in interval "
"[0,%d) while instantiating script %d\n",
@@ -1810,9 +1801,9 @@ int script_instantiate_sci0(EngineState *s, int script_nr) {
do {
reg_t addr;
reg.offset += objlength; // Step over the last checked object
- objtype = SEG_GET_HEAP(s, reg);
+ objtype = scr->getHeap(reg.offset);
if (!objtype) break;
- objlength = SEG_GET_HEAP(s, make_reg(reg.segment, reg.offset + 2));
+ objlength = scr->getHeap(reg.offset + 2);
reg.offset += 4; // Step over header
addr = reg;
@@ -1887,7 +1878,7 @@ int script_instantiate_sci11(EngineState *s, int script_nr) {
s->seg_manager->scriptInitialiseObjectsSci11(s, seg_id);
reg.offset = READ_LE_UINT16(heap->data);
- s->seg_manager->heapRelocate(s, reg);
+ s->seg_manager->heapRelocate(reg);
return seg_id;
}
@@ -1910,10 +1901,10 @@ void script_uninstantiate_sci0(EngineState *s, int script_nr, SegmentId seg) {
do {
reg.offset += objlength; // Step over the last checked object
- objtype = SEG_GET_HEAP(s, reg);
+ objtype = scr->getHeap(reg.offset);
if (!objtype)
break;
- objlength = SEG_GET_HEAP(s, make_reg(reg.segment, reg.offset + 2)); // use SEG_UGET_HEAP ??
+ objlength = scr->getHeap(reg.offset + 2); // use SEG_UGET_HEAP ??
reg.offset += 4; // Step over header
@@ -1922,7 +1913,7 @@ void script_uninstantiate_sci0(EngineState *s, int script_nr, SegmentId seg) {
reg.offset -= SCRIPT_OBJECT_MAGIC_OFFSET;
- superclass = OBJ_SUPERCLASS(s, reg); // Get superclass...
+ superclass = scr->getHeap(reg.offset + SCRIPT_SUPERCLASS_OFFSET); // Get superclass...
if (superclass >= 0) {
int superclass_script = s->_classtable[superclass].script;
diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h
index b7969c3447..e8c4ed8090 100644
--- a/engines/sci/engine/vm.h
+++ b/engines/sci/engine/vm.h
@@ -451,6 +451,13 @@ public:
return _markedAsDeleted;
}
+ /**
+ * Retrieves a 16 bit value from within a script's heap representation.
+ * @param offset offset to read from
+ * @return the value read from the specified location
+ */
+ int16 getHeap(uint16 offset) const;
+
};
/** Data stack */