mirror of
https://github.com/zoriya/ComSquare.git
synced 2026-05-28 08:33:34 +00:00
Reworking the memory management & fixing a bug in the memory viewer goto
This commit is contained in:
+24
-26
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user