diff --git a/CMakeLists.txt b/CMakeLists.txt index 5dd82d5..4653830 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,13 @@ add_executable(nes src/Window.cpp src/Window.h src/Shifter.cpp - src/Shifter.h src/Logger.cpp src/Logger.h src/Controller.cpp src/Controller.h src/SdlKeyboardController.cpp src/SdlKeyboardController.h) + src/Shifter.h + src/Logger.cpp + src/Logger.h + src/Controller.cpp + src/Controller.h + src/SdlKeyboardController.cpp + src/SdlKeyboardController.h) find_package(SDL2 CONFIG REQUIRED) find_package(fmt REQUIRED) diff --git a/src/Bus.cpp b/src/Bus.cpp index a31a2e9..d3ead41 100644 --- a/src/Bus.cpp +++ b/src/Bus.cpp @@ -17,7 +17,6 @@ namespace nes { return _ram[address & 0x07FF]; } else if(address >= 0x2000 && address < 0x4000) { - //std::cout << "PPU read at address: " << address << std::endl; return _ppu->read(address & 0x0007); } else if(address >= 0x8000) { @@ -26,6 +25,10 @@ namespace nes { else if(address == 0x4016) { return _controller1->read(); } + else if(address == 0x4017) { + // Controller 2 + return 0; + } return 0; } @@ -40,9 +43,15 @@ namespace nes { else if(address >= 0x8000) { std::cout << "Cartridge write at address: " << address << std::endl; } + else if(address == 0x4014) { + // DMA + } else if(address == 0x4016) { _controller1->poll(); } + else if(address == 0x4017) { + // Controller 2 + } } void Bus::connect(std::shared_ptr cartridge) { diff --git a/src/Ppu.cpp b/src/Ppu.cpp index 194eb87..66d2897 100644 --- a/src/Ppu.cpp +++ b/src/Ppu.cpp @@ -12,6 +12,7 @@ namespace nes { _nameTable = std::make_unique(1024); _paletteTable = std::make_unique(32); _palette = std::make_unique(64); + _oamData = std::make_unique(64); _palette[0x00] = Pixel(84, 84, 84); _palette[0x01] = Pixel(0, 30, 116); @@ -176,6 +177,9 @@ namespace nes { } _vRamAddress.value += _control.incrementMode ? 32 : 1; break; + case OamData: + value = reinterpret_cast(_oamData.get())[_oamAddress]; + break; } return value; } @@ -214,6 +218,12 @@ namespace nes { internalWrite(_vRamAddress.value, value); _vRamAddress.value += _control.incrementMode ? 32 : 1; break; + case OamAddress: + _oamAddress = value; + break; + case OamData: + reinterpret_cast(_oamData.get())[_oamAddress] = value; + break; default: break; } diff --git a/src/Ppu.h b/src/Ppu.h index a01c61e..ecf73c7 100644 --- a/src/Ppu.h +++ b/src/Ppu.h @@ -97,6 +97,13 @@ namespace nes { uint8_t msb; }; + struct SpriteInfo { + uint8_t y; + uint8_t id; + uint8_t attr; + uint8_t x; + }; + public: Ppu(); bool tick(); @@ -142,6 +149,9 @@ namespace nes { std::unique_ptr _palette; std::unique_ptr _paletteTable; + std::unique_ptr _oamData; + uint8_t _oamAddress; + private: std::unique_ptr _frameBuffer; std::shared_ptr _cartridge;