GBHawk
- Reorganize Sachen Mappers - Add Sachen MMC1 support (Captain Knick Knack)
This commit is contained in:
parent
f2529fa0e0
commit
0e4887b2f7
|
@ -117,7 +117,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
// These things do not change speed in GBC double spped mode
|
||||
audio.tick();
|
||||
ppu.tick();
|
||||
if (Use_RTC) { mapper.RTC_Tick(); }
|
||||
if (Use_MT) { mapper.Mapper_Tick(); }
|
||||
|
||||
if (!HDMA_transfer)
|
||||
{
|
||||
|
|
|
@ -94,7 +94,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
ser.Sync("speed_switch", ref speed_switch);
|
||||
ser.Sync("HDMA_transfer", ref HDMA_transfer);
|
||||
|
||||
ser.Sync("Use_RTC", ref Use_RTC);
|
||||
ser.Sync("Use_MT", ref Use_MT);
|
||||
ser.Sync("addr_access", ref addr_access);
|
||||
|
||||
// probably a better way to do this
|
||||
if (cart_RAM != null)
|
||||
|
|
|
@ -68,7 +68,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
|
||||
private int _frame = 0;
|
||||
|
||||
public bool Use_RTC;
|
||||
public bool Use_MT;
|
||||
public ushort addr_access;
|
||||
|
||||
public MapperBase mapper;
|
||||
|
||||
|
@ -373,6 +374,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
Console.WriteLine("Using RockMan 8 (Unlicensed) Mapper");
|
||||
mapper = new MapperRM8();
|
||||
}
|
||||
if ((_rom.HashMD5(0, _rom.Length) == "D3C1924D847BC5D125BF54C2076BE27A"))
|
||||
{
|
||||
Console.WriteLine("Using Sachen 1 (Unlicensed) Mapper");
|
||||
mapper = new MapperSachen1();
|
||||
mppr = "Schn1";
|
||||
}
|
||||
|
||||
Console.Write("Mapper: ");
|
||||
Console.WriteLine(mppr);
|
||||
|
@ -407,6 +414,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
if ((mppr == "Schn1") || (mppr == "Schn2"))
|
||||
{
|
||||
cart_RAM = null;
|
||||
Use_MT = true;
|
||||
}
|
||||
|
||||
// mbc2 carts have built in RAM
|
||||
|
@ -438,7 +446,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
// Extra RTC initialization for mbc3
|
||||
if (mppr == "MBC3")
|
||||
{
|
||||
Use_RTC = true;
|
||||
Use_MT = true;
|
||||
int days = (int)Math.Floor(_syncSettings.RTCInitialTime / 86400.0);
|
||||
|
||||
int days_upper = ((days & 0x100) >> 8) | ((days & 0x200) >> 2);
|
||||
|
|
|
@ -37,7 +37,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
{
|
||||
}
|
||||
|
||||
public virtual void RTC_Tick()
|
||||
public virtual void Mapper_Tick()
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -158,7 +158,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
RTC_regs[index] = value;
|
||||
}
|
||||
|
||||
public override void RTC_Tick()
|
||||
public override void Mapper_Tick()
|
||||
{
|
||||
if (!halt)
|
||||
{
|
||||
|
|
|
@ -17,6 +17,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
public int ROM_bank_mask;
|
||||
public int BASE_ROM_Bank;
|
||||
public bool reg_access;
|
||||
public ushort addr_last;
|
||||
public int counter;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
|
@ -26,37 +28,33 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
ROM_bank_mask = 0xFF;
|
||||
locked = true;
|
||||
reg_access = false;
|
||||
addr_last = 0;
|
||||
counter = 0;
|
||||
}
|
||||
|
||||
public override byte ReadMemory(ushort addr)
|
||||
{
|
||||
if (addr < 0x4000)
|
||||
{
|
||||
ushort t_addr = addr;
|
||||
|
||||
// header is scrambled
|
||||
if ((addr >= 0x100) && (addr < 0x200))
|
||||
if (locked)
|
||||
{
|
||||
int temp0 = (addr & 1);
|
||||
int temp1 = (addr & 2);
|
||||
int temp4 = (addr & 0x10);
|
||||
int temp6 = (addr & 0x40);
|
||||
// header is scrambled
|
||||
if ((addr >= 0x100) && (addr < 0x200))
|
||||
{
|
||||
int temp0 = (addr & 1);
|
||||
int temp1 = (addr & 2);
|
||||
int temp4 = (addr & 0x10);
|
||||
int temp6 = (addr & 0x40);
|
||||
|
||||
temp0 = temp0 << 6;
|
||||
temp1 = temp1 << 3;
|
||||
temp4 = temp4 >> 3;
|
||||
temp6 = temp6 >> 6;
|
||||
temp0 = temp0 << 6;
|
||||
temp1 = temp1 << 3;
|
||||
temp4 = temp4 >> 3;
|
||||
temp6 = temp6 >> 6;
|
||||
|
||||
addr &= 0x1AC;
|
||||
addr |= (ushort)(temp0 | temp1 | temp4 | temp6);
|
||||
}
|
||||
|
||||
if (locked) { addr |= 0x80; }
|
||||
|
||||
if (t_addr == 0x133)
|
||||
{
|
||||
locked = false;
|
||||
Console.WriteLine("cleared");
|
||||
addr &= 0x1AC;
|
||||
addr |= (ushort)(temp0 | temp1 | temp4 | temp6);
|
||||
}
|
||||
addr |= 0x80;
|
||||
}
|
||||
|
||||
return Core._rom[addr + BASE_ROM_Bank * 0x4000];
|
||||
|
@ -73,39 +71,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
|
||||
public override byte PeekMemory(ushort addr)
|
||||
{
|
||||
if (addr < 0x4000)
|
||||
{
|
||||
ushort t_addr = addr;
|
||||
|
||||
// header is scrambled
|
||||
if ((addr >= 0x100) && (addr < 0x200))
|
||||
{
|
||||
int temp0 = (addr & 1);
|
||||
int temp1 = (addr & 2);
|
||||
int temp4 = (addr & 0x10);
|
||||
int temp6 = (addr & 0x40);
|
||||
|
||||
temp0 = temp0 << 6;
|
||||
temp1 = temp1 << 3;
|
||||
temp4 = temp4 >> 3;
|
||||
temp6 = temp6 >> 6;
|
||||
|
||||
addr &= 0x1AC;
|
||||
addr |= (ushort)(temp0 | temp1 | temp4 | temp6);
|
||||
}
|
||||
|
||||
if (locked) { addr |= 0x80; }
|
||||
|
||||
return Core._rom[addr + BASE_ROM_Bank * 0x4000];
|
||||
}
|
||||
else if (addr < 0x8000)
|
||||
{
|
||||
return Core._rom[(addr - 0x4000) + ROM_bank * 0x4000];
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0xFF;
|
||||
}
|
||||
return ReadMemory(addr);
|
||||
}
|
||||
|
||||
public override void WriteMemory(ushort addr, byte value)
|
||||
|
@ -144,6 +110,29 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
WriteMemory(addr, value);
|
||||
}
|
||||
|
||||
public override void Mapper_Tick()
|
||||
{
|
||||
if (locked)
|
||||
{
|
||||
if (((Core.addr_access & 0x8000) == 0) && ((addr_last & 0x8000) > 0) && (Core.addr_access >= 0x100))
|
||||
{
|
||||
counter++;
|
||||
Console.WriteLine(Core.cpu.TotalExecutedCycles);
|
||||
}
|
||||
|
||||
if (Core.addr_access >= 0x100)
|
||||
{
|
||||
addr_last = Core.addr_access;
|
||||
}
|
||||
|
||||
if (counter == 0x30)
|
||||
{
|
||||
locked = false;
|
||||
Console.WriteLine("Unlocked");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
ser.Sync("ROM_Bank", ref ROM_bank);
|
||||
|
@ -152,6 +141,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
ser.Sync("ROM_bank_mask", ref ROM_bank_mask);
|
||||
ser.Sync("BASE_ROM_Bank", ref BASE_ROM_Bank);
|
||||
ser.Sync("reg_access", ref reg_access);
|
||||
ser.Sync("addr_last", ref addr_last);
|
||||
ser.Sync("counter", ref counter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,11 +12,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
class MapperSachen2 : MapperBase
|
||||
{
|
||||
public int ROM_bank;
|
||||
public bool locked;
|
||||
public bool locked, locked_GBC, finished;
|
||||
public int ROM_mask;
|
||||
public int ROM_bank_mask;
|
||||
public int BASE_ROM_Bank;
|
||||
public bool reg_access;
|
||||
public ushort addr_last;
|
||||
public int counter;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
|
@ -24,16 +26,18 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
ROM_mask = Core._rom.Length / 0x4000 - 1;
|
||||
BASE_ROM_Bank = 0;
|
||||
ROM_bank_mask = 0;
|
||||
locked = false;
|
||||
locked = true;
|
||||
locked_GBC = false;
|
||||
finished = false;
|
||||
reg_access = false;
|
||||
addr_last = 0;
|
||||
counter = 0;
|
||||
}
|
||||
|
||||
public override byte ReadMemory(ushort addr)
|
||||
{
|
||||
if (addr < 0x4000)
|
||||
{
|
||||
ushort t_addr = addr;
|
||||
|
||||
// header is scrambled
|
||||
if ((addr >= 0x100) && (addr < 0x200))
|
||||
{
|
||||
|
@ -51,12 +55,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
addr |= (ushort)(temp0 | temp1 | temp4 | temp6);
|
||||
}
|
||||
|
||||
if (locked) { addr |= 0x80; }
|
||||
|
||||
if (t_addr == 0x133)
|
||||
{
|
||||
if ((Core.GB_bios_register & 0x1) == 0) { locked ^= true; }
|
||||
}
|
||||
if (locked_GBC) { addr |= 0x80; }
|
||||
|
||||
return Core._rom[addr + BASE_ROM_Bank * 0x4000];
|
||||
}
|
||||
|
@ -75,39 +74,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
|
||||
public override byte PeekMemory(ushort addr)
|
||||
{
|
||||
if (addr < 0x4000)
|
||||
{
|
||||
ushort t_addr = addr;
|
||||
|
||||
// header is scrambled
|
||||
if ((addr >= 0x100) && (addr < 0x200))
|
||||
{
|
||||
int temp0 = (addr & 1);
|
||||
int temp1 = (addr & 2);
|
||||
int temp4 = (addr & 0x10);
|
||||
int temp6 = (addr & 0x40);
|
||||
|
||||
temp0 = temp0 << 6;
|
||||
temp1 = temp1 << 3;
|
||||
temp4 = temp4 >> 3;
|
||||
temp6 = temp6 >> 6;
|
||||
|
||||
addr &= 0x1AC;
|
||||
addr |= (ushort)(temp0 | temp1 | temp4 | temp6);
|
||||
}
|
||||
|
||||
if (locked) { addr |= 0x80; }
|
||||
|
||||
return Core._rom[addr + BASE_ROM_Bank * 0x4000];
|
||||
}
|
||||
else if (addr < 0x8000)
|
||||
{
|
||||
return Core._rom[(addr - 0x4000) + ROM_bank * 0x4000];
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0xFF;
|
||||
}
|
||||
return ReadMemory(addr);
|
||||
}
|
||||
|
||||
public override void WriteMemory(ushort addr, byte value)
|
||||
|
@ -146,14 +113,71 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
WriteMemory(addr, value);
|
||||
}
|
||||
|
||||
public override void Mapper_Tick()
|
||||
{
|
||||
if (locked)
|
||||
{
|
||||
if (((Core.addr_access & 0x8000) == 0) && ((addr_last & 0x8000) > 0) && (Core.addr_access >= 0x100))
|
||||
{
|
||||
counter++;
|
||||
}
|
||||
|
||||
if (Core.addr_access >= 0x100)
|
||||
{
|
||||
addr_last = Core.addr_access;
|
||||
}
|
||||
|
||||
if (counter == 0x30)
|
||||
{
|
||||
locked = false;
|
||||
locked_GBC = true;
|
||||
counter = 0;
|
||||
}
|
||||
}
|
||||
else if (locked_GBC)
|
||||
{
|
||||
if (((Core.addr_access & 0x8000) == 0) && ((addr_last & 0x8000) > 0) && (Core.addr_access >= 0x100))
|
||||
{
|
||||
counter++;
|
||||
}
|
||||
|
||||
if (Core.addr_access >= 0x100)
|
||||
{
|
||||
addr_last = Core.addr_access;
|
||||
}
|
||||
|
||||
if (counter == 0x30)
|
||||
{
|
||||
locked_GBC = false;
|
||||
finished = true;
|
||||
Console.WriteLine("Finished");
|
||||
Console.WriteLine(Core.cpu.TotalExecutedCycles);
|
||||
}
|
||||
|
||||
// The above condition seems to never be reached as described in the mapper notes
|
||||
// so for now add this one
|
||||
|
||||
if ((Core.addr_access == 0x133) && (counter == 1))
|
||||
{
|
||||
locked_GBC = false;
|
||||
finished = true;
|
||||
Console.WriteLine("Unlocked");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
ser.Sync("ROM_Bank", ref ROM_bank);
|
||||
ser.Sync("ROM_Mask", ref ROM_mask);
|
||||
ser.Sync("locked", ref locked);
|
||||
ser.Sync("locked_GBC", ref locked_GBC);
|
||||
ser.Sync("finished", ref finished);
|
||||
ser.Sync("ROM_bank_mask", ref ROM_bank_mask);
|
||||
ser.Sync("BASE_ROM_Bank", ref BASE_ROM_Bank);
|
||||
ser.Sync("reg_access", ref reg_access);
|
||||
ser.Sync("addr_last", ref addr_last);
|
||||
ser.Sync("counter", ref counter);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -30,6 +30,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
public byte ReadMemory(ushort addr)
|
||||
{
|
||||
MemoryCallbacks.CallReads(addr, "System Bus");
|
||||
addr_access = addr;
|
||||
|
||||
if (ppu.DMA_start)
|
||||
{
|
||||
|
@ -150,7 +151,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|||
public void WriteMemory(ushort addr, byte value)
|
||||
{
|
||||
MemoryCallbacks.CallWrites(addr, "System Bus");
|
||||
|
||||
addr_access = addr;
|
||||
|
||||
if (ppu.DMA_start)
|
||||
{
|
||||
// some of gekkio's tests require this to be accessible during DMA
|
||||
|
|
Loading…
Reference in New Issue