core z80, cycle counting fixes (reset, bus request)
authorkub <derkub@gmail.com>
Tue, 7 May 2024 21:10:27 +0000 (23:10 +0200)
committerkub <derkub@gmail.com>
Tue, 7 May 2024 22:09:18 +0000 (00:09 +0200)
pico/cd/mcd.c
pico/debug.c
pico/memory.c
pico/pico_cmn.c
pico/pico_int.h
pico/sms.c

index 2fdbe72..60acd6d 100644 (file)
@@ -312,7 +312,7 @@ static int SekSyncM68k(int once);
 void pcd_run_cpus_normal(int m68k_cycles)
 {
   // TODO this is suspicious. ~1 cycle refresh delay every 256 cycles?
-  SekAimM68k(m68k_cycles, 0x43); // Fhey area
+  SekAimM68k(m68k_cycles, 0x42); // Fhey area
 
   while (CYCLES_GT(Pico.t.m68c_aim, Pico.t.m68c_cnt)) {
     if (SekShouldInterrupt()) {
index 5a85a30..064e97a 100644 (file)
@@ -389,7 +389,6 @@ void PDebugZ80Frame(void)
   else
     lines = 262;
 
-  z80_resetCycles(Pico.t.z80c_aim);
   PsndStartFrame();
 
   if (/*Pico.m.z80Run &&*/ !Pico.m.z80_reset && (PicoIn.opt&POPT_EN_Z80)) {
@@ -407,6 +406,7 @@ void PDebugZ80Frame(void)
     PsndGetSamples(lines);
 
   timers_cycle(Pico.t.z80c_aim);
+  z80_resetCycles();
   Pico.t.m68c_aim = Pico.t.m68c_cnt;
 }
 
index 1bd230d..0c06aca 100644 (file)
@@ -530,20 +530,21 @@ void NOINLINE ctl_write_z80busreq(u32 d)
   {\r
     if (d)\r
     {\r
-      Pico.t.z80c_cnt = z80_cycles_from_68k() + (Pico.t.z80_busdelay >> 8);\r
+      Pico.t.z80c_aim = Pico.t.z80c_cnt = z80_cycles_from_68k() + (Pico.t.z80_busdelay >> 8) + 2;\r
       Pico.t.z80_busdelay &= 0xff;\r
     }\r
     else\r
     {\r
       if ((PicoIn.opt & POPT_EN_Z80) && !Pico.m.z80_reset) {\r
-        // Z80 grants bus 2 cycles after the next M cycle, even within an insn\r
+        // Z80 grants bus after the current M cycle, even within an insn\r
         // simulate this by accumulating the last insn overhang in busdelay\r
-        unsigned granted = z80_cycles_from_68k() + 6;\r
+        unsigned granted;\r
         pprof_start(m68k);\r
         PicoSyncZ80(SekCyclesDone());\r
+        pprof_end_sub(m68k);\r
+        granted = Pico.t.z80c_aim + 6; // M cycle is 3-6 cycles \r
         Pico.t.z80_busdelay += (Pico.t.z80c_cnt - granted) << 8;\r
         Pico.t.z80c_cnt = granted;\r
-        pprof_end_sub(m68k);\r
       }\r
     }\r
     Pico.m.z80Run = d;\r
@@ -563,12 +564,13 @@ void NOINLINE ctl_write_z80reset(u32 d)
         PicoSyncZ80(SekCyclesDone());\r
         pprof_end_sub(m68k);\r
       }\r
+      Pico.t.z80_busdelay &= 0xff; // also resets bus request\r
       YM2612ResetChip();\r
       timers_reset();\r
     }\r
     else\r
     {\r
-      Pico.t.z80c_cnt = z80_cycles_from_68k() + 2;\r
+      Pico.t.z80c_aim = Pico.t.z80c_cnt = z80_cycles_from_68k() + 2;\r
       z80_reset();\r
     }\r
     Pico.m.z80_reset = d;\r
index 519aba3..af2e598 100644 (file)
@@ -81,7 +81,7 @@ static __inline void SekAimM68k(int cyc, int mult)
 static __inline void SekRunM68k(int cyc)
 {
   // TODO 0x100 would be 2 cycles/128, moreover far too sensitive
-  SekAimM68k(cyc, 0x10c); // OutRunners, testpico, VDPFIFOTesting
+  SekAimM68k(cyc, 0x108); // OutRunners, testpico, VDPFIFOTesting
   SekSyncM68k(0);
 }
 
@@ -141,7 +141,6 @@ static int PicoFrameHints(void)
 
   skip = PicoIn.skipFrame;
 
-  z80_resetCycles(cycles_68k_to_z80(Pico.t.m68c_aim - Pico.t.m68c_frame_start));
   Pico.t.m68c_frame_start = Pico.t.m68c_aim;
   PsndStartFrame();
 
@@ -340,6 +339,7 @@ static int PicoFrameHints(void)
   PsndGetSamples(y);
 
   timers_cycle(cycles_68k_to_z80(Pico.t.m68c_aim - Pico.t.m68c_frame_start));
+  z80_resetCycles();
 
   pv->hint_cnt = hint;
 
index fbdeb87..995f8c1 100644 (file)
@@ -201,8 +201,8 @@ extern struct DrZ80 drZ80;
 \r
 #define Z80_STATE_SIZE 0x60\r
 \r
-#define z80_resetCycles(aim) \\r
-  Pico.t.z80c_cnt -= (aim < Pico.t.z80c_cnt ? aim : Pico.t.z80c_cnt), Pico.t.z80c_aim = Pico.t.z80_scanline = 0\r
+#define z80_resetCycles() \\r
+  Pico.t.z80c_cnt -= Pico.t.z80c_aim, Pico.t.z80c_aim = Pico.t.z80_scanline = 0\r
 \r
 #define z80_cyclesDone() \\r
   (Pico.t.z80c_aim - z80_cyclesLeft)\r
index e954bc8..c56111c 100644 (file)
@@ -846,7 +846,6 @@ void PicoFrameMS(void)
   int nmi;
   int y;
 
-  z80_resetCycles(Pico.t.z80c_aim);
   PsndStartFrame();
 
   // for SMS the pause button generates an NMI, for GG ths is not the case
@@ -923,6 +922,7 @@ void PicoFrameMS(void)
     z80_exec(Pico.t.z80c_line_start + cycles_line);
   }
 
+  z80_resetCycles();
   PsndGetSamplesMS(lines);
 }