eeprom crash fix, PacMan2 hack
[picodrive.git] / Pico / PicoFrameHints.c
index 1b35268..d1efa9a 100644 (file)
@@ -1,5 +1,5 @@
 // common code for Pico.c and cd/Pico.c
-// (c) Copyright 2007, Grazvydas "notaz" Ignotas
+// (c) Copyright 2007,2008 Grazvydas "notaz" Ignotas
 
 #define CYCLES_M68K_LINE     488 // suitable for both PAL/NTSC
 #define CYCLES_M68K_VINT_LAG  68
 
 // pad delay (for 6 button pads)
 #define PAD_DELAY \
-  if (PicoOpt&0x20) { \
+  if (PicoOpt&POPT_6BTN_PAD) { \
     if(Pico.m.padDelay[0]++ > 25) Pico.m.padTHPhase[0]=0; \
     if(Pico.m.padDelay[1]++ > 25) Pico.m.padTHPhase[1]=0; \
   }
 
 #define Z80_RUN(z80_cycles) \
 { \
-  if ((PicoOpt&4) && Pico.m.z80Run) \
+  if ((PicoOpt&POPT_EN_Z80) && Pico.m.z80Run) \
   { \
     int cnt; \
     if (Pico.m.z80Run & 2) z80CycleAim += z80_cycles; \
@@ -42,7 +42,7 @@
 #else
 #define CPUS_RUN(m68k_cycles,z80_cycles,s68k_cycles) \
 { \
-    if ((PicoOpt & 0x2000) && (Pico_mcd->m.busreq&3) == 1) { \
+    if ((PicoOpt&POPT_EN_MCD_PSYNC) && (Pico_mcd->m.busreq&3) == 1) { \
       SekRunPS(m68k_cycles, s68k_cycles); /* "better/perfect sync" */ \
     } else { \
       SekRunM68k(m68k_cycles); \
@@ -60,7 +60,7 @@ static int PicoFrameHints(void)
   int lines, y, lines_vis = 224, total_z80 = 0, z80CycleAim = 0, line_sample, skip;
   int hint; // Hint counter
 
-  if ((PicoOpt&0x10) && !PicoSkipFrame) {
+  if ((PicoOpt&POPT_ALT_RENDERER) && !PicoSkipFrame && (pv->reg[1]&0x40)) { // fast rend., display enabled
     // draw a frame just after vblank in alternative render mode
     // yes, this will cause 1 frame lag, but this is inaccurate mode anyway.
     PicoFrameFull();
@@ -125,21 +125,37 @@ static int PicoFrameHints(void)
     }
 
     // decide if we draw this line
+    if (!skip)
+    {
+      if (PicoOpt&POPT_ALT_RENDERER) {
+        // find the right moment for fast renderer, when display is no longer blanked
+        if ((pv->reg[1]&0x40) || y > 100) {
+          PicoFrameFull();
+#ifdef DRAW_FINISH_FUNC
+          DRAW_FINISH_FUNC();
+#endif
+          skip = 1;
+        }
+      }
+      else
+      {
 #if CAN_HANDLE_240_LINES
-    if(!skip && ((!(pv->reg[1]&8) && y<224) || (pv->reg[1]&8)) )
+        if (((!(pv->reg[1]&8) && y < 224) || (pv->reg[1]&8)) )
 #else
-    if(!skip && y<224)
+        if (y < 224)
 #endif
-      PicoLine(y);
+          PicoLine(y);
+      }
+    }
 
-    if(PicoOpt&1)
+    if (PicoOpt&POPT_EN_FM)
       Psnd_timers_and_dac(y);
 
 #ifndef PICO_CD
     // get samples from sound chips
-    if(y == 32 && PsndOut)
+    if (y == 32 && PsndOut)
       emustatus &= ~1;
-    else if((y == 224 || y == line_sample) && PsndOut)
+    else if ((y == 224 || y == line_sample) && PsndOut)
       getSamples(y);
 #endif
 
@@ -149,6 +165,8 @@ static int PicoFrameHints(void)
 
 #ifdef PICO_CD
     update_chips();
+#else
+    if (PicoLineHook) PicoLineHook(1);
 #endif
   }
 
@@ -191,10 +209,12 @@ static int PicoFrameHints(void)
     elprintf(EL_INTS, "vint: @ %06x [%i]", SekPc, SekCycleCnt);
     SekInterrupt(6);
   }
-  if (Pico.m.z80Run && (PicoOpt&4))
+  if (Pico.m.z80Run && (PicoOpt&POPT_EN_Z80)) {
+    elprintf(EL_INTS, "zint");
     z80_int();
+  }
 
-  if (PicoOpt&1)
+  if (PicoOpt&POPT_EN_FM)
     Psnd_timers_and_dac(y);
 
   // get samples from sound chips
@@ -210,7 +230,9 @@ static int PicoFrameHints(void)
     CYCLES_Z80_LINE - CYCLES_Z80_ASD, CYCLES_S68K_LINE - CYCLES_S68K_ASD);
 
 #ifdef PICO_CD
-    update_chips();
+  update_chips();
+#else
+  if (PicoLineHook) PicoLineHook(1);
 #endif
 
   // PAL line count might actually be 313 according to Steve Snake, but that would complicate things.
@@ -225,7 +247,7 @@ static int PicoFrameHints(void)
     check_cd_dma();
 #endif
 
-    if(PicoOpt&1)
+    if (PicoOpt&POPT_EN_FM)
       Psnd_timers_and_dac(y);
 
     // Run scanline:
@@ -234,6 +256,8 @@ static int PicoFrameHints(void)
 
 #ifdef PICO_CD
     update_chips();
+#else
+    if (PicoLineHook) PicoLineHook(1);
 #endif
   }