added registers (BGXXOFS)

This commit is contained in:
Clément Le Bihan
2020-02-12 17:38:23 +01:00
parent 49b5401135
commit de0c145dd0
3 changed files with 87 additions and 49 deletions
+67 -8
View File
@@ -2,6 +2,7 @@
// Created by cbihan on 1/27/20.
//
#include <iostream>
#include "PPU.hpp"
#include "../Exceptions/NotImplementedException.hpp"
#include "../Exceptions/InvalidAddress.hpp"
@@ -58,8 +59,17 @@ namespace ComSquare::PPU
this->_bgnba[addr - 0x0B].raw = data;
break;
case ppuRegisters::bg1hofs:
// Work in progress ! Non functional !
this->_bgofs[0].raw = data;
case ppuRegisters::bg1vofs:
case ppuRegisters::bg2hofs:
case ppuRegisters::bg2vofs:
case ppuRegisters::bg3hofs:
case ppuRegisters::bg3vofs:
case ppuRegisters::bg4hofs:
case ppuRegisters::bg4vofs:
// Work in progress !
if (addr == ppuRegisters::bg1hofs || addr == ppuRegisters::bg1vofs)
this->_m7ofs[addr - ppuRegisters::bg1hofs].raw = data;
this->_bgofs[addr - ppuRegisters::bg1hofs].raw = data;
break;
case ppuRegisters::vmain:
this->_vmain.raw = data;
@@ -72,10 +82,36 @@ namespace ComSquare::PPU
break;
//! @info should must be in vblank for the write (and write it to the screen )? and increment vram address after;
case ppuRegisters::vmdatal:
this->_vmdata.vmdatal = data;
if (!this->_inidisp.fblank) {
this->_vmdata.vmdatal = data;
this->_vram[getVramAddress()] = this->_vmdata.vmdata;
}
if (!this->_vmain.incrementMode)
this->_vmadd.vmadd += this->_vmain.incrementAmount;
break;
case ppuRegisters::vmdatah:
this->_vmdata.vmdatah = data;
if (!this->_inidisp.fblank) {
this->_vmdata.vmdatah = data;
this->_vram[getVramAddress()] = this->_vmdata.vmdata;
}
if (this->_vmain.incrementMode)
this->_vmadd.vmadd += this->_vmain.incrementAmount;
break;
case ppuRegisters::cgadd:
this->_cgadd = data;
this->_isLowByte = true;
break;
case ppuRegisters::cgdata:
if (this->_isLowByte) {
this->_cgdata.cgdatal = data;
this->_bus->write(this->_cgadd, this->_cgdata.cgdatal);
}
else {
this->_cgdata.cgdatah = data;
this->_bus->write(this->_cgadd, this->_cgdata.cgdatah);
}
this->_isLowByte = !this->_isLowByte;
this->_cgadd++;
break;
//TODO adding the rest of the registers. oaf !
default:
@@ -83,13 +119,35 @@ namespace ComSquare::PPU
}
}
uint8_t PPU::getVramAddress()
{
uint16_t vanillaAddress = this->_vmadd.vmadd;
switch (this->_vmain.addressRemapping) {
case 0b00:
return vanillaAddress;
case 0b01:
return (vanillaAddress & 0xFF00U) | (vanillaAddress & 0x00E0U) >> 5U | (vanillaAddress & 0x001FU) << 3U;
case 0b10:
return (vanillaAddress & 0xFE00U) | (vanillaAddress & 0x01C0U) >> 6U | (vanillaAddress & 0x3FU) << 3U;
case 0b11:
return (vanillaAddress & 0xFC00U) | (vanillaAddress & 0x0380U) >> 7U | (vanillaAddress & 0x7FU) << 3U;
}
}
void PPU::update(unsigned cycles)
{
(void)cycles;
uint32_t pixelTmp = 0xFFFFFF00;
pixelTmp |= this->_inidisp.brightness;
if (!this->_inidisp.fblank)
this->_renderer.putPixel(0, 0,pixelTmp);
int inc = 0;
uint32_t pixelTmp = 0xFFFFFFFF;
//pixelTmp |= this->_inidisp.brightness;
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);
}
}
}
this->_renderer.drawScreen();
}
@@ -97,5 +155,6 @@ namespace ComSquare::PPU
_bus(std::move(bus)),
_renderer(renderer)
{
//_vram = new uint16_t[32000];
}
}