From 54b8c66e22e67d28a26738fab1b8171dc7333a67 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Mon, 10 Mar 2025 19:28:43 +0200 Subject: [PATCH] DMA debugger ROM access information. --- debug.cpp | 14 +++++++++++ include/debug.h | 4 ++++ memory.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 76 insertions(+), 6 deletions(-) diff --git a/debug.cpp b/debug.cpp index 3b592019..033da6d0 100644 --- a/debug.cpp +++ b/debug.cpp @@ -2197,6 +2197,18 @@ void record_dma_clear(void) dr->cf_reg = 0xffff; } +void record_rom_access(uaecptr ptr, uae_u32 v, int size, bool rw) +{ + dma_record_init(); + if (!dma_record_data) + return; + struct dma_rec *dr = &dma_record_data[dma_record_cycle]; + dr->miscaddr = ptr; + dr->miscval = v; + dr->ciarw = rw; + dr->miscsize = size; +} + void record_cia_access(int r, int mask, uae_u16 value, bool rw, int phase) { dma_record_init(); @@ -2695,6 +2707,8 @@ static bool get_record_dma_info(struct dma_rec *drs, struct dma_rec *dr, TCHAR * _stprintf(l5, _T(" %u "), ph - 1); } } + } else if (dr->miscsize) { + _stprintf(l5, _T("ROM%c%c %08X"), dr->ciarw ? 'W' : 'R', dr->miscsize == 1 ? 'B' : (dr->miscsize == 2 ? 'W' : 'L'), dr->miscaddr); } } if (l6) { diff --git a/include/debug.h b/include/debug.h index 6c66eec0..62f274de 100644 --- a/include/debug.h +++ b/include/debug.h @@ -245,6 +245,9 @@ struct dma_rec bool ciarw; int ciaphase; uae_u16 ciavalue; + uaecptr miscaddr; + uae_u32 miscval; + int miscsize; bool end; bool cs, hs, vs; }; @@ -330,6 +333,7 @@ extern void record_dma_event_data(uae_u32 evt, uae_u32 data); extern void record_dma_clear(void); extern bool record_dma_check(void); extern void record_cia_access(int r, int mask, uae_u16 value, bool rw, int phase); +extern void record_rom_access(uaecptr, uae_u32 value, int size, bool rw); extern void record_dma_ipl(void); extern void record_dma_ipl_sample(void); extern void debug_mark_refreshed(uaecptr); diff --git a/memory.cpp b/memory.cpp index fecfde53..e4cd4be7 100644 --- a/memory.cpp +++ b/memory.cpp @@ -1073,19 +1073,58 @@ void a1000_reset (void) a1000_handle_kickstart (1); } -static void REGPARAM3 kickmem_lput (uaecptr, uae_u32) REGPARAM; -static void REGPARAM3 kickmem_wput (uaecptr, uae_u32) REGPARAM; -static void REGPARAM3 kickmem_bput (uaecptr, uae_u32) REGPARAM; +static void REGPARAM3 kickmem_lput(uaecptr, uae_u32) REGPARAM; +static void REGPARAM3 kickmem_wput(uaecptr, uae_u32) REGPARAM; +static void REGPARAM3 kickmem_bput(uaecptr, uae_u32) REGPARAM; +static uae_u32 REGPARAM3 kickmem_lget(uaecptr) REGPARAM; +static uae_u32 REGPARAM3 kickmem_wget(uaecptr) REGPARAM; +static uae_u32 REGPARAM3 kickmem_bget(uaecptr) REGPARAM; -MEMORY_BGET(kickmem); -MEMORY_WGET(kickmem); -MEMORY_LGET(kickmem); MEMORY_CHECK(kickmem); MEMORY_XLATE(kickmem); +static uae_u32 REGPARAM2 kickmem_lget(uaecptr addr) +{ + addr &= kickmem_bank.mask; + uae_u32 m = do_get_mem_long((uae_u32*)(kickmem_bank.baseaddr + addr)); +#ifdef DEBUGGER + if (debug_dma) { + record_rom_access(kickmem_bank.start + addr, m, 4, false); + } +#endif + return m; +} +static uae_u32 REGPARAM2 kickmem_wget(uaecptr addr) +{ + addr &= kickmem_bank.mask; + uae_u16 m = do_get_mem_word((uae_u16*)(kickmem_bank.baseaddr + addr)); +#ifdef DEBUGGER + if (debug_dma) { + record_rom_access(kickmem_bank.start + addr, m, 2, false); + } +#endif + return m; +} +static uae_u32 REGPARAM2 kickmem_bget(uaecptr addr) +{ + addr &= kickmem_bank.mask; + uae_u8 m = kickmem_bank.baseaddr[addr]; +#ifdef DEBUGGER + if (debug_dma) { + record_rom_access(kickmem_bank.start + addr, m, 1, false); + } +#endif + return m; +} + static void REGPARAM2 kickmem_lput (uaecptr addr, uae_u32 b) { uae_u32 *m; +#ifdef DEBUGGER + if (debug_dma) { + record_rom_access(kickmem_bank.start + addr, b, 4, true); + } +#endif if (currprefs.rom_readwrite && rom_write_enabled) { addr &= kickmem_bank.mask; m = (uae_u32 *)(kickmem_bank.baseaddr + addr); @@ -1112,6 +1151,11 @@ static void REGPARAM2 kickmem_lput (uaecptr addr, uae_u32 b) static void REGPARAM2 kickmem_wput (uaecptr addr, uae_u32 b) { uae_u16 *m; +#ifdef DEBUGGER + if (debug_dma) { + record_rom_access(kickmem_bank.start + addr, b, 2, true); + } +#endif if (currprefs.rom_readwrite && rom_write_enabled) { addr &= kickmem_bank.mask; m = (uae_u16 *)(kickmem_bank.baseaddr + addr); @@ -1131,6 +1175,11 @@ static void REGPARAM2 kickmem_wput (uaecptr addr, uae_u32 b) static void REGPARAM2 kickmem_bput (uaecptr addr, uae_u32 b) { +#ifdef DEBUGGER + if (debug_dma) { + record_rom_access(kickmem_bank.start + addr, b, 1, true); + } +#endif if (currprefs.rom_readwrite && rom_write_enabled) { addr &= kickmem_bank.mask; kickmem_bank.baseaddr[addr] = b; @@ -2050,6 +2099,9 @@ static void set_direct_memory(addrbank *ab) { if (!(ab->flags & ABFLAG_DIRECTACCESS)) return; + if (currprefs.cpu_memory_cycle_exact && currprefs.cpu_model < 68020) { + return; + } ab->baseaddr_direct_r = ab->baseaddr; if (!(ab->flags & ABFLAG_ROM)) ab->baseaddr_direct_w = ab->baseaddr; -- 2.47.3