Fixed PPU bug.

Fixed polling SDL events speed issue.
This commit is contained in:
Selim Mustafaev 2023-09-18 22:41:55 +03:00
parent 796828fa01
commit 5a459e582d
4 changed files with 33 additions and 16 deletions

View File

@ -14,20 +14,21 @@ int main() {
nes::SdlWindow window(nes::Ppu::SCREEN_WIDTH, nes::Ppu::SCREEN_HEIGHT);
window.setSize(nes::Ppu::SCREEN_WIDTH * 4, nes::Ppu::SCREEN_HEIGHT * 4);
device.setNewFrameCallback(std::bind(&nes::SdlWindow::drawFrame, &window, _1));
SDL_Event e;
device.setNewFrameCallback([&window, &e](auto buffer){
window.drawFrame(buffer);
while(SDL_PollEvent(&e));
});
device.connect(std::make_shared<SdlKeyboardController>());
device.insertCartridge("/home/selim/Downloads/smb.nes");
//device.insertCartridge("/Users/selim/Documents/nestest.nes");
//device.insertCartridge("C:\\Users\\selim\\Documents\\nestest.nes");
SDL_Event e;
uint64_t cycles = 0;
while (cycles < 1000000000) {
device.tick();
cycles++;
while(SDL_PollEvent(&e));
//int64_t us = static_cast<int64_t>(1000000000.0/(60*nes::Ppu::SCREEN_WIDTH*nes::Ppu::SCREEN_HEIGHT));
//std::this_thread::sleep_for(std::chrono::nanoseconds(1));
}

View File

@ -10,7 +10,12 @@
namespace nes {
Nes::Nes(): _cycles{}, _logger(100*1024*1024) {
Nes::Nes():
_cycles{}
#ifdef NES_LOGGING
,_logger(500*1024*1024)
#endif
{
_cpu = std::make_unique<Cpu>();
_ppu = std::make_shared<Ppu>();
}
@ -42,24 +47,32 @@ namespace nes {
void Nes::tick() {
bool needInterrupt = _ppu->tick();
// _logger.addLine(_cycles, _ppu->state());
#ifdef NES_LOGGING
_logger.addLine(_cycles, _ppu->state());
#endif
if(_cycles % 3 == 0) {
bool instructionExecuted = _cpu->tick();
// if(instructionExecuted) {
// _logger.addLine(_cycles, _cpu->state());
// }
#ifdef NES_LOGGING
if(instructionExecuted) {
_logger.addLine(_cycles, _cpu->state());
}
#endif
}
if(needInterrupt) {
_cpu->nmi();
// _logger.addLine(_cycles, "NMI");
// _logger.addLine(_cycles, _cpu->state());
#ifdef NES_LOGGING
_logger.addLine(_cycles, "NMI");
_logger.addLine(_cycles, _cpu->state());
#endif
}
// if(_cycles == 500000) {
// _logger.dump("/home/selim/Documents/log.txt");
// }
#ifdef NES_LOGGING
if(_cycles == 3000000) {
_logger.dump("/home/selim/Documents/log.txt");
}
#endif
_cycles++;
}

View File

@ -31,7 +31,10 @@ namespace nes {
std::unique_ptr<Cpu> _cpu;
std::shared_ptr<Ppu> _ppu;
std::shared_ptr<Cartridge> _cartridge;
#ifdef NES_LOGGING
Logger _logger;
#endif
};
}

View File

@ -170,8 +170,8 @@ namespace nes {
break;
case PpuData:
value = _dataTemp;
_dataTemp = internalRead(address);
if(address >= 0x3F00) {
_dataTemp = internalRead(_vRamAddress.value);
if(_vRamAddress.value >= 0x3F00) {
value = _dataTemp;
}
_vRamAddress.value += _control.incrementMode ? 32 : 1;