mirror of
https://github.com/dingusdev/dingusppc.git
synced 2025-01-02 21:30:40 +00:00
debugger: Auto increment after disassemble.
Pressing return after disassembling some instructions should cause the next instruction to disassemble.
This commit is contained in:
parent
619579bee3
commit
7866675a55
@ -108,7 +108,7 @@ static void show_help() {
|
|||||||
|
|
||||||
#ifdef ENABLE_68K_DEBUGGER
|
#ifdef ENABLE_68K_DEBUGGER
|
||||||
|
|
||||||
static void disasm_68k(uint32_t count, uint32_t address) {
|
static uint32_t disasm_68k(uint32_t count, uint32_t address) {
|
||||||
csh cs_handle;
|
csh cs_handle;
|
||||||
uint8_t code[10];
|
uint8_t code[10];
|
||||||
size_t code_size;
|
size_t code_size;
|
||||||
@ -116,7 +116,7 @@ static void disasm_68k(uint32_t count, uint32_t address) {
|
|||||||
|
|
||||||
if (cs_open(CS_ARCH_M68K, CS_MODE_M68K_040, &cs_handle) != CS_ERR_OK) {
|
if (cs_open(CS_ARCH_M68K, CS_MODE_M68K_040, &cs_handle) != CS_ERR_OK) {
|
||||||
cout << "Capstone initialization error" << endl;
|
cout << "Capstone initialization error" << endl;
|
||||||
return;
|
return address;
|
||||||
}
|
}
|
||||||
|
|
||||||
cs_insn* insn = cs_malloc(cs_handle);
|
cs_insn* insn = cs_malloc(cs_handle);
|
||||||
@ -154,6 +154,7 @@ print_bin:
|
|||||||
|
|
||||||
cs_free(insn, 1);
|
cs_free(insn, 1);
|
||||||
cs_close(&cs_handle);
|
cs_close(&cs_handle);
|
||||||
|
return address;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* emulator opcode table size --> 512 KB */
|
/* emulator opcode table size --> 512 KB */
|
||||||
@ -331,7 +332,7 @@ static void dump_mem(string& params) {
|
|||||||
cout << endl << endl;
|
cout << endl << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void disasm(uint32_t count, uint32_t address) {
|
static uint32_t disasm(uint32_t count, uint32_t address) {
|
||||||
PPCDisasmContext ctx;
|
PPCDisasmContext ctx;
|
||||||
|
|
||||||
ctx.instr_addr = address;
|
ctx.instr_addr = address;
|
||||||
@ -343,6 +344,7 @@ static void disasm(uint32_t count, uint32_t address) {
|
|||||||
cout << ": " << setfill('0') << setw(8) << right << uppercase << hex << ctx.instr_code;
|
cout << ": " << setfill('0') << setw(8) << right << uppercase << hex << ctx.instr_code;
|
||||||
cout << " " << disassemble_single(&ctx) << setfill(' ') << left << endl;
|
cout << " " << disassemble_single(&ctx) << setfill(' ') << left << endl;
|
||||||
}
|
}
|
||||||
|
return ctx.instr_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_gprs() {
|
static void print_gprs() {
|
||||||
@ -444,6 +446,9 @@ void enter_debugger() {
|
|||||||
int log_level, context;
|
int log_level, context;
|
||||||
size_t separator_pos;
|
size_t separator_pos;
|
||||||
bool did_message = false;
|
bool did_message = false;
|
||||||
|
uint32_t next_addr_ppc;
|
||||||
|
uint32_t next_addr_68k;
|
||||||
|
bool cmd_repeat;
|
||||||
|
|
||||||
unique_ptr<OfConfigUtils> ofnvram = unique_ptr<OfConfigUtils>(new OfConfigUtils);
|
unique_ptr<OfConfigUtils> ofnvram = unique_ptr<OfConfigUtils>(new OfConfigUtils);
|
||||||
|
|
||||||
@ -525,7 +530,8 @@ void enter_debugger() {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd.empty() && !last_cmd.empty()) {
|
cmd_repeat = cmd.empty() && !last_cmd.empty();
|
||||||
|
if (cmd_repeat) {
|
||||||
cmd = last_cmd;
|
cmd = last_cmd;
|
||||||
}
|
}
|
||||||
if (cmd == "help") {
|
if (cmd == "help") {
|
||||||
@ -672,10 +678,10 @@ void enter_debugger() {
|
|||||||
try {
|
try {
|
||||||
if (context == 2) {
|
if (context == 2) {
|
||||||
#ifdef ENABLE_68K_DEBUGGER
|
#ifdef ENABLE_68K_DEBUGGER
|
||||||
disasm_68k(inst_grab, addr);
|
next_addr_68k = disasm_68k(inst_grab, addr);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
disasm(inst_grab, addr);
|
next_addr_ppc = disasm(inst_grab, addr);
|
||||||
}
|
}
|
||||||
} catch (invalid_argument& exc) {
|
} catch (invalid_argument& exc) {
|
||||||
cout << exc.what() << endl;
|
cout << exc.what() << endl;
|
||||||
@ -685,14 +691,24 @@ void enter_debugger() {
|
|||||||
try {
|
try {
|
||||||
if (context == 2) {
|
if (context == 2) {
|
||||||
#ifdef ENABLE_68K_DEBUGGER
|
#ifdef ENABLE_68K_DEBUGGER
|
||||||
|
if (cmd_repeat) {
|
||||||
|
addr = next_addr_68k;
|
||||||
|
}
|
||||||
|
else {
|
||||||
addr_str = "R24";
|
addr_str = "R24";
|
||||||
addr = get_reg(addr_str);
|
addr = get_reg(addr_str) - 2;
|
||||||
disasm_68k(1, addr - 2);
|
}
|
||||||
|
next_addr_68k = disasm_68k(1, addr);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
|
if (cmd_repeat) {
|
||||||
|
addr = next_addr_ppc;
|
||||||
|
}
|
||||||
|
else {
|
||||||
addr_str = "PC";
|
addr_str = "PC";
|
||||||
addr = (uint32_t)get_reg(addr_str);
|
addr = (uint32_t)get_reg(addr_str);
|
||||||
disasm(1, addr);
|
}
|
||||||
|
next_addr_ppc = disasm(1, addr);
|
||||||
}
|
}
|
||||||
} catch (invalid_argument& exc) {
|
} catch (invalid_argument& exc) {
|
||||||
cout << exc.what() << endl;
|
cout << exc.what() << endl;
|
||||||
|
Loading…
Reference in New Issue
Block a user