48 lines
1.2 KiB
C
48 lines
1.2 KiB
C
//
|
|
// Created by william on 5/17/24.
|
|
//
|
|
|
|
#include <assert.h>
|
|
#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);
|
|
}
|
|
}
|
|
} |