GBHawk: memory ap optimizations

This commit is contained in:
alyosha-tas 2020-04-02 15:41:03 -04:00
parent 7d293bdb1a
commit ced37c45c3
19 changed files with 273 additions and 209 deletions

View File

@ -7,12 +7,22 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
{
public GBHawk Core { get; set; }
public virtual byte ReadMemory(ushort addr)
public virtual byte ReadMemoryLow(ushort addr)
{
return 0;
}
public virtual byte PeekMemory(ushort addr)
public virtual byte ReadMemoryHigh(ushort addr)
{
return 0;
}
public virtual byte PeekMemoryLow(ushort addr)
{
return 0;
}
public virtual byte PeekMemoryHigh(ushort addr)
{
return 0;
}

View File

@ -28,17 +28,19 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
regs_enable = false;
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x4000)
{
return Core._rom[addr];
}
else if (addr < 0x8000)
else
{
return Core._rom[(addr - 0x4000) + ROM_bank * 0x4000];
}
else
}
public override byte ReadMemoryHigh(ushort addr)
{
if (regs_enable)
{
@ -63,7 +65,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
}
}
public override void MapCDL(ushort addr, LR35902.eCDLogMemFlags flags)
{
@ -92,9 +93,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -10,13 +10,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
// nothing to initialize
}
public override byte ReadMemory(ushort addr)
{
if (addr < 0x8000)
public override byte ReadMemoryLow(ushort addr)
{
return Core._rom[addr];
}
else
public override byte ReadMemoryHigh(ushort addr)
{
if (Core.cart_RAM != null)
{
@ -27,7 +26,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
return 0;
}
}
}
public override void MapCDL(ushort addr, LR35902.eCDLogMemFlags flags)
{
@ -48,9 +46,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override byte PeekMemoryHigh(ushort addr)
{
return ReadMemoryHigh(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -31,17 +31,21 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x4000)
{
return Core._rom[addr];
}
else if (addr < 0x8000)
else
{
return Core._rom[(addr - 0x4000) + ROM_bank * 0x4000];
}
else if ((addr >= 0xA000) && (addr < 0xC000))
}
public override byte ReadMemoryHigh(ushort addr)
{
if ((addr >= 0xA000) && (addr < 0xC000))
{
if (RAM_enable)
{
@ -115,9 +119,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -44,17 +44,21 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x4000)
{
return Core._rom[addr];
}
else if (addr < 0x8000)
else
{
return Core._rom[(addr - 0x4000) + ROM_bank * 0x4000];
}
else if ((addr >= 0xA000) && (addr < 0xC000))
}
public override byte ReadMemoryHigh(ushort addr)
{
if ((addr >= 0xA000) && (addr < 0xC000))
{
if ((control >= 0xB) && (control < 0xE))
{
@ -136,9 +140,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -32,7 +32,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x4000)
{
@ -46,11 +46,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
return Core._rom[addr];
}
}
else if (addr < 0x8000)
else
{
return Core._rom[(addr - 0x4000) + ROM_bank * 0x4000];
}
else
}
public override byte ReadMemoryHigh(ushort addr)
{
if (Core.cart_RAM != null)
{
@ -69,7 +71,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
return 0xFF;
}
}
}
public override void MapCDL(ushort addr, LR35902.eCDLogMemFlags flags)
{
@ -110,9 +111,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -28,7 +28,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x4000)
{
@ -42,11 +42,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
return Core._rom[addr];
}
}
else if (addr < 0x8000)
else
{
return Core._rom[(addr - 0x4000) + (((ROM_bank & 0x60) >> 1) | (ROM_bank & 0xF)) * 0x4000];
}
else
}
public override byte ReadMemoryHigh(ushort addr)
{
if (Core.cart_RAM != null)
{
@ -65,7 +67,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
return 0;
}
}
}
public override void MapCDL(ushort addr, LR35902.eCDLogMemFlags flags)
{
@ -106,9 +107,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -19,17 +19,21 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
ROM_mask = Core._rom.Length / 0x4000 - 1;
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x4000)
{
return Core._rom[addr];
}
else if (addr < 0x8000)
else
{
return Core._rom[(addr - 0x4000) + ROM_bank * 0x4000];
}
else if ((addr >= 0xA000) && (addr < 0xA200))
}
public override byte ReadMemoryHigh(ushort addr)
{
if ((addr >= 0xA000) && (addr < 0xA200))
{
if (RAM_enable)
{
@ -67,9 +71,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -45,17 +45,19 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
RTC_regs_latch_wr = true;
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x4000)
{
return Core._rom[addr];
}
else if (addr < 0x8000)
else
{
return Core._rom[(addr - 0x4000) + ROM_bank * 0x4000];
}
else
}
public override byte ReadMemoryHigh(ushort addr)
{
if (RAM_enable)
{
@ -86,7 +88,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
return 0x0;
}
}
}
public override void MapCDL(ushort addr, LR35902.eCDLogMemFlags flags)
{
@ -130,9 +131,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -31,17 +31,19 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x4000)
{
return Core._rom[addr];
}
else if (addr < 0x8000)
else
{
return Core._rom[(addr - 0x4000) + ROM_bank * 0x4000];
}
else
}
public override byte ReadMemoryHigh(ushort addr)
{
if (Core.cart_RAM != null)
{
@ -60,7 +62,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
return 0xFF;
}
}
}
public override void MapCDL(ushort addr, LR35902.eCDLogMemFlags flags)
{
@ -93,9 +94,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -10,7 +10,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
// nothing to initialize
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x8000)
{
@ -29,6 +29,18 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte ReadMemoryHigh(ushort addr)
{
if (Core.cart_RAM != null)
{
return Core.cart_RAM[addr - 0xA000];
}
else
{
return 0;
}
}
public override void MapCDL(ushort addr, LR35902.eCDLogMemFlags flags)
{
if (addr < 0x8000)
@ -48,9 +60,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -57,17 +57,21 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
instr_bit_counter = instr = EE_addr = instr_case = instr_clocks = EE_value = countdown = 0;
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x4000)
{
return Core._rom[addr];
}
else if (addr < 0x8000)
else
{
return Core._rom[(addr - 0x4000) + ROM_bank * 0x4000];
}
else if (addr < 0xA000)
}
public override byte ReadMemoryHigh(ushort addr)
{
if (addr < 0xA000)
{
return 0xFF;
}
@ -119,9 +123,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -10,7 +10,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
// nothing to initialize
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x8000)
{
@ -29,6 +29,18 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte ReadMemoryHigh(ushort addr)
{
if (Core.cart_RAM != null)
{
return Core.cart_RAM[addr - 0xA000];
}
else
{
return 0;
}
}
public override void MapCDL(ushort addr, LR35902.eCDLogMemFlags flags)
{
if (addr < 0x8000)
@ -48,9 +60,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -18,7 +18,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
if (ROM_mask > 4) { ROM_mask |= 3; }
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x4000)
{
@ -26,15 +26,16 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
return Core._rom[addr];
}
else if (addr < 0x8000)
else
{
return Core._rom[(addr - 0x4000) + ROM_bank * 0x4000];
}
else
}
public override byte ReadMemoryHigh(ushort addr)
{
return 0xFF;
}
}
public override void MapCDL(ushort addr, LR35902.eCDLogMemFlags flags)
{
@ -54,9 +55,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -33,7 +33,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
counter = 0;
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x4000)
{
@ -60,15 +60,16 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
return Core._rom[addr + BASE_ROM_Bank * 0x4000];
}
else if (addr < 0x8000)
else
{
return Core._rom[(addr - 0x4000) + ROM_bank * 0x4000];
}
else
}
public override byte ReadMemoryHigh(ushort addr)
{
return 0xFF;
}
}
public override void MapCDL(ushort addr, LR35902.eCDLogMemFlags flags)
{
@ -107,9 +108,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -35,7 +35,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
counter = 0;
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x4000)
{
@ -60,18 +60,19 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
return Core._rom[addr + BASE_ROM_Bank * 0x4000];
}
else if (addr < 0x8000)
else
{
int temp_bank = (ROM_bank & ~ROM_bank_mask) | (ROM_bank_mask & BASE_ROM_Bank);
temp_bank &= ROM_mask;
return Core._rom[(addr - 0x4000) + temp_bank * 0x4000];
}
else
}
public override byte ReadMemoryHigh(ushort addr)
{
return 0xFF;
}
}
public override void MapCDL(ushort addr, LR35902.eCDLogMemFlags flags)
{
@ -111,9 +112,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -46,19 +46,20 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
ctrl = 0;
}
public override byte ReadMemory(ushort addr)
public override byte ReadMemoryLow(ushort addr)
{
if (addr < 0x4000)
{
return Core._rom[addr];
}
else if (addr < 0x8000)
else
{
return Core._rom[(addr - 0x4000) + ROM_bank * 0x4000];
}
else
{
}
public override byte ReadMemoryHigh(ushort addr)
{
switch (ctrl)
{
case 0xA:
@ -75,7 +76,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
return 0x0;
}
}
public override void MapCDL(ushort addr, LR35902.eCDLogMemFlags flags)
{
@ -93,9 +93,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -19,17 +19,15 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
if (ROM_mask > 0x100) { ROM_mask |= 0xFF; }
}
public override byte ReadMemory(ushort addr)
{
if (addr < 0x8000)
public override byte ReadMemoryLow(ushort addr)
{
return Core._rom[ROM_bank * 0x8000 + addr];
}
else
public override byte ReadMemoryHigh(ushort addr)
{
return 0xFF;
}
}
public override void MapCDL(ushort addr, LR35902.eCDLogMemFlags flags)
{
@ -43,9 +41,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
}
public override byte PeekMemory(ushort addr)
public override byte PeekMemoryLow(ushort addr)
{
return ReadMemory(addr);
return ReadMemoryLow(addr);
}
public override byte PeekMemoryHigh(ushort addr)
{
return ReadMemoryHigh(addr);
}
public override void WriteMemory(ushort addr, byte value)

View File

@ -42,7 +42,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
else
{
return mapper.ReadMemory(addr);
return mapper.ReadMemoryLow(addr);
}
}
else if ((addr >= 0xE000) && (addr < 0xF000))
@ -74,7 +74,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
{
if (addr >= 0x900)
{
return mapper.ReadMemory(addr);
return mapper.ReadMemoryLow(addr);
}
else
{
@ -87,7 +87,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
else
{
return mapper.ReadMemory(addr);
return mapper.ReadMemoryLow(addr);
}
}
else if (addr >= 0x200)
@ -99,12 +99,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
else
{
return mapper.ReadMemory(addr);
return mapper.ReadMemoryLow(addr);
}
}
else
{
return mapper.ReadMemory(addr);
return mapper.ReadMemoryLow(addr);
}
}
}
@ -115,7 +115,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
else if (addr < 0xC000)
{
return mapper.ReadMemory(addr);
return mapper.ReadMemoryHigh(addr);
}
else if (addr < 0xFE00)
{
@ -266,7 +266,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
else
{
return mapper.ReadMemory(addr);
return mapper.PeekMemoryLow(addr);
}
}
else if ((addr >= 0xE000) && (addr < 0xF000))
@ -297,7 +297,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
{
if (addr >= 0x900)
{
return mapper.ReadMemory(addr);
return mapper.PeekMemoryLow(addr);
}
else
{
@ -310,7 +310,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
else
{
return mapper.ReadMemory(addr);
return mapper.PeekMemoryLow(addr);
}
}
else if (addr >= 0x200)
@ -322,12 +322,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
else
{
return mapper.ReadMemory(addr);
return mapper.PeekMemoryLow(addr);
}
}
else
{
return mapper.ReadMemory(addr);
return mapper.PeekMemoryLow(addr);
}
}
}
@ -338,7 +338,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
}
else if (addr < 0xC000)
{
return mapper.PeekMemory(addr);
return mapper.PeekMemoryHigh(addr);
}
else if (addr < 0xFE00)
{