aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine
diff options
context:
space:
mode:
authorMartin Kiewitz2010-08-03 19:06:40 +0000
committerMartin Kiewitz2010-08-03 19:06:40 +0000
commitfcede4680a03e4f7a389a43f71d1484794e8dead (patch)
tree04ced1e4a233dd6f4022caf6221c5e7221e51633 /engines/sci/engine
parent449927abcf3c7c5b7346b6483375f19150ebc3bd (diff)
downloadscummvm-rg350-fcede4680a03e4f7a389a43f71d1484794e8dead.tar.gz
scummvm-rg350-fcede4680a03e4f7a389a43f71d1484794e8dead.tar.bz2
scummvm-rg350-fcede4680a03e4f7a389a43f71d1484794e8dead.zip
SCI: adding bpk debug command
currently removing or listing such breakpoints is not yet supported svn-id: r51710
Diffstat (limited to 'engines/sci/engine')
-rw-r--r--engines/sci/engine/kernel.cpp33
-rw-r--r--engines/sci/engine/kernel.h6
-rw-r--r--engines/sci/engine/vm.cpp10
3 files changed, 39 insertions, 10 deletions
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index e702002199..25502100ae 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -656,7 +656,7 @@ void Kernel::mapFunctions() {
return;
}
-bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) {
+bool Kernel::debugSetFunction(const char *kernelName, int logging, int breakpoint) {
if (strcmp(kernelName, "*")) {
for (uint id = 0; id < _kernelFuncs.size(); id++) {
if (_kernelFuncs[id].name) {
@@ -666,14 +666,21 @@ bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) {
KernelSubFunction *kernelSubCall = _kernelFuncs[id].subFunctions;
uint kernelSubCallCount = _kernelFuncs[id].subFunctionCount;
for (uint subId = 0; subId < kernelSubCallCount; subId++) {
- if (kernelSubCall->function)
- kernelSubCall->debugLogging = logging;
+ if (kernelSubCall->function) {
+ if (logging != -1)
+ kernelSubCall->debugLogging = logging == 1 ? true : false;
+ if (breakpoint != -1)
+ kernelSubCall->debugBreakpoint = breakpoint == 1 ? true : false;
+ }
kernelSubCall++;
}
return true;
}
// function name matched, set for this one and exit
- _kernelFuncs[id].debugLogging = logging;
+ if (logging != -1)
+ _kernelFuncs[id].debugLogging = logging == 1 ? true : false;
+ if (breakpoint != -1)
+ _kernelFuncs[id].debugBreakpoint = breakpoint == 1 ? true : false;
return true;
} else {
// main name was not matched
@@ -685,7 +692,10 @@ bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) {
if (kernelSubCall->function) {
if (strcmp(kernelName, kernelSubCall->name) == 0) {
// sub-function name matched, set for this one and exit
- kernelSubCall->debugLogging = logging;
+ if (logging != -1)
+ kernelSubCall->debugLogging = logging == 1 ? true : false;
+ if (breakpoint != -1)
+ kernelSubCall->debugBreakpoint = breakpoint == 1 ? true : false;
return true;
}
}
@@ -702,14 +712,21 @@ bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) {
if (_kernelFuncs[id].name) {
if (!_kernelFuncs[id].subFunctions) {
// No sub-functions, enable actual kernel function
- _kernelFuncs[id].debugLogging = logging;
+ if (logging != -1)
+ _kernelFuncs[id].debugLogging = logging == 1 ? true : false;
+ if (breakpoint != -1)
+ _kernelFuncs[id].debugBreakpoint = breakpoint == 1 ? true : false;
} else {
// Sub-Functions available, enable those too
KernelSubFunction *kernelSubCall = _kernelFuncs[id].subFunctions;
uint kernelSubCallCount = _kernelFuncs[id].subFunctionCount;
for (uint subId = 0; subId < kernelSubCallCount; subId++) {
- if (kernelSubCall->function)
- kernelSubCall->debugLogging = logging;
+ if (kernelSubCall->function) {
+ if (logging != -1)
+ kernelSubCall->debugLogging = logging == 1 ? true : false;
+ if (breakpoint != -1)
+ kernelSubCall->debugBreakpoint = breakpoint == 1 ? true : false;
+ }
kernelSubCall++;
}
}
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index 02ce102f30..b6247b46f1 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -127,6 +127,7 @@ struct KernelSubFunction {
uint16 *signature;
const SciWorkaroundEntry *workarounds;
bool debugLogging;
+ bool debugBreakpoint;
};
struct KernelFunction {
@@ -137,6 +138,7 @@ struct KernelFunction {
KernelSubFunction *subFunctions;
uint16 subFunctionCount;
bool debugLogging;
+ bool debugBreakpoint;
};
class Kernel {
@@ -218,9 +220,9 @@ public:
void loadKernelNames(GameFeatures *features);
/**
- * Sets debugCalls flag for a kernel function
+ * Sets debug flags for a kernel function
*/
- bool debugSetFunctionLogging(const char *kernelName, bool debugCalls);
+ bool debugSetFunction(const char *kernelName, int logging, int breakpoint);
private:
/**
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index c25e26dc2c..c6e8b3e2dd 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -743,6 +743,11 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) {
if (kernelCall.debugLogging)
logKernelCall(&kernelCall, NULL, s, argc, argv, s->r_acc);
+ if (kernelCall.debugBreakpoint) {
+ printf("Break on k%s\n", kernelCall.name);
+ g_sci->_debugState.debugging = true;
+ g_sci->_debugState.breakpointWasHit = true;
+ }
} else {
// Sub-functions available, check signature and call that one directly
if (argc < 1)
@@ -793,6 +798,11 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) {
if (kernelSubCall.debugLogging)
logKernelCall(&kernelCall, &kernelSubCall, s, argc, argv, s->r_acc);
+ if (kernelSubCall.debugBreakpoint) {
+ printf("Break on k%s\n", kernelSubCall.name);
+ g_sci->_debugState.debugging = true;
+ g_sci->_debugState.breakpointWasHit = true;
+ }
}
// Remove callk stack frame again, if there's still an execution stack