aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/scriptdebug.cpp
diff options
context:
space:
mode:
authorMax Horn2010-02-02 22:50:32 +0000
committerMax Horn2010-02-02 22:50:32 +0000
commit6c322506dd15b164028f8c560e55323f1b834711 (patch)
tree2e233495329c36bb5df7c38215f0a6d89ac07a67 /engines/sci/engine/scriptdebug.cpp
parent5d80990380a8438dc474cdd5778807b7a72e2501 (diff)
downloadscummvm-rg350-6c322506dd15b164028f8c560e55323f1b834711.tar.gz
scummvm-rg350-6c322506dd15b164028f8c560e55323f1b834711.tar.bz2
scummvm-rg350-6c322506dd15b164028f8c560e55323f1b834711.zip
SCI: Move some code around (no code changes)
svn-id: r47823
Diffstat (limited to 'engines/sci/engine/scriptdebug.cpp')
-rw-r--r--engines/sci/engine/scriptdebug.cpp237
1 files changed, 237 insertions, 0 deletions
diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp
index b54e9cd35a..f58ea869fb 100644
--- a/engines/sci/engine/scriptdebug.cpp
+++ b/engines/sci/engine/scriptdebug.cpp
@@ -428,4 +428,241 @@ void script_debug(EngineState *s, bool bp) {
con->attach();
}
+void Kernel::dumpScriptObject(char *data, int seeker, int objsize) {
+ int selectors, overloads, selectorsize;
+ int species = (int16)READ_LE_UINT16((unsigned char *) data + 8 + seeker);
+ int superclass = (int16)READ_LE_UINT16((unsigned char *) data + 10 + seeker);
+ int namepos = (int16)READ_LE_UINT16((unsigned char *) data + 14 + seeker);
+ int i = 0;
+
+ printf("Object\n");
+
+ Common::hexdump((unsigned char *) data + seeker, objsize - 4, 16, seeker);
+ //-4 because the size includes the two-word header
+
+ printf("Name: %s\n", namepos ? ((char *)(data + namepos)) : "<unknown>");
+ printf("Superclass: %x\n", superclass);
+ printf("Species: %x\n", species);
+ printf("-info-:%x\n", (int16)READ_LE_UINT16((unsigned char *) data + 12 + seeker) & 0xffff);
+
+ printf("Function area offset: %x\n", (int16)READ_LE_UINT16((unsigned char *) data + seeker + 4));
+ printf("Selectors [%x]:\n", selectors = (selectorsize = (int16)READ_LE_UINT16((unsigned char *) data + seeker + 6)));
+
+ seeker += 8;
+
+ while (selectors--) {
+ printf(" [#%03x] = 0x%x\n", i++, (int16)READ_LE_UINT16((unsigned char *)data + seeker) & 0xffff);
+ seeker += 2;
+ }
+
+ printf("Overridden functions: %x\n", selectors = overloads = (int16)READ_LE_UINT16((unsigned char *)data + seeker));
+
+ seeker += 2;
+
+ if (overloads < 100)
+ while (overloads--) {
+ int selector = (int16)READ_LE_UINT16((unsigned char *) data + (seeker));
+
+ printf(" [%03x] %s: @", selector & 0xffff, (selector >= 0 && selector < (int)_selectorNames.size()) ? _selectorNames[selector].c_str() : "<?>");
+ printf("%04x\n", (int16)READ_LE_UINT16((unsigned char *)data + seeker + selectors*2 + 2) & 0xffff);
+
+ seeker += 2;
+ }
+}
+
+void Kernel::dumpScriptClass(char *data, int seeker, int objsize) {
+ int selectors, overloads, selectorsize;
+ int species = (int16)READ_LE_UINT16((unsigned char *) data + 8 + seeker);
+ int superclass = (int16)READ_LE_UINT16((unsigned char *) data + 10 + seeker);
+ int namepos = (int16)READ_LE_UINT16((unsigned char *) data + 14 + seeker);
+
+ printf("Class\n");
+
+ Common::hexdump((unsigned char *) data + seeker, objsize - 4, 16, seeker);
+
+ printf("Name: %s\n", namepos ? ((char *)data + namepos) : "<unknown>");
+ printf("Superclass: %x\n", superclass);
+ printf("Species: %x\n", species);
+ printf("-info-:%x\n", (int16)READ_LE_UINT16((unsigned char *)data + 12 + seeker) & 0xffff);
+
+ printf("Function area offset: %x\n", (int16)READ_LE_UINT16((unsigned char *)data + seeker + 4));
+ printf("Selectors [%x]:\n", selectors = (selectorsize = (int16)READ_LE_UINT16((unsigned char *)data + seeker + 6)));
+
+ seeker += 8;
+ selectorsize <<= 1;
+
+ while (selectors--) {
+ int selector = (int16)READ_LE_UINT16((unsigned char *) data + (seeker) + selectorsize);
+
+ printf(" [%03x] %s = 0x%x\n", 0xffff & selector, (selector >= 0 && selector < (int)_selectorNames.size()) ? _selectorNames[selector].c_str() : "<?>",
+ (int16)READ_LE_UINT16((unsigned char *)data + seeker) & 0xffff);
+
+ seeker += 2;
+ }
+
+ seeker += selectorsize;
+
+ printf("Overloaded functions: %x\n", selectors = overloads = (int16)READ_LE_UINT16((unsigned char *)data + seeker));
+
+ seeker += 2;
+
+ while (overloads--) {
+ int selector = (int16)READ_LE_UINT16((unsigned char *)data + (seeker));
+ fprintf(stderr, "selector=%d; selectorNames.size() =%d\n", selector, _selectorNames.size());
+ printf(" [%03x] %s: @", selector & 0xffff, (selector >= 0 && selector < (int)_selectorNames.size()) ?
+ _selectorNames[selector].c_str() : "<?>");
+ printf("%04x\n", (int16)READ_LE_UINT16((unsigned char *)data + seeker + selectors * 2 + 2) & 0xffff);
+
+ seeker += 2;
+ }
+}
+
+void Kernel::dissectScript(int scriptNumber, Vocabulary *vocab) {
+ int objectctr[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ unsigned int _seeker = 0;
+ Resource *script = _resMan->findResource(ResourceId(kResourceTypeScript, scriptNumber), 0);
+
+ if (!script) {
+ warning("dissectScript(): Script not found!\n");
+ return;
+ }
+
+ while (_seeker < script->size) {
+ int objtype = (int16)READ_LE_UINT16(script->data + _seeker);
+ int objsize;
+ unsigned int seeker = _seeker + 4;
+
+ if (!objtype) {
+ printf("End of script object (#0) encountered.\n");
+ printf("Classes: %i, Objects: %i, Export: %i,\n Var: %i (all base 10)",
+ objectctr[6], objectctr[1], objectctr[7], objectctr[10]);
+ return;
+ }
+
+ printf("\n");
+
+ objsize = (int16)READ_LE_UINT16(script->data + _seeker + 2);
+
+ printf("Obj type #%x, size 0x%x: ", objtype, objsize);
+
+ _seeker += objsize;
+
+ objectctr[objtype]++;
+
+ switch (objtype) {
+ case SCI_OBJ_OBJECT:
+ dumpScriptObject((char *)script->data, seeker, objsize);
+ break;
+
+ case SCI_OBJ_CODE: {
+ printf("Code\n");
+ Common::hexdump(script->data + seeker, objsize - 4, 16, seeker);
+ };
+ break;
+
+ case 3: {
+ printf("<unknown>\n");
+ Common::hexdump(script->data + seeker, objsize - 4, 16, seeker);
+ };
+ break;
+
+ case SCI_OBJ_SAID: {
+ printf("Said\n");
+ Common::hexdump(script->data + seeker, objsize - 4, 16, seeker);
+
+ printf("%04x: ", seeker);
+ while (seeker < _seeker) {
+ unsigned char nextitem = script->data [seeker++];
+ if (nextitem == 0xFF)
+ printf("\n%04x: ", seeker);
+ else if (nextitem >= 0xF0) {
+ switch (nextitem) {
+ case 0xf0:
+ printf(", ");
+ break;
+ case 0xf1:
+ printf("& ");
+ break;
+ case 0xf2:
+ printf("/ ");
+ break;
+ case 0xf3:
+ printf("( ");
+ break;
+ case 0xf4:
+ printf(") ");
+ break;
+ case 0xf5:
+ printf("[ ");
+ break;
+ case 0xf6:
+ printf("] ");
+ break;
+ case 0xf7:
+ printf("# ");
+ break;
+ case 0xf8:
+ printf("< ");
+ break;
+ case 0xf9:
+ printf("> ");
+ break;
+ }
+ } else {
+ nextitem = nextitem << 8 | script->data [seeker++];
+ printf("%s[%03x] ", vocab->getAnyWordFromGroup(nextitem), nextitem);
+ }
+ }
+ printf("\n");
+ }
+ break;
+
+ case SCI_OBJ_STRINGS: {
+ printf("Strings\n");
+ while (script->data [seeker]) {
+ printf("%04x: %s\n", seeker, script->data + seeker);
+ seeker += strlen((char *)script->data + seeker) + 1;
+ }
+ seeker++; // the ending zero byte
+ };
+ break;
+
+ case SCI_OBJ_CLASS:
+ dumpScriptClass((char *)script->data, seeker, objsize);
+ break;
+
+ case SCI_OBJ_EXPORTS: {
+ printf("Exports\n");
+ Common::hexdump((unsigned char *)script->data + seeker, objsize - 4, 16, seeker);
+ };
+ break;
+
+ case SCI_OBJ_POINTERS: {
+ printf("Pointers\n");
+ Common::hexdump(script->data + seeker, objsize - 4, 16, seeker);
+ };
+ break;
+
+ case 9: {
+ printf("<unknown>\n");
+ Common::hexdump(script->data + seeker, objsize - 4, 16, seeker);
+ };
+ break;
+
+ case SCI_OBJ_LOCALVARS: {
+ printf("Local vars\n");
+ Common::hexdump(script->data + seeker, objsize - 4, 16, seeker);
+ };
+ break;
+
+ default:
+ printf("Unsupported!\n");
+ return;
+ }
+
+ }
+
+ printf("Script ends without terminator\n");
+}
+
} // End of namespace Sci