mirror of
https://github.com/zoriya/ComSquare.git
synced 2026-05-27 16:21:53 +00:00
getPalette should work fine
This commit is contained in:
+19
-10
@@ -10,17 +10,18 @@
|
||||
|
||||
namespace ComSquare::PPU
|
||||
{
|
||||
Background::Background(ComSquare::PPU::PPU &_ppu, int backGroundNumber, bool hasPriority):
|
||||
Background::Background(ComSquare::PPU::PPU &ppu, int backGroundNumber, bool hasPriority):
|
||||
_priority(hasPriority),
|
||||
_bgNumber(backGroundNumber)
|
||||
_bgNumber(backGroundNumber),
|
||||
_ppu(ppu)
|
||||
{
|
||||
_cgram = _ppu.cgram;
|
||||
_vram = _ppu.vram;
|
||||
_bpp = _ppu.getBPP(backGroundNumber);
|
||||
_characterSize = _ppu.getCharacterSize(backGroundNumber);
|
||||
_tileMapStartAddress = _ppu.getTileMapStartAddress(backGroundNumber);
|
||||
_tilesetAddress = _ppu.getTilesetAddress(backGroundNumber);
|
||||
_tileMaps = _ppu.getBackgroundSize(backGroundNumber);
|
||||
_cgram = ppu.cgram;
|
||||
_vram = ppu.vram;
|
||||
_bpp = ppu.getBPP(backGroundNumber);
|
||||
_characterSize = ppu.getCharacterSize(backGroundNumber);
|
||||
_tileMapStartAddress = ppu.getTileMapStartAddress(backGroundNumber);
|
||||
_tilesetAddress = ppu.getTilesetAddress(backGroundNumber);
|
||||
_tileMaps = ppu.getBackgroundSize(backGroundNumber);
|
||||
_directColor = false;
|
||||
_highRes = false;
|
||||
}
|
||||
@@ -82,9 +83,17 @@ namespace ComSquare::PPU
|
||||
std::vector<uint16_t> Background::getPalette(int nbPalette)
|
||||
{
|
||||
uint8_t nbColors = std::pow(2, this->_bpp);
|
||||
uint16_t addr = nbPalette * this->_bpp * this->_bpp * 2;
|
||||
uint16_t addr = nbPalette * this->_bpp * this->_bpp * 2; // 2 because it's 2 addr for 1 color
|
||||
std::vector<uint16_t> palette(nbColors);
|
||||
|
||||
switch (this->_ppu.getBgMode()) {
|
||||
case 0:
|
||||
addr += this->_bgNumber * (4 * 8) * 2;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
for (int i = 0; i < nbColors; i++) {
|
||||
palette[i] = this->_cgram->read_internal(addr);
|
||||
palette[i] += this->_cgram->read_internal(addr + 1) << 8U;
|
||||
|
||||
@@ -25,6 +25,7 @@ namespace ComSquare::PPU
|
||||
#define TILE_PIXEL_HEIGHT 8U
|
||||
#define TILE_SIZE 8
|
||||
#define NB_TILE_PER_ROW 16
|
||||
|
||||
private:
|
||||
Vector2<int> _tileMaps;
|
||||
Vector2<int> _characterSize;
|
||||
@@ -35,6 +36,7 @@ namespace ComSquare::PPU
|
||||
uint16_t _tilesetAddress;
|
||||
bool _priority;
|
||||
int _bgNumber;
|
||||
ComSquare::PPU::PPU &_ppu;
|
||||
|
||||
std::shared_ptr<Ram::Ram> _vram;
|
||||
std::shared_ptr<Ram::Ram> _cgram;
|
||||
@@ -59,8 +61,6 @@ namespace ComSquare::PPU
|
||||
//! @param offset The rendering offeset in pixels
|
||||
void drawBasicTileMap(uint16_t baseAddress, Vector2<int> offset);
|
||||
public:
|
||||
// TODO getter setter for priority and bgNumber
|
||||
|
||||
Vector2<int> backgroundSize;
|
||||
std::array<std::array<uint32_t, 1024>, 1024> buffer;
|
||||
Background(ComSquare::PPU::PPU &_ppu, int backGroundNumber, bool hasPriority);
|
||||
|
||||
+48
-43
@@ -381,7 +381,7 @@ namespace ComSquare::PPU
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t PPU::getVramAddress()
|
||||
uint16_t PPU::getVramAddress() const
|
||||
{
|
||||
uint16_t vanillaAddress = this->_registers._vmadd.vmadd;
|
||||
|
||||
@@ -419,7 +419,7 @@ namespace ComSquare::PPU
|
||||
return "PPU";
|
||||
}
|
||||
|
||||
std::string PPU::getValueName(uint24_t addr)
|
||||
std::string PPU::getValueName(uint24_t addr) const
|
||||
{
|
||||
switch (addr) {
|
||||
case PpuRegisters::inidisp:
|
||||
@@ -560,7 +560,7 @@ namespace ComSquare::PPU
|
||||
return Ppu;
|
||||
}
|
||||
|
||||
bool PPU::isDebugger()
|
||||
bool PPU::isDebugger() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -570,7 +570,7 @@ namespace ComSquare::PPU
|
||||
return this->cgram->read_internal(addr);
|
||||
}
|
||||
|
||||
int PPU::getBPP(int bgNumber)
|
||||
int PPU::getBPP(int bgNumber) const
|
||||
{
|
||||
switch (this->_registers._bgmode.bgMode) {
|
||||
case 0:
|
||||
@@ -604,22 +604,22 @@ namespace ComSquare::PPU
|
||||
}
|
||||
}
|
||||
|
||||
Vector2<int> PPU::getCharacterSize(int bgNumber)
|
||||
Vector2<int> PPU::getCharacterSize(int bgNumber) const
|
||||
{
|
||||
Vector2<int> characterSize(8, 8);
|
||||
|
||||
//this wont work for modes 5 and 6 and will be reworked
|
||||
//TODO this wont work for modes 5 and 6 and will be reworked
|
||||
if (this->_registers._bgmode.raw & (1U << (3 + bgNumber)))
|
||||
characterSize = {16, 16};
|
||||
return characterSize;
|
||||
}
|
||||
|
||||
uint16_t PPU::getTileMapStartAddress(int bgNumber)
|
||||
uint16_t PPU::getTileMapStartAddress(int bgNumber) const
|
||||
{
|
||||
return this->_registers._bgsc[bgNumber - 1].tilemapAddress << 11U;
|
||||
}
|
||||
|
||||
uint16_t PPU::getTilesetAddress(int bgNumber)
|
||||
uint16_t PPU::getTilesetAddress(int bgNumber) const
|
||||
{
|
||||
uint16_t baseAddress = this->_registers._bgnba[bgNumber > 2].raw;
|
||||
|
||||
@@ -628,7 +628,7 @@ namespace ComSquare::PPU
|
||||
return baseAddress;
|
||||
}
|
||||
|
||||
Vector2<int> PPU::getBackgroundSize(int bgNumber)
|
||||
Vector2<int> PPU::getBackgroundSize(int bgNumber) const
|
||||
{
|
||||
Vector2<int> backgroundSize(0,0);
|
||||
|
||||
@@ -637,7 +637,7 @@ namespace ComSquare::PPU
|
||||
return backgroundSize;
|
||||
}
|
||||
|
||||
void PPU::renderMainAndSubScreen(void)
|
||||
void PPU::renderMainAndSubScreen()
|
||||
{
|
||||
uint16_t colorPalette;
|
||||
// should only render backgrounds needed (depending of th bgMode)
|
||||
@@ -654,80 +654,80 @@ namespace ComSquare::PPU
|
||||
// the starting palette index isn't implemented
|
||||
switch (this->_registers._bgmode.bgMode) {
|
||||
case 0:
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg4NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg3NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg4NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg3NoPriority]);
|
||||
//sprites priority 0
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg4Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg3Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg4Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg3Priority]);
|
||||
//sprites priority 1
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg2NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg1NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg2NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg1NoPriority]);
|
||||
//sprites priority 2
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg2Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg1Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg2Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg1Priority]);
|
||||
//sprites priority 3
|
||||
break;
|
||||
case 1:
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg3NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg3NoPriority]);
|
||||
//sprites priority 0
|
||||
if (!this->_registers._bgmode.mode1Bg3PriorityBit)
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg3Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg3Priority]);
|
||||
//sprites priority 1
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg2NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg1NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg2NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg1NoPriority]);
|
||||
//sprites priority 2
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg2Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg1Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg2Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg1Priority]);
|
||||
//sprites priority 3
|
||||
if (this->_registers._bgmode.mode1Bg3PriorityBit)
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg3Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg3Priority]);
|
||||
break;
|
||||
case 2:
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg2NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg2NoPriority]);
|
||||
//sprites priority 0
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg1NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg1NoPriority]);
|
||||
//sprites priority 1
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg2Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg2Priority]);
|
||||
//sprites priority 2
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg1Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg1Priority]);
|
||||
//sprites priority 3
|
||||
break;
|
||||
case 3:
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg2NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg2NoPriority]);
|
||||
//sprites priority 0
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg1NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg1NoPriority]);
|
||||
//sprites priority 1
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg2Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg2Priority]);
|
||||
//sprites priority 2
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg1Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg1Priority]);
|
||||
//sprites priority 3
|
||||
break;
|
||||
case 4:
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg2NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg2NoPriority]);
|
||||
//sprites priority 0
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg1NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg1NoPriority]);
|
||||
//sprites priority 1
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg2Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg2Priority]);
|
||||
//sprites priority 2
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg1Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg1Priority]);
|
||||
//sprites priority 3
|
||||
break;
|
||||
case 5:
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg2NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg2NoPriority]);
|
||||
//sprites priority 0
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg1NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg1NoPriority]);
|
||||
//sprites priority 1
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg2Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg2Priority]);
|
||||
//sprites priority 2
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg1Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg1Priority]);
|
||||
//sprites priority 3
|
||||
break;
|
||||
case 6:
|
||||
//sprites priority 0
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg1NoPriority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg1NoPriority]);
|
||||
//sprites priority 1
|
||||
//sprites priority 2
|
||||
this->addToMainSubScreen(this->_backgrounds[bgName::bg1Priority]);
|
||||
this->addToMainSubScreen(this->_backgrounds[BgName::bg1Priority]);
|
||||
//sprites priority 3
|
||||
break;
|
||||
case 7:
|
||||
@@ -755,4 +755,9 @@ namespace ComSquare::PPU
|
||||
if (this->_registers._t[1].raw & (1U << (bg.getBgNumber() - 1U)))
|
||||
this->add_buffer(this->_subScreen, bg.buffer);
|
||||
}
|
||||
|
||||
int PPU::getBgMode() const
|
||||
{
|
||||
return this->_registers._bgmode.bgMode;
|
||||
}
|
||||
}
|
||||
+12
-10
@@ -25,7 +25,7 @@
|
||||
namespace ComSquare::PPU
|
||||
{
|
||||
class Background;
|
||||
enum bgName {
|
||||
enum BgName {
|
||||
bg1NoPriority = 0,
|
||||
bg1Priority,
|
||||
bg2NoPriority,
|
||||
@@ -594,30 +594,32 @@ namespace ComSquare::PPU
|
||||
//! @param The number of cycles to update.
|
||||
virtual void update(unsigned cycles);
|
||||
//! @brief Give the Vram Address with the right Address remapping
|
||||
uint16_t getVramAddress();
|
||||
uint16_t getVramAddress() const;
|
||||
//! @brief Give the name of the Address register (used for debug)
|
||||
std::string getValueName(uint24_t addr);
|
||||
std::string getValueName(uint24_t addr) const;
|
||||
//! @brief Return true if the CPU is overloaded with debugging features.
|
||||
virtual bool isDebugger();
|
||||
virtual bool isDebugger() const;
|
||||
//! @brief Allow others components to read the CGRAM
|
||||
uint16_t cgramRead(uint16_t addr);
|
||||
//! @brief get the bpp depending of the bgNumber and the Bgmode
|
||||
int getBPP(int bgNumber);
|
||||
int getBPP(int bgNumber) const;
|
||||
//! @brief Give the correct character size depending of the bgMode
|
||||
Vector2<int> getCharacterSize(int bgNumber);
|
||||
Vector2<int> getCharacterSize(int bgNumber) const;
|
||||
//! @brief Give the address where the tilemap starts
|
||||
uint16_t getTileMapStartAddress(int bgNumber);
|
||||
uint16_t getTileMapStartAddress(int bgNumber) const;
|
||||
//! @brief Give the address to find the correct tileset for a given x and y
|
||||
uint16_t getTilesetAddress(int bgNumber);
|
||||
uint16_t getTilesetAddress(int bgNumber) const;
|
||||
//! @brief Give the number of tilemaps to be rendered
|
||||
Vector2<int> getBackgroundSize(int bgNumber);
|
||||
Vector2<int> getBackgroundSize(int bgNumber) const;
|
||||
//! @brief Render the Main and sub screen correctly
|
||||
void renderMainAndSubScreen(void);
|
||||
void renderMainAndSubScreen();
|
||||
//! @brief Add a bg buffer to another buffer
|
||||
template <std::size_t DEST_SIZE, std::size_t SRC_SIZE>
|
||||
void add_buffer(std::array<std::array<uint32_t, DEST_SIZE>, DEST_SIZE> &bufferDest, std::array<std::array<uint32_t, SRC_SIZE>, SRC_SIZE> &bufferSrc);
|
||||
//! @brief Add a bg to the sub and/or main screen
|
||||
void addToMainSubScreen(Background &bg);
|
||||
//! @brief Get the current background Mode
|
||||
int getBgMode() const;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user