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;