[Scummvm-cvs-logs] SF.net SVN: scummvm:[40683] scummvm/trunk/engines/sci/engine
fingolfin at users.sourceforge.net
fingolfin at users.sourceforge.net
Mon May 18 14:34:03 CEST 2009
Revision: 40683
http://scummvm.svn.sourceforge.net/scummvm/?rev=40683&view=rev
Author: fingolfin
Date: 2009-05-18 12:34:03 +0000 (Mon, 18 May 2009)
Log Message:
-----------
SCI: Replaced SegManager::getHeap() by Script::getHeap()
Modified Paths:
--------------
scummvm/trunk/engines/sci/engine/seg_manager.cpp
scummvm/trunk/engines/sci/engine/seg_manager.h
scummvm/trunk/engines/sci/engine/vm.cpp
scummvm/trunk/engines/sci/engine/vm.h
Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp 2009-05-18 11:57:02 UTC (rev 40682)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp 2009-05-18 12:34:03 UTC (rev 40683)
@@ -363,23 +363,10 @@
}
}
-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::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,
Modified: scummvm/trunk/engines/sci/engine/seg_manager.h
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.h 2009-05-18 11:57:02 UTC (rev 40682)
+++ scummvm/trunk/engines/sci/engine/seg_manager.h 2009-05-18 12:34:03 UTC (rev 40683)
@@ -161,14 +161,8 @@
// 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
// Allocates a data stack
@@ -265,7 +259,7 @@
- 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);
Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp 2009-05-18 11:57:02 UTC (rev 40682)
+++ scummvm/trunk/engines/sci/engine/vm.cpp 2009-05-18 12:34:03 UTC (rev 40683)
@@ -244,13 +244,6 @@
#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_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 @@
// 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 @@
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 @@
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 @@
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 @@
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 @@
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;
Modified: scummvm/trunk/engines/sci/engine/vm.h
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.h 2009-05-18 11:57:02 UTC (rev 40682)
+++ scummvm/trunk/engines/sci/engine/vm.h 2009-05-18 12:34:03 UTC (rev 40683)
@@ -451,6 +451,13 @@
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 */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list