Mercurial > repos > blastem
comparison blastem.c @ 516:7f54f1773e84
Properly handle jmp instructions in the debugger next command
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 09 Feb 2014 00:42:43 -0800 |
parents | 1495179d6737 |
children | 3fc1d145493c |
comparison
equal
deleted
inserted
replaced
515:1495179d6737 | 516:7f54f1773e84 |
---|---|
1463 break; | 1463 break; |
1464 } | 1464 } |
1465 printf(format, param, value); | 1465 printf(format, param, value); |
1466 break; | 1466 break; |
1467 case 'n': | 1467 case 'n': |
1468 //TODO: Deal with jmp, dbcc, rtr and rte | 1468 //TODO: Deal with dbcc, rtr and rte |
1469 if (inst.op == M68K_RTS) { | 1469 if (inst.op == M68K_RTS) { |
1470 after = (read_dma_value(context->aregs[7]/2) << 16) | read_dma_value(context->aregs[7]/2 + 1); | 1470 after = (read_dma_value(context->aregs[7]/2) << 16) | read_dma_value(context->aregs[7]/2 + 1); |
1471 } else if(inst.op == M68K_BCC && inst.extra.cond != COND_FALSE) { | 1471 } else if(inst.op == M68K_BCC && inst.extra.cond != COND_FALSE) { |
1472 if (inst.extra.cond = COND_TRUE) { | 1472 if (inst.extra.cond = COND_TRUE) { |
1473 after = inst.address + 2 + inst.src.params.immed; | 1473 after = inst.address + 2 + inst.src.params.immed; |
1474 } else { | 1474 } else { |
1475 branch_f = after; | 1475 branch_f = after; |
1476 branch_t = inst.address + 2 + inst.src.params.immed; | 1476 branch_t = inst.address + 2 + inst.src.params.immed; |
1477 insert_breakpoint(context, branch_t, (uint8_t *)debugger); | 1477 insert_breakpoint(context, branch_t, (uint8_t *)debugger); |
1478 } | |
1479 } else if(inst.op == M68K_JMP) { | |
1480 switch(inst.src.addr_mode) | |
1481 { | |
1482 case MODE_AREG_INDIRECT: | |
1483 after = context->aregs[inst.src.params.regs.pri]; | |
1484 break; | |
1485 case MODE_AREG_INDEX_DISP8: { | |
1486 uint8_t sec_reg = inst.src.params.regs.sec >> 1 & 0x7; | |
1487 after = context->aregs[inst.src.params.regs.pri]; | |
1488 uint32_t * regfile = inst.src.params.regs.sec & 0x10 ? context->aregs : context->dregs; | |
1489 if (inst.src.params.regs.sec & 1) { | |
1490 //32-bit index register | |
1491 after += regfile[sec_reg]; | |
1492 } else { | |
1493 //16-bit index register | |
1494 if (regfile[sec_reg] & 0x8000) { | |
1495 after += (0xFFFF0000 | regfile[sec_reg]); | |
1496 } else { | |
1497 after += regfile[sec_reg]; | |
1498 } | |
1499 } | |
1500 after += inst.src.params.regs.displacement; | |
1501 break; | |
1502 } | |
1503 case MODE_PC_DISPLACE: | |
1504 after = inst.src.params.regs.displacement + address + 2; | |
1505 break; | |
1506 case MODE_PC_INDEX_DISP8: { | |
1507 uint8_t sec_reg = inst.src.params.regs.sec >> 1 & 0x7; | |
1508 after = address + 2; | |
1509 uint32_t * regfile = inst.src.params.regs.sec & 0x10 ? context->aregs : context->dregs; | |
1510 if (inst.src.params.regs.sec & 1) { | |
1511 //32-bit index register | |
1512 after += regfile[sec_reg]; | |
1513 } else { | |
1514 //16-bit index register | |
1515 if (regfile[sec_reg] & 0x8000) { | |
1516 after += (0xFFFF0000 | regfile[sec_reg]); | |
1517 } else { | |
1518 after += regfile[sec_reg]; | |
1519 } | |
1520 } | |
1521 after += inst.src.params.regs.displacement; | |
1522 break; | |
1523 } | |
1524 case MODE_ABSOLUTE: | |
1525 case MODE_ABSOLUTE_SHORT: | |
1526 after = inst.src.params.immed; | |
1527 break; | |
1478 } | 1528 } |
1479 } | 1529 } |
1480 insert_breakpoint(context, after, (uint8_t *)debugger); | 1530 insert_breakpoint(context, after, (uint8_t *)debugger); |
1481 debugging = 0; | 1531 debugging = 0; |
1482 break; | 1532 break; |