From 15f7fc3d7021b98feda4d09127cacfdde53fcb11 Mon Sep 17 00:00:00 2001 From: tudnai Date: Sun, 30 Oct 2022 17:42:29 -0700 Subject: [PATCH] BugFix: Debug Disassembly alters behavior --- A2Mac/Base.lproj/Debugger.storyboard | 21 +++++++++++---------- A2Mac/DebuggerWindowController.swift | 21 ++++++++++++++------- src/dev/mem/mmio.c | 24 ++++++++++++------------ 3 files changed, 37 insertions(+), 29 deletions(-) diff --git a/A2Mac/Base.lproj/Debugger.storyboard b/A2Mac/Base.lproj/Debugger.storyboard index a7dc187..0f00661 100644 --- a/A2Mac/Base.lproj/Debugger.storyboard +++ b/A2Mac/Base.lproj/Debugger.storyboard @@ -198,11 +198,11 @@ - + - + @@ -216,17 +216,17 @@ - + - + - + - + @@ -326,14 +326,14 @@ C20D: 4C C5 FE JMP $FEC5 - + - + @@ -354,7 +354,7 @@ C20D: 4C C5 FE JMP $FEC5 - + @@ -454,7 +454,7 @@ C20D: 4C C5 FE JMP $FEC5 - + @@ -617,6 +617,7 @@ C20D: 4C C5 FE JMP $FEC5 + diff --git a/A2Mac/DebuggerWindowController.swift b/A2Mac/DebuggerWindowController.swift index 0ddee5f..4700dc8 100644 --- a/A2Mac/DebuggerWindowController.swift +++ b/A2Mac/DebuggerWindowController.swift @@ -133,10 +133,9 @@ class DebuggerWindowController: NSWindowController, NSWindowDelegate { @IBAction func Step_Over(_ sender: Any) { let sp = m6502.SP - m6502_Step() - while m6502.SP < 0xFF && m6502.SP < sp { + repeat { m6502_Step() - } + } while m6502.SP < 0xFF && m6502.SP < sp // TODO: This should be in Debugger! if let debugger = DebuggerViewController.shared { @@ -159,12 +158,20 @@ class DebuggerWindowController: NSWindowController, NSWindowDelegate { @IBAction func Step_Out(_ sender: Any) { - let sp = m6502.SP + var sp = m6502.SP + + repeat { + let opcode = MEM[Int(m6502.PC)] - m6502_Step() - while m6502.SP < 0xFF && m6502.SP <= sp { m6502_Step() - } + + // If it was NOT and RTI or RTS and stack pointer is above the saved one... + if opcode != 0x40 && opcode != 0x60 && m6502.SP > sp { + // ... then we need to update what we are looking at to get to the true frame pointer + sp = m6502.SP + } + + } while m6502.SP < 0xFF && m6502.SP <= sp // TODO: This should be in Debugger! if let debugger = DebuggerViewController.shared { diff --git a/src/dev/mem/mmio.c b/src/dev/mem/mmio.c index 54452fc..32dc857 100644 --- a/src/dev/mem/mmio.c +++ b/src/dev/mem/mmio.c @@ -1134,10 +1134,10 @@ INLINE uint16_t _addr_abs_dbg() { return _fetch16_dbg(); } INLINE uint8_t _src_abs() { - return memread( _addr_abs() ); + return _memread( _addr_abs() ); } INLINE uint8_t _src_abs_dbg() { - return memread( _addr_abs_dbg() ); + return _memread_dbg( _addr_abs_dbg() ); } //INLINE uint8_t * dest_abs() { // return WRLOMEM + addr_abs(); @@ -1180,10 +1180,10 @@ INLINE uint16_t _addr_abs_X_dbg() { return _fetch16_dbg() + m6502.X; } INLINE uint8_t _src_abs_X() { - return memread( _addr_abs_X() ); + return _memread( _addr_abs_X() ); } INLINE uint8_t _src_abs_X_dbg() { - return memread( _addr_abs_X_dbg() ); + return _memread_dbg( _addr_abs_X_dbg() ); } //INLINE uint8_t * dest_abs_X() { // return WRLOMEM + addr_abs_X(); @@ -1202,10 +1202,10 @@ INLINE uint16_t _addr_abs_Y_dbg() { return _fetch16_dbg() + m6502.Y; } INLINE uint8_t _src_abs_Y() { - return memread(_addr_abs_Y()); + return _memread(_addr_abs_Y()); } INLINE uint8_t _src_abs_Y_dbg() { - return memread(_addr_abs_Y_dbg()); + return _memread_dbg(_addr_abs_Y_dbg()); } //INLINE uint8_t * dest_abs_Y() { // return WRLOMEM + addr_abs_Y(); @@ -1266,10 +1266,10 @@ INLINE uint16_t _addr_ind_dbg() { return memread16( _fetch_dbg() ); } INLINE uint8_t _src_ind() { - return memread( _addr_ind() ); + return _memread( _addr_ind() ); } INLINE uint8_t _src_ind_dbg() { - return memread( _addr_ind_dbg() ); + return _memread_dbg( _addr_ind_dbg() ); } /** @@ -1287,10 +1287,10 @@ INLINE uint16_t _addr_ind_X_dbg() { return memread16( _fetch_dbg() + m6502.X ); } INLINE uint8_t _src_X_ind() { - return memread( _addr_ind_X() ); + return _memread( _addr_ind_X() ); } INLINE uint8_t _src_X_ind_dbg() { - return memread( _addr_ind_X_dbg() ); + return _memread_dbg( _addr_ind_X_dbg() ); } //INLINE uint8_t * dest_X_ind() { // return WRLOMEM + addr_ind_X(); @@ -1311,10 +1311,10 @@ INLINE uint16_t _addr_ind_Y_dbg() { return memread16( _fetch_dbg() ) + m6502.Y; } INLINE uint8_t _src_ind_Y() { - return memread( _addr_ind_Y() ); + return _memread( _addr_ind_Y() ); } INLINE uint8_t _src_ind_Y_dbg() { - return memread( _addr_ind_Y_dbg() ); + return _memread_dbg( _addr_ind_Y_dbg() ); } //INLINE uint8_t * dest_ind_Y() { // return WRLOMEM + addr_ind_Y();