summaryrefslogtreecommitdiff
path: root/blastem.c
diff options
context:
space:
mode:
Diffstat (limited to 'blastem.c')
-rw-r--r--blastem.c71
1 files changed, 8 insertions, 63 deletions
diff --git a/blastem.c b/blastem.c
index d7cf953..6b13ed5 100644
--- a/blastem.c
+++ b/blastem.c
@@ -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);