[Scummvm-cvs-logs] SF.net SVN: scummvm:[49385] tools/branches/gsoc2010-decompiler/decompiler/ scummv6/disassembler.cpp
pidgeot at users.sourceforge.net
pidgeot at users.sourceforge.net
Wed Jun 2 00:33:04 CEST 2010
Revision: 49385
http://scummvm.svn.sourceforge.net/scummvm/?rev=49385&view=rev
Author: pidgeot
Date: 2010-06-01 22:33:04 +0000 (Tue, 01 Jun 2010)
Log Message:
-----------
Add code for reading string parameters to SCUMMv6 disassembler
Modified Paths:
--------------
tools/branches/gsoc2010-decompiler/decompiler/scummv6/disassembler.cpp
Modified: tools/branches/gsoc2010-decompiler/decompiler/scummv6/disassembler.cpp
===================================================================
--- tools/branches/gsoc2010-decompiler/decompiler/scummv6/disassembler.cpp 2010-06-01 22:29:55 UTC (rev 49384)
+++ tools/branches/gsoc2010-decompiler/decompiler/scummv6/disassembler.cpp 2010-06-01 22:33:04 UTC (rev 49385)
@@ -21,6 +21,7 @@
*/
#include <iostream>
+#include <sstream>
#include "disassembler.h"
@@ -126,15 +127,85 @@
return _insts;
}
-void ScummV6Disassembler::readParameter(Parameter *p, char type)
-{
- switch (type)
- {
- case 'c': //Character string
- //TODO
- break;
- default: //Defer handling to parent implementation
- SimpleDisassembler::readParameter(p, type);
- break;
+void ScummV6Disassembler::readParameter(Parameter *p, char type) {
+ switch (type) {
+ case 'c': //Character string
+ {
+ byte cmd;
+ bool inStr = false;
+ std::stringstream s;
+ while ((cmd = _f.readByte()) != 0) {
+ if (cmd == 0xFF || cmd == 0xFE) {
+ if (inStr) {
+ s << '"';
+ inStr = false;
+ }
+ cmd = _f.readByte();
+ switch (cmd) {
+ case 1:
+ s << ":newline:";
+ _address += 2;
+ break;
+ case 2:
+ s << ":keeptext:";
+ _address += 2;
+ break;
+ case 3:
+ s << ":wait:";
+ _address += 2;
+ break;
+ case 4: // addIntToStack
+ case 5: // addVerbToStack
+ case 6: // addNameToStack
+ case 7: // addStringToStack
+ {
+ uint16 var = _f.readUint16LE();
+ //TODO: Clean output similar to descumm
+ s << ":addToStack=" << var << ":";
+ _address += 4;
+ }
+ break;
+ case 9:
+ s << ":startanim=" << _f.readUint16LE() << ":";
+ _address += 4;
+ break;
+ case 10:
+ s << ":sound:";
+ _f.seek(14, SEEK_CUR);
+ _address += 16;
+ break;
+ case 12:
+ s << ":setcolor=" << _f.readUint16LE() << ":";
+ _address += 4;
+ break;
+ case 13:
+ s << ":unk2=" << _f.readUint16LE() << ":";
+ _address += 4;
+ break;
+ case 14:
+ s << ":setfont=" << _f.readUint16LE() << ":";
+ _address += 4;
+ break;
+ default:
+ s << ":unk" << cmd << "=" << _f.readUint16LE() << ":";
+ _address += 4;
+ break;
+ }
+ } else {
+ if (!inStr) {
+ s << '"';
+ inStr = true;
+ }
+ s << cmd;
+ _address++;
+ }
+ }
+ p->_type = kString;
+ p->_value = s.str();
+ }
+ break;
+ default: //Defer handling to parent implementation
+ SimpleDisassembler::readParameter(p, type);
+ break;
}
}
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