diff options
author | Mike Pavone <pavone@retrodev.com> | 2014-02-09 12:35:27 -0800 |
---|---|---|
committer | Mike Pavone <pavone@retrodev.com> | 2014-02-09 12:35:27 -0800 |
commit | 57324b7ae6acb13034f6f23001c0ce306d9c2cf0 (patch) | |
tree | b54aeea0e91a82720bb4f95ce521953e93a0f529 /blastem.c | |
parent | eabf30121c4f8412a6bf841b01383557ab5a9202 (diff) |
Refactor debugger next command
Diffstat (limited to 'blastem.c')
-rw-r--r-- | blastem.c | 71 |
1 files changed, 8 insertions, 63 deletions
@@ -1469,72 +1469,17 @@ m68k_context * debugger(m68k_context * context, uint32_t address) after = (read_dma_value(context->aregs[7]/2) << 16) | read_dma_value(context->aregs[7]/2 + 1); } else if (inst.op == M68K_RTE || inst.op == M68K_RTR) { after = (read_dma_value((context->aregs[7]+2)/2) << 16) | read_dma_value((context->aregs[7]+2)/2 + 1); - } else if(inst.op == M68K_BCC && inst.extra.cond != COND_FALSE) { - if (inst.extra.cond == COND_TRUE) { - after = inst.address + 2 + inst.src.params.immed; - } else { + } else if(m68k_is_noncall_branch(&inst)) { + if (inst.op == M68K_BCC && inst.extra.cond != COND_TRUE) { branch_f = after; - branch_t = inst.address + 2 + inst.src.params.immed; + branch_t = m68k_branch_target(&inst, context->dregs, context->aregs); insert_breakpoint(context, branch_t, (uint8_t *)debugger); - } - } else if(inst.op == M68K_DBCC) { - if (inst.extra.cond == COND_FALSE) { - if (context->dregs[inst.dst.params.regs.pri] & 0xFFFF) { - after = inst.address + 2 + inst.src.params.immed; - } - } else if (inst.extra.cond != COND_TRUE) { + } else if(inst.op == M68K_BCC && inst.extra.cond != COND_FALSE) { branch_t = after; - branch_f = inst.address + 2 + inst.src.params.immed; - } - } else if(inst.op == M68K_JMP) { - switch(inst.src.addr_mode) - { - case MODE_AREG_INDIRECT: - after = context->aregs[inst.src.params.regs.pri]; - break; - case MODE_AREG_INDEX_DISP8: { - uint8_t sec_reg = inst.src.params.regs.sec >> 1 & 0x7; - after = context->aregs[inst.src.params.regs.pri]; - uint32_t * regfile = inst.src.params.regs.sec & 0x10 ? context->aregs : context->dregs; - if (inst.src.params.regs.sec & 1) { - //32-bit index register - after += regfile[sec_reg]; - } else { - //16-bit index register - if (regfile[sec_reg] & 0x8000) { - after += (0xFFFF0000 | regfile[sec_reg]); - } else { - after += regfile[sec_reg]; - } - } - after += inst.src.params.regs.displacement; - break; - } - case MODE_PC_DISPLACE: - after = inst.src.params.regs.displacement + address + 2; - break; - case MODE_PC_INDEX_DISP8: { - uint8_t sec_reg = inst.src.params.regs.sec >> 1 & 0x7; - after = address + 2; - uint32_t * regfile = inst.src.params.regs.sec & 0x10 ? context->aregs : context->dregs; - if (inst.src.params.regs.sec & 1) { - //32-bit index register - after += regfile[sec_reg]; - } else { - //16-bit index register - if (regfile[sec_reg] & 0x8000) { - after += (0xFFFF0000 | regfile[sec_reg]); - } else { - after += regfile[sec_reg]; - } - } - after += inst.src.params.regs.displacement; - break; - } - case MODE_ABSOLUTE: - case MODE_ABSOLUTE_SHORT: - after = inst.src.params.immed; - break; + branch_f = m68k_branch_target(&inst, context->dregs, context->aregs); + insert_breakpoint(context, branch_f, (uint8_t *)debugger); + } else { + after = m68k_branch_target(&inst, context->dregs, context->aregs); } } insert_breakpoint(context, after, (uint8_t *)debugger); |