From b57a0ef92df56ced24b25c8d9a58f57d5e525aa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Fri, 14 Feb 2020 17:32:13 +0100 Subject: [PATCH] hot fix --- sources/PPU/PPU.cpp | 39 +++++++++++++++++++++++++------- sources/PPU/PPU.hpp | 45 +++++++++++++++++++++++++++++-------- sources/Ram/ExtendedRam.cpp | 2 +- 3 files changed, 68 insertions(+), 18 deletions(-) diff --git a/sources/PPU/PPU.cpp b/sources/PPU/PPU.cpp index ab655f8..49adcf5 100644 --- a/sources/PPU/PPU.cpp +++ b/sources/PPU/PPU.cpp @@ -39,8 +39,12 @@ namespace ComSquare::PPU this->_oamadd.oamaddh = data; break; case ppuRegisters::oamdata: - //! @brief not implemented yet. this->_oamdata = data; + throw InvalidAddress("oamdata", addr); + std::cout << "oamdata" << std::endl; + // the oamAddress have to be calculated if fblank or not (not implemented) + _oamram.write(this->_oamadd.oamAddress, this->_oamdata); + this->_oamadd.oamAddress++; break; case ppuRegisters::bgmode: this->_bgmode.raw = data; @@ -73,7 +77,17 @@ namespace ComSquare::PPU break; case ppuRegisters::vmain: this->_vmain.raw = data; - break; + switch (this->_vmain.incrementAmount) { + case 0b00: + this->_incrementAmount = 1; + break; + case 0b01: + this->_incrementAmount = 32; + break; + case 0b10: + case 0b11: + this->_incrementAmount = 128; + } case ppuRegisters::vmaddl: this->_vmadd.vmaddl = data; break; @@ -81,20 +95,23 @@ namespace ComSquare::PPU this->_vmadd.vmaddh = data; break; case ppuRegisters::vmdatal: + throw InvalidAddress("vmdata", addr); + std::cout << "vmdatal" << std::endl; if (!this->_inidisp.fblank) { this->_vmdata.vmdatal = data; - //this->_vram[getVramAddress()] = this->_vmdata.vmdata; + this->_vram.write(getVramAddress(), this->_vmdata.vmdata); } if (!this->_vmain.incrementMode) - this->_vmadd.vmadd += this->_vmain.incrementAmount; + this->_vmadd.vmadd += this->_incrementAmount; break; case ppuRegisters::vmdatah: + std::cout << "vmdatah" << std::endl; if (!this->_inidisp.fblank) { this->_vmdata.vmdatah = data; - //this->_vram[getVramAddress()] = this->_vmdata.vmdata; + this->_vram.write(getVramAddress(), this->_vmdata.vmdata); } if (this->_vmain.incrementMode) - this->_vmadd.vmadd += this->_vmain.incrementAmount; + this->_vmadd.vmadd += this->_incrementAmount; break; case ppuRegisters::m7sel: this->_m7sel.raw = data; @@ -104,11 +121,14 @@ namespace ComSquare::PPU this->_isLowByte = true; break; case ppuRegisters::cgdata: + throw InvalidAddress("cgdata", addr); if (this->_isLowByte) { + std::cout << "cgadatal" << std::endl; this->_cgdata.cgdatal = data; this->_cgram.write(this->_cgadd, this->_cgdata.raw); } else { + std::cout << "cgadatah" << std::endl; this->_cgdata.cgdatah = data; this->_cgram.write(this->_cgadd, this->_cgdata.raw); } @@ -186,14 +206,18 @@ namespace ComSquare::PPU int inc = 0; //uint32_t pixelTmp = 0xFFFFFFFF; //pixelTmp |= this->_inidisp.brightness; + std::cout << "update" << std::endl; if (!this->_inidisp.fblank) { for (int x = 0; x < 448; x++) { for (int y = 0; y < 512; y++) { - //this->_renderer.putPixel(x, y, ((uint32_t)_vram[inc++] << 8U) + 0xFFU); + if (inc == 0xFA00) + inc = 0; + //std::cout << "holy" << std::endl; this->_renderer.putPixel(x, y, (uint32_t)this->_vram.read(inc++)); } } } + std::cout << "cgadata2" << std::endl; this->_renderer.drawScreen(); } @@ -205,6 +229,5 @@ namespace ComSquare::PPU _cgram(512) { this->_isLowByte = true; - //_vram = new uint16_t[32000]; } } \ No newline at end of file diff --git a/sources/PPU/PPU.hpp b/sources/PPU/PPU.hpp index a7f0342..22c72ed 100644 --- a/sources/PPU/PPU.hpp +++ b/sources/PPU/PPU.hpp @@ -217,75 +217,100 @@ namespace ComSquare::PPU //! @brief INIDISP Register (F-blank and Brightness) union { struct { + //! @brief Store the brightness value (F = max, 0 = off) uint8_t brightness: 4; bool _: 3; + //! @brief Store the FBlank status bool fblank: 1; }; - uint8_t raw; + uint8_t raw = 0; } _inidisp; //! @brief OBSEL Register (Object Size and Character Address) union { struct { - uint8_t baseSelect: 3; - bool nameSelect: 2; + //! @brief Stores the location of the first sprite table + uint8_t nameBaseSelect: 3; + //! @brief Stores the offset of the second sprite table + uint8_t nameSelect: 2; + //! @brief Stores the resolution preset of the sprites uint8_t objectSize: 3; }; - uint8_t raw; + uint8_t raw = 0; } _obsel; //! @brief OAMADD Register (OAM Address and Obj Priority) union { struct { + //! @brief Stores the address to write with OAMDATA register uint32_t oamAddress: 9; uint8_t _: 6; + //! @brief When Obj Priority activation bit is set, an Obj other than Sprite 0 may be given priority bool objPriorityActivationBit: 1; }; struct { + //! @brief Stores the data written on the OAMADDL register uint8_t oamaddl; + //! @brief Stores the data written on the OAMADDH register uint8_t oamaddh; }; - uint32_t raw; + uint32_t raw = 0; } _oamadd; //! @brief OAMDATA Register (Data for OAM write) uint8_t _oamdata; //! @brief BGMODE Register (OAM Address and Obj Priority) union { struct { + //! @brief Stores the current BG Mode (0 - 7) uint8_t bgMode: 3; + //! @brief When Mode 1 BG3 priority bit is set the BG3 is draw bool mode1Bg3PriorityBit: 1; + //! @brief When The bit is set character size will 16x16 otherwise it is 8x8 bool characterSizeBg1: 1; + //! @brief When The bit is set character size will 16x16 otherwise it is 8x8 bool characterSizeBg2: 1; + //! @brief When The bit is set character size will 16x16 otherwise it is 8x8 bool characterSizeBg3: 1; + //! @brief When The bit is set character size will 16x16 otherwise it is 8x8 bool characterSizeBg4: 1; }; - uint8_t raw; + uint8_t raw = 0; } _bgmode; //! @brief MOSAIC Register (Screen Pixelation) union { struct { + //! @brief Apply mosaic to the BG1 bool affectBg1: 1; + //! @brief Apply mosaic to the BG2 bool affectBg2: 1; + //! @brief Apply mosaic to the BG3 bool affectBg3: 1; + //! @brief Apply mosaic to the BG4 bool affectBg4: 1; + //! @brief Stores the pixel size (0 = 1x1, F = 16x16) uint8_t pixelSize: 4; }; - uint8_t raw; + uint8_t raw = 0; } _mosaic; //! @brief BGSC Registers (BG Tilemap Address and Size) union { struct { + //! @brief When tilemap horizontal mirroring bit is set the tilemap is mirrored horizontally bool tilemapHorizontalMirroring: 1; + //! @brief When tilemap vertically mirroring bit is set the tilemap is mirrored vertically bool tilemapVerticalMirroring: 1; + //! @brief Address of the tilemap Address (0, 0) uint8_t tilemapAddress: 6; }; - uint8_t raw; + uint8_t raw = 0; } _bgsc[4]; //! @brief BGNBA Registers (BG1/2/3/4 Chr Address) union { struct { + //! @brief The address let us know where to search for BG1/3 characters uint8_t baseAddressBg1a3: 4; + //! @brief The address let us know where to search for BG2/4 characters uint8_t baseAddressBg2a4: 4; }; - uint8_t raw; + uint8_t raw = 0; } _bgnba[2]; //! @brief BGXXOFS Register (BG1/2/3/4 Horizontal and Vertical Scrolls) union { @@ -314,6 +339,8 @@ namespace ComSquare::PPU }; uint8_t raw; } _vmain; + //! @brief Store the real value of the increment Amount (1, 32, 128) instead of 0,1 or 2 + uint8_t _incrementAmount; //! @brief VMADD Register (VRAM Address) union { struct { diff --git a/sources/Ram/ExtendedRam.cpp b/sources/Ram/ExtendedRam.cpp index 0e2ea3e..8e75476 100644 --- a/sources/Ram/ExtendedRam.cpp +++ b/sources/Ram/ExtendedRam.cpp @@ -23,7 +23,7 @@ namespace ComSquare::Ram uint16_t ExtendedRam::read(uint24_t addr) { if (addr >= this->_size) - throw InvalidAddress("ExtendedRam Write", addr); + throw InvalidAddress("ExtendedRam Read", addr); return this->_data[addr]; }