// // Created by william on 12/30/23. // #include #include "../include/ppu.h" void ppu_init(PPU *ppu, byte *registers_ram, byte *oam_dma_register) { ppu->registers = registers_ram; ppu->registers[PPU_REGISTER_CTRL] = 0x00; ppu->registers[PPU_REGISTER_MASK] = 0x00; ppu->registers[PPU_REGISTER_STATUS] = 0x00; ppu->registers[PPU_REGISTER_OAM_ADDR] = 0x00; ppu->registers[PPU_REGISTER_OAM_DATA] = 0x00; ppu->registers[PPU_REGISTER_SCROLL] = 0x00; ppu->registers[PPU_REGISTER_ADDR] = 0x00; ppu->registers[PPU_REGISTER_DATA] = 0x00; ppu->oam_dma_register = oam_dma_register; ppu->odd_frame = false; } long frame = 0; int x, y = 0; void ppu_cycle(PPU *ppu) { int frame_width = 341; int frame_height = 262; bool rendering_enabled = ppu_read_flag(ppu, PPU_REGISTER_MASK, PPU_MASK_SHOW_BG | PPU_MASK_SHOW_SP); if (rendering_enabled && ppu->odd_frame) { // With rendering enabled, the odd frames are shorter // TODO: and doing the last cycle of the last dummy nametable fetch there instead frame_width = 339; frame_height = 261; } x++; if (x >= frame_width) { x = 0; y++; } if (y >= frame_height) { y = 0; frame++; ppu->odd_frame = !ppu->odd_frame; } } bool ppu_read_flag(PPU *ppu, size_t reg, byte mask) { return ppu->registers[reg] & mask; } //byte ppu_read_register(PPU *ppu, size_t reg, byte mask) { // return ppu->registers[reg] & mask; //} void ppu_read_register(PPU *ppu, byte reg) { if (reg == PPU_REGISTER_STATUS) { ppu->w = false; } } void ppu_write_register(PPU *ppu, byte reg) { if (reg == PPU_REGISTER_SCROLL || reg == PPU_REGISTER_ADDR) { ppu->w = !ppu->w; } if (reg == PPU_REGISTER_OAM_DATA) { ppu->registers[PPU_REGISTER_OAM_ADDR]++; } }