diff options
author | Martin Kiewitz | 2017-02-23 23:54:45 +0100 |
---|---|---|
committer | Martin Kiewitz | 2017-02-23 23:54:45 +0100 |
commit | 9dd0cd51d5b243700ccbd154e1d91ddb84c307c2 (patch) | |
tree | 5fa0a22dc13b07840d5495d0fec99f3d1a38c0ee /engines/agi/console.cpp | |
parent | 5fa728371f9d01f9fb268596d961ad841825a456 (diff) | |
download | scummvm-rg350-9dd0cd51d5b243700ccbd154e1d91ddb84c307c2.tar.gz scummvm-rg350-9dd0cd51d5b243700ccbd154e1d91ddb84c307c2.tar.bz2 scummvm-rg350-9dd0cd51d5b243700ccbd154e1d91ddb84c307c2.zip |
AGI: Clean up VM opcode handling
so that invalid opcodes won't crash ScummVM anymore
Diffstat (limited to 'engines/agi/console.cpp')
-rw-r--r-- | engines/agi/console.cpp | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/engines/agi/console.cpp b/engines/agi/console.cpp index 9a4a357b44..3729cd3be6 100644 --- a/engines/agi/console.cpp +++ b/engines/agi/console.cpp @@ -94,16 +94,18 @@ bool Console::Cmd_SetObj(int argc, const char **argv) { } bool Console::Cmd_RunOpcode(int argc, const char **argv) { + const AgiOpCodeEntry *opCodes = _vm->getOpCodesTable(); + if (argc < 2) { debugPrintf("Usage: runopcode <name> <parameter0> ....\n"); return true; } - for (int i = 0; logicNamesCmd[i].name; i++) { - if (!strcmp(argv[1], logicNamesCmd[i].name)) { + for (int i = 0; opCodes[i].name; i++) { + if (!strcmp(argv[1], opCodes[i].name)) { uint8 p[16]; - if ((argc - 2) != logicNamesCmd[i].argumentsLength()) { - debugPrintf("AGI command wants %d arguments\n", logicNamesCmd[i].argumentsLength()); + if ((argc - 2) != opCodes[i].parameterSize) { + debugPrintf("AGI command wants %d arguments\n", opCodes[i].parameterSize); return 0; } p[0] = argv[2] ? (char)strtoul(argv[2], NULL, 0) : 0; @@ -112,7 +114,7 @@ bool Console::Cmd_RunOpcode(int argc, const char **argv) { p[3] = argv[5] ? (char)strtoul(argv[5], NULL, 0) : 0; p[4] = argv[6] ? (char)strtoul(argv[6], NULL, 0) : 0; - debugC(5, kDebugLevelMain, "Opcode: %s %s %s %s", logicNamesCmd[i].name, argv[1], argv[2], argv[3]); + debugC(5, kDebugLevelMain, "Opcode: %s %s %s %s", opCodes[i].name, argv[1], argv[2], argv[3]); _vm->executeAgiCommand(i, p); @@ -392,24 +394,26 @@ bool Console::Cmd_Room(int argc, const char **argv) { } bool Console::Cmd_BT(int argc, const char **argv) { + const AgiOpCodeEntry *opCodes = _vm->getOpCodesTable(); + debugPrintf("Current script: %d\nStack depth: %d\n", _vm->_game.curLogicNr, _vm->_game.execStack.size()); uint8 *code = NULL; uint8 op = 0; uint8 p[CMD_BSIZE] = { 0 }; - int num; + int parameterSize; Common::Array<ScriptPos>::iterator it; for (it = _vm->_game.execStack.begin(); it != _vm->_game.execStack.end(); ++it) { code = _vm->_game.logics[it->script].data; op = code[it->curIP]; - num = logicNamesCmd[op].argumentsLength(); - memmove(p, &code[it->curIP], num); - memset(p + num, 0, CMD_BSIZE - num); + parameterSize = opCodes[op].parameterSize; + memmove(p, &code[it->curIP], parameterSize); + memset(p + parameterSize, 0, CMD_BSIZE - parameterSize); - debugPrintf("%d(%d): %s(", it->script, it->curIP, logicNamesCmd[op].name); + debugPrintf("%d(%d): %s(", it->script, it->curIP, opCodes[op].name); - for (int i = 0; i < num; i++) + for (int i = 0; i < parameterSize; i++) debugPrintf("%d, ", p[i]); debugPrintf(")\n"); |