aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine
diff options
context:
space:
mode:
authorColin Snover2017-07-22 12:20:46 -0500
committerColin Snover2017-07-23 10:35:13 -0500
commit8bab5a3467519fdfd8509b8250d12a97e4a2e02e (patch)
tree288c382d5391ee2b7dd49e62fd836d2ab97ec724 /engines/sci/engine
parent5b166a517303b076478f21b108e1109b07e1a322 (diff)
downloadscummvm-rg350-8bab5a3467519fdfd8509b8250d12a97e4a2e02e.tar.gz
scummvm-rg350-8bab5a3467519fdfd8509b8250d12a97e4a2e02e.tar.bz2
scummvm-rg350-8bab5a3467519fdfd8509b8250d12a97e4a2e02e.zip
SCI: Resolve offset names when disassembling object methods
Diffstat (limited to 'engines/sci/engine')
-rw-r--r--engines/sci/engine/scriptdebug.cpp31
1 files changed, 21 insertions, 10 deletions
diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp
index a15725e894..545aae6d30 100644
--- a/engines/sci/engine/scriptdebug.cpp
+++ b/engines/sci/engine/scriptdebug.cpp
@@ -81,7 +81,7 @@ void DebugState::updateActiveBreakpointTypes() {
}
// Disassembles one command from the heap, returns address of next command or 0 if a ret was encountered.
-reg_t disassemble(EngineState *s, reg32_t pos, reg_t objAddr, bool printBWTag, bool printBytecode) {
+reg_t disassemble(EngineState *s, reg32_t pos, const Object *obj, bool printBWTag, bool printBytecode) {
SegmentObj *mobj = s->_segMan->getSegment(pos.getSegment(), SEG_TYPE_SCRIPT);
Script *script_entity = NULL;
reg_t retval;
@@ -200,8 +200,7 @@ reg_t disassemble(EngineState *s, reg32_t pos, reg_t objAddr, bool printBWTag, b
debugN(opsize ? "\t%02x" : "\t%04x", param_value);
}
} else if (opcode == op_super) {
- Object *obj;
- if (objAddr != NULL_REG && (obj = s->_segMan->getObject(objAddr)) != nullptr) {
+ if (obj != nullptr) {
debugN("\t%s", s->_segMan->getObjectName(obj->getSuperClassSelector()));
debugN(opsize ? "[%02x]" : "[%04x]", param_value);
} else {
@@ -210,16 +209,28 @@ reg_t disassemble(EngineState *s, reg32_t pos, reg_t objAddr, bool printBWTag, b
debugN(",");
#ifdef ENABLE_SCI32
- } else if (getSciVersion() == SCI_VERSION_3 && (
+ } else if (
opcode == op_pToa || opcode == op_aTop ||
opcode == op_pTos || opcode == op_sTop ||
opcode == op_ipToa || opcode == op_dpToa ||
- opcode == op_ipTos || opcode == op_dpTos)) {
+ opcode == op_ipTos || opcode == op_dpTos) {
- const char *selectorName = "<invalid>";
+ const char *selectorName;
- if (param_value < kernel->getSelectorNamesSize()) {
- selectorName = kernel->getSelectorName(param_value).c_str();
+ if (getSciVersion() == SCI_VERSION_3) {
+ if (param_value < kernel->getSelectorNamesSize()) {
+ selectorName = kernel->getSelectorName(param_value).c_str();
+ } else {
+ selectorName = "<invalid>";
+ }
+ } else {
+ if (obj != nullptr) {
+ const Object *const super = obj->getClass(s->_segMan);
+ assert(super);
+ selectorName = kernel->getSelectorName(super->getVarSelector(param_value / 2)).c_str();
+ } else {
+ selectorName = "<unavailable>";
+ }
}
debugN("\t%s[%x]", selectorName, param_value);
@@ -290,7 +301,7 @@ reg_t disassemble(EngineState *s, reg32_t pos, reg_t objAddr, bool printBWTag, b
if (pos == s->xs->addr.pc) { // Extra information if debugging the current opcode
if ((opcode == op_pTos) || (opcode == op_sTop) || (opcode == op_pToa) || (opcode == op_aTop) ||
(opcode == op_dpToa) || (opcode == op_ipToa) || (opcode == op_dpTos) || (opcode == op_ipTos)) {
- const Object *obj = s->_segMan->getObject(s->xs->objp);
+ obj = s->_segMan->getObject(s->xs->objp);
if (!obj) {
warning("Attempted to reference on non-object at %04x:%04x", PRINT_REG(s->xs->objp));
} else {
@@ -479,7 +490,7 @@ void SciEngine::scriptDebug() {
}
debugN("Step #%d\n", s->scriptStepCounter);
- disassemble(s, s->xs->addr.pc, s->xs->objp, false, true);
+ disassemble(s, s->xs->addr.pc, s->_segMan->getObject(s->xs->objp), false, true);
if (_debugState.runningStep) {
_debugState.runningStep--;