diff --git a/CMakeLists.txt b/CMakeLists.txt index 350a802..f3a11eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,9 @@ add_executable(nes src/Mapper/Mapper.cpp src/Mapper/Mapper.h src/Mapper/Mapper0.cpp - src/Mapper/Mapper0.h src/Ppu.cpp src/Ppu.h) + src/Mapper/Mapper0.h src/Ppu.cpp src/Ppu.h + src/Window.cpp + src/Window.h) find_package(SDL2 CONFIG REQUIRED) target_link_libraries(nes PRIVATE SDL2::SDL2) \ No newline at end of file diff --git a/src/Bus.cpp b/src/Bus.cpp index dcbf6c6..e322807 100644 --- a/src/Bus.cpp +++ b/src/Bus.cpp @@ -4,6 +4,7 @@ #include "Bus.h" #include +#include namespace nes { @@ -17,7 +18,7 @@ namespace nes { } else if(address >= 0x2000 && address < 0x4000) { std::cout << "PPU read at address: " << address << std::endl; - return 0; + return _ppu->read(address & 0x0007); } else if(address >= 0x8000) { return _cartridge->readPrg(address); @@ -32,13 +33,18 @@ namespace nes { } else if(address >= 0x2000 && address < 0x4000) { std::cout << "PPU write at address: " << address << std::endl; + _ppu->write(address & 0x0007, value); } else if(address >= 0x8000) { std::cout << "Cartridge write at address: " << address << std::endl; } } - void Bus::connect(Cartridge *cartridge) { - _cartridge = cartridge; + void Bus::connect(std::shared_ptr cartridge) { + _cartridge = std::move(cartridge); + } + + void Bus::connect(std::shared_ptr ppu) { + _ppu = std::move(ppu); } } \ No newline at end of file diff --git a/src/Bus.h b/src/Bus.h index 5ca2e85..e27ea15 100644 --- a/src/Bus.h +++ b/src/Bus.h @@ -6,6 +6,7 @@ #define NES_BUS_H #include "Cartridge.h" +#include "Ppu.h" #include #include @@ -17,11 +18,13 @@ namespace nes { Bus(); uint8_t read(uint16_t address); void write(uint16_t address, uint8_t value); - void connect(Cartridge* cartridge); + void connect(std::shared_ptr cartridge); + void connect(std::shared_ptr ppu); private: std::unique_ptr _ram; - Cartridge* _cartridge; + std::shared_ptr _cartridge; + std::shared_ptr _ppu; }; } diff --git a/src/Nes.cpp b/src/Nes.cpp index c00c28c..37ff726 100644 --- a/src/Nes.cpp +++ b/src/Nes.cpp @@ -16,7 +16,8 @@ namespace nes { void Nes::runRom(const fs::path &path, std::optional address) { _cartridge = std::make_shared(path); - _cpu->bus()->connect(_cartridge.get()); + _cpu->bus()->connect(_cartridge); + _cpu->bus()->connect(_ppu); reset(address); } diff --git a/src/Ppu.cpp b/src/Ppu.cpp index 6592ab3..bd1235c 100644 --- a/src/Ppu.cpp +++ b/src/Ppu.cpp @@ -7,11 +7,12 @@ namespace nes { Ppu::Ppu(): _column{}, _scanline{} { - + _frameBuffer = std::make_unique(SCREEN_WIDTH*SCREEN_HEIGHT); } void Ppu::tick() { + setPixel(_scanline, _column, {}); _column++; if(_column >= 341) { @@ -20,7 +21,21 @@ namespace nes { if(_scanline >= 261) { _scanline = -1; + onNewFrame(_frameBuffer.get()); } } } + + void Ppu::write(uint16_t address, uint8_t value) { + + } + + uint8_t Ppu::read(uint16_t address) { + return 0; + } + + void Ppu::setPixel(uint16_t row, uint16_t column, Pixel pixel) { + size_t index = row*SCREEN_WIDTH + column; + _frameBuffer[index] = pixel; + } } \ No newline at end of file diff --git a/src/Ppu.h b/src/Ppu.h index b00cdfa..954dbac 100644 --- a/src/Ppu.h +++ b/src/Ppu.h @@ -6,17 +6,37 @@ #define NES_PPU_H #include +#include +#include namespace nes { + struct Pixel { + uint8_t R; + uint8_t G; + uint8_t B; + uint8_t A; + }; + class Ppu { + public: + static constexpr uint16_t SCREEN_WIDTH = 256; + static constexpr uint16_t SCREEN_HEIGHT = 240; + public: Ppu(); void tick(); + void write(uint16_t address, uint8_t value); + uint8_t read(uint16_t address); + void setPixel(uint16_t row, uint16_t column, Pixel pixel); + + public: + std::function onNewFrame; private: int16_t _column; int16_t _scanline; + std::unique_ptr _frameBuffer; }; } diff --git a/src/Window.cpp b/src/Window.cpp new file mode 100644 index 0000000..b68117c --- /dev/null +++ b/src/Window.cpp @@ -0,0 +1,9 @@ +// +// Created by Мустафаев Селим Мустафаевич on 24.08.2023. +// + +#include "Window.h" + +namespace nes { + +} \ No newline at end of file diff --git a/src/Window.h b/src/Window.h new file mode 100644 index 0000000..f784565 --- /dev/null +++ b/src/Window.h @@ -0,0 +1,18 @@ +// +// Created by Мустафаев Селим Мустафаевич on 24.08.2023. +// + +#ifndef NES_WINDOW_H +#define NES_WINDOW_H + +#include + +namespace nes { + + class Window { + + }; + +} + +#endif //NES_WINDOW_H