From bb572cce696c13d0f6e9ca98a4b41aa08cd0f719 Mon Sep 17 00:00:00 2001 From: Samuel Walker Date: Fri, 30 May 2025 15:54:52 -0600 Subject: [PATCH] working on dma and add sp timing. --- include/dma.h | 1 + lib/bus.c | 2 +- lib/dma.c | 24 ++++++++++++++++++++---- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/include/dma.h b/include/dma.h index a929209..45ba815 100644 --- a/include/dma.h +++ b/include/dma.h @@ -7,6 +7,7 @@ typedef struct { u8 byte; u8 value; u8 start_delay; + bool transferring; } dma_context; typedef struct { diff --git a/lib/bus.c b/lib/bus.c index e7c136a..d314ad0 100644 --- a/lib/bus.c +++ b/lib/bus.c @@ -35,7 +35,7 @@ u8 bus_read(u16 address) { return wram_read(address); } else if (address < 0xFE00) { //reserved echo ram... - return 0; + return wram_read((address & 0x1FFF) | 0xC000); } else if (address < 0xFEA0) { //OAM if(dma_transferring()) diff --git a/lib/dma.c b/lib/dma.c index b8da838..a13d67f 100644 --- a/lib/dma.c +++ b/lib/dma.c @@ -1,17 +1,22 @@ #include #include #include +#include +#include +#include static dma_context ctx; void dma_start(u8 start) { ctx.active = true; ctx.byte = 0; - ctx.start_delay = 0; + ctx.start_delay = 2; ctx.value = start; + ctx.transferring = false; } void dma_tick() { + ctx.transferring = false; if (!ctx.active) { return; } @@ -20,8 +25,19 @@ void dma_tick() { ctx.start_delay--; return; } - - ppu_oam_write(ctx.byte, bus_read((ctx.value << 8) | ctx.byte)); + ctx.transferring = true; + u8 data = 0; + u16 addr = (ctx.value << 8) | ctx.byte; + if(ctx.value < 0x80) { + data = cart_read(addr); + } else if (ctx.value < 0xA0) { + data = ppu_vram_read(addr); + } else if (ctx.value < 0xC0) { + data = cart_read(addr); + } else { + data = wram_read((addr & 0x1FFF) | 0xC000); + } + ppu_oam_write(ctx.byte, data); ctx.byte++; @@ -29,7 +45,7 @@ void dma_tick() { } bool dma_transferring() { - return ctx.active; + return ctx.transferring && ctx.active; } void dma_save_state(dma_state* state) {