From 6fe95780d358f2d7854c342448eb61159f267656 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sat, 12 Mar 2011 23:43:29 +0100 Subject: SCI: Continue disasm until no jumps go past the current opcode This should ensure disasm will disassemble an entire function, and not stop at an intermediate ret opcode. --- engines/sci/engine/scriptdebug.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'engines/sci/engine') diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 184f81bb99..76490217c3 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -281,6 +281,35 @@ reg_t disassemble(EngineState *s, reg_t pos, bool printBWTag, bool printBytecode return retval; } +bool isJumpOpcode(EngineState *s, reg_t pos, reg_t& jumpTarget) +{ + SegmentObj *mobj = s->_segMan->getSegment(pos.segment, SEG_TYPE_SCRIPT); + if (!mobj) + return false; + Script *script_entity = (Script *)mobj; + + const byte *scr = script_entity->getBuf(); + int scr_size = script_entity->getBufSize(); + + if (pos.offset >= scr_size) + return false; + + int16 opparams[4]; + byte opsize; + int bytecount = readPMachineInstruction(scr + pos.offset, opsize, opparams); + const byte opcode = opsize >> 1; + + switch (opcode) { + case op_bt: + case op_bnt: + case op_jmp: + jumpTarget = pos + bytecount + opparams[0]; + return true; + default: + return false; + } +} + void SciEngine::scriptDebug() { EngineState *s = _gamestate; -- cgit v1.2.3