[Scummvm-cvs-logs] SF.net SVN: scummvm:[41371] tools/branches/gsoc2009-decompiler/decompiler

kjdf at users.sourceforge.net kjdf at users.sourceforge.net
Mon Jun 8 16:07:19 CEST 2009


Revision: 41371
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41371&view=rev
Author:   kjdf
Date:     2009-06-08 14:07:19 +0000 (Mon, 08 Jun 2009)

Log Message:
-----------
decompiler: more opcodes (to read script-1 of samnmax)

Modified Paths:
--------------
    tools/branches/gsoc2009-decompiler/decompiler/decompiler.cc
    tools/branches/gsoc2009-decompiler/decompiler/parser.h
    tools/branches/gsoc2009-decompiler/decompiler/reader.h

Modified: tools/branches/gsoc2009-decompiler/decompiler/decompiler.cc
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/decompiler.cc	2009-06-08 13:21:17 UTC (rev 41370)
+++ tools/branches/gsoc2009-decompiler/decompiler/decompiler.cc	2009-06-08 14:07:19 UTC (rev 41371)
@@ -10,6 +10,6 @@
 int main(int argc, char **argv) {
 	vector<Instruction*> v = Scumm6Parser().parseFile(argv[1]);
 	for (unsigned i = 0; i < v.size(); i++)
-		printf("%04x: %s\n", v[i]->_addr-8, v[i]->_description.c_str());
+		printf("(d) %04x | (r) %04x: %s\n", v[i]->_addr-8, v[i]->_addr, v[i]->_description.c_str());
 	return 0;
 }

