65 lines
824 B
C
65 lines
824 B
C
|
#pragma once
|
||
|
#include "stdafx.h"
|
||
|
#include "PpuTypes.h"
|
||
|
|
||
|
class Ppu
|
||
|
{
|
||
|
private:
|
||
|
uint16_t _cycle = 0;
|
||
|
uint16_t _scanline = 0;
|
||
|
uint32_t _frameCount = 0;
|
||
|
bool _nmiFlag = false;
|
||
|
|
||
|
public:
|
||
|
PpuState GetState()
|
||
|
{
|
||
|
return {
|
||
|
_cycle,
|
||
|
_scanline,
|
||
|
_frameCount
|
||
|
};
|
||
|
}
|
||
|
|
||
|
void Exec()
|
||
|
{
|
||
|
if(_cycle == 340) {
|
||
|
_cycle = 0;
|
||
|
_scanline++;
|
||
|
|
||
|
if(_scanline == 225) {
|
||
|
_nmiFlag = true;
|
||
|
}
|
||
|
|
||
|
if(_scanline == 260) {
|
||
|
_nmiFlag = false;
|
||
|
_scanline = 0;
|
||
|
_frameCount++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_cycle++;
|
||
|
}
|
||
|
|
||
|
uint8_t Read(uint16_t addr)
|
||
|
{
|
||
|
switch(addr) {
|
||
|
case 0x4210:
|
||
|
return _nmiFlag ? 0x80 : 0;
|
||
|
break;
|
||
|
|
||
|
case 0x4212:
|
||
|
return (
|
||
|
(_scanline >= 225 ? 0x80 : 0) ||
|
||
|
((_cycle >= 0x121 || _cycle <= 0x15) ? 0x40 : 0)
|
||
|
);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void Write(uint32_t addr, uint8_t value)
|
||
|
{
|
||
|
|
||
|
}
|
||
|
};
|