From 97ce58420e8a8bce5c0955e53d1c4cbae491879e Mon Sep 17 00:00:00 2001 From: tudnai Date: Fri, 18 Nov 2022 20:03:57 -0800 Subject: [PATCH] - More memory addressing to monitor - Faster m6502 save and restore --- src/cpu/6502_dbg.c | 11 +++++------ src/dev/mem/mmio.c | 27 +++++++++++++++++++++++++++ src/dev/mem/mmio.h | 23 +++++++++++++++-------- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/cpu/6502_dbg.c b/src/cpu/6502_dbg.c index c1f0695..0932661 100644 --- a/src/cpu/6502_dbg.c +++ b/src/cpu/6502_dbg.c @@ -118,7 +118,8 @@ void m6502_Debug(void) { 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() + memcpy(&m6502_saved, &m6502, 7), // copy over only A, X, Y, Status, PC & SP... + m6502.clkfrm += m6502_Step_dbg() ){ switch (m6502.interrupt) { case HALT: @@ -144,8 +145,7 @@ void m6502_Debug(void) { // 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; + memcpy(&m6502, &m6502_saved, 7); // copy over only A, X, Y, Status, PC & SP... return; } @@ -158,8 +158,7 @@ void m6502_Debug(void) { // 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; + memcpy(&m6502, &m6502_saved, 7); // copy over only A, X, Y, Status, PC & SP... return; } @@ -260,7 +259,7 @@ void m6502_dbg_init(void) { m6502_dbg_bp_del_all(mem_write_breakpoints); // TODO: TESTING ONLY!!! - m6502_dbg_bp_add(mem_read_breakpoints, 0xC000); +// m6502_dbg_bp_add(mem_read_breakpoints, 0xC000); } diff --git a/src/dev/mem/mmio.c b/src/dev/mem/mmio.c index 7e182d5..6eadb5e 100644 --- a/src/dev/mem/mmio.c +++ b/src/dev/mem/mmio.c @@ -1212,11 +1212,21 @@ INLINE uint8_t _src_abs_dis() { INLINE int8_t _rel_addr() { return _fetch(); } +INLINE int8_t _rel_addr_dbg() { + uint16_t addr = _fetch(); + is_mem_rd_bp(addr); + return addr; +} INLINE int8_t _rel_addr_dis() { _disPrintf(disassembly.oper, sizeof(disassembly.oper), "$%04X", m6502.PC + 1 + (int8_t)memread8(m6502.PC)); return _fetch_dis(); } INLINE uint16_t _abs_addr() { + uint16_t addr = _fetch16(); + is_mem_rd_bp(addr); + return addr; +} +INLINE uint16_t _abs_addr_dbg() { return _fetch16(); } INLINE uint16_t _abs_addr_dis() { @@ -1226,6 +1236,9 @@ INLINE uint16_t _abs_addr_dis() { INLINE uint16_t _ind_addr() { return memread16( _fetch16() ); } +INLINE uint16_t _ind_addr_dbg() { + return _memread16_dbg( _fetch16() ); +} INLINE uint16_t _ind_addr_dis() { _disPrintf(disassembly.oper, sizeof(disassembly.oper), "($%04X)", memread16(m6502.PC)); _disPrintf(disassembly.comment, sizeof(disassembly.comment), "ind_addr:%04X", memread16(memread16(m6502.PC))); @@ -1305,6 +1318,9 @@ INLINE uint8_t _addr_zp_dis() { INLINE uint8_t _src_zp() { return memread8_low(_addr_zp()); } +INLINE uint8_t _src_zp_dbg() { + return _memread_dbg(_addr_zp()); +} INLINE uint8_t _src_zp_dis() { return memread8_low(_addr_zp_dis()); } @@ -1387,6 +1403,11 @@ INLINE uint8_t _src_X_ind_dis() { INLINE uint16_t _addr_ind_Y() { return memread16( _fetch() ) + m6502.Y; } +INLINE uint16_t _addr_ind_Y_dbg() { + uint16_t addr = _memread16_dbg( _fetch() ) + m6502.Y; + is_mem_rd_bp(addr); + return addr; +} INLINE uint16_t _addr_ind_Y_dis() { _disPrintf(disassembly.oper, sizeof(disassembly.oper), "($%02X),Y", memread8(m6502.PC) ); _disPrintf(disassembly.comment, sizeof(disassembly.comment), "ind_addr:%04X", memread16( memread8(m6502.PC) ) + m6502.Y ); @@ -1423,6 +1444,9 @@ INLINE uint8_t _addr_zp_X_dis() { INLINE uint8_t _src_zp_X() { return memread8_low(_addr_zp_X()); } +INLINE uint8_t _src_zp_X_dbg() { + return _memread_dbg(_addr_zp_X()); +} INLINE uint8_t _src_zp_X_dis() { return memread8_low(_addr_zp_X_dis()); } @@ -1446,6 +1470,9 @@ INLINE uint8_t _addr_zp_Y_dis() { INLINE uint8_t _src_zp_Y() { return memread8_low(_addr_zp_Y()); } +INLINE uint8_t _src_zp_Y_dbg() { + return _memread_dbg(_addr_zp_Y()); +} INLINE uint8_t _src_zp_Y_dis() { return memread8_low(_addr_zp_Y_dis()); } diff --git a/src/dev/mem/mmio.h b/src/dev/mem/mmio.h index cec60dd..bc589a8 100644 --- a/src/dev/mem/mmio.h +++ b/src/dev/mem/mmio.h @@ -427,10 +427,13 @@ INLINE uint8_t _src_abs(void); INLINE uint8_t _src_abs_dbg(void); INLINE uint8_t _src_abs_dis(void); INLINE int8_t _rel_addr(void); +INLINE int8_t _rel_addr_dbg(void); INLINE int8_t _rel_addr_dis(void); INLINE uint16_t _abs_addr(void); +INLINE uint16_t _abs_addr_dbg(void); INLINE uint16_t _abs_addr_dis(void); INLINE uint16_t _ind_addr(void); +INLINE uint16_t _ind_addr_dbg(void); INLINE uint16_t _ind_addr_dis(void); INLINE uint16_t _addr_abs_X(void); INLINE uint16_t _addr_abs_X_dis(void); @@ -447,6 +450,7 @@ INLINE uint8_t _imm_dis(void); INLINE uint8_t _addr_zp(void); INLINE uint8_t _addr_zp_dis(void); INLINE uint8_t _src_zp(void); +INLINE uint8_t _src_zp_dbg(void); INLINE uint8_t _src_zp_dis(void); INLINE uint16_t _addr_ind(void); INLINE uint16_t _addr_ind_dis(void); @@ -459,6 +463,7 @@ INLINE uint8_t _src_X_ind(void); INLINE uint8_t _src_X_ind_dbg(void); INLINE uint8_t _src_X_ind_dis(void); INLINE uint16_t _addr_ind_Y(void); +INLINE uint16_t _addr_ind_Y_dbg(void); INLINE uint16_t _addr_ind_Y_dis(void); INLINE uint8_t _src_ind_Y(void); INLINE uint8_t _src_ind_Y_dbg(void); @@ -466,10 +471,12 @@ INLINE uint8_t _src_ind_Y_dis(void); INLINE uint8_t _addr_zp_X(void); INLINE uint8_t _addr_zp_X_dis(void); INLINE uint8_t _src_zp_X(void); +INLINE uint8_t _src_zp_X_dbg(void); INLINE uint8_t _src_zp_X_dis(void); INLINE uint8_t _addr_zp_Y(void); INLINE uint8_t _addr_zp_Y_dis(void); INLINE uint8_t _src_zp_Y(void); +INLINE uint8_t _src_zp_Y_dbg(void); INLINE uint8_t _src_zp_Y_dis(void); @@ -516,26 +523,26 @@ INLINE uint8_t _src_zp_Y_dis(void); #define memwrite(addr,data) _memwrite(addr,data); #define addr_abs() _addr_abs() #define src_abs() _src_abs_dbg() -#define rel_addr() _rel_addr() -#define abs_addr() _abs_addr() -#define ind_addr() _ind_addr() +#define rel_addr() _rel_addr_dbg() +#define abs_addr() _abs_addr_dbg() +#define ind_addr() _ind_addr_dbg() #define addr_abs_X() _addr_abs_X() #define src_abs_X() _src_abs_X_dbg() #define addr_abs_Y() _addr_abs_Y() #define src_abs_Y() _src_abs_Y_dbg() #define imm() _imm() #define addr_zp() _addr_zp() -#define src_zp() _src_zp() +#define src_zp() _src_zp_dbg() #define addr_ind() _addr_ind() #define src_ind() _src_ind_dbg() #define addr_ind_X() _addr_ind_X() #define src_X_ind() _src_X_ind_dbg() -#define addr_ind_Y() _addr_ind_Y() -#define src_ind_Y() _src_ind_Y() +#define addr_ind_Y() _addr_ind_Y_dbg() +#define src_ind_Y() _src_ind_Y_dbg() #define addr_zp_X() _addr_zp_X() -#define src_zp_X() _src_zp_X() +#define src_zp_X() _src_zp_X_dbg() #define addr_zp_Y() _addr_zp_Y() -#define src_zp_Y() _src_zp_Y() +#define src_zp_Y() _src_zp_Y_dbg() #else // DEBUGGER