2024-01-06 14:27:09 -05:00
|
|
|
//
|
|
|
|
// Created by william on 12/30/23.
|
|
|
|
//
|
|
|
|
|
|
|
|
#include <stddef.h>
|
|
|
|
#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;
|
|
|
|
}
|
|
|
|
|
2024-05-04 21:38:09 -04:00
|
|
|
long frame = 0;
|
|
|
|
int x, y = 0;
|
|
|
|
|
2024-01-06 14:27:09 -05:00
|
|
|
void ppu_cycle(PPU *ppu) {
|
2024-05-04 21:38:09 -04:00
|
|
|
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;
|
|
|
|
}
|
2024-01-06 14:27:09 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
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]++;
|
|
|
|
}
|
|
|
|
}
|