mirror of https://github.com/mgba-emu/mgba.git
Add n command, and command repetition
This commit is contained in:
parent
4df2d6de8f
commit
baad7b50bd
|
@ -29,6 +29,7 @@ typedef void (DebuggerComamnd)(struct ARMDebugger*, struct DebugVector*);
|
||||||
|
|
||||||
static void _breakInto(struct ARMDebugger*, struct DebugVector*);
|
static void _breakInto(struct ARMDebugger*, struct DebugVector*);
|
||||||
static void _continue(struct ARMDebugger*, struct DebugVector*);
|
static void _continue(struct ARMDebugger*, struct DebugVector*);
|
||||||
|
static void _next(struct ARMDebugger*, struct DebugVector*);
|
||||||
static void _print(struct ARMDebugger*, struct DebugVector*);
|
static void _print(struct ARMDebugger*, struct DebugVector*);
|
||||||
static void _printHex(struct ARMDebugger*, struct DebugVector*);
|
static void _printHex(struct ARMDebugger*, struct DebugVector*);
|
||||||
static void _printStatus(struct ARMDebugger*, struct DebugVector*);
|
static void _printStatus(struct ARMDebugger*, struct DebugVector*);
|
||||||
|
@ -45,6 +46,7 @@ struct {
|
||||||
{ "continue", _continue },
|
{ "continue", _continue },
|
||||||
{ "i", _printStatus },
|
{ "i", _printStatus },
|
||||||
{ "info", _printStatus },
|
{ "info", _printStatus },
|
||||||
|
{ "n", _next },
|
||||||
{ "p", _print },
|
{ "p", _print },
|
||||||
{ "print", _print },
|
{ "print", _print },
|
||||||
{ "p/x", _printHex },
|
{ "p/x", _printHex },
|
||||||
|
@ -88,6 +90,12 @@ static void _continue(struct ARMDebugger* debugger, struct DebugVector* dv) {
|
||||||
debugger->state = DEBUGGER_RUNNING;
|
debugger->state = DEBUGGER_RUNNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _next(struct ARMDebugger* debugger, struct DebugVector* dv) {
|
||||||
|
(void)(dv);
|
||||||
|
ARMRun(debugger->cpu);
|
||||||
|
_printStatus(debugger, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void _print(struct ARMDebugger* debugger, struct DebugVector* dv) {
|
static void _print(struct ARMDebugger* debugger, struct DebugVector* dv) {
|
||||||
(void)(debugger);
|
(void)(debugger);
|
||||||
for ( ; dv; dv = dv->next) {
|
for ( ; dv; dv = dv->next) {
|
||||||
|
@ -413,7 +421,7 @@ static void _DVFree(struct DebugVector* dv) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _parse(struct ARMDebugger* debugger, const char* line) {
|
static int _parse(struct ARMDebugger* debugger, const char* line) {
|
||||||
char* firstSpace = strchr(line, ' ');
|
char* firstSpace = strchr(line, ' ');
|
||||||
size_t cmdLength;
|
size_t cmdLength;
|
||||||
struct DebugVector* dv = 0;
|
struct DebugVector* dv = 0;
|
||||||
|
@ -423,7 +431,7 @@ static void _parse(struct ARMDebugger* debugger, const char* line) {
|
||||||
if (dv->type == ERROR_TYPE) {
|
if (dv->type == ERROR_TYPE) {
|
||||||
printf("Parse error\n");
|
printf("Parse error\n");
|
||||||
_DVFree(dv);
|
_DVFree(dv);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
cmdLength = strlen(line);
|
cmdLength = strlen(line);
|
||||||
|
@ -438,13 +446,12 @@ static void _parse(struct ARMDebugger* debugger, const char* line) {
|
||||||
if (strncasecmp(name, line, cmdLength) == 0) {
|
if (strncasecmp(name, line, cmdLength) == 0) {
|
||||||
debuggerCommands[i].command(debugger, dv);
|
debuggerCommands[i].command(debugger, dv);
|
||||||
_DVFree(dv);
|
_DVFree(dv);
|
||||||
linenoiseHistoryAdd(line);
|
return 1;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_DVFree(dv);
|
_DVFree(dv);
|
||||||
ARMRun(debugger->cpu);
|
printf("Command not found\n");
|
||||||
_printStatus(debugger, 0);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _commandLine(struct ARMDebugger* debugger) {
|
static void _commandLine(struct ARMDebugger* debugger) {
|
||||||
|
@ -456,8 +463,20 @@ static void _commandLine(struct ARMDebugger* debugger) {
|
||||||
debugger->state = DEBUGGER_EXITING;
|
debugger->state = DEBUGGER_EXITING;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_parse(debugger, line);
|
if (!line[0]) {
|
||||||
free(line);
|
if (debugger->lastCommand) {
|
||||||
|
_parse(debugger, debugger->lastCommand);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
linenoiseHistoryAdd(line);
|
||||||
|
if (_parse(debugger, line)) {
|
||||||
|
char* oldLine = debugger->lastCommand;
|
||||||
|
debugger->lastCommand = line;
|
||||||
|
free(oldLine);
|
||||||
|
} else {
|
||||||
|
free(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ enum DebuggerState {
|
||||||
struct ARMDebugger {
|
struct ARMDebugger {
|
||||||
enum DebuggerState state;
|
enum DebuggerState state;
|
||||||
struct ARMCore* cpu;
|
struct ARMCore* cpu;
|
||||||
|
|
||||||
|
char* lastCommand;
|
||||||
};
|
};
|
||||||
|
|
||||||
void ARMDebuggerInit(struct ARMDebugger*, struct ARMCore*);
|
void ARMDebuggerInit(struct ARMDebugger*, struct ARMCore*);
|
||||||
|
|
Loading…
Reference in New Issue