GBHawk: MBC3 state

This commit is contained in:
alyosha-tas 2017-11-24 19:23:10 -05:00
parent cbd217d479
commit 68e32e93e4
1 changed files with 42 additions and 41 deletions

View File

@ -10,7 +10,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
public int ROM_bank; public int ROM_bank;
public int RAM_bank; public int RAM_bank;
public bool RAM_enable; public bool RAM_enable;
public bool sel_mode;
public int ROM_mask; public int ROM_mask;
public int RAM_mask; public int RAM_mask;
public byte[] RTC_regs = new byte[5]; public byte[] RTC_regs = new byte[5];
@ -18,13 +17,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
public bool RTC_regs_latch_wr; public bool RTC_regs_latch_wr;
public int RTC_timer; public int RTC_timer;
public int RTC_low_clock; public int RTC_low_clock;
public bool halt;
public override void Initialize() public override void Initialize()
{ {
ROM_bank = 1; ROM_bank = 1;
RAM_bank = 0; RAM_bank = 0;
RAM_enable = false; RAM_enable = false;
sel_mode = false;
ROM_mask = Core._rom.Length / 0x4000 - 1; ROM_mask = Core._rom.Length / 0x4000 - 1;
// some games have sizes that result in a degenerate ROM, account for it here // some games have sizes that result in a degenerate ROM, account for it here
@ -50,15 +49,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
{ {
if (addr < 0x4000) if (addr < 0x4000)
{ {
// lowest bank is fixed, but is still effected by mode return Core._rom[addr];
if (sel_mode)
{
return Core._rom[(ROM_bank & 0x60) * 0x4000 + addr];
}
else
{
return Core._rom[addr];
}
} }
else if (addr < 0x8000) else if (addr < 0x8000)
{ {
@ -150,6 +141,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
else if ((RAM_bank >= 8) && (RAM_bank < 0xC)) else if ((RAM_bank >= 8) && (RAM_bank < 0xC))
{ {
RTC_regs[RAM_bank - 8] = value; RTC_regs[RAM_bank - 8] = value;
halt = (RTC_regs[4] & 0x40) > 0;
} }
} }
} }
@ -167,45 +160,48 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
public override void RTC_Tick() public override void RTC_Tick()
{ {
RTC_timer++; if (!halt)
if (RTC_timer == 128)
{ {
RTC_timer = 0; RTC_timer++;
RTC_low_clock++; if (RTC_timer == 128)
if (RTC_low_clock == 32768)
{ {
RTC_low_clock = 0; RTC_timer = 0;
RTC_regs[0]++; RTC_low_clock++;
if (RTC_regs[0] > 59)
if (RTC_low_clock == 32768)
{ {
RTC_regs[0] = 0; RTC_low_clock = 0;
RTC_regs[1]++;
if (RTC_regs[1] > 59)
{
RTC_regs[2]++;
if (RTC_regs[2] > 23)
{
RTC_regs[2] = 0;
if (RTC_regs[3] < 0xFF)
{
RTC_regs[3]++;
}
else
{
RTC_regs[3] = 0;
if ((RTC_regs[4] & 1) == 0) RTC_regs[0]++;
if (RTC_regs[0] > 59)
{
RTC_regs[0] = 0;
RTC_regs[1]++;
if (RTC_regs[1] > 59)
{
RTC_regs[2]++;
if (RTC_regs[2] > 23)
{
RTC_regs[2] = 0;
if (RTC_regs[3] < 0xFF)
{ {
RTC_regs[4] |= 1; RTC_regs[3]++;
} }
else else
{ {
RTC_regs[4] &= 0xFE; RTC_regs[3] = 0;
RTC_regs[4] |= 0x80;
if ((RTC_regs[4] & 1) == 0)
{
RTC_regs[4] |= 1;
}
else
{
RTC_regs[4] &= 0xFE;
RTC_regs[4] |= 0x80;
}
} }
} }
} }
@ -223,7 +219,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
ser.Sync("RAM_Bank", ref RAM_bank); ser.Sync("RAM_Bank", ref RAM_bank);
ser.Sync("RAM_Mask", ref RAM_mask); ser.Sync("RAM_Mask", ref RAM_mask);
ser.Sync("RAM_enable", ref RAM_enable); ser.Sync("RAM_enable", ref RAM_enable);
ser.Sync("sel_mode", ref sel_mode); ser.Sync("halt", ref halt);
ser.Sync("RTC_regs", ref RTC_regs, false);
ser.Sync("RTC_regs_latch", ref RTC_regs_latch, false);
ser.Sync("RTC_regs_latch_wr", ref RTC_regs_latch_wr);
ser.Sync("RTC_timer", ref RTC_timer);
ser.Sync("RTC_low_clock", ref RTC_low_clock);
} }
} }
} }