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

kjdf at users.sourceforge.net kjdf at users.sourceforge.net
Fri Jun 19 23:16:21 CEST 2009


Revision: 41690
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41690&view=rev
Author:   kjdf
Date:     2009-06-19 21:16:21 +0000 (Fri, 19 Jun 2009)

Log Message:
-----------
decompiler: able to disassemble all v6 scripts

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

Modified: tools/branches/gsoc2009-decompiler/decompiler/graph.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/graph.h	2009-06-19 21:15:55 UTC (rev 41689)
+++ tools/branches/gsoc2009-decompiler/decompiler/graph.h	2009-06-19 21:16:21 UTC (rev 41690)
@@ -26,13 +26,14 @@
 
 		friend class Graph;
 
-		std::list<Node*> _in;
-		std::list<Node*> _out;
 		bool _hidden;
 		bool _visited;
 		Node *_interval;
+		Node *_primitive;
+		std::list<Node*> _in;
+		std::list<Node*> _out;
 
-		Node(const Data &data) : _data(data), _hidden(false), _interval(0) {
+		Node(const Data &data) : _data(data), _hidden(false), _interval(0), _primitive(0) {
 		}
 
 		~Node() {
@@ -86,6 +87,30 @@
 				removeNode(u);
 	}
 
+	Graph derive() {
+		return Graph();
+	}
+
+
+	Graph(const Graph &g) {
+		map<Node*, Node*> trans;
+		foreach (Node *u, g._nodes)
+			trans[u] = addNode(u->_data);
+		foreach (Node *u, g._nodes) {
+			foreach (Node *v, u->_in)
+				trans[u]->_in.push_back(trans[v]);
+			foreach (Node *v, u->_out)
+				trans[u]->_in.push_back(trans[v]);
+		}
+	}
+
+	void test(int level=0) {
+		if (level == 0)
+			cout << _nodes.size();
+		else
+			derive().test(level-1);
+	}
+
 	void assignIntervals(Node *start) {
 		std::list<Node*> intervals;
 		intervals.push_back(start);

Modified: tools/branches/gsoc2009-decompiler/decompiler/instruction.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/instruction.h	2009-06-19 21:15:55 UTC (rev 41689)
+++ tools/branches/gsoc2009-decompiler/decompiler/instruction.h	2009-06-19 21:16:21 UTC (rev 41690)
@@ -54,7 +54,7 @@
 		for (index_t i = 0; i < _instructions.size(); i++)
 			if (_instructions[i]->_addr == addr)
 				return i;
-		fprintf(stderr, "!!! no instruction with address %x (%d)\n", addr, addr);
+		fprintf(stderr, "!!! (unhandled) no instruction with address %x (%d)\n", addr, addr);
 		return (index_t)-1;	// Note: -1 is negative, but index_t unsigned
 	}
 

Modified: tools/branches/gsoc2009-decompiler/decompiler/intv.cc
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/intv.cc	2009-06-19 21:15:55 UTC (rev 41689)
+++ tools/branches/gsoc2009-decompiler/decompiler/intv.cc	2009-06-19 21:16:21 UTC (rev 41690)
@@ -1,4 +1,5 @@
 #include <iostream>
+#include <map>
 using namespace std;
 
 #include "graph.h"
@@ -72,5 +73,6 @@
 	g.addEdge(n15, n6);
 	g.assignIntervals(n1);
 	cout << g.graphvizPrint(printer);
+	g.test(0);
 	return 0;
 }

