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

kjdf at users.sourceforge.net kjdf at users.sourceforge.net
Thu Jun 11 16:50:19 CEST 2009


Revision: 41451
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41451&view=rev
Author:   kjdf
Date:     2009-06-11 14:50:19 +0000 (Thu, 11 Jun 2009)

Log Message:
-----------
decompiler: more opcodes

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

Modified: tools/branches/gsoc2009-decompiler/decompiler/parser.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/parser.h	2009-06-11 14:50:05 UTC (rev 41450)
+++ tools/branches/gsoc2009-decompiler/decompiler/parser.h	2009-06-11 14:50:19 UTC (rev 41451)
@@ -22,7 +22,8 @@
 	SubopcodeReader *_reader;
 
 	Scumm6Parser() {
-		_reader = new SubopcodeReader();
+		_reader = new SubopcodeReader("main");
+
 		//		_reader->registerOpcode(0x00, new SimpleReader("pushByte", "b"));
 		_reader->registerOpcode(0x01, new SimpleReader("push", "W"));
 		_reader->registerOpcode(0x03, new SimpleReader("pushVar", "w"));
@@ -31,53 +32,67 @@
 		_reader->registerOpcode(0x0d, new SimpleReader("not"));
 		_reader->registerOpcode(0x0e, new SimpleReader("=="));
 		_reader->registerOpcode(0x0f, new SimpleReader("!="));
+
 		_reader->registerOpcode(0x10, new SimpleReader(">"));
 		_reader->registerOpcode(0x11, new SimpleReader("<"));
 		_reader->registerOpcode(0x12, new SimpleReader("<="));
 		_reader->registerOpcode(0x13, new SimpleReader(">="));
 		_reader->registerOpcode(0x14, new SimpleReader("+"));
 		_reader->registerOpcode(0x15, new SimpleReader("-"));
+		_reader->registerOpcode(0x18, new SimpleReader("&&"));
+
 		_reader->registerOpcode(0x43, new SimpleReader("writeVar", "w"));
 		_reader->registerOpcode(0x47, new SimpleReader("wordArrayWrite", "w"));
 		_reader->registerOpcode(0x4f, new SimpleReader("wordVarInc", "w"));
+
 		_reader->registerOpcode(0x5c, new CondJumpReader("jumpIf", "o3"));
 		_reader->registerOpcode(0x5d, new SeqReader(new SimpleReader("not"),
 													new CondJumpReader("jumpIf", "o3")));
-
 		_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(0x61, new SimpleReader("drawObject"));
+		_reader->registerOpcode(0x65, new SimpleReader("stopObjectCodeA"));
+		_reader->registerOpcode(0x66, new SimpleReader("stopObjectCodeB"));
 		_reader->registerOpcode(0x67, new SimpleReader("endCutscene"));
 		_reader->registerOpcode(0x68, new SimpleReader("cutscene"));
-
-		SubopcodeReader *cursor = new SubopcodeReader();
+		SubopcodeReader *cursor = new SubopcodeReader("cursor");
 		_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(0x6c, new SimpleReader("breakHere"));	// = yield
 		_reader->registerOpcode(0x6d, new SimpleReader("classOfIs"));
 		_reader->registerOpcode(0x6e, new SimpleReader("setClass"));
+		_reader->registerOpcode(0x6f, new SimpleReader("getState"));
+
 		_reader->registerOpcode(0x70, new SimpleReader("setState"));
 		_reader->registerOpcode(0x72, new SimpleReader("getOwner"));
 		_reader->registerOpcode(0x73, new JumpReader("jump", "o3"));
+		_reader->registerOpcode(0x74, new JumpReader("startSound"));
+		_reader->registerOpcode(0x7a, new SimpleReader("setCameraAt"));
 		_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(0x8b, new SimpleReader("delay"));
+		_reader->registerOpcode(0x8c, new SimpleReader("getActorRoom"));
 		_reader->registerOpcode(0x8d, new SimpleReader("getObjectX"));
 		_reader->registerOpcode(0x8e, new SimpleReader("getObjectY"));
 
-		SubopcodeReader *res = new SubopcodeReader();
+		_reader->registerOpcode(0x97, new SimpleReader("setObjectName", "s"));
+		_reader->registerOpcode(0x99, new SimpleReader("setBoxFlags"));
+		_reader->registerOpcode(0x9a, new SimpleReader("createBoxMatrix"));
+		SubopcodeReader *res = new SubopcodeReader("res");
 		_reader->registerOpcode(0x9b, res);
 		res->registerOpcode(100, new SimpleReader("resOps.loadScript"));
 		res->registerOpcode(101, new SimpleReader("resOps.loadSound"));
@@ -95,52 +110,53 @@
 		res->registerOpcode(113, new SimpleReader("resOps.unlockSound"));
 		res->registerOpcode(114, new SimpleReader("resOps.unlockCostume"));
 		res->registerOpcode(115, new SimpleReader("resOps.unlockRoom"));
-
-		SubopcodeReader *room = new SubopcodeReader();
+		SubopcodeReader *room = new SubopcodeReader("room");
 		_reader->registerOpcode(0x9c, room);
+		room->registerOpcode(172, new SimpleReader("roomOps.scroll"));
+		room->registerOpcode(174, new SimpleReader("roomOps.setScreen"));
 		room->registerOpcode(175, new SimpleReader("roomOps.roomPalette"));
 		room->registerOpcode(181, new SimpleReader("roomOps.fade"));
-
-		SubopcodeReader *actor = new SubopcodeReader();
+		SubopcodeReader *actor = new SubopcodeReader("actor");
 		_reader->registerOpcode(0x9d, actor);
 		actor->registerOpcode(76, new SimpleReader("actorOps.setCostume"));
 		actor->registerOpcode(83, new SimpleReader("actorOps.init"));
+		actor->registerOpcode(84, new SimpleReader("actorOps.setElevation"));
+		actor->registerOpcode(86, new SimpleReader("actorOps.setPalette"));
 		actor->registerOpcode(87, new SimpleReader("actorOps.setTalkColor"));
+		actor->registerOpcode(92, new SimpleReader("actorOps.setScale"));
+		actor->registerOpcode(93, new SimpleReader("actorOps.setNeverClip"));
+		actor->registerOpcode(94, new SimpleReader("actorOps.setAlwaysZClip"));
 		actor->registerOpcode(95, new SimpleReader("actorOps.setIgnoreBoxes"));
+		actor->registerOpcode(97, new SimpleReader("actorOps.setAnimationSpeed"));
 		actor->registerOpcode(99, new SimpleReader("actorOps.setTalkPos"));
 		actor->registerOpcode(0xc5, new SimpleReader("actorOps.setCurActor"));
 
 		_reader->registerOpcode(0xa3, new SimpleReader("getVerbEntryPoint"));
-
-		SubopcodeReader *array = new SubopcodeReader();
+		SubopcodeReader *array = new SubopcodeReader("array");
 		_reader->registerOpcode(0xa4, array);
 		array->registerOpcode(205, new SimpleReader("array.assignString", "ws"));
-
-		SubopcodeReader *wait = new SubopcodeReader();
+		SubopcodeReader *wait = new SubopcodeReader("wait");
 		_reader->registerOpcode(0xa9, wait);
 		wait->registerOpcode(168, new SeqReader(new SimpleReader("wait.forActor.pushCond"),
 												new CondJumpReader("jumpIf", "o4")));
-		
-
 		_reader->registerOpcode(0xad, new SimpleReader("isAnyOf"));
 		_reader->registerOpcode(0xaf, new SimpleReader("isActorInBox"));
+
 		_reader->registerOpcode(0xb0, new SimpleReader("delay"));
 		_reader->registerOpcode(0xb3, new SimpleReader("stopSentence"));
-
 		// TODO: The various print* opcodes share all subopcodes. Fix this code duplication
-		SubopcodeReader *printDebug = new SubopcodeReader();
+		SubopcodeReader *printDebug = new SubopcodeReader("printDebug");
 		_reader->registerOpcode(0xb6, printDebug);
 		printDebug->registerOpcode(75, new SimpleReader("printDebug.msg", "s"));
 		printDebug->registerOpcode(0xfe, new SimpleReader("printDebug.loadDefault"));
 		printDebug->registerOpcode(0xff, new SimpleReader("printDebug.saveDefault"));
-
-		SubopcodeReader *print = new SubopcodeReader();
+		SubopcodeReader *print = new SubopcodeReader("print");
 		_reader->registerOpcode(0xb7, print);
 		print->registerOpcode(75, new SimpleReader("printSystem.msg", "s"));
 		print->registerOpcode(0xfe, new SimpleReader("printSystem.begin"));
 		print->registerOpcode(0xff, new SimpleReader("printSystem.saveDefault"));
-
-		SubopcodeReader *dimArray = new SubopcodeReader();
+		SubopcodeReader *dimArray = new SubopcodeReader("dimArray");
+		_reader->registerOpcode(0xba, new SimpleReader("actorTalk", "s"));
 		_reader->registerOpcode(0xbc, dimArray);
 		dimArray->registerOpcode(199, new SimpleReader("dimArray.int", "w"));
 		dimArray->registerOpcode(204, new SimpleReader("dimArray.undim", "w"));

Modified: tools/branches/gsoc2009-decompiler/decompiler/reader.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/reader.h	2009-06-11 14:50:05 UTC (rev 41450)
+++ tools/branches/gsoc2009-decompiler/decompiler/reader.h	2009-06-11 14:50:19 UTC (rev 41451)
@@ -59,7 +59,19 @@
 			case 's':
 				ssret << " \"";
 				for (char c = f.get(); c != 0; c = f.get())
-					ssret << c;
+					if ((uint8) c == 0xff || c == 0xfe)
+						switch (f.get()) {
+						case 10:
+							ssret << "::sound::";
+							for (uint32 q = 0; q < 14; q++)
+								f.get();
+							break;
+						default:
+							fprintf(stderr, "! unhandled SCUMM STRING format char\n");
+							return false;
+						}
+					else
+						ssret << c;
 				ssret << '"';
 				break;
 			default:
@@ -108,8 +120,9 @@
 struct SubopcodeReader : public Reader {
 
 	Reader *_dispatchTable[256];
+	string _name;
 
-	SubopcodeReader() {
+	SubopcodeReader(string name) : _name(name) {
 		memset(_dispatchTable, 0, sizeof(_dispatchTable));
 	}
 
@@ -126,7 +139,7 @@
 		if (f.eof()) {
 			return false;
 		} else if (!_dispatchTable[opcode]) {
-			fprintf(stderr, "! unhandled opcode 0x%02x (%d) at address 0x%02x (%d)\n", opcode, opcode, addr, addr);
+			fprintf(stderr, "! [%s] unhandled opcode 0x%02x (%d) at address 0x%02x (%d)\n", _name.c_str(), opcode, opcode, addr, addr);
 			return false;
 		} else {
 			return _dispatchTable[opcode]->readInstruction(f, script, 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