GBHawk: bug fixes and ppu viewer working

This commit is contained in:
alyosha-tas 2020-03-30 22:59:50 -04:00
parent 68e69ff85b
commit 19b1d0fa18
6 changed files with 48 additions and 15 deletions

View File

@ -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));
} }
} }

View File

@ -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++)

View File

@ -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;
} }
} }

View File

@ -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];
}
}
} }

View File

@ -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(&REG_FFFF, loader); loader = byte_loader(&REG_FFFF, loader);
loader = byte_loader(&REG_FF0F, loader); loader = byte_loader(&REG_FF0F, loader);
loader = byte_loader(&REG_FF0F_OLD, loader); loader = byte_loader(&REG_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);

View File

@ -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];