Adding OAM buffer

This commit is contained in:
Selim Mustafaev 2023-09-20 23:23:13 +03:00
parent 5a459e582d
commit 116a195cae
4 changed files with 37 additions and 2 deletions

View File

@ -22,7 +22,13 @@ add_executable(nes
src/Window.cpp src/Window.cpp
src/Window.h src/Window.h
src/Shifter.cpp 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(SDL2 CONFIG REQUIRED)
find_package(fmt REQUIRED) find_package(fmt REQUIRED)

View File

@ -17,7 +17,6 @@ namespace nes {
return _ram[address & 0x07FF]; return _ram[address & 0x07FF];
} }
else if(address >= 0x2000 && address < 0x4000) { else if(address >= 0x2000 && address < 0x4000) {
//std::cout << "PPU read at address: " << address << std::endl;
return _ppu->read(address & 0x0007); return _ppu->read(address & 0x0007);
} }
else if(address >= 0x8000) { else if(address >= 0x8000) {
@ -26,6 +25,10 @@ namespace nes {
else if(address == 0x4016) { else if(address == 0x4016) {
return _controller1->read(); return _controller1->read();
} }
else if(address == 0x4017) {
// Controller 2
return 0;
}
return 0; return 0;
} }
@ -40,9 +43,15 @@ namespace nes {
else if(address >= 0x8000) { else if(address >= 0x8000) {
std::cout << "Cartridge write at address: " << address << std::endl; std::cout << "Cartridge write at address: " << address << std::endl;
} }
else if(address == 0x4014) {
// DMA
}
else if(address == 0x4016) { else if(address == 0x4016) {
_controller1->poll(); _controller1->poll();
} }
else if(address == 0x4017) {
// Controller 2
}
} }
void Bus::connect(std::shared_ptr<Cartridge> cartridge) { void Bus::connect(std::shared_ptr<Cartridge> cartridge) {

View File

@ -12,6 +12,7 @@ namespace nes {
_nameTable = std::make_unique<uint8_t[]>(1024); _nameTable = std::make_unique<uint8_t[]>(1024);
_paletteTable = std::make_unique<uint8_t[]>(32); _paletteTable = std::make_unique<uint8_t[]>(32);
_palette = std::make_unique<Pixel[]>(64); _palette = std::make_unique<Pixel[]>(64);
_oamData = std::make_unique<SpriteInfo[]>(64);
_palette[0x00] = Pixel(84, 84, 84); _palette[0x00] = Pixel(84, 84, 84);
_palette[0x01] = Pixel(0, 30, 116); _palette[0x01] = Pixel(0, 30, 116);
@ -176,6 +177,9 @@ namespace nes {
} }
_vRamAddress.value += _control.incrementMode ? 32 : 1; _vRamAddress.value += _control.incrementMode ? 32 : 1;
break; break;
case OamData:
value = reinterpret_cast<uint8_t*>(_oamData.get())[_oamAddress];
break;
} }
return value; return value;
} }
@ -214,6 +218,12 @@ namespace nes {
internalWrite(_vRamAddress.value, value); internalWrite(_vRamAddress.value, value);
_vRamAddress.value += _control.incrementMode ? 32 : 1; _vRamAddress.value += _control.incrementMode ? 32 : 1;
break; break;
case OamAddress:
_oamAddress = value;
break;
case OamData:
reinterpret_cast<uint8_t*>(_oamData.get())[_oamAddress] = value;
break;
default: default:
break; break;
} }

View File

@ -97,6 +97,13 @@ namespace nes {
uint8_t msb; uint8_t msb;
}; };
struct SpriteInfo {
uint8_t y;
uint8_t id;
uint8_t attr;
uint8_t x;
};
public: public:
Ppu(); Ppu();
bool tick(); bool tick();
@ -142,6 +149,9 @@ namespace nes {
std::unique_ptr<Pixel[]> _palette; std::unique_ptr<Pixel[]> _palette;
std::unique_ptr<uint8_t[]> _paletteTable; std::unique_ptr<uint8_t[]> _paletteTable;
std::unique_ptr<SpriteInfo[]> _oamData;
uint8_t _oamAddress;
private: private:
std::unique_ptr<Pixel[]> _frameBuffer; std::unique_ptr<Pixel[]> _frameBuffer;
std::shared_ptr<Cartridge> _cartridge; std::shared_ptr<Cartridge> _cartridge;