// // Created by william on 5/17/24. // #include #include "memory.h" void ppu_vram_fetch(PPUVramFetch *fetch, address addr) { assert(addr < VRAM_SIZE); if (fetch->finished) { fetch->finished = false; return; } fetch->data = *fetch->vram[addr]; fetch->finished = true; } void ppu_tile_fetch(PPUTileFetch *fetch, address addr) { if (fetch->fetch_cycle >= 8) { fetch->fetch_cycle = 0; } if (fetch->fetch_cycle % 2 == 0) { // First cycle of a memory fetch ppu_vram_fetch(&fetch->vram_fetch, addr + (fetch->fetch_cycle / 2)); } else { // Second cycle of a fetch, the data should be available byte data = fetch->vram_fetch.data; switch (fetch->fetch_cycle) { case 1: fetch->nametable = data; break; case 3: fetch->attribute_table = data; break; case 5: fetch->pattern_table_tile_low = data; break; case 7: fetch->pattern_table_tile_high = data; break; default: assert(false); } } }