[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