2009-02-17 15:09:09 +00:00
|
|
|
/* ScummVM - Graphic Adventure Engine
|
|
|
|
*
|
|
|
|
* ScummVM is the legal property of its developers, whose names
|
|
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
|
|
* file distributed with this source distribution.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
|
|
|
* $URL$
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
*/
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-05-13 16:52:41 +00:00
|
|
|
#include "sci/sci.h"
|
2009-05-15 14:07:45 +00:00
|
|
|
#include "sci/resource.h"
|
2009-02-27 02:23:40 +00:00
|
|
|
#include "sci/engine/state.h"
|
2009-02-16 00:34:40 +00:00
|
|
|
#include "common/util.h"
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-21 10:23:36 +00:00
|
|
|
namespace Sci {
|
|
|
|
|
2009-02-15 06:10:59 +00:00
|
|
|
#define END Script_None
|
|
|
|
|
2009-04-20 19:28:33 +00:00
|
|
|
opcode_format g_opcode_formats[128][4] = {
|
2009-02-15 22:28:50 +00:00
|
|
|
/*00*/
|
|
|
|
{Script_None}, {Script_None}, {Script_None}, {Script_None},
|
|
|
|
/*04*/
|
|
|
|
{Script_None}, {Script_None}, {Script_None}, {Script_None},
|
|
|
|
/*08*/
|
|
|
|
{Script_None}, {Script_None}, {Script_None}, {Script_None},
|
|
|
|
/*0C*/
|
|
|
|
{Script_None}, {Script_None}, {Script_None}, {Script_None},
|
|
|
|
/*10*/
|
|
|
|
{Script_None}, {Script_None}, {Script_None}, {Script_None},
|
|
|
|
/*14*/
|
|
|
|
{Script_None}, {Script_None}, {Script_None}, {Script_SRelative, END},
|
|
|
|
/*18*/
|
|
|
|
{Script_SRelative, END}, {Script_SRelative, END}, {Script_SVariable, END}, {Script_None},
|
|
|
|
/*1C*/
|
|
|
|
{Script_SVariable, END}, {Script_None}, {Script_None}, {Script_Variable, END},
|
|
|
|
/*20*/
|
|
|
|
{Script_SRelative, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_SVariable, Script_Byte, END},
|
|
|
|
/*24 (24=ret)*/
|
|
|
|
{Script_End}, {Script_Byte, END}, {Script_Invalid}, {Script_Invalid},
|
|
|
|
/*28*/
|
|
|
|
{Script_Variable, END}, {Script_Invalid}, {Script_Byte, END}, {Script_Variable, Script_Byte, END},
|
|
|
|
/*2C*/
|
|
|
|
{Script_SVariable, END}, {Script_SVariable, Script_Variable, END}, {Script_None}, {Script_Invalid},
|
|
|
|
/*30*/
|
|
|
|
{Script_None}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END},
|
|
|
|
/*34*/
|
|
|
|
{Script_Property, END}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END},
|
|
|
|
/*38*/
|
|
|
|
{Script_Property, END}, {Script_SRelative, END}, {Script_SRelative, END}, {Script_None},
|
|
|
|
/*3C*/
|
2010-01-28 19:22:58 +00:00
|
|
|
{Script_None}, {Script_None}, {Script_None}, {Script_Word},
|
2009-02-15 22:28:50 +00:00
|
|
|
/*40-4F*/
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
/*50-5F*/
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
/*60-6F*/
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
/*70-7F*/
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
|
|
|
|
{Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}
|
2009-02-15 06:10:59 +00:00
|
|
|
};
|
|
|
|
#undef END
|
|
|
|
|
2009-08-30 14:53:58 +00:00
|
|
|
void script_adjust_opcode_formats(EngineState *s) {
|
2009-08-16 19:18:19 +00:00
|
|
|
// TODO: Check that this is correct
|
2009-08-30 14:53:58 +00:00
|
|
|
if (s->detectLofsType() != SCI_VERSION_0_EARLY) {
|
2009-04-20 19:28:33 +00:00
|
|
|
g_opcode_formats[op_lofsa][0] = Script_Offset;
|
|
|
|
g_opcode_formats[op_lofss][0] = Script_Offset;
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
2009-08-30 14:53:58 +00:00
|
|
|
|
2009-08-26 22:11:31 +00:00
|
|
|
#ifdef ENABLE_SCI32
|
|
|
|
// In SCI32, some arguments are now words instead of bytes
|
2009-09-23 10:55:35 +00:00
|
|
|
if (getSciVersion() >= SCI_VERSION_2) {
|
2009-08-26 22:11:31 +00:00
|
|
|
g_opcode_formats[op_calle][2] = Script_Word;
|
|
|
|
g_opcode_formats[op_callk][1] = Script_Word;
|
|
|
|
g_opcode_formats[op_super][1] = Script_Word;
|
|
|
|
g_opcode_formats[op_send][0] = Script_Word;
|
|
|
|
g_opcode_formats[op_self][0] = Script_Word;
|
|
|
|
g_opcode_formats[op_call][1] = Script_Word;
|
|
|
|
g_opcode_formats[op_callb][1] = Script_Word;
|
|
|
|
}
|
|
|
|
#endif
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
2009-02-15 22:28:50 +00:00
|
|
|
|
2009-08-26 18:13:11 +00:00
|
|
|
#if 1
|
|
|
|
|
2009-09-17 13:21:42 +00:00
|
|
|
#define FIND_SELECTOR(_slc_) _selectorCache._slc_ = findSelector(#_slc_)
|
|
|
|
#define FIND_SELECTOR2(_slc_, _slcstr_) _selectorCache._slc_ = findSelector(_slcstr_)
|
2009-08-26 18:13:11 +00:00
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
// The defines below can be used to construct static selector tables for games which don't have
|
|
|
|
// a vocab.997 resource, by dumping the selector table from other similar versions or games
|
2009-09-17 13:21:42 +00:00
|
|
|
#define FIND_SELECTOR(_slc_) _selectorCache._slc_ = findSelector(#_slc_); \
|
|
|
|
printf("\t{ \"%s\", %d },\n", #_slc_, _selectorCache._slc_)
|
2010-01-25 01:39:44 +00:00
|
|
|
|
2009-09-17 13:21:42 +00:00
|
|
|
#define FIND_SELECTOR2(_slc_, _slcstr_) _selectorCache._slc_ = findSelector(_slcstr_); \
|
|
|
|
printf("\t{ \"%s\", %d },\n", _slcstr_, _selectorCache._slc_)
|
2009-08-26 18:13:11 +00:00
|
|
|
|
|
|
|
#endif
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-06-01 14:12:43 +00:00
|
|
|
void Kernel::mapSelectors() {
|
2009-08-28 10:13:03 +00:00
|
|
|
// species
|
|
|
|
// superClass
|
|
|
|
// -info-
|
2009-02-23 02:17:26 +00:00
|
|
|
FIND_SELECTOR(y);
|
2009-08-28 10:13:03 +00:00
|
|
|
FIND_SELECTOR(x);
|
2009-02-23 02:17:26 +00:00
|
|
|
FIND_SELECTOR(view);
|
|
|
|
FIND_SELECTOR(loop);
|
|
|
|
FIND_SELECTOR(cel);
|
2009-08-28 10:13:03 +00:00
|
|
|
FIND_SELECTOR(underBits);
|
2009-02-23 02:17:26 +00:00
|
|
|
FIND_SELECTOR(nsTop);
|
|
|
|
FIND_SELECTOR(nsLeft);
|
2009-08-28 10:13:03 +00:00
|
|
|
FIND_SELECTOR(nsBottom);
|
|
|
|
FIND_SELECTOR(lsTop);
|
|
|
|
FIND_SELECTOR(lsLeft);
|
|
|
|
FIND_SELECTOR(lsBottom);
|
|
|
|
FIND_SELECTOR(lsRight);
|
2009-02-23 02:17:26 +00:00
|
|
|
FIND_SELECTOR(nsRight);
|
2009-08-28 10:13:03 +00:00
|
|
|
FIND_SELECTOR(signal);
|
|
|
|
FIND_SELECTOR(illegalBits);
|
|
|
|
FIND_SELECTOR(brTop);
|
|
|
|
FIND_SELECTOR(brLeft);
|
|
|
|
FIND_SELECTOR(brBottom);
|
|
|
|
FIND_SELECTOR(brRight);
|
|
|
|
// name
|
|
|
|
// key
|
|
|
|
// time
|
2009-02-23 02:17:26 +00:00
|
|
|
FIND_SELECTOR(text);
|
2009-08-28 10:13:03 +00:00
|
|
|
FIND_SELECTOR(elements);
|
|
|
|
// color
|
|
|
|
// back
|
|
|
|
FIND_SELECTOR(mode);
|
|
|
|
// style
|
2009-02-23 02:17:26 +00:00
|
|
|
FIND_SELECTOR(state);
|
2009-08-28 10:13:03 +00:00
|
|
|
FIND_SELECTOR(font);
|
|
|
|
FIND_SELECTOR(type);
|
|
|
|
// window
|
|
|
|
FIND_SELECTOR(cursor);
|
|
|
|
FIND_SELECTOR(max);
|
|
|
|
// mark
|
|
|
|
// who
|
|
|
|
FIND_SELECTOR(message);
|
|
|
|
// edit
|
|
|
|
FIND_SELECTOR(play);
|
|
|
|
FIND_SELECTOR(number);
|
|
|
|
FIND_SELECTOR(handle); // nodePtr
|
2009-02-23 02:17:26 +00:00
|
|
|
FIND_SELECTOR(client);
|
|
|
|
FIND_SELECTOR(dx);
|
|
|
|
FIND_SELECTOR(dy);
|
|
|
|
FIND_SELECTOR2(b_movCnt, "b-moveCnt");
|
|
|
|
FIND_SELECTOR2(b_i1, "b-i1");
|
|
|
|
FIND_SELECTOR2(b_i2, "b-i2");
|
|
|
|
FIND_SELECTOR2(b_di, "b-di");
|
|
|
|
FIND_SELECTOR2(b_xAxis, "b-xAxis");
|
|
|
|
FIND_SELECTOR2(b_incr, "b-incr");
|
2009-08-28 10:13:03 +00:00
|
|
|
FIND_SELECTOR(xStep);
|
|
|
|
FIND_SELECTOR(yStep);
|
|
|
|
FIND_SELECTOR(moveSpeed);
|
|
|
|
FIND_SELECTOR(canBeHere); // cantBeHere
|
|
|
|
FIND_SELECTOR(heading);
|
|
|
|
FIND_SELECTOR(mover);
|
|
|
|
FIND_SELECTOR(doit);
|
|
|
|
FIND_SELECTOR(isBlocked);
|
|
|
|
FIND_SELECTOR(looper);
|
|
|
|
FIND_SELECTOR(priority);
|
2009-02-23 02:17:26 +00:00
|
|
|
FIND_SELECTOR(modifiers);
|
2009-08-28 10:13:03 +00:00
|
|
|
FIND_SELECTOR(replay);
|
|
|
|
// setPri
|
|
|
|
// at
|
|
|
|
// next
|
|
|
|
// done
|
|
|
|
// width
|
2009-02-23 02:17:26 +00:00
|
|
|
FIND_SELECTOR(wordFail);
|
|
|
|
FIND_SELECTOR(syntaxFail);
|
2009-08-28 10:13:03 +00:00
|
|
|
// semanticFail
|
|
|
|
// pragmaFail
|
|
|
|
// said
|
|
|
|
FIND_SELECTOR(claimed);
|
|
|
|
// value
|
|
|
|
// save
|
|
|
|
// restore
|
|
|
|
// title
|
|
|
|
// button
|
|
|
|
// icon
|
|
|
|
// draw
|
|
|
|
FIND_SELECTOR2(delete_, "delete");
|
|
|
|
FIND_SELECTOR(z);
|
|
|
|
// -----------------------------
|
|
|
|
FIND_SELECTOR(size);
|
2009-02-23 02:17:26 +00:00
|
|
|
FIND_SELECTOR(moveDone);
|
|
|
|
FIND_SELECTOR(vol);
|
|
|
|
FIND_SELECTOR(pri);
|
|
|
|
FIND_SELECTOR(min);
|
|
|
|
FIND_SELECTOR(sec);
|
|
|
|
FIND_SELECTOR(frame);
|
|
|
|
FIND_SELECTOR(dataInc);
|
|
|
|
FIND_SELECTOR(palette);
|
|
|
|
FIND_SELECTOR(cantBeHere);
|
|
|
|
FIND_SELECTOR(nodePtr);
|
|
|
|
FIND_SELECTOR(flags);
|
|
|
|
FIND_SELECTOR(points);
|
2009-04-25 23:31:03 +00:00
|
|
|
FIND_SELECTOR(syncCue);
|
|
|
|
FIND_SELECTOR(syncTime);
|
2009-06-24 19:12:45 +00:00
|
|
|
FIND_SELECTOR(printLang);
|
|
|
|
FIND_SELECTOR(subtitleLang);
|
|
|
|
FIND_SELECTOR(parseLang);
|
2009-10-08 14:37:55 +00:00
|
|
|
FIND_SELECTOR(overlay);
|
2009-08-30 01:37:52 +00:00
|
|
|
FIND_SELECTOR(setCursor);
|
2009-09-27 23:06:39 +00:00
|
|
|
FIND_SELECTOR(topString);
|
2010-01-15 21:26:02 +00:00
|
|
|
FIND_SELECTOR(scaleSignal);
|
2009-11-04 12:16:08 +00:00
|
|
|
FIND_SELECTOR(scaleX);
|
|
|
|
FIND_SELECTOR(scaleY);
|
2009-12-21 14:32:54 +00:00
|
|
|
|
|
|
|
#ifdef ENABLE_SCI32
|
|
|
|
FIND_SELECTOR(data);
|
2009-12-27 01:49:39 +00:00
|
|
|
FIND_SELECTOR(picture);
|
2010-01-05 00:12:31 +00:00
|
|
|
FIND_SELECTOR(plane);
|
|
|
|
FIND_SELECTOR(top);
|
|
|
|
FIND_SELECTOR(left);
|
2009-12-21 14:32:54 +00:00
|
|
|
#endif
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
2009-06-01 14:12:43 +00:00
|
|
|
void Kernel::dumpScriptObject(char *data, int seeker, int objsize) {
|
2009-02-15 22:28:50 +00:00
|
|
|
int selectors, overloads, selectorsize;
|
2009-03-07 16:14:20 +00:00
|
|
|
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);
|
2009-02-15 22:28:50 +00:00
|
|
|
int i = 0;
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Object\n");
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-05-12 07:21:44 +00:00
|
|
|
Common::hexdump((unsigned char *) data + seeker, objsize - 4, 16, seeker);
|
2009-02-21 12:42:06 +00:00
|
|
|
//-4 because the size includes the two-word header
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-07-06 10:39:22 +00:00
|
|
|
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);
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-07-06 10:39:22 +00:00
|
|
|
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)));
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-15 22:28:50 +00:00
|
|
|
seeker += 8;
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-15 22:28:50 +00:00
|
|
|
while (selectors--) {
|
2009-07-06 10:39:22 +00:00
|
|
|
printf(" [#%03x] = 0x%x\n", i++, (int16)READ_LE_UINT16((unsigned char *)data + seeker) & 0xffff);
|
2009-02-15 22:28:50 +00:00
|
|
|
seeker += 2;
|
|
|
|
}
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Overridden functions: %x\n", selectors = overloads = (int16)READ_LE_UINT16((unsigned char *)data + seeker));
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-15 22:28:50 +00:00
|
|
|
seeker += 2;
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-15 22:28:50 +00:00
|
|
|
if (overloads < 100)
|
|
|
|
while (overloads--) {
|
2009-03-07 16:14:20 +00:00
|
|
|
int selector = (int16)READ_LE_UINT16((unsigned char *) data + (seeker));
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-07-06 10:39:22 +00:00
|
|
|
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);
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-15 22:28:50 +00:00
|
|
|
seeker += 2;
|
|
|
|
}
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
2009-06-01 14:12:43 +00:00
|
|
|
void Kernel::dumpScriptClass(char *data, int seeker, int objsize) {
|
2009-02-15 22:28:50 +00:00
|
|
|
int selectors, overloads, selectorsize;
|
2009-03-07 16:14:20 +00:00
|
|
|
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);
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Class\n");
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-05-12 07:21:44 +00:00
|
|
|
Common::hexdump((unsigned char *) data + seeker, objsize - 4, 16, seeker);
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-07-06 10:39:22 +00:00
|
|
|
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);
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-07-06 10:39:22 +00:00
|
|
|
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)));
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-15 22:28:50 +00:00
|
|
|
seeker += 8;
|
|
|
|
selectorsize <<= 1;
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-15 22:28:50 +00:00
|
|
|
while (selectors--) {
|
2009-03-07 16:14:20 +00:00
|
|
|
int selector = (int16)READ_LE_UINT16((unsigned char *) data + (seeker) + selectorsize);
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-07-06 10:39:22 +00:00
|
|
|
printf(" [%03x] %s = 0x%x\n", 0xffff & selector, (selector >= 0 && selector < (int)_selectorNames.size()) ? _selectorNames[selector].c_str() : "<?>",
|
2009-03-07 16:14:20 +00:00
|
|
|
(int16)READ_LE_UINT16((unsigned char *)data + seeker) & 0xffff);
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-15 22:28:50 +00:00
|
|
|
seeker += 2;
|
|
|
|
}
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-15 22:28:50 +00:00
|
|
|
seeker += selectorsize;
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Overloaded functions: %x\n", selectors = overloads = (int16)READ_LE_UINT16((unsigned char *)data + seeker));
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-15 22:28:50 +00:00
|
|
|
seeker += 2;
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-15 22:28:50 +00:00
|
|
|
while (overloads--) {
|
2009-03-07 16:14:20 +00:00
|
|
|
int selector = (int16)READ_LE_UINT16((unsigned char *)data + (seeker));
|
2009-05-31 14:55:32 +00:00
|
|
|
fprintf(stderr, "selector=%d; selectorNames.size() =%d\n", selector, _selectorNames.size());
|
2009-07-06 10:39:22 +00:00
|
|
|
printf(" [%03x] %s: @", selector & 0xffff, (selector >= 0 && selector < (int)_selectorNames.size()) ?
|
2009-05-31 14:55:32 +00:00
|
|
|
_selectorNames[selector].c_str() : "<?>");
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("%04x\n", (int16)READ_LE_UINT16((unsigned char *)data + seeker + selectors * 2 + 2) & 0xffff);
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-15 22:28:50 +00:00
|
|
|
seeker += 2;
|
|
|
|
}
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
2009-06-01 14:12:43 +00:00
|
|
|
void Kernel::dissectScript(int scriptNumber, Vocabulary *vocab) {
|
2009-02-15 22:28:50 +00:00
|
|
|
int objectctr[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
|
|
|
unsigned int _seeker = 0;
|
2009-09-02 12:02:37 +00:00
|
|
|
Resource *script = _resMan->findResource(ResourceId(kResourceTypeScript, scriptNumber), 0);
|
2009-02-15 22:28:50 +00:00
|
|
|
|
|
|
|
if (!script) {
|
2009-07-06 10:39:22 +00:00
|
|
|
warning("dissectScript(): Script not found!\n");
|
2009-02-15 22:28:50 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
while (_seeker < script->size) {
|
2009-03-07 16:14:20 +00:00
|
|
|
int objtype = (int16)READ_LE_UINT16(script->data + _seeker);
|
2009-02-15 22:28:50 +00:00
|
|
|
int objsize;
|
|
|
|
unsigned int seeker = _seeker + 4;
|
|
|
|
|
|
|
|
if (!objtype) {
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("End of script object (#0) encountered.\n");
|
|
|
|
printf("Classes: %i, Objects: %i, Export: %i,\n Var: %i (all base 10)",
|
2009-02-15 22:28:50 +00:00
|
|
|
objectctr[6], objectctr[1], objectctr[7], objectctr[10]);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("\n");
|
2009-02-15 22:28:50 +00:00
|
|
|
|
2009-03-07 16:14:20 +00:00
|
|
|
objsize = (int16)READ_LE_UINT16(script->data + _seeker + 2);
|
2009-02-15 22:28:50 +00:00
|
|
|
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Obj type #%x, size 0x%x: ", objtype, objsize);
|
2009-02-15 22:28:50 +00:00
|
|
|
|
|
|
|
_seeker += objsize;
|
|
|
|
|
|
|
|
objectctr[objtype]++;
|
|
|
|
|
|
|
|
switch (objtype) {
|
2009-05-14 23:09:30 +00:00
|
|
|
case SCI_OBJ_OBJECT:
|
2009-05-31 14:55:32 +00:00
|
|
|
dumpScriptObject((char *)script->data, seeker, objsize);
|
2009-02-15 22:28:50 +00:00
|
|
|
break;
|
|
|
|
|
2009-05-14 23:09:30 +00:00
|
|
|
case SCI_OBJ_CODE: {
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Code\n");
|
2009-05-12 07:21:44 +00:00
|
|
|
Common::hexdump(script->data + seeker, objsize - 4, 16, seeker);
|
2009-02-15 22:28:50 +00:00
|
|
|
};
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 3: {
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("<unknown>\n");
|
2009-05-12 07:21:44 +00:00
|
|
|
Common::hexdump(script->data + seeker, objsize - 4, 16, seeker);
|
2009-02-15 22:28:50 +00:00
|
|
|
};
|
|
|
|
break;
|
|
|
|
|
2009-05-14 23:09:30 +00:00
|
|
|
case SCI_OBJ_SAID: {
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Said\n");
|
2009-05-12 07:21:44 +00:00
|
|
|
Common::hexdump(script->data + seeker, objsize - 4, 16, seeker);
|
2009-02-15 22:28:50 +00:00
|
|
|
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("%04x: ", seeker);
|
2009-02-15 22:28:50 +00:00
|
|
|
while (seeker < _seeker) {
|
|
|
|
unsigned char nextitem = script->data [seeker++];
|
|
|
|
if (nextitem == 0xFF)
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("\n%04x: ", seeker);
|
2009-02-15 22:28:50 +00:00
|
|
|
else if (nextitem >= 0xF0) {
|
|
|
|
switch (nextitem) {
|
|
|
|
case 0xf0:
|
2009-07-06 10:39:22 +00:00
|
|
|
printf(", ");
|
2009-02-15 22:28:50 +00:00
|
|
|
break;
|
|
|
|
case 0xf1:
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("& ");
|
2009-02-15 22:28:50 +00:00
|
|
|
break;
|
|
|
|
case 0xf2:
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("/ ");
|
2009-02-15 22:28:50 +00:00
|
|
|
break;
|
|
|
|
case 0xf3:
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("( ");
|
2009-02-15 22:28:50 +00:00
|
|
|
break;
|
|
|
|
case 0xf4:
|
2009-07-06 10:39:22 +00:00
|
|
|
printf(") ");
|
2009-02-15 22:28:50 +00:00
|
|
|
break;
|
|
|
|
case 0xf5:
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("[ ");
|
2009-02-15 22:28:50 +00:00
|
|
|
break;
|
|
|
|
case 0xf6:
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("] ");
|
2009-02-15 22:28:50 +00:00
|
|
|
break;
|
|
|
|
case 0xf7:
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("# ");
|
2009-02-15 22:28:50 +00:00
|
|
|
break;
|
|
|
|
case 0xf8:
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("< ");
|
2009-02-15 22:28:50 +00:00
|
|
|
break;
|
|
|
|
case 0xf9:
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("> ");
|
2009-02-15 22:28:50 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
nextitem = nextitem << 8 | script->data [seeker++];
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("%s[%03x] ", vocab->getAnyWordFromGroup(nextitem), nextitem);
|
2009-02-15 22:28:50 +00:00
|
|
|
}
|
|
|
|
}
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("\n");
|
2009-02-15 22:28:50 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2009-05-14 23:09:30 +00:00
|
|
|
case SCI_OBJ_STRINGS: {
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Strings\n");
|
2009-02-15 22:28:50 +00:00
|
|
|
while (script->data [seeker]) {
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("%04x: %s\n", seeker, script->data + seeker);
|
2009-02-21 12:42:06 +00:00
|
|
|
seeker += strlen((char *)script->data + seeker) + 1;
|
2009-02-15 22:28:50 +00:00
|
|
|
}
|
2009-02-21 12:42:06 +00:00
|
|
|
seeker++; // the ending zero byte
|
2009-02-15 22:28:50 +00:00
|
|
|
};
|
|
|
|
break;
|
|
|
|
|
2009-05-14 23:09:30 +00:00
|
|
|
case SCI_OBJ_CLASS:
|
2009-05-31 14:55:32 +00:00
|
|
|
dumpScriptClass((char *)script->data, seeker, objsize);
|
2009-02-15 22:28:50 +00:00
|
|
|
break;
|
|
|
|
|
2009-05-14 23:09:30 +00:00
|
|
|
case SCI_OBJ_EXPORTS: {
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Exports\n");
|
2009-05-12 07:21:44 +00:00
|
|
|
Common::hexdump((unsigned char *)script->data + seeker, objsize - 4, 16, seeker);
|
2009-02-15 22:28:50 +00:00
|
|
|
};
|
|
|
|
break;
|
|
|
|
|
2009-05-14 23:09:30 +00:00
|
|
|
case SCI_OBJ_POINTERS: {
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Pointers\n");
|
2009-05-12 07:21:44 +00:00
|
|
|
Common::hexdump(script->data + seeker, objsize - 4, 16, seeker);
|
2009-02-15 22:28:50 +00:00
|
|
|
};
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 9: {
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("<unknown>\n");
|
2009-05-12 07:21:44 +00:00
|
|
|
Common::hexdump(script->data + seeker, objsize - 4, 16, seeker);
|
2009-02-15 22:28:50 +00:00
|
|
|
};
|
|
|
|
break;
|
|
|
|
|
2009-05-14 23:09:30 +00:00
|
|
|
case SCI_OBJ_LOCALVARS: {
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Local vars\n");
|
2009-05-12 07:21:44 +00:00
|
|
|
Common::hexdump(script->data + seeker, objsize - 4, 16, seeker);
|
2009-02-15 22:28:50 +00:00
|
|
|
};
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Unsupported!\n");
|
2009-02-15 22:28:50 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Script ends without terminator\n");
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
2009-02-21 10:23:36 +00:00
|
|
|
|
|
|
|
} // End of namespace Sci
|