Modified: tools/branches/gsoc2009-decompiler/decompiler/parser.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/parser.h	2009-06-19 21:15:55 UTC (rev 41689)
+++ tools/branches/gsoc2009-decompiler/decompiler/parser.h	2009-06-19 21:16:21 UTC (rev 41690)
@@ -24,10 +24,14 @@
 	Scumm6Parser() {
 		_reader = new SubopcodeReader("main");
 
-		//		_reader->registerOpcode(0x00, new SimpleReader("pushByte", "b"));
+		_reader->registerOpcode(0x00, new SimpleReader("pushByte", "b"));
 		_reader->registerOpcode(0x01, new SimpleReader("push", "W"));
+		_reader->registerOpcode(0x02, new SimpleReader("pushByteVar", "b"));
 		_reader->registerOpcode(0x03, new SimpleReader("pushVar", "w"));
+		_reader->registerOpcode(0x06, new SimpleReader("byteArrayRead", "b"));
 		_reader->registerOpcode(0x07, new SimpleReader("wordArrayRead", "w"));
+		_reader->registerOpcode(0x0a, new SimpleReader("byteArrayIndexedRead", "b"));
+		_reader->registerOpcode(0x0b, new SimpleReader("wordArrayIndexedRead", "w"));
 		_reader->registerOpcode(0x0c, new SimpleReader("dup"));
 		_reader->registerOpcode(0x0d, new SimpleReader("not"));
 		_reader->registerOpcode(0x0e, new SimpleReader("=="));
@@ -46,11 +50,21 @@
 		_reader->registerOpcode(0x1a, new SimpleReader("pop"));
 
 
-		_reader->registerOpcode(0x43, new SimpleReader("writeVar", "w"));
+		_reader->registerOpcode(0x42, new SimpleReader("writeByteVar", "b"));
+		_reader->registerOpcode(0x43, new SimpleReader("writeWordVar", "w"));
+		_reader->registerOpcode(0x46, new SimpleReader("byteArrayWrite", "b"));
 		_reader->registerOpcode(0x47, new SimpleReader("wordArrayWrite", "w"));
+		_reader->registerOpcode(0x4a, new SimpleReader("byteArrayIndexedWrite", "b"));
+		_reader->registerOpcode(0x4b, new SimpleReader("wordArrayIndexedWrite", "w"));
+		_reader->registerOpcode(0x4e, new SimpleReader("byteVarInc", "b"));
 		_reader->registerOpcode(0x4f, new SimpleReader("wordVarInc", "w"));
 
+		_reader->registerOpcode(0x52, new SimpleReader("byteArrayInc", "b"));
+		_reader->registerOpcode(0x53, new SimpleReader("wordArrayInc", "w"));
+		_reader->registerOpcode(0x56, new SimpleReader("byteVarDec", "b"));
 		_reader->registerOpcode(0x57, new SimpleReader("wordVarDec", "w"));
+		_reader->registerOpcode(0x5a, new SimpleReader("byteArrayDec", "b"));
+		_reader->registerOpcode(0x5b, new SimpleReader("wordArrayDec", "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"));
@@ -58,10 +72,14 @@
 
 		_reader->registerOpcode(0x60, new SimpleReader("startObject"));
 		_reader->registerOpcode(0x61, new SimpleReader("drawObject"));
+		_reader->registerOpcode(0x62, new SimpleReader("drawObjectAt"));
+		_reader->registerOpcode(0x63, new SimpleReader("drawBlastObject"));
+		_reader->registerOpcode(0x64, new SimpleReader("setBlastObjectWindow"));
 		_reader->registerOpcode(0x65, new SimpleReader("stopObjectCodeA"));
 		_reader->registerOpcode(0x66, new SimpleReader("stopObjectCodeB"));
 		_reader->registerOpcode(0x67, new SimpleReader("endCutscene"));
 		_reader->registerOpcode(0x68, new SimpleReader("cutscene"));
+		_reader->registerOpcode(0x69, new SimpleReader("stopMusic"));
 		_reader->registerOpcode(0x6a, new SimpleReader("freezeUnfreeze"));
 		SubopcodeReader *cursor = new SubopcodeReader("cursor"); _reader->registerOpcode(0x6b, cursor);
 		_reader->registerOpcode(0x6c, new SimpleReader("breakHere"));	// = yield
@@ -70,10 +88,14 @@
 		_reader->registerOpcode(0x6f, new SimpleReader("getState"));
 
 		_reader->registerOpcode(0x70, new SimpleReader("setState"));
+		_reader->registerOpcode(0x71, new SimpleReader("setOwner"));
 		_reader->registerOpcode(0x72, new SimpleReader("getOwner"));
 		_reader->registerOpcode(0x73, new JumpReader("jump", "o3"));
 		_reader->registerOpcode(0x74, new SimpleReader("startSound"));
 		_reader->registerOpcode(0x75, new SimpleReader("stopSound"));
+		_reader->registerOpcode(0x76, new SimpleReader("startMusic"));
+		_reader->registerOpcode(0x77, new SimpleReader("stopObjectScript"));
+		_reader->registerOpcode(0x78, new SimpleReader("panCameraTo"));
 		_reader->registerOpcode(0x79, new SimpleReader("actorFollowCamera"));
 		_reader->registerOpcode(0x7a, new SimpleReader("setCameraAt"));
 		_reader->registerOpcode(0x7b, new SimpleReader("loadRoom"));
@@ -87,49 +109,108 @@
 		_reader->registerOpcode(0x82, new SimpleReader("animateActor"));
 		_reader->registerOpcode(0x83, new SimpleReader("doSentence"));
 		_reader->registerOpcode(0x84, new SimpleReader("pickupObject"));
+		_reader->registerOpcode(0x85, new SimpleReader("loadRoomWithEgo"));
 		_reader->registerOpcode(0x87, new SimpleReader("getRandomNumber"));
+		_reader->registerOpcode(0x88, new SimpleReader("getRandomNumberRange"));
+		_reader->registerOpcode(0x8a, new SimpleReader("getActorMoving"));
 		_reader->registerOpcode(0x8b, new SimpleReader("delay"));
 		_reader->registerOpcode(0x8c, new SimpleReader("getActorRoom"));
 		_reader->registerOpcode(0x8d, new SimpleReader("getObjectX"));
 		_reader->registerOpcode(0x8e, new SimpleReader("getObjectY"));
+		_reader->registerOpcode(0x8f, new SimpleReader("getObjectOldDir"));
 
+		_reader->registerOpcode(0x90, new SimpleReader("getActorWalkBox"));
+		_reader->registerOpcode(0x91, new SimpleReader("getActorCostume"));
 		_reader->registerOpcode(0x92, new SimpleReader("findInventory"));
 		_reader->registerOpcode(0x93, new SimpleReader("getInventoryCount"));
+		_reader->registerOpcode(0x94, new SimpleReader("getVerbFromXY"));
 		_reader->registerOpcode(0x95, new SimpleReader("beginOverride", "bw")); // TODO: how to handle this?
 		_reader->registerOpcode(0x96, new SimpleReader("endOverride"));
 		_reader->registerOpcode(0x97, new SimpleReader("setObjectName", "s"));
+		_reader->registerOpcode(0x98, new SimpleReader("isSoundRunning"));
 		_reader->registerOpcode(0x99, new SimpleReader("setBoxFlags"));
 		_reader->registerOpcode(0x9a, new SimpleReader("createBoxMatrix"));
 		SubopcodeReader *res   = new SubopcodeReader("res");   _reader->registerOpcode(0x9b, res);
 		SubopcodeReader *room  = new SubopcodeReader("room");  _reader->registerOpcode(0x9c, room);
 		SubopcodeReader *actor = new SubopcodeReader("actor"); _reader->registerOpcode(0x9d, actor);
+		SubopcodeReader *verb  = new SubopcodeReader("verb");  _reader->registerOpcode(0x9e, verb);
+		_reader->registerOpcode(0x9f, new SimpleReader("getActorFromXY"));
 
+		_reader->registerOpcode(0xa0, new SimpleReader("findObject"));
+		_reader->registerOpcode(0xa1, new SimpleReader("pseudoRoom"));
+		_reader->registerOpcode(0xa2, new SimpleReader("getActorElevation"));
 		_reader->registerOpcode(0xa3, new SimpleReader("getVerbEntryPoint"));
+		SubopcodeReader *array   = new SubopcodeReader("array");   _reader->registerOpcode(0xa4, array);
+		SubopcodeReader *srVerbs = new SubopcodeReader("srVerbs"); _reader->registerOpcode(0xa5, srVerbs);
 		_reader->registerOpcode(0xa6, new SimpleReader("drawBox"));
-		SubopcodeReader *array = new SubopcodeReader("array"); _reader->registerOpcode(0xa4, array);
-		SubopcodeReader *wait  = new SubopcodeReader("wait");  _reader->registerOpcode(0xa9, wait);
+		_reader->registerOpcode(0xa7, new SimpleReader("pop"));
+		_reader->registerOpcode(0xa8, new SimpleReader("getActorWidth"));
+		SubopcodeReader *wait    = new SubopcodeReader("wait");    _reader->registerOpcode(0xa9, wait);
+		_reader->registerOpcode(0xaa, new SimpleReader("getActorScaleX"));
+		_reader->registerOpcode(0xab, new SimpleReader("getActorAnimCounter"));
+		_reader->registerOpcode(0xac, new SimpleReader("soundKludge"));
 		_reader->registerOpcode(0xad, new SimpleReader("isAnyOf"));
+		SubopcodeReader *system  = new SubopcodeReader("system");  _reader->registerOpcode(0xae, system);
 		_reader->registerOpcode(0xaf, new SimpleReader("isActorInBox"));
 
 		_reader->registerOpcode(0xb0, new SimpleReader("delay"));
 		_reader->registerOpcode(0xb1, new SimpleReader("delaySeconds"));
+		_reader->registerOpcode(0xb2, new SimpleReader("delayMinutes"));
 		_reader->registerOpcode(0xb3, new SimpleReader("stopSentence"));
-		SubopcodeReader *printText  = new SubopcodeReader("printText");  _reader->registerOpcode(0xb5, printText);
-		SubopcodeReader *printDebug = new SubopcodeReader("printDebug"); _reader->registerOpcode(0xb6, printDebug);
-		SubopcodeReader *print     =  new SubopcodeReader("print");      _reader->registerOpcode(0xb7, print);
-		_reader->registerOpcode(0xba, new SimpleReader("actorTalk", "s"));
-		SubopcodeReader *dimArray = new SubopcodeReader("dimArray");     _reader->registerOpcode(0xbc, dimArray);
+		SubopcodeReader *printLine   = new SubopcodeReader("printLine");   _reader->registerOpcode(0xb4, printLine);
+		SubopcodeReader *printText   = new SubopcodeReader("printText");   _reader->registerOpcode(0xb5, printText);
+		SubopcodeReader *printDebug  = new SubopcodeReader("printDebug");  _reader->registerOpcode(0xb6, printDebug);
+		SubopcodeReader *printSystem = new SubopcodeReader("printSystem"); _reader->registerOpcode(0xb7, printSystem);
+		SubopcodeReader *printActor  = new SubopcodeReader("printActor");  _reader->registerOpcode(0xb8, printActor);
+		SubopcodeReader *printEgo    = new SubopcodeReader("printEgo");    _reader->registerOpcode(0xb9, printEgo);
+		_reader->registerOpcode(0xba, new SimpleReader("talkActor", "s"));
+		_reader->registerOpcode(0xbb, new SimpleReader("talkEgo", "s"));
+		SubopcodeReader *dimArray = new SubopcodeReader("dimArray");       _reader->registerOpcode(0xbc, dimArray);
+		_reader->registerOpcode(0xbd, new SimpleReader("dummy"));
+		_reader->registerOpcode(0xbe, new SimpleReader("startObjectQuick"));
+		_reader->registerOpcode(0xbf, new SimpleReader("startScriptQuick2"));
 
-		_reader->registerOpcode(0xc9, new SimpleReader("kernelSetFunctions.dummy"));
+		_reader->registerOpcode(0xc0, new SimpleReader("dim2dimArray"));
+		_reader->registerOpcode(0xc4, new SimpleReader("abs"));
+		_reader->registerOpcode(0xc5, new SimpleReader("distObjectObject"));
+		_reader->registerOpcode(0xc6, new SimpleReader("distObjectPt"));
+		_reader->registerOpcode(0xc7, new SimpleReader("distPtPt"));
+		_reader->registerOpcode(0xc8, new SimpleReader("kernelGetFunctions.*"));
+		_reader->registerOpcode(0xc9, new SimpleReader("kernelSetFunctions.*"));
 		_reader->registerOpcode(0xca, new SimpleReader("delayFrames"));
+		_reader->registerOpcode(0xcb, new SimpleReader("pickOneOf"));
+		_reader->registerOpcode(0xcc, new SimpleReader("pickOneOfDefault"));
+		_reader->registerOpcode(0xcd, new SimpleReader("StampObject"));
 
+		_reader->registerOpcode(0xd0, new SimpleReader("getDateTime"));
+		_reader->registerOpcode(0xd1, new SimpleReader("stopTalking"));
+		_reader->registerOpcode(0xd2, new SimpleReader("getAnimateVariable"));
+		_reader->registerOpcode(0xd4, new SimpleReader("shuffle", "w"));
+		_reader->registerOpcode(0xd5, new SimpleReader("jumpToScript"));
+		_reader->registerOpcode(0xd6, new SimpleReader("band"));
+		_reader->registerOpcode(0xd7, new SimpleReader("bor"));
+		_reader->registerOpcode(0xd8, new SimpleReader("isRoomScriptRunning"));
+		_reader->registerOpcode(0xdd, new SimpleReader("findAllObjects"));
+
+		_reader->registerOpcode(0xe1, new SimpleReader("getPixel"));
+		_reader->registerOpcode(0xe3, new SimpleReader("pickVarRandom", "w"));
+		_reader->registerOpcode(0xe4, new SimpleReader("setBoxSet"));
+		_reader->registerOpcode(0xec, new SimpleReader("getActorLayer"));
+		_reader->registerOpcode(0xed, new SimpleReader("getObjectNewDir"));
+
 		cursor->registerOpcode(0x90, new SimpleReader("cursor.cursorOn"));
+		cursor->registerOpcode(0x91, new SimpleReader("cursor.cursorOff"));
 		cursor->registerOpcode(0x92, new SimpleReader("cursor.userPutOn"));
+		cursor->registerOpcode(0x93, new SimpleReader("cursor.userPutOff"));
+		cursor->registerOpcode(0x94, new SimpleReader("cursor.softOn"));
 		cursor->registerOpcode(0x95, new SimpleReader("cursor.softOff"));
+		cursor->registerOpcode(0x96, new SimpleReader("cursor.userputSoftOn"));
 		cursor->registerOpcode(0x97, new SimpleReader("cursor.userputSoftOff"));
 		cursor->registerOpcode(0x99, new SimpleReader("cursor.setCursorImg"));
+		cursor->registerOpcode(0x9a, new SimpleReader("cursor.setCursorHotspot"));
 		cursor->registerOpcode(0x9c, new SimpleReader("cursor.initCharset"));
-		//		cursor->registerOpcode(0x9d, new SimpleReader("cursor.charsetColor"));
+		cursor->registerOpcode(0x9d, new SimpleReader("cursor.setCharsetColor"));
+		cursor->registerOpcode(0xd6, new SimpleReader("cursor.setTransparent"));
 
 		res->registerOpcode(100, new SimpleReader("resOps.loadScript"));
 		res->registerOpcode(101, new SimpleReader("resOps.loadSound"));
@@ -147,47 +228,175 @@
 		res->registerOpcode(113, new SimpleReader("resOps.unlockSound"));
 		res->registerOpcode(114, new SimpleReader("resOps.unlockCostume"));
 		res->registerOpcode(115, new SimpleReader("resOps.unlockRoom"));
+		res->registerOpcode(116, new SimpleReader("resOps.clearHeap"));
+		res->registerOpcode(117, new SimpleReader("resOps.loadCharset"));
+		res->registerOpcode(118, new SimpleReader("resOps.nukeCharset"));
 		res->registerOpcode(119, new SimpleReader("resOps.loadObject"));
 
 		room->registerOpcode(172, new SimpleReader("roomOps.scroll"));
 		room->registerOpcode(174, new SimpleReader("roomOps.setScreen"));
 		room->registerOpcode(175, new SimpleReader("roomOps.roomPalette"));
+		room->registerOpcode(176, new SimpleReader("roomOps.shakeOn"));
+		room->registerOpcode(177, new SimpleReader("roomOps.shakeOff"));
 		room->registerOpcode(179, new SimpleReader("roomOps.darkenPalette"));
+		room->registerOpcode(180, new SimpleReader("roomOps.saveGame"));
 		room->registerOpcode(181, new SimpleReader("roomOps.fade"));
+		room->registerOpcode(182, new SimpleReader("roomOps.rgbIntensity"));
+		room->registerOpcode(183, new SimpleReader("roomOps.shadow"));
+		room->registerOpcode(184, new SimpleReader("roomOps.saveString"));
+		room->registerOpcode(185, new SimpleReader("roomOps.loadString"));
+		room->registerOpcode(186, new SimpleReader("roomOps.transform"));
+		room->registerOpcode(187, new SimpleReader("roomOps.cycleSpeed"));
+		room->registerOpcode(213, new SimpleReader("roomOps.newPalette"));
 
 		actor->registerOpcode(76, new SimpleReader("actorOps.setCostume"));
+		actor->registerOpcode(77, new SimpleReader("actorOps.stepDist"));
+		actor->registerOpcode(78, new SimpleReader("actorOps.sound"));
+		actor->registerOpcode(79, new SimpleReader("actorOps.walkAnimation"));
+		actor->registerOpcode(80, new SimpleReader("actorOps.talkAnimation"));
+		actor->registerOpcode(81, new SimpleReader("actorOps.standAnimation"));
+		actor->registerOpcode(82, new SimpleReader("actorOps.animation"));
 		actor->registerOpcode(83, new SimpleReader("actorOps.init"));
 		actor->registerOpcode(84, new SimpleReader("actorOps.setElevation"));
+		actor->registerOpcode(85, new SimpleReader("actorOps.animationDefault"));
 		actor->registerOpcode(86, new SimpleReader("actorOps.setPalette"));
 		actor->registerOpcode(87, new SimpleReader("actorOps.setTalkColor"));
+		actor->registerOpcode(88, new SimpleReader("actorOps.setName", "s"));
+		actor->registerOpcode(89, new SimpleReader("actorOps.initAnimation"));
+		actor->registerOpcode(91, new SimpleReader("actorOps.actorWidth"));
 		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(96, new SimpleReader("actorOps.setFollowBoxes"));
 		actor->registerOpcode(97, new SimpleReader("actorOps.setAnimationSpeed"));
+		actor->registerOpcode(98, new SimpleReader("actorOps.shadow"));
 		actor->registerOpcode(99, new SimpleReader("actorOps.setTalkPos"));
-		actor->registerOpcode(0xc5, new SimpleReader("actorOps.setCurActor"));
+		actor->registerOpcode(197, new SimpleReader("actorOps.setCurActor"));
+		actor->registerOpcode(198, new SimpleReader("actorOps.actorVariable"));
+		actor->registerOpcode(215, new SimpleReader("actorOps.ignoreTurnsOn"));
+		actor->registerOpcode(216, new SimpleReader("actorOps.ignoreTurnsOff"));
+		actor->registerOpcode(217, new SimpleReader("actorOps.actorNew"));
+		actor->registerOpcode(225, new SimpleReader("actorOps.setAlwaysZClip"));
+		actor->registerOpcode(227, new SimpleReader("actorOps.actorDepth"));
+		actor->registerOpcode(228, new SimpleReader("actorOps.actorWalkScript"));
+		actor->registerOpcode(229, new SimpleReader("actorOps.actorStop"));
+		actor->registerOpcode(230, new SimpleReader("actorOps.setDirection"));
+		actor->registerOpcode(231, new SimpleReader("actorOps.turnToDirection"));
+		actor->registerOpcode(233, new SimpleReader("actorOps.actorWalkPause"));
+		actor->registerOpcode(234, new SimpleReader("actorOps.actorWalkResume"));
+		actor->registerOpcode(235, new SimpleReader("actorOps.actorTalkScript"));
 
+		verb->registerOpcode(124, new SimpleReader("verbOps.setImage"));
+		verb->registerOpcode(125, new SimpleReader("verbOps.setName", "s"));
+		verb->registerOpcode(126, new SimpleReader("verbOps.setColor"));
+		verb->registerOpcode(127, new SimpleReader("verbOps.setHiColor"));
+		verb->registerOpcode(128, new SimpleReader("verbOps.setXY"));
+		verb->registerOpcode(129, new SimpleReader("verbOps.setOn"));
+		verb->registerOpcode(130, new SimpleReader("verbOps.setOff"));
+		verb->registerOpcode(131, new SimpleReader("verbOps.kill"));
+		verb->registerOpcode(132, new SimpleReader("verbOps.init"));
+		verb->registerOpcode(133, new SimpleReader("verbOps.setDimColor"));
+		verb->registerOpcode(134, new SimpleReader("verbOps.setDimmed"));
+		verb->registerOpcode(135, new SimpleReader("verbOps.setKey"));
+		verb->registerOpcode(136, new SimpleReader("verbOps.setCenter"));
+		verb->registerOpcode(137, new SimpleReader("verbOps.setToString"));
+		verb->registerOpcode(139, new SimpleReader("verbOps.setToObject"));
+		verb->registerOpcode(140, new SimpleReader("verbOps.setBkColor"));
+		verb->registerOpcode(196, new SimpleReader("verbOps.setCurVerb"));
+		verb->registerOpcode(255, new SimpleReader("verbOps.redraw"));
+
 		array->registerOpcode(205, new SimpleReader("array.assignString", "ws"));
+		array->registerOpcode(208, new SimpleReader("array.assignIntList", "w"));
+		array->registerOpcode(212, new SimpleReader("array.assign2dimList", "w"));
 
+		srVerbs->registerOpcode(141, new SimpleReader("saveRestoreVerbs.saveVerbs"));
+		srVerbs->registerOpcode(142, new SimpleReader("saveRestoreVerbs.restoreVerbs"));
+		srVerbs->registerOpcode(143, new SimpleReader("saveRestoreVerbs.deleteVerbs"));
+
 		wait->registerOpcode(168, new SeqReader(new SimpleReader("wait.forActor.pushCond"),	new CondJumpReader("jumpIf", "o4")));
+		wait->registerOpcode(169, new SimpleReader("wait.forMessage"));
+		wait->registerOpcode(170, new SimpleReader("wait.forCamera"));
+		wait->registerOpcode(171, new SimpleReader("wait.forSentence"));
+		wait->registerOpcode(226, new SeqReader(new SimpleReader("wait.forAnimation.pushCond"),	new CondJumpReader("jumpIf", "o4")));
+		wait->registerOpcode(232, new SeqReader(new SimpleReader("wait.forTurn.pushCond"),	new CondJumpReader("jumpIf", "o4")));
 
+		system->registerOpcode(158, new SimpleReader("system.restart"));
+		system->registerOpcode(159, new SimpleReader("system.pause"));
+		system->registerOpcode(160, new SimpleReader("system.quit"));
+
 		// TODO: The various print* opcodes share all subopcodes. Fix this code duplication
+		printLine->registerOpcode(65, new SimpleReader("printLine.at"));
+		printLine->registerOpcode(66, new SimpleReader("printLine.color"));
+		printLine->registerOpcode(67, new SimpleReader("printLine.clipped"));
+		printLine->registerOpcode(69, new SimpleReader("printLine.center"));
+		printLine->registerOpcode(71, new SimpleReader("printLine.left"));
+		printLine->registerOpcode(72, new SimpleReader("printLine.overhead"));
+		printLine->registerOpcode(74, new SimpleReader("printLine.mumble"));
+		printLine->registerOpcode(75, new SimpleReader("printLine.msg", "s"));
+		printLine->registerOpcode(0xfe, new SimpleReader("printLine.begin"));
+		printLine->registerOpcode(0xff, new SimpleReader("printLine.saveDefault"));
+
 		printText->registerOpcode(65, new SimpleReader("printText.at"));
 		printText->registerOpcode(66, new SimpleReader("printText.color"));
+		printText->registerOpcode(67, new SimpleReader("printText.clipped"));
 		printText->registerOpcode(69, new SimpleReader("printText.center"));
+		printText->registerOpcode(71, new SimpleReader("printText.left"));
+		printText->registerOpcode(72, new SimpleReader("printText.overhead"));
 		printText->registerOpcode(74, new SimpleReader("printText.mumble"));
 		printText->registerOpcode(75, new SimpleReader("printText.msg", "s"));
 		printText->registerOpcode(0xfe, new SimpleReader("printText.begin"));
+		printText->registerOpcode(0xff, new SimpleReader("printText.saveDefault"));
+
+		printDebug->registerOpcode(65, new SimpleReader("printDebug.at"));
+		printDebug->registerOpcode(66, new SimpleReader("printDebug.color"));
+		printDebug->registerOpcode(67, new SimpleReader("printDebug.clipped"));
+		printDebug->registerOpcode(69, new SimpleReader("printDebug.center"));
+		printDebug->registerOpcode(71, new SimpleReader("printDebug.left"));
+		printDebug->registerOpcode(72, new SimpleReader("printDebug.overhead"));
+		printDebug->registerOpcode(74, new SimpleReader("printDebug.mumble"));
 		printDebug->registerOpcode(75, new SimpleReader("printDebug.msg", "s"));
-		printDebug->registerOpcode(0xfe, new SimpleReader("printDebug.loadDefault"));
+		printDebug->registerOpcode(0xfe, new SimpleReader("printDebug.begin"));
 		printDebug->registerOpcode(0xff, new SimpleReader("printDebug.saveDefault"));
-		print->registerOpcode(75, new SimpleReader("printSystem.msg", "s"));
-		print->registerOpcode(0xfe, new SimpleReader("printSystem.begin"));
-		print->registerOpcode(0xff, new SimpleReader("printSystem.saveDefault"));
 
+		printSystem->registerOpcode(65, new SimpleReader("printSystem.at"));
+		printSystem->registerOpcode(66, new SimpleReader("printSystem.color"));
+		printSystem->registerOpcode(67, new SimpleReader("printSystem.clipped"));
+		printSystem->registerOpcode(69, new SimpleReader("printSystem.center"));
+		printSystem->registerOpcode(71, new SimpleReader("printSystem.left"));
+		printSystem->registerOpcode(72, new SimpleReader("printSystem.overhead"));
+		printSystem->registerOpcode(74, new SimpleReader("printSystem.mumble"));
+		printSystem->registerOpcode(75, new SimpleReader("printSystem.msg", "s"));
+		printSystem->registerOpcode(0xfe, new SimpleReader("printSystem.begin"));
+		printSystem->registerOpcode(0xff, new SimpleReader("printSystem.saveDefault"));
+
+		printActor->registerOpcode(65, new SimpleReader("printActor.at"));
+		printActor->registerOpcode(66, new SimpleReader("printActor.color"));
+		printActor->registerOpcode(67, new SimpleReader("printActor.clipped"));
+		printActor->registerOpcode(69, new SimpleReader("printActor.center"));
+		printActor->registerOpcode(71, new SimpleReader("printActor.left"));
+		printActor->registerOpcode(72, new SimpleReader("printActor.overhead"));
+		printActor->registerOpcode(74, new SimpleReader("printActor.mumble"));
+		printActor->registerOpcode(75, new SimpleReader("printActor.msg", "s"));
+		printActor->registerOpcode(0xfe, new SimpleReader("printActor.begin"));
+		printActor->registerOpcode(0xff, new SimpleReader("printActor.saveDefault"));
+
+		printEgo->registerOpcode(65, new SimpleReader("printEgo.at"));
+		printEgo->registerOpcode(66, new SimpleReader("printEgo.color"));
+		printEgo->registerOpcode(67, new SimpleReader("printEgo.clipped"));
+		printEgo->registerOpcode(69, new SimpleReader("printEgo.center"));
+		printEgo->registerOpcode(71, new SimpleReader("printEgo.left"));
+		printEgo->registerOpcode(72, new SimpleReader("printEgo.overhead"));
+		printEgo->registerOpcode(74, new SimpleReader("printEgo.mumble"));
+		printEgo->registerOpcode(75, new SimpleReader("printEgo.msg", "s"));
+		printEgo->registerOpcode(0xfe, new SimpleReader("printEgo.begin"));
+		printEgo->registerOpcode(0xff, new SimpleReader("printEgo.saveDefault"));
+
 		dimArray->registerOpcode(199, new SimpleReader("dimArray.int", "w"));
+		dimArray->registerOpcode(200, new SimpleReader("dimArray.bit", "w"));
+		dimArray->registerOpcode(201, new SimpleReader("dimArray.nibble", "w"));
+		dimArray->registerOpcode(202, new SimpleReader("dimArray.byte", "w"));
+		dimArray->registerOpcode(203, new SimpleReader("dimArray.string", "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-19 21:15:55 UTC (rev 41689)
+++ tools/branches/gsoc2009-decompiler/decompiler/reader.h	2009-06-19 21:16:21 UTC (rev 41690)
@@ -41,7 +41,7 @@
 			switch (_format[i]) {
 			case 'b': {
 				int b = f.get();
-				ssret << ' ' << (uint16) b;
+				ssret << ' ' << b;
 				break;
 			}
 			case 'w': {
@@ -67,22 +67,72 @@
 					if (c == 0xff || c == 0xfe) {
 						int cmd = f.get();
 						switch (cmd) {
+						case 1:
+							ssret << "::newline::";
+							break;
+						case 2:
+							ssret << "::keeptext::";
+							break;
+						case 3:
+							ssret << "::wait::";
+							break;
 						case 4: {
 							uint16 w = (uint16) read_le_uint16(f);
-							ssret << "::" << w << "::";
+							ssret << "::addIntToStack(" << w << ")::";
+							break;
 						}
+						case 5: {
+							uint16 w = (uint16) read_le_uint16(f);
+							ssret << "::addVerbToStack(" << w << ")::";
+							break;
+						}
+						case 6: {
+							uint16 w = (uint16) read_le_uint16(f);
+							ssret << "::addNameToStack(" << w << ")::";
+							break;
+						}
+						case 7: {
+							uint16 w = (uint16) read_le_uint16(f);
+							ssret << "::addStringToStack(" << w << ")::";
+							break;
+						}
+						case 8: {
+							uint16 w = (uint16) read_le_uint16(f);
+							ssret << "::UNKNOWN/(" << w << ")::";
+							break;
+						}
+						case 9: {
+							uint16 w = (uint16) read_le_uint16(f);
+							ssret << "::startAnim(" << w << ")::";
+							break;
+						}
 						case 10:
 							ssret << "::sound::";
 							for (uint32 q = 0; q < 14; q++)
 								f.get();
 							break;
+						case 12: {
+							uint16 w = (uint16) read_le_uint16(f);
+							ssret << "::setColor(" << w << ")::";
+							break;
+						}
+						case 13: {
+							uint16 w = (uint16) read_le_uint16(f);
+							ssret << "::UNKNOWN13(" << w << ")::";
+							break;
+						}
+						case 14: {
+							uint16 w = (uint16) read_le_uint16(f);
+							ssret << "::setFont(" << w << ")::";
+							break;
+						}
 						default:
 							fprintf(stderr, "! unhandled SCUMM STRING format char '%d' at pos 0x%x\n", cmd, ((uint32)f.tellg())-1);
 							return false;
 						}
 					}
 					else
-						ssret << c;
+						ssret << (char) c;
 				ssret << '"';
 				break;
 			default:


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