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.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)

View File

@ -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> cartridge) {

View File

@ -12,6 +12,7 @@ namespace nes {
_nameTable = std::make_unique<uint8_t[]>(1024);
_paletteTable = std::make_unique<uint8_t[]>(32);
_palette = std::make_unique<Pixel[]>(64);
_oamData = std::make_unique<SpriteInfo[]>(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<uint8_t*>(_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<uint8_t*>(_oamData.get())[_oamAddress] = value;
break;
default:
break;
}

View File

@ -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<Pixel[]> _palette;
std::unique_ptr<uint8_t[]> _paletteTable;
std::unique_ptr<SpriteInfo[]> _oamData;
uint8_t _oamAddress;
private:
std::unique_ptr<Pixel[]> _frameBuffer;
std::shared_ptr<Cartridge> _cartridge;