Modified: tools/branches/gsoc2009-decompiler/decompiler/parser.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/parser.h	2009-06-08 13:21:17 UTC (rev 41370)
+++ tools/branches/gsoc2009-decompiler/decompiler/parser.h	2009-06-08 14:07:19 UTC (rev 41371)
@@ -23,47 +23,89 @@
 
 	Scumm6Parser() {
 		_reader = new SubopcodeReader();
+		//		_reader->registerOpcode(0x00, new SimpleReader("pushByte", "b"));
 		_reader->registerOpcode(0x01, new SimpleReader("push", "w"));
 		_reader->registerOpcode(0x03, new SimpleReader("pushVar(v->s)", "w"));
-		_reader->registerOpcode(0x07, new SimpleReader("arrayRead", "w"));
+		_reader->registerOpcode(0x07, new SimpleReader("wordArrayRead", "w"));
 		_reader->registerOpcode(0x0e, new SimpleReader("=="));
 		_reader->registerOpcode(0x0f, new SimpleReader("!="));
 		_reader->registerOpcode(0x10, new SimpleReader(">"));
-		_reader->registerOpcode(0x12, new SimpleReader("<"));
+		_reader->registerOpcode(0x11, new SimpleReader("<"));
+		_reader->registerOpcode(0x12, new SimpleReader("<="));
 		_reader->registerOpcode(0x13, new SimpleReader(">="));
 		_reader->registerOpcode(0x14, new SimpleReader("+"));
 		_reader->registerOpcode(0x43, new SimpleReader("writeVar(s->v)", "w"));
+		_reader->registerOpcode(0x47, new SimpleReader("wordArrayWrite", "w"));
 		_reader->registerOpcode(0x4f, new SimpleReader("varInc", "w"));
 		_reader->registerOpcode(0x5d, new SimpleReader("jumpIfNot", "w"));
 		_reader->registerOpcode(0x5e, new SimpleReader("startScript"));
+		_reader->registerOpcode(0x5f, new SimpleReader("startScriptQuick"));
 		_reader->registerOpcode(0x60, new SimpleReader("startObject"));
 		_reader->registerOpcode(0x66, new SimpleReader("stopObjectCode"));
 		_reader->registerOpcode(0x67, new SimpleReader("endCutscene"));
 		_reader->registerOpcode(0x68, new SimpleReader("cutscene"));
+
+		SubopcodeReader *cursor = new SubopcodeReader();
+		_reader->registerOpcode(0x6b, cursor);
+		cursor->registerOpcode(0x90, new SimpleReader("cursor.cursorOn"));
+		cursor->registerOpcode(0x92, new SimpleReader("cursor.userPutOn"));
+		cursor->registerOpcode(0x99, new SimpleReader("cursor.setCursorImg"));
+		cursor->registerOpcode(0x9c, new SimpleReader("cursor.initCharset"));
+		//		cursor->registerOpcode(0x9d, new SimpleReader("cursor.charsetColor"));
+
 		_reader->registerOpcode(0x6d, new SimpleReader("classOfIs"));
+		_reader->registerOpcode(0x6e, new SimpleReader("setClass"));
 		_reader->registerOpcode(0x72, new SimpleReader("getOwner"));
 		_reader->registerOpcode(0x73, new SimpleReader("jump", "w"));
+		_reader->registerOpcode(0x7b, new SimpleReader("loadRoom"));
 		_reader->registerOpcode(0x7c, new SimpleReader("stopScript"));
 		_reader->registerOpcode(0x7d, new SimpleReader("walkActorToObj"));
 		_reader->registerOpcode(0x7e, new SimpleReader("walkActorTo"));
+		_reader->registerOpcode(0x7f, new SimpleReader("putActorAtXY"));
 		_reader->registerOpcode(0x81, new SimpleReader("faceCutscene"));
 		_reader->registerOpcode(0x82, new SimpleReader("animateActor"));
 		_reader->registerOpcode(0x83, new SimpleReader("doSentence"));
+		_reader->registerOpcode(0x84, new SimpleReader("pickupObject"));
 		_reader->registerOpcode(0x8d, new SimpleReader("getObjectX"));
 		_reader->registerOpcode(0x8e, new SimpleReader("getObjectY"));
+
+		SubopcodeReader *room = new SubopcodeReader();
+		_reader->registerOpcode(0x9c, room);
+		room->registerOpcode(181, new SimpleReader("roomOps.fade"));
+
+		SubopcodeReader *actor = new SubopcodeReader();
+		_reader->registerOpcode(0x9d, actor);
+		actor->registerOpcode(76, new SimpleReader("actorOps.setCostume"));
+		actor->registerOpcode(83, new SimpleReader("actorOps.init"));
+		actor->registerOpcode(87, new SimpleReader("actorOps.setTalkColor"));
+		actor->registerOpcode(95, new SimpleReader("actorOps.setIgnoreBoxes"));
+		actor->registerOpcode(99, new SimpleReader("actorOps.setTalkPos"));
+		actor->registerOpcode(0xc5, new SimpleReader("actorOps.setCurActor")); // not in scumm, descumm says it's from HE???
+
 		_reader->registerOpcode(0xa3, new SimpleReader("getVerbEntryPoint"));
+
+		SubopcodeReader *array = new SubopcodeReader();
+		_reader->registerOpcode(0xa4, array);
+		array->registerOpcode(205, new SimpleReader("array.assignString", "ws"));
+
 		SubopcodeReader *wait = new SubopcodeReader();
-		wait->registerOpcode(168, new SimpleReader("wait_forActor", "w"));
 		_reader->registerOpcode(0xa9, wait);
+		wait->registerOpcode(168, new SimpleReader("wait.forActor", "w"));
+
 		_reader->registerOpcode(0xad, new SimpleReader("isAnyOf"));
 		_reader->registerOpcode(0xb0, new SimpleReader("delay"));
 		_reader->registerOpcode(0xb3, new SimpleReader("stopSentence"));
 
-		//		SubopcodeReader *three = new SubopcodeReader();
-		//		three->registerOpcode(1, new SimpleReader("three/1", 1));
-		//		three->registerOpcode(2, new SimpleReader("three/2", 2));
-		//		_reader->registerOpcode(3, three);
-		//		_reader->registerOpcode(4, new SimpleReader("four", 4));
+		SubopcodeReader *print = new SubopcodeReader();
+		_reader->registerOpcode(0xb7, print);
+		print->registerOpcode(75, new SimpleReader("printSystem.msg", "s"));
+		print->registerOpcode(0xfe, new SimpleReader("printSystem.begin"));
+
+		SubopcodeReader *dimArray = new SubopcodeReader();
+		_reader->registerOpcode(0xbc, dimArray);
+		dimArray->registerOpcode(199, new SimpleReader("dimArray.int", "w"));
+
+		_reader->registerOpcode(0xc9, new SimpleReader("kernelSetFunctions.dummy"));
 	}
 
 	void parseHeader(ifstream &f) {

Modified: tools/branches/gsoc2009-decompiler/decompiler/reader.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/reader.h	2009-06-08 13:21:17 UTC (rev 41370)
+++ tools/branches/gsoc2009-decompiler/decompiler/reader.h	2009-06-08 14:07:19 UTC (rev 41371)
@@ -37,12 +37,25 @@
 		description << _description;
 		for (uint32 i = 0; i < _format.size(); i++)
 			switch (_format[i]) {
-			case 'w':
+			case 'w': {
 				uint16 w = read_le_uint16(f);
 				description.setf(ios::hex, ios::basefield);
 				description << "_0x" << setfill('0') << setw(4) << w;
 				break;
 			}
+				/*			case 'b': {
+				uint8 b = f.get();
+				description.setf(ios::dec, ios::basefield);
+				description << "_0x" << setfill('0') << setw(2) << b;
+				break;
+				}*/
+			case 's':
+				description << "_\"";
+				for (char c = f.get(); c != 0; c = f.get())
+					description << c;
+				description << '"';
+				break;
+			}
 		v.push_back(new Instruction(description.str(), addr));
 		return true;
 	}
@@ -63,13 +76,14 @@
 
 	bool readInstruction(ifstream& f, vector<Instruction*> &v, uint32 addr) {
 		uint8 opcode = f.get();
-		if (f.eof())
+		if (f.eof()) {
 			return false;
-		else if (!_dispatchTable[opcode]) {
+		} else if (!_dispatchTable[opcode]) {
 			printf("! unhandled opcode 0x%02x (%d) at address 0x%02x (%d)\n", opcode, opcode, addr, addr);
 			return false;
-		} else
+		} else {
 			return _dispatchTable[opcode]->readInstruction(f, v, addr);
+		}
 	}
 };
 


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