|
|
|
@@ -3,8 +3,8 @@ |
|
|
|
#include "ppu.h" |
|
|
|
|
|
|
|
|
|
|
|
// TODO: Stubbed |
|
|
|
// TODO: Retain open bus bits |
|
|
|
// TODO: Retain open bus bits? |
|
|
|
|
|
|
|
|
|
|
|
#define ppu_reg_ctrl (0x2000U) |
|
|
|
#define ppu_reg_mask (0x2001U) |
|
|
|
@@ -29,8 +29,22 @@ uint8_t nes_ppu_read(nes_ppu* ppu, uint16_t addr) { |
|
|
|
|
|
|
|
} else if (ppu_reg_data == addr) { |
|
|
|
val = ppu->data; |
|
|
|
ppu->data = ppu->vram[ppu->addr - |
|
|
|
nes_ppu_mem_vram_start]; |
|
|
|
|
|
|
|
if (ppu->addr < nes_ppu_mem_vram_start) { |
|
|
|
ppu->data = ppu->chr_mem[ppu->addr]; |
|
|
|
} else if (ppu->addr < nes_ppu_mem_vram_start + |
|
|
|
nes_ppu_mem_vram_size) { |
|
|
|
ppu->data = ppu->vram[ppu->addr - |
|
|
|
nes_ppu_mem_vram_start]; |
|
|
|
} else if (ppu->addr < nes_ppu_mem_pal_start) { |
|
|
|
ppu->data = ppu->chr_mem[ppu->addr]; |
|
|
|
} else if (ppu->addr < nes_ppu_mem_size) { |
|
|
|
uint8_t pal_addr = |
|
|
|
(ppu->addr - nes_ppu_mem_pal_start) & |
|
|
|
(nes_ppu_mem_pal_size - 1); |
|
|
|
ppu->data = ppu->palette[pal_addr]; |
|
|
|
} |
|
|
|
|
|
|
|
ppu->addr += (ppu->status & ppu_Control_VRAM_Inc) ? |
|
|
|
32 : 1; |
|
|
|
} |
|
|
|
@@ -68,16 +82,35 @@ void nes_ppu_write(nes_ppu* ppu, uint16_t addr, uint8_t val) { |
|
|
|
|
|
|
|
} else if (ppu_reg_addr == addr) { |
|
|
|
if (ppu->latch) { |
|
|
|
ppu->addr &= 0xFF00U; |
|
|
|
ppu->addr &= 0x3F00U; |
|
|
|
ppu->addr |= val; |
|
|
|
printf("PPU: VRAM ADDR %04x\n", ppu->addr); |
|
|
|
|
|
|
|
} else { |
|
|
|
ppu->addr &= 0x00FFU; |
|
|
|
ppu->addr |= (uint16_t)(val & 0x3FU) << 8; |
|
|
|
ppu->addr |= (uint16_t)val << 8; |
|
|
|
} |
|
|
|
ppu->latch = !ppu->latch; |
|
|
|
|
|
|
|
} else if (ppu_reg_data == addr) { |
|
|
|
ppu->vram[ppu->addr - nes_ppu_mem_vram_start] = val; |
|
|
|
if (ppu->addr >= nes_ppu_mem_size) { |
|
|
|
printf("!!! PPU: MEM OOB: %04x", ppu->addr); |
|
|
|
|
|
|
|
} else if (ppu->addr >= nes_ppu_mem_pal_start) { |
|
|
|
uint8_t pal_addr = |
|
|
|
(ppu->addr - nes_ppu_mem_pal_start) & |
|
|
|
(nes_ppu_mem_pal_size - 1); |
|
|
|
ppu->palette[pal_addr] = val; |
|
|
|
|
|
|
|
} else if (ppu->addr >= nes_ppu_mem_vram_start) { |
|
|
|
uint16_t vram_addr = ppu->addr - nes_ppu_mem_vram_start; |
|
|
|
if (vram_addr >= nes_ppu_mem_vram_size) { |
|
|
|
printf("!!! PPU: VRAM OOB: %04x", vram_addr); |
|
|
|
vram_addr &= (nes_ppu_mem_vram_size - 1); |
|
|
|
} |
|
|
|
ppu->vram[vram_addr] = val; |
|
|
|
} |
|
|
|
|
|
|
|
ppu->addr += (ppu->status & ppu_Control_VRAM_Inc) ? |
|
|
|
32 : 1; |
|
|
|
} |
|
|
|
|