line draw deferment implemented
[picodrive.git] / Pico / Pico.c
index 93d04e7..58c1a35 100644 (file)
@@ -58,6 +58,8 @@ void PicoPower(void)
 {\r
   unsigned char sram_reg=Pico.m.sram_reg; // must be preserved\r
 \r
+  Pico.m.frame_count = 0;\r
+\r
   // clear all memory of the emulated machine\r
   memset(&Pico.ram,0,(unsigned int)&Pico.rom-(unsigned int)&Pico.ram);\r
 \r
@@ -156,8 +158,11 @@ int PicoReset(void)
 \r
   Pico.m.dirtyPal = 1;\r
 \r
+  Pico.m.z80_bank68k = 0;\r
+  memset(Pico.zram, 0, sizeof(Pico.zram)); // ??\r
+\r
   PicoDetectRegion();\r
-  Pico.video.status = 0x3408 | Pico.m.pal; // 'always set' bits | vblank | pal\r
+  Pico.video.status = 0x3428 | Pico.m.pal; // 'always set' bits | vblank | collision | pal\r
 \r
   PsndReset(); // pal must be known here\r
 \r
@@ -169,6 +174,12 @@ int PicoReset(void)
     PicoResetMCD();\r
     return 0;\r
   }\r
+  else {\r
+    // reinit, so that checksum checks pass\r
+    SekFinishIdleDet();\r
+    if (!(PicoOpt & POPT_DIS_IDLE_DET))\r
+      SekInitIdleDet();\r
+  }\r
 \r
   // reset sram state; enable sram access by default if it doesn't overlap with ROM\r
   Pico.m.sram_reg=sram_reg&0x14;\r
@@ -185,17 +196,17 @@ int PicoReset(void)
 // same for Outrunners (92-121, when active is set to 24)\r
 // 96 is VR hack\r
 static const int dma_timings[] = {\r
-96,  167, 166,  83, // vblank: 32cell: dma2vram dma2[vs|c]ram vram_fill vram_copy\r
-102, 205, 204, 102, // vblank: 40cell:\r
-16,   16,  15,   8, // active: 32cell:\r
-24,   18,  17,   9  // ...\r
+  96,  167, 166,  83, // vblank: 32cell: dma2vram dma2[vs|c]ram vram_fill vram_copy\r
+  102, 205, 204, 102, // vblank: 40cell:\r
+  16,   16,  15,   8, // active: 32cell:\r
+  24,   18,  17,   9  // ...\r
 };\r
 \r
 static const int dma_bsycles[] = {\r
-(488<<8)/96,  (488<<8)/167, (488<<8)/166, (488<<8)/83,\r
-(488<<8)/102, (488<<8)/205, (488<<8)/204, (488<<8)/102,\r
-(488<<8)/16,  (488<<8)/16,  (488<<8)/15,  (488<<8)/8,\r
-(488<<8)/24,  (488<<8)/18,  (488<<8)/17,  (488<<8)/9\r
+  (488<<8)/96,  (488<<8)/167, (488<<8)/166, (488<<8)/83,\r
+  (488<<8)/102, (488<<8)/205, (488<<8)/204, (488<<8)/102,\r
+  (488<<8)/16,  (488<<8)/16,  (488<<8)/15,  (488<<8)/8,\r
+  (488<<8)/24,  (488<<8)/18,  (488<<8)/17,  (488<<8)/9\r
 };\r
 \r
 PICO_INTERNAL int CheckDMA(void)\r
@@ -229,7 +240,7 @@ static __inline void SekRunM68k(int cyc)
 {\r
   int cyc_do;\r
   SekCycleAim+=cyc;\r
-  if((cyc_do=SekCycleAim-SekCycleCnt) <= 0) return;\r
+  if ((cyc_do=SekCycleAim-SekCycleCnt) <= 0) return;\r
 #if defined(EMU_CORE_DEBUG)\r
   // this means we do run-compare\r
   SekCycleCnt+=CM_compareRun(cyc_do, 0);\r
@@ -320,7 +331,7 @@ PICO_INTERNAL void PicoSyncZ80(int m68k_cycles_done)
   z80_cycle_aim = cycles_68k_to_z80(m68k_cycles_done);\r
   cnt = z80_cycle_aim - z80_cycle_cnt;\r
 \r
-  elprintf(EL_ANOMALY, "z80 sync %i (%i|%i -> %i|%i)", cnt, z80_cycle_cnt, z80_cycle_cnt / 228,\r
+  elprintf(EL_BUSREQ, "z80 sync %i (%i|%i -> %i|%i)", cnt, z80_cycle_cnt, z80_cycle_cnt / 228,\r
     z80_cycle_aim, z80_cycle_aim / 228);\r
 \r
   if (cnt > 0)\r
@@ -375,7 +386,6 @@ static int PicoFrameSimple(void)
 \r
   SekCyclesReset();\r
   z80_resetCycles();\r
-  timers_cycle();\r
 \r
   // 6 button pad: let's just say it timed out now\r
   Pico.m.padTHPhase[0]=Pico.m.padTHPhase[1]=0;\r
@@ -414,6 +424,7 @@ static int PicoFrameSimple(void)
     if (!(PicoOpt&POPT_ALT_RENDERER))\r
     {\r
       // Draw the screen\r
+#if 0\r
 #if CAN_HANDLE_240_LINES\r
       if (pv->reg[1]&8) {\r
         for (y=0;y<240;y++) PicoLine(y);\r
@@ -422,6 +433,7 @@ static int PicoFrameSimple(void)
       }\r
 #else\r
       for (y=0;y<224;y++) PicoLine(y);\r
+#endif\r
 #endif\r
     }\r
     else PicoFrameFull();\r
@@ -491,13 +503,22 @@ static int PicoFrameSimple(void)
   if (PsndOut && ym2612.dacen && PsndDacLine <= line_last)\r
     PsndDoDAC(line_last);\r
 \r
+  timers_cycle();\r
+\r
   return 0;\r
 }\r
 \r
+int idle_hit_counter = 0;\r
+\r
 int PicoFrame(void)\r
 {\r
   int acc;\r
 \r
+  if ((Pico.m.frame_count&0x3f) == 0) {\r
+    elprintf(EL_STATUS, "ihits: %i", idle_hit_counter);\r
+    idle_hit_counter = 0;\r
+  }\r
+\r
   Pico.m.frame_count++;\r
 \r
   if (PicoAHW & PAHW_MCD) {\r