From 8ef1a5cd60a763004e8ee8b1a2c9e4a88d763c27 Mon Sep 17 00:00:00 2001 From: Samuel Walker Date: Sat, 31 May 2025 09:17:28 -0600 Subject: [PATCH] oam timings passing. --- .vscode/settings.json | 7 ++++++- include/dma.h | 2 ++ lib/dma.c | 24 ++++++++++++++++-------- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 594370e..7de6e4e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,6 +10,11 @@ "xtr1common": "c", "chrono": "c", "interrupts.h": "c", - "cmath": "c" + "cmath": "c", + "algorithm": "c", + "functional": "c", + "optional": "c", + "system_error": "c", + "xutility": "c" } } \ No newline at end of file diff --git a/include/dma.h b/include/dma.h index 45ba815..0b1ee63 100644 --- a/include/dma.h +++ b/include/dma.h @@ -6,8 +6,10 @@ typedef struct { bool active; u8 byte; u8 value; + u8 value_buffer; u8 start_delay; bool transferring; + bool dma_waiting; } dma_context; typedef struct { diff --git a/lib/dma.c b/lib/dma.c index a13d67f..eb85c21 100644 --- a/lib/dma.c +++ b/lib/dma.c @@ -8,23 +8,31 @@ static dma_context ctx; void dma_start(u8 start) { + ctx.start_delay = 1; + ctx.value_buffer = start; + ctx.dma_waiting = true; +} + +void dma_begin() { ctx.active = true; ctx.byte = 0; - ctx.start_delay = 2; - ctx.value = start; - ctx.transferring = false; + ctx.value = ctx.value_buffer; + ctx.dma_waiting = false; } void dma_tick() { ctx.transferring = false; + + if (ctx.start_delay) { + ctx.start_delay--; + } else if(ctx.dma_waiting) { + dma_begin(); + } + if (!ctx.active) { return; } - if (ctx.start_delay) { - ctx.start_delay--; - return; - } ctx.transferring = true; u8 data = 0; u16 addr = (ctx.value << 8) | ctx.byte; @@ -45,7 +53,7 @@ void dma_tick() { } bool dma_transferring() { - return ctx.transferring && ctx.active; + return ctx.transferring;// && ctx.active; } void dma_save_state(dma_state* state) {