adding vram read registers

This commit is contained in:
Clément Le Bihan
2021-02-01 18:38:04 +01:00
parent 4802ba0714
commit 71dfa7b880
2 changed files with 36 additions and 10 deletions
+33 -10
View File
@@ -77,7 +77,7 @@ namespace ComSquare::PPU
00,0x00,0x00,0x00,0x80,0x00,0xc0,0x00,0xe0,0x00,0xf0,0x00,0xf8,0x00,0xfc,0x00, 00,0x00,0x00,0x00,0x80,0x00,0xc0,0x00,0xe0,0x00,0xf0,0x00,0xf8,0x00,0xfc,0x00,
00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x07,0x00,0x0f,00,0x1f,00,0x3f,00, -1 00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x07,0x00,0x0f,00,0x1f,00,0x3f,00, -1
};*/ };*/
int *cgram_test = get_dump_cgram(); /* int *cgram_test = get_dump_cgram();
for (int i = 0; cgram_test[i] != -1; i++) { for (int i = 0; cgram_test[i] != -1; i++) {
this->cgram->write_internal(i, cgram_test[i]); this->cgram->write_internal(i, cgram_test[i]);
} }
@@ -85,7 +85,7 @@ namespace ComSquare::PPU
int *vram_test = get_dump_vram(); int *vram_test = get_dump_vram();
for (int i = 0; vram_test[i] != -1; i++) { for (int i = 0; vram_test[i] != -1; i++) {
this->vram->write_internal(i, vram_test[i]); this->vram->write_internal(i, vram_test[i]);
} } */
/*int vram_test_2[] = {8, 00, 02, 00, 0x0A, 00, 02, 00, 0x0A, 00, 00, 00, 00, 00, 00, -1}; /*int vram_test_2[] = {8, 00, 02, 00, 0x0A, 00, 02, 00, 0x0A, 00, 00, 00, 00, 00, 00, -1};
for (int i = 0; vram_test_2[i] != -1; i++) { for (int i = 0; vram_test_2[i] != -1; i++) {
this->vram->write_internal(i + 0x8000, vram_test_2[i]); this->vram->write_internal(i + 0x8000, vram_test_2[i]);
@@ -114,7 +114,7 @@ namespace ComSquare::PPU
//registers //registers
this->_registers._bgmode.bgMode = 1; /* this->_registers._bgmode.bgMode = 1;
this->_backgrounds[0].setBpp(this->getBPP(1)); this->_backgrounds[0].setBpp(this->getBPP(1));
this->_backgrounds[1].setBpp(this->getBPP(1)); this->_backgrounds[1].setBpp(this->getBPP(1));
this->_backgrounds[2].setBpp(this->getBPP(2)); this->_backgrounds[2].setBpp(this->getBPP(2));
@@ -166,12 +166,12 @@ namespace ComSquare::PPU
this->_registers._t[0].enableWindowDisplayBg2 = true; this->_registers._t[0].enableWindowDisplayBg2 = true;
this->_registers._t[0].enableWindowDisplayBg3 = true; this->_registers._t[0].enableWindowDisplayBg3 = true;
*/
} }
uint8_t PPU::read(uint24_t addr) uint8_t PPU::read(uint24_t addr)
{ {
return 0; //return 0;
switch (addr) { switch (addr) {
case PpuRegisters::mpyl: case PpuRegisters::mpyl:
return this->_registers._mpy.mpyl; return this->_registers._mpy.mpyl;
@@ -182,9 +182,25 @@ namespace ComSquare::PPU
case PpuRegisters::slhv: case PpuRegisters::slhv:
return this->_registers._slhv; return this->_registers._slhv;
case PpuRegisters::oamdataread: case PpuRegisters::oamdataread:
case PpuRegisters::vmdatalread:
case PpuRegisters::vmdatahread:
return 0; return 0;
case PpuRegisters::vmdatalread: {
auto returnValue = static_cast<uint8_t>(this->_vramReadBuffer);
if (!this->_registers._vmain.incrementMode) {
this->updateVramReadBuffer();
// & 0x7FFF;
this->_registers._vmadd.vmadd += this->_registers._incrementAmount;
}
return returnValue;
}
case PpuRegisters::vmdatahread: {
auto returnValue = static_cast<uint8_t>(this->_vramReadBuffer >> 8);
if (this->_registers._vmain.incrementMode) {
this->updateVramReadBuffer();
// & 0x7FFF;
this->_registers._vmadd.vmadd += this->_registers._incrementAmount;
}
return returnValue;
}
case PpuRegisters::cgdataread: { case PpuRegisters::cgdataread: {
return this->cgram->read_internal(this->_registers._cgadd++); return this->cgram->read_internal(this->_registers._cgadd++);
} }
@@ -200,7 +216,7 @@ namespace ComSquare::PPU
void PPU::write(uint24_t addr, uint8_t data) void PPU::write(uint24_t addr, uint8_t data)
{ {
return; //return;
switch (addr) { switch (addr) {
case PpuRegisters::inidisp: case PpuRegisters::inidisp:
this->_registers._inidisp.raw = data; this->_registers._inidisp.raw = data;
@@ -277,16 +293,18 @@ namespace ComSquare::PPU
break; break;
case PpuRegisters::vmaddl: case PpuRegisters::vmaddl:
this->_registers._vmadd.vmaddl = data; this->_registers._vmadd.vmaddl = data;
this->updateVramReadBuffer();
break; break;
case PpuRegisters::vmaddh: case PpuRegisters::vmaddh:
this->_registers._vmadd.vmaddh = data; this->_registers._vmadd.vmaddh = data;
this->updateVramReadBuffer();
break; break;
case PpuRegisters::vmdatal: case PpuRegisters::vmdatal:
//throw InvalidAddress("vmdata", addr); //throw InvalidAddress("vmdata", addr);
//std::cout << "vmdatal" << std::endl; //std::cout << "vmdatal" << std::endl;
if (!this->_registers._inidisp.fblank) { if (!this->_registers._inidisp.fblank) {
this->_registers._vmdata.vmdatal = data; this->_registers._vmdata.vmdatal = data;
this->vram->write_internal(getVramAddress(), this->_registers._vmdata.vmdatal); this->vram->write_internal(this->getVramAddress(), this->_registers._vmdata.vmdatal);
} }
if (!this->_registers._vmain.incrementMode) if (!this->_registers._vmain.incrementMode)
this->_registers._vmadd.vmadd += this->_registers._incrementAmount; this->_registers._vmadd.vmadd += this->_registers._incrementAmount;
@@ -295,7 +313,7 @@ namespace ComSquare::PPU
//std::cout << "vmdatah" << std::endl; //std::cout << "vmdatah" << std::endl;
if (!this->_registers._inidisp.fblank) { if (!this->_registers._inidisp.fblank) {
this->_registers._vmdata.vmdatah = data; this->_registers._vmdata.vmdatah = data;
this->vram->write_internal(getVramAddress(), this->_registers._vmdata.vmdatah); this->vram->write_internal(this->getVramAddress(), this->_registers._vmdata.vmdatah);
} }
if (this->_registers._vmain.incrementMode) if (this->_registers._vmain.incrementMode)
this->_registers._vmadd.vmadd += this->_registers._incrementAmount; this->_registers._vmadd.vmadd += this->_registers._incrementAmount;
@@ -760,4 +778,9 @@ namespace ComSquare::PPU
{ {
return this->_registers._bgmode.bgMode; return this->_registers._bgmode.bgMode;
} }
void PPU::updateVramReadBuffer()
{
this->_vramReadBuffer = this->vram->read_internal(this->getVramAddress())
}
} }
+3
View File
@@ -568,6 +568,8 @@ namespace ComSquare::PPU
std::array<std::array<uint32_t, 1024>, 1024> _subScreen; std::array<std::array<uint32_t, 1024>, 1024> _subScreen;
//! @brief Final Screen buffer //! @brief Final Screen buffer
std::array<std::array<uint32_t, 1024>, 1024> _screen; std::array<std::array<uint32_t, 1024>, 1024> _screen;
//! @brief Used for vram read registers (0x2139 - 0x213A)
uint16_t _vramReadBuffer = 0;
public: public:
explicit PPU(Renderer::IRenderer &renderer); explicit PPU(Renderer::IRenderer &renderer);
@@ -620,6 +622,7 @@ namespace ComSquare::PPU
void addToMainSubScreen(Background &bg); void addToMainSubScreen(Background &bg);
//! @brief Get the current background Mode //! @brief Get the current background Mode
int getBgMode() const; int getBgMode() const;
void updateVramReadBuffer();
}; };
} }