[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