mirror of https://github.com/trudnai/Steve2.git
Memory debugger to break at the instruction instead of at the next one
This commit is contained in:
parent
e48c71c254
commit
ba4a99ad0d
|
@ -1274,6 +1274,20 @@
|
|||
</PersistentString>
|
||||
</PersistentStrings>
|
||||
</ContextState>
|
||||
<ContextState
|
||||
contextName = "m6502_Debug:6502_dbg.c">
|
||||
<PersistentStrings>
|
||||
<PersistentString
|
||||
value = "m6502.PC">
|
||||
</PersistentString>
|
||||
<PersistentString
|
||||
value = "m6502_saved.PC">
|
||||
</PersistentString>
|
||||
<PersistentString
|
||||
value = "m6502_saved">
|
||||
</PersistentString>
|
||||
</PersistentStrings>
|
||||
</ContextState>
|
||||
<ContextState
|
||||
contextName = "DisplayView.mouseExited(with:):DisplayView.swift">
|
||||
<PersistentStrings>
|
||||
|
|
|
@ -118,9 +118,20 @@ class DebuggerWindowController: NSWindowController, NSWindowDelegate {
|
|||
PauseButtonUpdate()
|
||||
|
||||
m6502.debugger.SP = 0xFF
|
||||
|
||||
m6502.debugger.wMask = 0
|
||||
m6502.debugger.mask.hlt = 1;
|
||||
m6502.debugger.mask.brk = 1;
|
||||
m6502.debugger.mask.inv = 1;
|
||||
|
||||
m6502.debugger.on = true
|
||||
|
||||
m6502.interrupt = NO_INT
|
||||
|
||||
// because of memory debugger first we need to step over one instruction
|
||||
// otherwise it would not step over that instruction
|
||||
m6502_Step_dbg()
|
||||
// now we cn resume to run
|
||||
ViewController.shared?.Resume()
|
||||
}
|
||||
|
||||
|
@ -130,7 +141,6 @@ class DebuggerWindowController: NSWindowController, NSWindowDelegate {
|
|||
|
||||
ViewController.shared?.Pause(0)
|
||||
|
||||
// m6502.debugger.wMask = 0
|
||||
m6502.debugger.on = false
|
||||
}
|
||||
|
||||
|
@ -152,9 +162,21 @@ class DebuggerWindowController: NSWindowController, NSWindowDelegate {
|
|||
@IBAction func Step_Over(_ sender: Any) {
|
||||
if MEM[Int(m6502.PC)] == 0x20 {
|
||||
m6502.debugger.SP = m6502.SP > 1 ? m6502.SP : 0
|
||||
|
||||
m6502.debugger.wMask = 0
|
||||
m6502.debugger.mask.out = 1
|
||||
m6502.debugger.mask.hlt = 1;
|
||||
m6502.debugger.mask.brk = 1;
|
||||
m6502.debugger.mask.inv = 1;
|
||||
|
||||
m6502.debugger.on = true
|
||||
|
||||
m6502.interrupt = NO_INT
|
||||
|
||||
// because of memory debugger first we need to step over one instruction
|
||||
// otherwise it would not step over that instruction
|
||||
m6502_Step_dbg()
|
||||
// now we cn resume to run
|
||||
ViewController.shared?.Resume()
|
||||
}
|
||||
else {
|
||||
|
@ -165,7 +187,7 @@ class DebuggerWindowController: NSWindowController, NSWindowDelegate {
|
|||
|
||||
|
||||
@IBAction func Step_In(_ sender: Any) {
|
||||
m6502_Step()
|
||||
m6502_Step_dbg()
|
||||
|
||||
// TODO: This should be in Debugger!
|
||||
if let debugger = DebuggerViewController.shared {
|
||||
|
@ -181,9 +203,21 @@ class DebuggerWindowController: NSWindowController, NSWindowDelegate {
|
|||
PauseButtonUpdate()
|
||||
|
||||
m6502.debugger.SP = m6502.SP < 0xFE ? m6502.SP + 1 : 0xFF
|
||||
|
||||
m6502.debugger.wMask = 0
|
||||
m6502.debugger.mask.out = 1
|
||||
m6502.debugger.mask.hlt = 1;
|
||||
m6502.debugger.mask.brk = 1;
|
||||
m6502.debugger.mask.inv = 1;
|
||||
|
||||
m6502.debugger.on = true
|
||||
|
||||
m6502.interrupt = NO_INT
|
||||
|
||||
// because of memory debugger first we need to step over one instruction
|
||||
// otherwise it would not step over that instruction
|
||||
m6502_Step_dbg()
|
||||
// now we cn resume to run
|
||||
ViewController.shared?.Resume()
|
||||
}
|
||||
|
||||
|
|
|
@ -1349,6 +1349,8 @@ class ViewController: NSViewController {
|
|||
break
|
||||
}
|
||||
|
||||
// clear iterrupt
|
||||
m6502.interrupt = NO_INT
|
||||
}
|
||||
else {
|
||||
m6502_Run()
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
#define IRQ_VECTOR 0xFFFE
|
||||
|
||||
extern m6502_t m6502;
|
||||
m6502_t m6502_saved;
|
||||
|
||||
uint16_t disass_addr = 0xFDED;
|
||||
|
||||
|
@ -100,7 +101,7 @@ INLINE int m6502_Step_dbg(void) {
|
|||
|
||||
void m6502_Debug(void) {
|
||||
m6502.clktime += m6502.clkfrm;
|
||||
|
||||
m6502.clkfrm = 0;
|
||||
m6502.lastIO = 0;
|
||||
m6502.interrupt = NO_INT; // TODO: This should be taken care by the interrupt handler
|
||||
|
||||
|
@ -114,14 +115,16 @@ void m6502_Debug(void) {
|
|||
}
|
||||
}
|
||||
|
||||
clk_6502_per_frm_max = clk_6502_per_frm;
|
||||
pc = m6502.PC;
|
||||
for ( m6502.clkfrm = m6502_Step_dbg(); m6502.clkfrm < clk_6502_per_frm_max; m6502.clkfrm += m6502_Step_dbg() ) {
|
||||
for (
|
||||
m6502_saved = m6502, clk_6502_per_frm_max = clk_6502_per_frm;
|
||||
m6502.clkfrm < clk_6502_per_frm_max;
|
||||
m6502_saved = m6502, m6502.clkfrm += m6502_Step_dbg()
|
||||
){
|
||||
switch (m6502.interrupt) {
|
||||
case HALT:
|
||||
if (m6502.debugger.mask.hlt) {
|
||||
cpuState = cpuState_halted;
|
||||
// m6502.debugger.wMask = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -129,7 +132,7 @@ void m6502_Debug(void) {
|
|||
case BREAK:
|
||||
if (m6502.debugger.mask.brk) {
|
||||
cpuState = cpuState_halted;
|
||||
// m6502.debugger.wMask = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -137,8 +140,13 @@ void m6502_Debug(void) {
|
|||
case BREAKRDMEM:
|
||||
if (m6502.debugger.mask.brk) {
|
||||
cpuState = cpuState_halted;
|
||||
// m6502.debugger.wMask = 0;
|
||||
m6502.PC = pc;
|
||||
|
||||
// memory break happens *after* executing
|
||||
// the instruction, therefore we need to
|
||||
// step back to get it right in the debugger
|
||||
m6502_saved.interrupt = m6502.interrupt;
|
||||
m6502 = m6502_saved;
|
||||
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -146,7 +154,13 @@ void m6502_Debug(void) {
|
|||
case BREAKWRMEM:
|
||||
if (m6502.debugger.mask.brk) {
|
||||
cpuState = cpuState_halted;
|
||||
// m6502.debugger.wMask = 0;
|
||||
|
||||
// memory break happens *after* executing
|
||||
// the instruction, therefore we need to
|
||||
// step back to get it right in the debugger
|
||||
m6502_saved.interrupt = m6502.interrupt;
|
||||
m6502 = m6502_saved;
|
||||
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -154,7 +168,7 @@ void m6502_Debug(void) {
|
|||
case IRQ:
|
||||
if (m6502.debugger.mask.irq) {
|
||||
cpuState = cpuState_halted;
|
||||
// m6502.debugger.wMask = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -162,7 +176,7 @@ void m6502_Debug(void) {
|
|||
case NMI:
|
||||
if (m6502.debugger.mask.nmi) {
|
||||
cpuState = cpuState_halted;
|
||||
// m6502.debugger.wMask = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -170,7 +184,7 @@ void m6502_Debug(void) {
|
|||
case INV:
|
||||
if (m6502.debugger.mask.inv) {
|
||||
cpuState = cpuState_halted;
|
||||
// m6502.debugger.wMask = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -180,7 +194,7 @@ void m6502_Debug(void) {
|
|||
if (m6502.debugger.mask.out) {
|
||||
if ( m6502.SP >= m6502.debugger.SP ) {
|
||||
cpuState = cpuState_halted;
|
||||
// m6502.debugger.wMask = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#ifndef _6502_dbg_h
|
||||
#define _6502_dbg_h
|
||||
|
||||
extern m6502_t m6502_saved;
|
||||
|
||||
extern uint16_t disass_addr;
|
||||
extern void m6502_Debug(void);
|
||||
|
|
|
@ -971,6 +971,37 @@ INLINE void ioWrite( uint16_t addr, uint8_t val ) {
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
INLINE uint8_t is_mem_rd_bp(uint16_t addr) {
|
||||
if (LAST_IDX(mem_read_breakpoints)) {
|
||||
if ( m6502_dbg_bp_exists(mem_read_breakpoints, addr) ) {
|
||||
// printf("MEM BP $%04X (bp:%04X)\n", addr, m6502.PC);
|
||||
// cpuState = cpuState_halted;
|
||||
m6502.interrupt = BREAKRDMEM;
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INLINE uint8_t is_mem_wr_bp(uint16_t addr) {
|
||||
if (LAST_IDX(mem_write_breakpoints)) {
|
||||
if ( m6502_dbg_bp_exists(mem_write_breakpoints, addr) ) {
|
||||
// printf("MEM BP $%04X (bp:%04X)\n", addr, m6502.PC);
|
||||
// cpuState = cpuState_halted;
|
||||
m6502.interrupt = BREAKWRMEM;
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Naive implementation of RAM read from address
|
||||
**/
|
||||
|
@ -996,11 +1027,15 @@ INLINE uint16_t memread16_low( uint16_t addr ) {
|
|||
// return * (uint16_t*) ( RDHIMEM + addr );
|
||||
//}
|
||||
INLINE uint16_t memread16( uint16_t addr ) {
|
||||
|
||||
// if (addr >= 0xC000) {
|
||||
// return memread16_high(addr);
|
||||
// }
|
||||
|
||||
// if (addr >= 0xC000) {
|
||||
// return memread16_high(addr);
|
||||
// }
|
||||
|
||||
return memread16_low(addr);
|
||||
}
|
||||
INLINE uint16_t _memread16_dbg( uint16_t addr ) {
|
||||
is_mem_rd_bp(addr);
|
||||
return memread16_low(addr);
|
||||
}
|
||||
|
||||
|
@ -1020,14 +1055,7 @@ INLINE uint8_t _memread( uint16_t addr ) {
|
|||
}
|
||||
|
||||
INLINE uint8_t _memread_dbg( uint16_t addr ) {
|
||||
if (LAST_IDX(mem_read_breakpoints)) {
|
||||
if ( m6502_dbg_bp_exists(mem_read_breakpoints, addr) ) {
|
||||
// printf("MEM BP $%04X (bp:%04X)\n", addr, m6502.PC);
|
||||
// cpuState = cpuState_halted;
|
||||
m6502.interrupt = BREAKRDMEM;
|
||||
}
|
||||
}
|
||||
|
||||
is_mem_rd_bp(addr);
|
||||
return _memread(addr);
|
||||
}
|
||||
|
||||
|
@ -1302,6 +1330,9 @@ INLINE uint8_t _src_zp_dis() {
|
|||
INLINE uint16_t _addr_ind() {
|
||||
return memread16( _fetch() );
|
||||
}
|
||||
INLINE uint16_t _addr_ind_dbg() {
|
||||
return _memread16_dbg( _fetch() );
|
||||
}
|
||||
INLINE uint16_t _addr_ind_dis() {
|
||||
_disPrintf(disassembly.oper, sizeof(disassembly.oper), "($%02X,X)", memread8(m6502.PC) );
|
||||
_disPrintf(disassembly.comment, sizeof(disassembly.comment), "ind_addr:%04X", memread16( memread8(m6502.PC)) );
|
||||
|
@ -1312,7 +1343,7 @@ INLINE uint8_t _src_ind() {
|
|||
return _memread( _addr_ind() );
|
||||
}
|
||||
INLINE uint8_t _src_ind_dbg() {
|
||||
return _memread_dbg( _addr_ind() );
|
||||
return _memread_dbg( _addr_ind_dbg() );
|
||||
}
|
||||
INLINE uint8_t _src_ind_dis() {
|
||||
return _memread_dis( _addr_ind_dis() );
|
||||
|
@ -1326,6 +1357,9 @@ INLINE uint8_t _src_ind_dis() {
|
|||
INLINE uint16_t _addr_ind_X() {
|
||||
return memread16( _fetch() + m6502.X );
|
||||
}
|
||||
INLINE uint16_t _addr_ind_X_dbg() {
|
||||
return _memread16_dbg( _fetch() + m6502.X );
|
||||
}
|
||||
INLINE uint16_t _addr_ind_X_dis() {
|
||||
_disPrintf(disassembly.oper, sizeof(disassembly.oper), "($%02X,X)", memread8(m6502.PC) );
|
||||
_disPrintf(disassembly.comment, sizeof(disassembly.comment), "ind_addr:%04X", memread16( memread8(m6502.PC) + m6502.X) );
|
||||
|
@ -1336,7 +1370,7 @@ INLINE uint8_t _src_X_ind() {
|
|||
return _memread( _addr_ind_X() );
|
||||
}
|
||||
INLINE uint8_t _src_X_ind_dbg() {
|
||||
return _memread_dbg( _addr_ind_X() );
|
||||
return _memread_dbg( _addr_ind_X_dbg() );
|
||||
}
|
||||
INLINE uint8_t _src_X_ind_dis() {
|
||||
return _memread_dis( _addr_ind_X_dis() );
|
||||
|
|
Loading…
Reference in New Issue