Reworking the memory management & fixing a bug in the memory viewer goto

This commit is contained in:
Zoe Roux
2021-02-03 23:43:07 +01:00
parent 0b28719f41
commit 874c21b0fd
29 changed files with 295 additions and 307 deletions
+24 -26
View File
@@ -5,11 +5,8 @@
#include <iostream>
#include <bitset>
#include "PPU.hpp"
#include "PPUUtils.hpp"
#include "../Exceptions/NotImplementedException.hpp"
#include "../Exceptions/InvalidAddress.hpp"
#include "../Ram/Ram.hpp"
#include "../Models/Vector2.hpp"
namespace ComSquare::PPU
{
@@ -21,7 +18,7 @@ namespace ComSquare::PPU
{
this->_registers._isLowByte = true;
for (int i = 0; i < 512; i++) {
this->cgram->write_internal(i, random() % 255);
this->cgram->write(i, random() % 255);
}
}
@@ -45,7 +42,7 @@ namespace ComSquare::PPU
case ppuRegisters::stat78:
return 0;
default:
throw InvalidAddress("PPU Internal Registers read ", addr + this->getStart());
throw InvalidAddress("PPU Internal Registers read ", addr + this->_start);
}
}
@@ -69,7 +66,7 @@ namespace ComSquare::PPU
//throw InvalidAddress("oamdata", addr);
std::cout << "oamdata" << std::endl;
// the oamAddress have to be calculated if fblank or not (not implemented)
oamram->write_internal(this->_registers._oamadd.oamAddress, this->_registers._oamdata);
oamram->write(this->_registers._oamadd.oamAddress, this->_registers._oamdata);
this->_registers._oamadd.oamAddress++;
break;
case ppuRegisters::bgmode:
@@ -126,7 +123,7 @@ namespace ComSquare::PPU
//std::cout << "vmdatal" << std::endl;
if (!this->_registers._inidisp.fblank) {
this->_registers._vmdata.vmdatal = data;
this->vram->write_internal(this->getVramAddress(), data);
this->vram->write(this->getVramAddress(), data);
}
if (!this->_registers._vmain.incrementMode)
this->_registers._vmadd.vmadd += this->_registers._incrementAmount;
@@ -135,7 +132,7 @@ namespace ComSquare::PPU
//std::cout << "vmdatah" << std::endl;
if (!this->_registers._inidisp.fblank) {
this->_registers._vmdata.vmdatah = data;
this->vram->write_internal(this->getVramAddress() + 1, data);
this->vram->write(this->getVramAddress() + 1, data);
}
if (this->_registers._vmain.incrementMode)
this->_registers._vmadd.vmadd += this->_registers._incrementAmount;
@@ -163,9 +160,9 @@ namespace ComSquare::PPU
}
else {
this->_registers._cgdata.cgdatah = data;
this->cgram->write_internal(this->_registers._cgadd, this->_registers._cgdata.cgdatal);
this->cgram->write(this->_registers._cgadd, this->_registers._cgdata.cgdatal);
this->_registers._cgadd++;
this->cgram->write_internal(this->_registers._cgadd, this->_registers._cgdata.cgdatah);
this->cgram->write(this->_registers._cgadd, this->_registers._cgdata.cgdatah);
this->_registers._cgadd++;
}
this->_registers._isLowByte = !this->_registers._isLowByte;
@@ -215,7 +212,7 @@ namespace ComSquare::PPU
break;
//TODO adding the rest of the registers. oaf !
default:
throw InvalidAddress("PPU Internal Registers write", addr + this->getStart());
throw InvalidAddress("PPU Internal Registers write", addr + this->_start);
}
}
@@ -233,6 +230,7 @@ namespace ComSquare::PPU
case 0b11:
return (vanillaAddress & 0xFC00U) | (vanillaAddress & 0x0380U) >> 7U | (vanillaAddress & 0x7FU) << 3U;
}
throw InvalidAddress("Invalid vram address", vanillaAddress);
}
void PPU::update(unsigned cycles)
@@ -242,23 +240,23 @@ namespace ComSquare::PPU
uint8_t red;
uint8_t green;
uint8_t blue;
uint32_t pixelTmp = 0x0;
uint32_t pixelTmp;
if (!this->_registers._inidisp.fblank) {
for (int y = 0; y <= 255; y += 2) {
tmp = this->cgram->read_internal(y);
tmp += this->cgram->read_internal(y + 1) << 8;
blue = (tmp & 0x7D00U) >> 10U;
green = (tmp & 0x03E0U) >> 5U;
red = (tmp & 0x001FU);
for (int y = 0; y <= 255; y += 2) {
tmp = this->cgram->read(y);
tmp += this->cgram->read(y + 1) << 8;
blue = (tmp & 0x7D00U) >> 10U;
green = (tmp & 0x03E0U) >> 5U;
red = (tmp & 0x001FU);
pixelTmp = this->_registers._inidisp.brightness * 255U / 15U;
pixelTmp += (red * 255U / 31U) << 24U;
pixelTmp += (green * 255U / 31U) << 16U;
pixelTmp += (blue * 255U / 31U) << 8U;
pixelTmp = this->_registers._inidisp.brightness * 255U / 15U;
pixelTmp += (red * 255U / 31U) << 24U;
pixelTmp += (green * 255U / 31U) << 16U;
pixelTmp += (blue * 255U / 31U) << 8U;
for (int x = 0; x < 100; x++)
this->_renderer.putPixel(x, y, pixelTmp);
}
for (int x = 0; x < 100; x++)
this->_renderer.putPixel(x, y, pixelTmp);
}
}
this->renderBackground(1, {8, 8}, 4, false);
this->_renderer.drawScreen();
@@ -417,6 +415,6 @@ namespace ComSquare::PPU
uint16_t PPU::cgramRead(uint16_t addr)
{
return this->cgram->read_internal(addr);
return this->cgram->read(addr);
}
}