GBHawk: fix linking in perfect dark

This commit is contained in:
alyosha-tas 2021-11-21 11:38:23 -05:00
parent 45dec23352
commit 5d6cf748bf
1 changed files with 13 additions and 5 deletions

View File

@ -16,6 +16,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
public byte coming_in; public byte coming_in;
public bool can_pulse; public bool can_pulse;
public bool IRQ_block; public bool IRQ_block;
public bool tranfser_complete_flag;
public byte ReadReg(int addr) public byte ReadReg(int addr)
{ {
@ -41,9 +42,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
case 0xFF02: case 0xFF02:
if ((value & 0x1) == 1) if ((value & 0x1) == 1)
{ {
serial_bits = 8;
if (((value & 2) > 0) && Core.GBC_compat) if (((value & 2) > 0) && Core.GBC_compat)
{ {
clk_rate = 16; clk_rate = 16;
@ -69,14 +67,21 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
} }
*/ */
} }
can_pulse = true;
if (tranfser_complete_flag)
{
can_pulse = true;
serial_bits = 8;
tranfser_complete_flag = false;
}
} }
else else
{ {
serial_bits = 8; serial_bits = 8;
clk_rate = -1; clk_rate = -1;
serial_clock = clk_rate; serial_clock = clk_rate;
can_pulse = false; can_pulse = false;
tranfser_complete_flag = true;
} }
if (Core.GBC_compat) if (Core.GBC_compat)
@ -112,6 +117,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
if (serial_bits == 0) if (serial_bits == 0)
{ {
serial_control &= 0x7F; serial_control &= 0x7F;
tranfser_complete_flag = true;
if (Core.REG_FFFF.Bit(3)) { Core.cpu.FlagI = true; } if (Core.REG_FFFF.Bit(3)) { Core.cpu.FlagI = true; }
Core.REG_FF0F |= 0x08; Core.REG_FF0F |= 0x08;
@ -139,6 +145,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
coming_in = 1; coming_in = 1;
can_pulse = false; can_pulse = false;
IRQ_block = false; IRQ_block = false;
tranfser_complete_flag = true;
} }
public void SyncState(Serializer ser) public void SyncState(Serializer ser)
@ -152,6 +159,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
ser.Sync(nameof(coming_in), ref coming_in); ser.Sync(nameof(coming_in), ref coming_in);
ser.Sync(nameof(can_pulse), ref can_pulse); ser.Sync(nameof(can_pulse), ref can_pulse);
ser.Sync(nameof(IRQ_block), ref IRQ_block); ser.Sync(nameof(IRQ_block), ref IRQ_block);
ser.Sync(nameof(tranfser_complete_flag), ref tranfser_complete_flag);
} }
} }
} }