diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs index 45cb3ea8f7..f6f7ca33c1 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs @@ -13,7 +13,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk //Maria related variables public int cycle; public int cpu_cycle; - public int m6532_cycle; public bool cpu_is_haltable; public bool cpu_is_halted; public bool cpu_halt_pending; @@ -38,6 +37,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk // if the 6532 or TIA are accessed (PC goes to one of those addresses) the next access will be slower by 1/2 a CPU cycle // i.e. it will take 6 Maria cycles instead of 4 public bool slow_access = false; + public int slow_countdown; public void FrameAdvance(IController controller, bool render, bool rendersound) { @@ -77,7 +77,15 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public void RunCPUCycle() { - cpu_cycle++; + if (slow_countdown==0) + { + cpu_cycle++; + } + else + { + slow_countdown--; + } + tia._hsyncCnt++; tia._hsyncCnt %= 454; // do the audio sampling @@ -87,11 +95,10 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } // tick the m6532 timer, which is still active although not recommended to use - m6532_cycle++; - if (m6532_cycle== 4) + // also it runs off of the cpu cycle timer + if (cpu_cycle== 4) { m6532.Timer.Tick(); - m6532_cycle = 0; } if (cpu_cycle <= (2 + (slow_access ? 1 : 0))) @@ -110,6 +117,13 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (!cpu_is_halted) { cpu.ExecuteOne(); + + // we need to stall the next cpu cycle from starting if the current one is a slow access + if (slow_access) + { + slow_access = false; + slow_countdown = 2; + } } else { @@ -132,32 +146,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk cpu_is_halted = false; } } - - // determine if the next access will be fast or slow - if ((cpu.PC & 0xFCE0) == 0) - { - // return TIA registers or control register if it is still unlocked - if ((A7800_control_register & 0x1) == 0) - { - slow_access = false; - } - else - { - slow_access = true; - } - } - else if ((cpu.PC & 0xFF80) == 0x280) - { - slow_access = true; - } - else if ((cpu.PC & 0xFE80) == 0x480) - { - slow_access = true; - } - else - { - slow_access = false; - } } public void GetControllerState(IController controller) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs index deabc35700..d438ce8a87 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs @@ -70,13 +70,13 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk ser.Sync("cycle", ref cycle); ser.Sync("cpu_cycle", ref cpu_cycle); - ser.Sync("m6532_cycle", ref m6532_cycle); ser.Sync("cpu_is_haltable", ref cpu_is_haltable); ser.Sync("cpu_is_halted", ref cpu_is_halted); ser.Sync("cpu_halt_pending", ref cpu_halt_pending); ser.Sync("cpu_resume_pending", ref cpu_resume_pending); ser.Sync("slow_access", ref slow_access); + ser.Sync("slow_access", ref slow_countdown); ser.Sync("small flag", ref small_flag); ser.Sync("pal kara", ref PAL_Kara); ser.Sync("Cart RAM", ref cart_RAM); diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs index f8229d38c5..7dd3e34cf5 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs @@ -34,6 +34,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } else { + slow_access = true; return tia.ReadMemory((ushort)(addr & 0x1F), false); } } @@ -50,11 +51,12 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } else if ((addr & 0xFF80) == 0x280) { - //return regs_6532[addr & 0x1F]; + slow_access = true; return m6532.ReadMemory(addr, false); } else if ((addr & 0xFE80) == 0x480) { + slow_access = true; return RAM_6532[addr & 0x7F]; } else if ((addr >= 0x1800) && (addr < 0x2800)) @@ -109,6 +111,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } else { + slow_access = true; tia.WriteMemory((ushort)(addr & 0x1F), value, false); } } @@ -130,8 +133,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk Console.Write(Maria_regs[i]); Console.Write(" "); } - Console.WriteLine(maria.scanline); */ + } else { @@ -140,10 +143,12 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } else if ((addr & 0xFF80) == 0x280) { + slow_access = true; m6532.WriteMemory(addr, value); } else if ((addr & 0xFE80) == 0x480) { + slow_access = true; RAM_6532[addr & 0x7F] = value; } else if ((addr >= 0x1800) && (addr < 0x2800))