mirror of https://github.com/bsnes-emu/bsnes.git
Uniform syntax for debugger input and output
This commit is contained in:
parent
bd7f8f2555
commit
e9b3a38171
112
Core/debugger.c
112
Core/debugger.c
|
@ -195,9 +195,9 @@ static lvalue_t debugger_evaluate_lvalue(GB_gameboy_t *gb, const char *string,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Registers
|
// Registers
|
||||||
if (string[0] == '$') {
|
if (string[0] != '$' && (string[0] < '0' || string[0] > '9')) {
|
||||||
if (length == 2) {
|
if (length == 1) {
|
||||||
switch (string[1]) {
|
switch (string[0]) {
|
||||||
case 'a': return (lvalue_t){LVALUE_REG_H, .register_address = &gb->registers[GB_REGISTER_AF]};
|
case 'a': return (lvalue_t){LVALUE_REG_H, .register_address = &gb->registers[GB_REGISTER_AF]};
|
||||||
case 'f': return (lvalue_t){LVALUE_REG_L, .register_address = &gb->registers[GB_REGISTER_AF]};
|
case 'f': return (lvalue_t){LVALUE_REG_L, .register_address = &gb->registers[GB_REGISTER_AF]};
|
||||||
case 'b': return (lvalue_t){LVALUE_REG_H, .register_address = &gb->registers[GB_REGISTER_BC]};
|
case 'b': return (lvalue_t){LVALUE_REG_H, .register_address = &gb->registers[GB_REGISTER_BC]};
|
||||||
|
@ -208,14 +208,14 @@ static lvalue_t debugger_evaluate_lvalue(GB_gameboy_t *gb, const char *string,
|
||||||
case 'l': return (lvalue_t){LVALUE_REG_L, .register_address = &gb->registers[GB_REGISTER_HL]};
|
case 'l': return (lvalue_t){LVALUE_REG_L, .register_address = &gb->registers[GB_REGISTER_HL]};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (length == 3) {
|
else if (length == 2) {
|
||||||
switch (string[1]) {
|
switch (string[0]) {
|
||||||
case 'a': if (string[2] == 'f') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_AF]};
|
case 'a': if (string[1] == 'f') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_AF]};
|
||||||
case 'b': if (string[2] == 'c') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_BC]};
|
case 'b': if (string[1] == 'c') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_BC]};
|
||||||
case 'd': if (string[2] == 'e') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_DE]};
|
case 'd': if (string[1] == 'e') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_DE]};
|
||||||
case 'h': if (string[2] == 'l') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_HL]};
|
case 'h': if (string[1] == 'l') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_HL]};
|
||||||
case 's': if (string[2] == 'p') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_SP]};
|
case 's': if (string[1] == 'p') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_SP]};
|
||||||
case 'p': if (string[2] == 'c') return (lvalue_t){LVALUE_REG16, .register_address = &gb->pc};
|
case 'p': if (string[1] == 'c') return (lvalue_t){LVALUE_REG16, .register_address = &gb->pc};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GB_log(gb, "Unknown register: %.*s\n", length, string);
|
GB_log(gb, "Unknown register: %.*s\n", length, string);
|
||||||
|
@ -318,9 +318,9 @@ uint16_t debugger_evaluate(GB_gameboy_t *gb, const char *string,
|
||||||
// Not an expression - must be a register or a literal
|
// Not an expression - must be a register or a literal
|
||||||
|
|
||||||
// Registers
|
// Registers
|
||||||
if (string[0] == '$') {
|
if (string[0] != '$' && (string[0] < '0' || string[0] > '9')) {
|
||||||
if (length == 2) {
|
if (length == 1) {
|
||||||
switch (string[1]) {
|
switch (string[0]) {
|
||||||
case 'a': return gb->registers[GB_REGISTER_AF] >> 8;
|
case 'a': return gb->registers[GB_REGISTER_AF] >> 8;
|
||||||
case 'f': return gb->registers[GB_REGISTER_AF] & 0xFF;
|
case 'f': return gb->registers[GB_REGISTER_AF] & 0xFF;
|
||||||
case 'b': return gb->registers[GB_REGISTER_BC] >> 8;
|
case 'b': return gb->registers[GB_REGISTER_BC] >> 8;
|
||||||
|
@ -331,27 +331,27 @@ uint16_t debugger_evaluate(GB_gameboy_t *gb, const char *string,
|
||||||
case 'l': return gb->registers[GB_REGISTER_HL] & 0xFF;
|
case 'l': return gb->registers[GB_REGISTER_HL] & 0xFF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (length == 3) {
|
else if (length == 2) {
|
||||||
switch (string[1]) {
|
switch (string[0]) {
|
||||||
case 'a': if (string[2] == 'f') return gb->registers[GB_REGISTER_AF];
|
case 'a': if (string[1] == 'f') return gb->registers[GB_REGISTER_AF];
|
||||||
case 'b': if (string[2] == 'c') return gb->registers[GB_REGISTER_BC];
|
case 'b': if (string[1] == 'c') return gb->registers[GB_REGISTER_BC];
|
||||||
case 'd': if (string[2] == 'e') return gb->registers[GB_REGISTER_DE];
|
case 'd': if (string[1] == 'e') return gb->registers[GB_REGISTER_DE];
|
||||||
case 'h': if (string[2] == 'l') return gb->registers[GB_REGISTER_HL];
|
case 'h': if (string[1] == 'l') return gb->registers[GB_REGISTER_HL];
|
||||||
case 's': if (string[2] == 'p') return gb->registers[GB_REGISTER_SP];
|
case 's': if (string[1] == 'p') return gb->registers[GB_REGISTER_SP];
|
||||||
case 'p': if (string[2] == 'c') return gb->pc;
|
case 'p': if (string[1] == 'c') return gb->pc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (length == 4) {
|
else if (length == 3) {
|
||||||
if (watchpoint_address && memcmp(string, "$old", 4) == 0) {
|
if (watchpoint_address && memcmp(string, "old", 3) == 0) {
|
||||||
return GB_read_memory(gb, *watchpoint_address);
|
return GB_read_memory(gb, *watchpoint_address);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (watchpoint_new_value && memcmp(string, "$new", 4) == 0) {
|
if (watchpoint_new_value && memcmp(string, "new", 3) == 0) {
|
||||||
return *watchpoint_new_value;
|
return *watchpoint_new_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* $new is identical to $old in read conditions */
|
/* $new is identical to $old in read conditions */
|
||||||
if (watchpoint_address && memcmp(string, "$new", 4) == 0) {
|
if (watchpoint_address && memcmp(string, "new", 3) == 0) {
|
||||||
return GB_read_memory(gb, *watchpoint_address);
|
return GB_read_memory(gb, *watchpoint_address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -361,7 +361,13 @@ uint16_t debugger_evaluate(GB_gameboy_t *gb, const char *string,
|
||||||
}
|
}
|
||||||
|
|
||||||
char *end;
|
char *end;
|
||||||
uint16_t literal = (uint16_t) (strtol(string, &end, 16));
|
int base = 10;
|
||||||
|
if (string[0] == '$') {
|
||||||
|
string++;
|
||||||
|
base = 16;
|
||||||
|
length--;
|
||||||
|
}
|
||||||
|
uint16_t literal = (uint16_t) (strtol(string, &end, base));
|
||||||
if (end != string + length) {
|
if (end != string + length) {
|
||||||
GB_log(gb, "Failed to parse: %.*s\n", length, string);
|
GB_log(gb, "Failed to parse: %.*s\n", length, string);
|
||||||
*error = true;
|
*error = true;
|
||||||
|
@ -453,12 +459,12 @@ static bool registers(GB_gameboy_t *gb, char *arguments)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
GB_log(gb, "AF = %04x\n", gb->registers[GB_REGISTER_AF]);
|
GB_log(gb, "AF = $%04x\n", gb->registers[GB_REGISTER_AF]);
|
||||||
GB_log(gb, "BC = %04x\n", gb->registers[GB_REGISTER_BC]);
|
GB_log(gb, "BC = $%04x\n", gb->registers[GB_REGISTER_BC]);
|
||||||
GB_log(gb, "DE = %04x\n", gb->registers[GB_REGISTER_DE]);
|
GB_log(gb, "DE = $%04x\n", gb->registers[GB_REGISTER_DE]);
|
||||||
GB_log(gb, "HL = %04x\n", gb->registers[GB_REGISTER_HL]);
|
GB_log(gb, "HL = $%04x\n", gb->registers[GB_REGISTER_HL]);
|
||||||
GB_log(gb, "SP = %04x\n", gb->registers[GB_REGISTER_SP]);
|
GB_log(gb, "SP = $%04x\n", gb->registers[GB_REGISTER_SP]);
|
||||||
GB_log(gb, "PC = %04x\n", gb->pc);
|
GB_log(gb, "PC = $%04x\n", gb->pc);
|
||||||
GB_log(gb, "TIMA = %d/%u\n", gb->io_registers[GB_IO_TIMA], gb->tima_cycles);
|
GB_log(gb, "TIMA = %d/%u\n", gb->io_registers[GB_IO_TIMA], gb->tima_cycles);
|
||||||
GB_log(gb, "Display Controller: LY = %d/%u\n", gb->io_registers[GB_IO_LY], gb->display_cycles % 456);
|
GB_log(gb, "Display Controller: LY = %d/%u\n", gb->io_registers[GB_IO_LY], gb->display_cycles % 456);
|
||||||
return true;
|
return true;
|
||||||
|
@ -510,7 +516,7 @@ static bool breakpoint(GB_gameboy_t *gb, char *arguments)
|
||||||
|
|
||||||
uint16_t index = find_breakpoint(gb, result);
|
uint16_t index = find_breakpoint(gb, result);
|
||||||
if (index < gb->n_breakpoints && gb->breakpoints[index].addr == result) {
|
if (index < gb->n_breakpoints && gb->breakpoints[index].addr == result) {
|
||||||
GB_log(gb, "Breakpoint already set at %04x\n", result);
|
GB_log(gb, "Breakpoint already set at $%04x\n", result);
|
||||||
if (!gb->breakpoints[index].condition && condition) {
|
if (!gb->breakpoints[index].condition && condition) {
|
||||||
GB_log(gb, "Added condition to breakpoint\n");
|
GB_log(gb, "Added condition to breakpoint\n");
|
||||||
gb->breakpoints[index].condition = strdup(condition);
|
gb->breakpoints[index].condition = strdup(condition);
|
||||||
|
@ -539,7 +545,7 @@ static bool breakpoint(GB_gameboy_t *gb, char *arguments)
|
||||||
}
|
}
|
||||||
gb->n_breakpoints++;
|
gb->n_breakpoints++;
|
||||||
|
|
||||||
GB_log(gb, "Breakpoint set at %04x\n", result);
|
GB_log(gb, "Breakpoint set at $%04x\n", result);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -568,7 +574,7 @@ static bool delete(GB_gameboy_t *gb, char *arguments)
|
||||||
|
|
||||||
uint16_t index = find_breakpoint(gb, result);
|
uint16_t index = find_breakpoint(gb, result);
|
||||||
if (index >= gb->n_breakpoints || gb->breakpoints[index].addr != result) {
|
if (index >= gb->n_breakpoints || gb->breakpoints[index].addr != result) {
|
||||||
GB_log(gb, "No breakpoint set at %04x\n", result);
|
GB_log(gb, "No breakpoint set at $%04x\n", result);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -580,7 +586,7 @@ static bool delete(GB_gameboy_t *gb, char *arguments)
|
||||||
gb->n_breakpoints--;
|
gb->n_breakpoints--;
|
||||||
gb->breakpoints = realloc(gb->breakpoints, gb->n_breakpoints * sizeof(gb->breakpoints[0]));
|
gb->breakpoints = realloc(gb->breakpoints, gb->n_breakpoints * sizeof(gb->breakpoints[0]));
|
||||||
|
|
||||||
GB_log(gb, "Breakpoint removed from %04x\n", result);
|
GB_log(gb, "Breakpoint removed from $%04x\n", result);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -653,7 +659,7 @@ print_usage:
|
||||||
|
|
||||||
uint16_t index = find_watchpoint(gb, result);
|
uint16_t index = find_watchpoint(gb, result);
|
||||||
if (index < gb->n_watchpoints && gb->watchpoints[index].addr == result) {
|
if (index < gb->n_watchpoints && gb->watchpoints[index].addr == result) {
|
||||||
GB_log(gb, "Watchpoint already set at %04x\n", result);
|
GB_log(gb, "Watchpoint already set at $%04x\n", result);
|
||||||
if (!gb->watchpoints[index].flags != flags) {
|
if (!gb->watchpoints[index].flags != flags) {
|
||||||
GB_log(gb, "Modified watchpoint type\n");
|
GB_log(gb, "Modified watchpoint type\n");
|
||||||
gb->watchpoints[index].flags = flags;
|
gb->watchpoints[index].flags = flags;
|
||||||
|
@ -687,7 +693,7 @@ print_usage:
|
||||||
}
|
}
|
||||||
gb->n_watchpoints++;
|
gb->n_watchpoints++;
|
||||||
|
|
||||||
GB_log(gb, "Watchpoint set at %04x\n", result);
|
GB_log(gb, "Watchpoint set at $%04x\n", result);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -716,7 +722,7 @@ static bool unwatch(GB_gameboy_t *gb, char *arguments)
|
||||||
|
|
||||||
uint16_t index = find_watchpoint(gb, result);
|
uint16_t index = find_watchpoint(gb, result);
|
||||||
if (index >= gb->n_watchpoints || gb->watchpoints[index].addr != result) {
|
if (index >= gb->n_watchpoints || gb->watchpoints[index].addr != result) {
|
||||||
GB_log(gb, "No watchpoint set at %04x\n", result);
|
GB_log(gb, "No watchpoint set at $%04x\n", result);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -728,7 +734,7 @@ static bool unwatch(GB_gameboy_t *gb, char *arguments)
|
||||||
gb->n_watchpoints--;
|
gb->n_watchpoints--;
|
||||||
gb->watchpoints = realloc(gb->watchpoints, gb->n_watchpoints* sizeof(gb->watchpoints[0]));
|
gb->watchpoints = realloc(gb->watchpoints, gb->n_watchpoints* sizeof(gb->watchpoints[0]));
|
||||||
|
|
||||||
GB_log(gb, "Watchpoint removed from %04x\n", result);
|
GB_log(gb, "Watchpoint removed from $%04x\n", result);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -746,10 +752,10 @@ static bool list(GB_gameboy_t *gb, char *arguments)
|
||||||
GB_log(gb, "%d breakpoint(s) set:\n", gb->n_breakpoints);
|
GB_log(gb, "%d breakpoint(s) set:\n", gb->n_breakpoints);
|
||||||
for (uint16_t i = 0; i < gb->n_breakpoints; i++) {
|
for (uint16_t i = 0; i < gb->n_breakpoints; i++) {
|
||||||
if (gb->breakpoints[i].condition) {
|
if (gb->breakpoints[i].condition) {
|
||||||
GB_log(gb, " %d. %04x (Condition: %s)\n", i + 1, gb->breakpoints[i].addr, gb->breakpoints[i].condition);
|
GB_log(gb, " %d. $%04x (Condition: %s)\n", i + 1, gb->breakpoints[i].addr, gb->breakpoints[i].condition);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
GB_log(gb, " %d. %04x\n", i + 1, gb->breakpoints[i].addr);
|
GB_log(gb, " %d. $%04x\n", i + 1, gb->breakpoints[i].addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -761,13 +767,13 @@ static bool list(GB_gameboy_t *gb, char *arguments)
|
||||||
GB_log(gb, "%d watchpoint(s) set:\n", gb->n_watchpoints);
|
GB_log(gb, "%d watchpoint(s) set:\n", gb->n_watchpoints);
|
||||||
for (uint16_t i = 0; i < gb->n_watchpoints; i++) {
|
for (uint16_t i = 0; i < gb->n_watchpoints; i++) {
|
||||||
if (gb->watchpoints[i].condition) {
|
if (gb->watchpoints[i].condition) {
|
||||||
GB_log(gb, " %d. %04x (%c%c, Condition: %s)\n", i + 1, gb->watchpoints[i].addr,
|
GB_log(gb, " %d. $%04x (%c%c, Condition: %s)\n", i + 1, gb->watchpoints[i].addr,
|
||||||
(gb->watchpoints[i].flags & GB_WATCHPOINT_R)? 'r' : '-',
|
(gb->watchpoints[i].flags & GB_WATCHPOINT_R)? 'r' : '-',
|
||||||
(gb->watchpoints[i].flags & GB_WATCHPOINT_W)? 'w' : '-',
|
(gb->watchpoints[i].flags & GB_WATCHPOINT_W)? 'w' : '-',
|
||||||
gb->watchpoints[i].condition);
|
gb->watchpoints[i].condition);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
GB_log(gb, " %d. %04x (%c%c)\n", i + 1, gb->watchpoints[i].addr,
|
GB_log(gb, " %d. $%04x (%c%c)\n", i + 1, gb->watchpoints[i].addr,
|
||||||
(gb->watchpoints[i].flags & GB_WATCHPOINT_R)? 'r' : '-',
|
(gb->watchpoints[i].flags & GB_WATCHPOINT_R)? 'r' : '-',
|
||||||
(gb->watchpoints[i].flags & GB_WATCHPOINT_W)? 'w' : '-');
|
(gb->watchpoints[i].flags & GB_WATCHPOINT_W)? 'w' : '-');
|
||||||
}
|
}
|
||||||
|
@ -807,7 +813,7 @@ static bool print(GB_gameboy_t *gb, char *arguments)
|
||||||
bool error;
|
bool error;
|
||||||
uint16_t result = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL);
|
uint16_t result = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
GB_log(gb, "=%04x\n", result);
|
GB_log(gb, "=$%04x\n", result);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -959,8 +965,8 @@ void GB_debugger_ret_hook(GB_gameboy_t *gb)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (gb->registers[GB_REGISTER_SP] != gb->sp_for_call_depth[gb->debug_call_depth]) {
|
if (gb->registers[GB_REGISTER_SP] != gb->sp_for_call_depth[gb->debug_call_depth]) {
|
||||||
GB_log(gb, "Stack leak detected for function %04x!\n", gb->addr_for_call_depth[gb->debug_call_depth]);
|
GB_log(gb, "Stack leak detected for function $%04x!\n", gb->addr_for_call_depth[gb->debug_call_depth]);
|
||||||
GB_log(gb, "SP is %04x, should be %04x.\n", gb->registers[GB_REGISTER_SP],
|
GB_log(gb, "SP is $%04x, should be $%04x.\n", gb->registers[GB_REGISTER_SP],
|
||||||
gb->sp_for_call_depth[gb->debug_call_depth]);
|
gb->sp_for_call_depth[gb->debug_call_depth]);
|
||||||
gb->debug_stopped = true;
|
gb->debug_stopped = true;
|
||||||
}
|
}
|
||||||
|
@ -977,7 +983,7 @@ void GB_debugger_test_write_watchpoint(GB_gameboy_t *gb, uint16_t addr, uint8_t
|
||||||
}
|
}
|
||||||
if (!gb->watchpoints[index].condition) {
|
if (!gb->watchpoints[index].condition) {
|
||||||
gb->debug_stopped = true;
|
gb->debug_stopped = true;
|
||||||
GB_log(gb, "Watchpoint: [%04x] = %02x\n", addr, value);
|
GB_log(gb, "Watchpoint: [$%04x] = $%02x\n", addr, value);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bool error;
|
bool error;
|
||||||
|
@ -990,7 +996,7 @@ void GB_debugger_test_write_watchpoint(GB_gameboy_t *gb, uint16_t addr, uint8_t
|
||||||
}
|
}
|
||||||
if (condition) {
|
if (condition) {
|
||||||
gb->debug_stopped = true;
|
gb->debug_stopped = true;
|
||||||
GB_log(gb, "Watchpoint: [%04x] = %02x\n", addr, value);
|
GB_log(gb, "Watchpoint: [$%04x] = $%02x\n", addr, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1004,7 +1010,7 @@ void GB_debugger_test_read_watchpoint(GB_gameboy_t *gb, uint16_t addr)
|
||||||
}
|
}
|
||||||
if (!gb->watchpoints[index].condition) {
|
if (!gb->watchpoints[index].condition) {
|
||||||
gb->debug_stopped = true;
|
gb->debug_stopped = true;
|
||||||
GB_log(gb, "Watchpoint: [%04x]\n", addr);
|
GB_log(gb, "Watchpoint: [$%04x]\n", addr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bool error;
|
bool error;
|
||||||
|
@ -1017,7 +1023,7 @@ void GB_debugger_test_read_watchpoint(GB_gameboy_t *gb, uint16_t addr)
|
||||||
}
|
}
|
||||||
if (condition) {
|
if (condition) {
|
||||||
gb->debug_stopped = true;
|
gb->debug_stopped = true;
|
||||||
GB_log(gb, "Watchpoint: [%04x]\n", addr);
|
GB_log(gb, "Watchpoint: [$%04x]\n", addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1040,7 +1046,7 @@ next_command:
|
||||||
}
|
}
|
||||||
if (!gb->debug_stopped && should_break(gb, gb->pc)) {
|
if (!gb->debug_stopped && should_break(gb, gb->pc)) {
|
||||||
gb->debug_stopped = true;
|
gb->debug_stopped = true;
|
||||||
GB_log(gb, "Breakpoint: PC = %04x\n", gb->pc);
|
GB_log(gb, "Breakpoint: PC = $%04x\n", gb->pc);
|
||||||
GB_cpu_disassemble(gb, gb->pc, 5);
|
GB_cpu_disassemble(gb, gb->pc, 5);
|
||||||
}
|
}
|
||||||
if (gb->debug_stopped) {
|
if (gb->debug_stopped) {
|
||||||
|
|
|
@ -9,7 +9,7 @@ typedef void GB_opcode_t(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc);
|
||||||
|
|
||||||
static void ill(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void ill(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
GB_log(gb, ".BYTE %02x\n", opcode);
|
GB_log(gb, ".BYTE $%02x\n", opcode);
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ static void ld_rr_d16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1;
|
register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1;
|
||||||
value = GB_read_memory(gb, (*pc)++);
|
value = GB_read_memory(gb, (*pc)++);
|
||||||
value |= GB_read_memory(gb, (*pc)++) << 8;
|
value |= GB_read_memory(gb, (*pc)++) << 8;
|
||||||
GB_log(gb, "LD %s, %04x\n", register_names[register_id], value);
|
GB_log(gb, "LD %s, $%04x\n", register_names[register_id], value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ld_drr_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void ld_drr_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
|
@ -72,7 +72,7 @@ static void ld_hr_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
uint8_t register_id;
|
uint8_t register_id;
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
register_id = ((opcode >> 4) + 1) & 0x03;
|
register_id = ((opcode >> 4) + 1) & 0x03;
|
||||||
GB_log(gb, "LD %c, %02x\n", register_names[register_id][0], GB_read_memory(gb, (*pc)++));
|
GB_log(gb, "LD %c, $%02x\n", register_names[register_id][0], GB_read_memory(gb, (*pc)++));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rlca(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void rlca(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
|
@ -92,7 +92,7 @@ static void ld_da16_sp(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc){
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
addr = GB_read_memory(gb, (*pc)++);
|
addr = GB_read_memory(gb, (*pc)++);
|
||||||
addr |= GB_read_memory(gb, (*pc)++) << 8;
|
addr |= GB_read_memory(gb, (*pc)++) << 8;
|
||||||
GB_log(gb, "LD [%04x], sp\n", addr);
|
GB_log(gb, "LD [$%04x], sp\n", addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_hl_rr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void add_hl_rr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
|
@ -137,7 +137,7 @@ static void ld_lr_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
uint8_t register_id;
|
uint8_t register_id;
|
||||||
register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1;
|
register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1;
|
||||||
|
|
||||||
GB_log(gb, "LD %c, %02x\n", register_names[register_id][1], GB_read_memory(gb, (*pc)++));
|
GB_log(gb, "LD %c, $%02x\n", register_names[register_id][1], GB_read_memory(gb, (*pc)++));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rrca(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void rrca(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
|
@ -155,7 +155,7 @@ static void rra(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
static void jr_r8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void jr_r8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_attributed_log(gb, GB_LOG_UNDERLINE, "JR %04x\n", *pc + (int8_t) GB_read_memory(gb, (*pc)) + 1);
|
GB_attributed_log(gb, GB_LOG_UNDERLINE, "JR $%04x\n", *pc + (int8_t) GB_read_memory(gb, (*pc)) + 1);
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,7 +178,7 @@ static const char *condition_code(uint8_t opcode)
|
||||||
static void jr_cc_r8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void jr_cc_r8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_attributed_log(gb, GB_LOG_DASHED_UNDERLINE, "JR %s, %04x\n", condition_code(opcode), *pc + (int8_t)GB_read_memory(gb, (*pc)) + 1);
|
GB_attributed_log(gb, GB_LOG_DASHED_UNDERLINE, "JR %s, $%04x\n", condition_code(opcode), *pc + (int8_t)GB_read_memory(gb, (*pc)) + 1);
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,7 +245,7 @@ static void dec_dhl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
static void ld_dhl_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void ld_dhl_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "LD [hl], %02x\n", GB_read_memory(gb, (*pc)++));
|
GB_log(gb, "LD [hl], $%02x\n", GB_read_memory(gb, (*pc)++));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *get_src_name(uint8_t opcode)
|
static const char *get_src_name(uint8_t opcode)
|
||||||
|
@ -356,21 +356,21 @@ static void pop_rr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
static void jp_cc_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void jp_cc_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_attributed_log(gb, GB_LOG_DASHED_UNDERLINE, "JP %s, %04x\n", condition_code(opcode), GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8));
|
GB_attributed_log(gb, GB_LOG_DASHED_UNDERLINE, "JP %s, $%04x\n", condition_code(opcode), GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8));
|
||||||
(*pc) += 2;
|
(*pc) += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void jp_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void jp_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "JP %04x\n", GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8));
|
GB_log(gb, "JP $%04x\n", GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8));
|
||||||
(*pc) += 2;
|
(*pc) += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void call_cc_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void call_cc_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "CALL %s, %04x\n", condition_code(opcode), GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8));
|
GB_log(gb, "CALL %s, $%04x\n", condition_code(opcode), GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8));
|
||||||
(*pc) += 2;
|
(*pc) += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,55 +384,55 @@ static void push_rr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
static void add_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void add_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "ADD %02x\n", GB_read_memory(gb, (*pc)++));
|
GB_log(gb, "ADD $%02x\n", GB_read_memory(gb, (*pc)++));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void adc_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void adc_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "ADC %02x\n", GB_read_memory(gb, (*pc)++));
|
GB_log(gb, "ADC $%02x\n", GB_read_memory(gb, (*pc)++));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sub_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void sub_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "SUB %02x\n", GB_read_memory(gb, (*pc)++));
|
GB_log(gb, "SUB $%02x\n", GB_read_memory(gb, (*pc)++));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sbc_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void sbc_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "LBC %02x\n", GB_read_memory(gb, (*pc)++));
|
GB_log(gb, "LBC $%02x\n", GB_read_memory(gb, (*pc)++));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void and_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void and_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "AND %02x\n", GB_read_memory(gb, (*pc)++));
|
GB_log(gb, "AND $%02x\n", GB_read_memory(gb, (*pc)++));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xor_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void xor_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "XOR %02x\n", GB_read_memory(gb, (*pc)++));
|
GB_log(gb, "XOR $%02x\n", GB_read_memory(gb, (*pc)++));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void or_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void or_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "OR %02x\n", GB_read_memory(gb, (*pc)++));
|
GB_log(gb, "OR $%02x\n", GB_read_memory(gb, (*pc)++));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cp_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void cp_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "CP %02x\n", GB_read_memory(gb, (*pc)++));
|
GB_log(gb, "CP $%02x\n", GB_read_memory(gb, (*pc)++));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rst(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void rst(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "RST %02x\n", opcode ^ 0xC7);
|
GB_log(gb, "RST $%02x\n", opcode ^ 0xC7);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -451,7 +451,7 @@ static void reti(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
static void call_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void call_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "CALL %04x\n", GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8));
|
GB_log(gb, "CALL $%04x\n", GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8));
|
||||||
(*pc) += 2;
|
(*pc) += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -459,14 +459,14 @@ static void ld_da8_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
uint8_t temp = GB_read_memory(gb, (*pc)++);
|
uint8_t temp = GB_read_memory(gb, (*pc)++);
|
||||||
GB_log(gb, "LDH [%02x], a\n", temp);
|
GB_log(gb, "LDH [$%02x], a\n", temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ld_a_da8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void ld_a_da8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
uint8_t temp = GB_read_memory(gb, (*pc)++);
|
uint8_t temp = GB_read_memory(gb, (*pc)++);
|
||||||
GB_log(gb, "LDH a, [%02x]\n", temp);
|
GB_log(gb, "LDH a, [$%02x]\n", temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ld_dc_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void ld_dc_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
|
@ -485,7 +485,7 @@ static void add_sp_r8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
int8_t temp = GB_read_memory(gb, (*pc)++);
|
int8_t temp = GB_read_memory(gb, (*pc)++);
|
||||||
GB_log(gb, "ADD SP, %s%02x\n", temp < 0? "-" : "", temp < 0? -temp : temp);
|
GB_log(gb, "ADD SP, %s$%02x\n", temp < 0? "-" : "", temp < 0? -temp : temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void jp_hl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void jp_hl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
|
@ -497,14 +497,14 @@ static void jp_hl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
static void ld_da16_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void ld_da16_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "LD [%04x], a\n", GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8));
|
GB_log(gb, "LD [$%04x], a\n", GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8));
|
||||||
(*pc) += 2;
|
(*pc) += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ld_a_da16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void ld_a_da16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
GB_log(gb, "LD a, [%04x]\n", GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8));
|
GB_log(gb, "LD a, [$%04x]\n", GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8));
|
||||||
(*pc) += 2;
|
(*pc) += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -524,7 +524,7 @@ static void ld_hl_sp_r8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
{
|
{
|
||||||
(*pc)++;
|
(*pc)++;
|
||||||
int8_t temp = GB_read_memory(gb, (*pc)++);
|
int8_t temp = GB_read_memory(gb, (*pc)++);
|
||||||
GB_log(gb, "LD hl, sp, %s%02x\n", temp < 0? "-" : "", temp < 0? -temp : temp);
|
GB_log(gb, "LD hl, sp, %s$%02x\n", temp < 0? "-" : "", temp < 0? -temp : temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ld_sp_hl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
static void ld_sp_hl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc)
|
||||||
|
|
Loading…
Reference in New Issue