GBHawk: Bug Fixes

This commit is contained in:
alyosha-tas 2017-11-24 12:24:22 -05:00
parent d9183ede93
commit ffbb1f3399
2 changed files with 45 additions and 27 deletions

View File

@ -33,22 +33,27 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
if (ppu.DMA_start)
{
if ((addr >= 0xFE00) && (addr < 0xFEA0) && ppu.DMA_OAM_access)
if (addr < 0x4000)
{
return OAM[addr - 0xFE00];
}
else if ((addr >= 0xFF80))
{
return ZP_RAM[addr - 0xFF80];
return mapper.ReadMemory(addr); // some of gekkio's tests require this to be accessible during DMA
}
else if ((addr >= 0xE000) && (addr < 0xFE00))
{
return RAM[addr - 0xE000]; // some of gekkio's tests require this to be accessible during DMA
}
else if (addr < 0x4000)
else if ((addr >= 0xFE00) && (addr < 0xFEA0) && ppu.DMA_OAM_access)
{
return mapper.ReadMemory(addr); // some of gekkio's tests require this to be accessible during DMA
return OAM[addr - 0xFE00];
}
else if ((addr >= 0xFF00) && (addr < 0xFF80)) // The game GOAL! Requires Hardware Regs to be accessible
{
return Read_Registers(addr);
}
else if ((addr >= 0xFF80))
{
return ZP_RAM[addr - 0xFF80];
}
return 0xFF;
}
@ -126,22 +131,22 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
if (ppu.DMA_start)
{
if ((addr >= 0xFE00) && (addr < 0xFEA0) && ppu.DMA_OAM_access)
if ((addr >= 0xE000) && (addr < 0xFE00))
{
RAM[addr - 0xE000] = value; // some of gekkio's tests require this to be accessible during DMA
}
else if ((addr >= 0xFE00) && (addr < 0xFEA0) && ppu.DMA_OAM_access)
{
OAM[addr - 0xFE00] = value;
}
else if ((addr >= 0xFF00) && (addr < 0xFF80)) // The game GOAL! Requires Hardware Regs to be accessible
{
Write_Registers(addr, value);
}
else if ((addr >= 0xFF80))
{
ZP_RAM[addr - 0xFF80] = value;
}
else if (addr == 0xFF46)
{
Write_Registers(addr, value); // a second DMA can start, but what about other registers?
}
else if ((addr >= 0xE000) && (addr < 0xFE00))
{
RAM[addr - 0xE000] = value; // some of gekkio's tests require this to be accessible during DMA
}
return;
}
@ -211,22 +216,27 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
{
if (ppu.DMA_start)
{
if ((addr >= 0xFE00) && (addr < 0xFEA0) && ppu.DMA_OAM_access)
if (addr < 0x4000)
{
return OAM[addr - 0xFE00];
}
else if ((addr >= 0xFF80))
{
return ZP_RAM[addr - 0xFF80];
return mapper.ReadMemory(addr); // some of gekkio's tests require this to be accessible during DMA
}
else if ((addr >= 0xE000) && (addr < 0xFE00))
{
return RAM[addr - 0xE000]; // some of gekkio's tests require this to be accessible during DMA
}
else if (addr < 0x4000)
else if ((addr >= 0xFE00) && (addr < 0xFEA0) && ppu.DMA_OAM_access)
{
return mapper.PeekMemory(addr); // some of gekkio's tests require this to be accessible during DMA
return OAM[addr - 0xFE00];
}
else if ((addr >= 0xFF00) && (addr < 0xFF80)) // The game GOAL! Requires Hardware Regs to be accessible
{
return Read_Registers(addr);
}
else if ((addr >= 0xFF80))
{
return ZP_RAM[addr - 0xFF80];
}
return 0xFF;
}

View File

@ -117,6 +117,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
switch (addr)
{
case 0xFF40: // LCDC
if (LCDC.Bit(7) && !value.Bit(7))
{
VRAM_access_read = true;
VRAM_access_write = true;
OAM_access_read = true;
OAM_access_write = true;
}
LCDC = value;
break;
case 0xFF41: // STAT
@ -1047,8 +1055,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
BGP = 0xFF;
obj_pal_0 = 0xFF;
obj_pal_1 = 0xFF;
window_y = 0;
window_x = 0;
window_y = 0x0;
window_x = 0x0;
LY_inc = 1;
no_scan = false;
OAM_access_read = true;