57 lines
1.1 KiB
C
57 lines
1.1 KiB
C
#include <dma.h>
|
|
#include <ppu.h>
|
|
#include <bus.h>
|
|
#include <cart.h>
|
|
#include <ppu.h>
|
|
#include <ram.h>
|
|
|
|
static dma_context ctx;
|
|
|
|
void dma_start(u8 start) {
|
|
ctx.active = true;
|
|
ctx.byte = 0;
|
|
ctx.start_delay = 2;
|
|
ctx.value = start;
|
|
ctx.transferring = false;
|
|
}
|
|
|
|
void dma_tick() {
|
|
ctx.transferring = false;
|
|
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;
|
|
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++;
|
|
|
|
ctx.active = ctx.byte < 0xA0;
|
|
}
|
|
|
|
bool dma_transferring() {
|
|
return ctx.transferring && ctx.active;
|
|
}
|
|
|
|
void dma_save_state(dma_state* state) {
|
|
state->ctx = ctx;
|
|
}
|
|
|
|
void dma_load_state(const dma_state* state) {
|
|
ctx = state->ctx;
|
|
} |