GBHawk: bug fixes and ppu viewer working
This commit is contained in:
parent
68e69ff85b
commit
19b1d0fa18
|
@ -135,7 +135,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkNew
|
||||||
|
|
||||||
public void SetScanlineCallback(ScanlineCallback callback, int line)
|
public void SetScanlineCallback(ScanlineCallback callback, int line)
|
||||||
{
|
{
|
||||||
if ((callback == null) || (line == -1) || (line == -2))
|
if ((callback == null) || (line == -2))
|
||||||
{
|
{
|
||||||
_scanlineCallback = null;
|
_scanlineCallback = null;
|
||||||
LibGBHawk.GB_setscanlinecallback(GB_Pntr, null, 0);
|
LibGBHawk.GB_setscanlinecallback(GB_Pntr, null, 0);
|
||||||
|
@ -151,7 +151,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkNew
|
||||||
|
|
||||||
if (line == -2)
|
if (line == -2)
|
||||||
{
|
{
|
||||||
GetGPU();
|
|
||||||
callback(LibGBHawk.GB_get_LCDC(GB_Pntr));
|
callback(LibGBHawk.GB_get_LCDC(GB_Pntr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,6 +201,11 @@ namespace GBHawk
|
||||||
|
|
||||||
// send the image on VBlank
|
// send the image on VBlank
|
||||||
SendVideoBuffer();
|
SendVideoBuffer();
|
||||||
|
|
||||||
|
if ((ppu->scanlineCallback) && (MemMap._scanlineCallbackLine == -1))
|
||||||
|
{
|
||||||
|
ppu->scanlineCallback();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MemMap.REG_FF0F_OLD = MemMap.REG_FF0F;
|
MemMap.REG_FF0F_OLD = MemMap.REG_FF0F;
|
||||||
|
@ -457,18 +462,23 @@ namespace GBHawk
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
MemMap.Cart_RAM = new uint8_t[0x800];
|
MemMap.Cart_RAM = new uint8_t[0x800];
|
||||||
|
MemMap.Cart_RAM_Length = 0x800;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
MemMap.Cart_RAM = new uint8_t[0x2000];
|
MemMap.Cart_RAM = new uint8_t[0x2000];
|
||||||
|
MemMap.Cart_RAM_Length = 0x2000;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
MemMap.Cart_RAM = new uint8_t[0x8000];
|
MemMap.Cart_RAM = new uint8_t[0x8000];
|
||||||
|
MemMap.Cart_RAM_Length = 0x8000;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
MemMap.Cart_RAM = new uint8_t[0x20000];
|
MemMap.Cart_RAM = new uint8_t[0x20000];
|
||||||
|
MemMap.Cart_RAM_Length = 0x20000;
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
MemMap.Cart_RAM = new uint8_t[0x10000];
|
MemMap.Cart_RAM = new uint8_t[0x10000];
|
||||||
|
MemMap.Cart_RAM_Length = 0x10000;
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
MemMap.has_bat = false;
|
MemMap.has_bat = false;
|
||||||
|
@ -486,12 +496,14 @@ namespace GBHawk
|
||||||
if (mppr == "MBC2")
|
if (mppr == "MBC2")
|
||||||
{
|
{
|
||||||
MemMap.Cart_RAM = new uint8_t[0x200];
|
MemMap.Cart_RAM = new uint8_t[0x200];
|
||||||
|
MemMap.Cart_RAM_Length = 0x200;
|
||||||
}
|
}
|
||||||
|
|
||||||
// mbc7 has 256 bytes of RAM, regardless of any header info
|
// mbc7 has 256 bytes of RAM, regardless of any header info
|
||||||
if (mppr == "MBC7")
|
if (mppr == "MBC7")
|
||||||
{
|
{
|
||||||
MemMap.Cart_RAM = new uint8_t[0x100];
|
MemMap.Cart_RAM = new uint8_t[0x100];
|
||||||
|
MemMap.Cart_RAM_Length = 0x100;
|
||||||
MemMap.has_bat = true;
|
MemMap.has_bat = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -499,11 +511,10 @@ namespace GBHawk
|
||||||
if (mppr == "TAMA5")
|
if (mppr == "TAMA5")
|
||||||
{
|
{
|
||||||
MemMap.Cart_RAM = new uint8_t[0x20];
|
MemMap.Cart_RAM = new uint8_t[0x20];
|
||||||
|
MemMap.Cart_RAM_Length = 0x20;
|
||||||
MemMap.has_bat = true;
|
MemMap.has_bat = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
MemMap.Cart_RAM_Length = sizeof(MemMap.Cart_RAM);
|
|
||||||
|
|
||||||
if (MemMap.Cart_RAM != nullptr && (mppr != "MBC7"))
|
if (MemMap.Cart_RAM != nullptr && (mppr != "MBC7"))
|
||||||
{
|
{
|
||||||
for (uint32_t i = 0; i < MemMap.Cart_RAM_Length; i++)
|
for (uint32_t i = 0; i < MemMap.Cart_RAM_Length; i++)
|
||||||
|
|
|
@ -187,13 +187,12 @@ GBHawk_EXPORT uint8_t* GB_get_ppu_pntrs(GBCore* p, int sel) {
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// need to fix this for GB
|
|
||||||
switch (sel)
|
switch (sel)
|
||||||
{
|
{
|
||||||
case 0: return p->MemMap.VRAM; break;
|
case 0: return p->MemMap.VRAM; break;
|
||||||
case 1: return p->MemMap.OAM; break;
|
case 1: return p->MemMap.OAM; break;
|
||||||
case 2: return (uint8_t*)p->ppu->OBJ_palette; break;
|
case 2: return (uint8_t*)p->MemMap.color_palette_OBJ; break;
|
||||||
case 3: return (uint8_t*)p->ppu->BG_palette; break;
|
case 3: return (uint8_t*)p->MemMap.color_palette_BG; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -766,9 +766,14 @@ namespace GBHawk
|
||||||
case 0xFF44:
|
case 0xFF44:
|
||||||
case 0xFF45:
|
case 0xFF45:
|
||||||
case 0xFF46:
|
case 0xFF46:
|
||||||
|
ppu_pntr->WriteReg(addr, value);
|
||||||
|
break;
|
||||||
case 0xFF47:
|
case 0xFF47:
|
||||||
case 0xFF48:
|
case 0xFF48:
|
||||||
case 0xFF49:
|
case 0xFF49:
|
||||||
|
ppu_pntr->WriteReg(addr, value);
|
||||||
|
compute_palettes();
|
||||||
|
break;
|
||||||
case 0xFF4A:
|
case 0xFF4A:
|
||||||
case 0xFF4B:
|
case 0xFF4B:
|
||||||
ppu_pntr->WriteReg(addr, value);
|
ppu_pntr->WriteReg(addr, value);
|
||||||
|
@ -911,4 +916,14 @@ namespace GBHawk
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MemoryManager::compute_palettes()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
color_palette_OBJ[i] = color_palette[(ppu_pntr->obj_pal_0 >> (i * 2)) & 3];
|
||||||
|
color_palette_OBJ[i + 4] = color_palette[(ppu_pntr->obj_pal_1 >> (i * 2)) & 3];
|
||||||
|
color_palette_BG[i] = color_palette[(ppu_pntr->BGP >> (i * 2)) & 3];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -28,6 +28,7 @@ namespace GBHawk
|
||||||
void WriteMemory(uint32_t addr, uint8_t value);
|
void WriteMemory(uint32_t addr, uint8_t value);
|
||||||
uint8_t Read_Registers(uint32_t addr);
|
uint8_t Read_Registers(uint32_t addr);
|
||||||
void Write_Registers(uint32_t addr, uint8_t value);
|
void Write_Registers(uint32_t addr, uint8_t value);
|
||||||
|
void compute_palettes();
|
||||||
|
|
||||||
#pragma region Declarations
|
#pragma region Declarations
|
||||||
|
|
||||||
|
@ -67,10 +68,10 @@ namespace GBHawk
|
||||||
|
|
||||||
uint8_t REG_FFFF, REG_FF0F, REG_FF0F_OLD;
|
uint8_t REG_FFFF, REG_FF0F, REG_FF0F_OLD;
|
||||||
|
|
||||||
uint8_t _scanlineCallbackLine;
|
int32_t _scanlineCallbackLine;
|
||||||
uint8_t input_register;
|
uint8_t input_register;
|
||||||
uint32_t RAM_Bank;
|
uint32_t RAM_Bank = 0;
|
||||||
uint32_t VRAM_Bank;
|
uint32_t VRAM_Bank = 0;
|
||||||
uint32_t IR_write;
|
uint32_t IR_write;
|
||||||
uint32_t addr_access;
|
uint32_t addr_access;
|
||||||
uint32_t Acc_X_state;
|
uint32_t Acc_X_state;
|
||||||
|
@ -87,6 +88,10 @@ namespace GBHawk
|
||||||
|
|
||||||
const uint8_t GBA_override[13] = { 0xFF, 0x00, 0xCD, 0x03, 0x35, 0xAA, 0x31, 0x90, 0x94, 0x00, 0x00, 0x00, 0x00 };
|
const uint8_t GBA_override[13] = { 0xFF, 0x00, 0xCD, 0x03, 0x35, 0xAA, 0x31, 0x90, 0x94, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
|
||||||
|
// these two arrays are computed on calls from the GPU Viewer to get the GB palettes
|
||||||
|
uint32_t color_palette_BG[4] = {};
|
||||||
|
uint32_t color_palette_OBJ[8] = {};
|
||||||
|
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
||||||
#pragma region Functions
|
#pragma region Functions
|
||||||
|
@ -206,9 +211,10 @@ namespace GBHawk
|
||||||
saver = byte_saver(REG_FFFF, saver);
|
saver = byte_saver(REG_FFFF, saver);
|
||||||
saver = byte_saver(REG_FF0F, saver);
|
saver = byte_saver(REG_FF0F, saver);
|
||||||
saver = byte_saver(REG_FF0F_OLD, saver);
|
saver = byte_saver(REG_FF0F_OLD, saver);
|
||||||
saver = byte_saver(_scanlineCallbackLine, saver);
|
|
||||||
saver = byte_saver(input_register, saver);
|
saver = byte_saver(input_register, saver);
|
||||||
|
|
||||||
|
saver = int_saver(_scanlineCallbackLine, saver);
|
||||||
|
|
||||||
saver = int_saver(RAM_Bank, saver);
|
saver = int_saver(RAM_Bank, saver);
|
||||||
saver = int_saver(VRAM_Bank, saver);
|
saver = int_saver(VRAM_Bank, saver);
|
||||||
saver = int_saver(IR_write, saver);
|
saver = int_saver(IR_write, saver);
|
||||||
|
@ -261,9 +267,10 @@ namespace GBHawk
|
||||||
loader = byte_loader(®_FFFF, loader);
|
loader = byte_loader(®_FFFF, loader);
|
||||||
loader = byte_loader(®_FF0F, loader);
|
loader = byte_loader(®_FF0F, loader);
|
||||||
loader = byte_loader(®_FF0F_OLD, loader);
|
loader = byte_loader(®_FF0F_OLD, loader);
|
||||||
loader = byte_loader(&_scanlineCallbackLine, loader);
|
|
||||||
loader = byte_loader(&input_register, loader);
|
loader = byte_loader(&input_register, loader);
|
||||||
|
|
||||||
|
loader = sint_loader(&_scanlineCallbackLine, loader);
|
||||||
|
|
||||||
loader = int_loader(&RAM_Bank, loader);
|
loader = int_loader(&RAM_Bank, loader);
|
||||||
loader = int_loader(&VRAM_Bank, loader);
|
loader = int_loader(&VRAM_Bank, loader);
|
||||||
loader = int_loader(&IR_write, loader);
|
loader = int_loader(&IR_write, loader);
|
||||||
|
|
|
@ -38,7 +38,7 @@ namespace GBHawk
|
||||||
uint8_t* cpu_LY = nullptr;
|
uint8_t* cpu_LY = nullptr;
|
||||||
uint8_t* REG_FFFF = nullptr;
|
uint8_t* REG_FFFF = nullptr;
|
||||||
uint8_t* REG_FF0F = nullptr;
|
uint8_t* REG_FF0F = nullptr;
|
||||||
uint8_t* _scanlineCallbackLine = nullptr;
|
int32_t* _scanlineCallbackLine = nullptr;
|
||||||
uint8_t* OAM = nullptr;
|
uint8_t* OAM = nullptr;
|
||||||
uint8_t* VRAM = nullptr;
|
uint8_t* VRAM = nullptr;
|
||||||
uint32_t* VRAM_Bank = nullptr;
|
uint32_t* VRAM_Bank = nullptr;
|
||||||
|
@ -3487,6 +3487,8 @@ namespace GBHawk
|
||||||
VRAM_access_write = true;
|
VRAM_access_write = true;
|
||||||
OAM_access_read = true;
|
OAM_access_read = true;
|
||||||
OAM_access_write = true;
|
OAM_access_write = true;
|
||||||
|
|
||||||
|
clear_screen = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!((LCDC & 0x80) > 0) && ((value & 0x80) > 0))
|
if (!((LCDC & 0x80) > 0) && ((value & 0x80) > 0))
|
||||||
|
@ -4328,7 +4330,7 @@ namespace GBHawk
|
||||||
if ((internal_cycle % 2) == 1)
|
if ((internal_cycle % 2) == 1)
|
||||||
{
|
{
|
||||||
// calculate the row number of the tiles to be fetched
|
// calculate the row number of the tiles to be fetched
|
||||||
y_tile = ((uint32_t)floor((float)((uint32_t)scroll_y + LY) / 8.0)) % 32;
|
y_tile = ((uint32_t)floor(((float)scroll_y + (float)LY) / (float)8.0)) % 32;
|
||||||
|
|
||||||
temp_fetch = y_tile * 32 + (x_tile + tile_inc) % 32;
|
temp_fetch = y_tile * 32 + (x_tile + tile_inc) % 32;
|
||||||
tile_byte = VRAM[0x1800 + (((LCDC & 0x4) > 0) ? 1 : 0) * 0x400 + temp_fetch];
|
tile_byte = VRAM[0x1800 + (((LCDC & 0x4) > 0) ? 1 : 0) * 0x400 + temp_fetch];
|
||||||
|
|
Loading…
Reference in New Issue