mirror of
https://github.com/mkwong98/HDNes.git
synced 2025-04-02 10:32:07 -04:00
117 lines
2.5 KiB
C++
117 lines
2.5 KiB
C++
#include "ppu.h"
|
|
#include "cpu.h"
|
|
#include "../gameManager.h"
|
|
|
|
|
|
ppu::ppu(){
|
|
frameReady = false;
|
|
isRendering = false;
|
|
}
|
|
|
|
ppu::~ppu()
|
|
{
|
|
//dtor
|
|
}
|
|
|
|
Uint8 ppu::readReg(Uint8 idx){
|
|
if(idx == REG_PPUSTATUS){
|
|
//only read bit 5-7
|
|
busValue = (busValue & 0x1F) | (registers[idx] & 0xE0);
|
|
//clear flag 7
|
|
registers[idx] = registers[idx] & 0x7F;
|
|
}
|
|
else if(idx == REG_OAMDATA || idx == REG_PPUDATA){
|
|
busValue = registers[idx];
|
|
}
|
|
return busValue;
|
|
}
|
|
|
|
void ppu::writeReg(Uint8 idx, Uint8 value){
|
|
//skip for certain reg when not ready
|
|
if(bootUpCycles && idx == REG_PPUCTRL) return;
|
|
busValue = value;
|
|
if(idx == REG_PPUCTRL || idx == REG_PPUMASK || idx == REG_OAMADDR || idx == REG_PPUSCROLL || idx == REG_PPUADDR || idx == REG_PPUDATA){
|
|
registers[idx] = value;
|
|
}
|
|
else if(idx == REG_OAMDATA){
|
|
oam[registers[REG_OAMADDR]] = busValue;
|
|
++(registers[REG_OAMADDR]);
|
|
}
|
|
}
|
|
|
|
Uint8 ppu::read4014(){
|
|
}
|
|
|
|
void ppu::write4014(Uint8 value){
|
|
}
|
|
|
|
void ppu::runCycle(){
|
|
if(bootUpCycles) --bootUpCycles;
|
|
|
|
|
|
|
|
|
|
//rendering
|
|
if(renderingY < 240){
|
|
//pre render scan line
|
|
}
|
|
else if(renderingY == 241){
|
|
if(renderingX == 1 && (registers[REG_PPUCTRL] & 0x80)){
|
|
cp->pullNMILow();
|
|
}
|
|
}
|
|
else if(renderingY == 261){
|
|
if(renderingX == 1){
|
|
//clear top 3 bits
|
|
registers[REG_PPUSTATUS] = registers[REG_PPUSTATUS] & 0x1F;
|
|
}
|
|
}
|
|
|
|
//update x and y at the end of cycle
|
|
if(renderingX == 339 && renderingY == 261 && oddFrame) ++renderingX;
|
|
if(renderingX == 340){
|
|
renderingX = 0;
|
|
if(renderingY == 261){
|
|
renderingY = 0;
|
|
oddFrame = !oddFrame;
|
|
}
|
|
else{
|
|
++renderingY;
|
|
}
|
|
}
|
|
else{
|
|
++renderingX;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ppu::reset(){
|
|
}
|
|
|
|
void ppu::saveState(fstream* statefile){
|
|
}
|
|
|
|
void ppu::loadState(fstream* statefile){
|
|
}
|
|
|
|
void ppu::init(){
|
|
mb = gameManager::gm->mb;
|
|
cp = gameManager::gm->cp;
|
|
}
|
|
|
|
void ppu::init2(){
|
|
registers[REG_PPUCTRL] = 0;
|
|
registers[REG_PPUMASK] = 0;
|
|
registers[REG_PPUSTATUS] = 0xA0;
|
|
registers[REG_OAMADDR] = 0x00;
|
|
addressLatch = 0x00;
|
|
registers[REG_PPUSCROLL] = 0x00;
|
|
registers[REG_PPUADDR] = 0x00;
|
|
registers[REG_PPUDATA] = 0x00;
|
|
oddFrame = false;
|
|
bootUpCycles = 29658;
|
|
renderingX = 0;
|
|
renderingY = 0;
|
|
}
|