diff --git a/main.cpp b/main.cpp index 20190f5..0330a9d 100644 --- a/main.cpp +++ b/main.cpp @@ -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()); 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(1000000000.0/(60*nes::Ppu::SCREEN_WIDTH*nes::Ppu::SCREEN_HEIGHT)); //std::this_thread::sleep_for(std::chrono::nanoseconds(1)); } diff --git a/src/Nes.cpp b/src/Nes.cpp index 935667c..f90a8b3 100644 --- a/src/Nes.cpp +++ b/src/Nes.cpp @@ -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(); _ppu = std::make_shared(); } @@ -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++; } diff --git a/src/Nes.h b/src/Nes.h index 6de4f2e..5d37b00 100644 --- a/src/Nes.h +++ b/src/Nes.h @@ -31,7 +31,10 @@ namespace nes { std::unique_ptr _cpu; std::shared_ptr _ppu; std::shared_ptr _cartridge; + +#ifdef NES_LOGGING Logger _logger; +#endif }; } diff --git a/src/Ppu.cpp b/src/Ppu.cpp index 983b107..194eb87 100644 --- a/src/Ppu.cpp +++ b/src/Ppu.cpp @@ -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;