improved game vidmode change detection; some iface changes
[picodrive.git] / pico / draw.c
index 180045d..c432bd5 100644 (file)
@@ -54,6 +54,7 @@ int  HighPreSpr[80*2+1]; // slightly preprocessed sprites
 unsigned char HighLnSpr[240][3 + MAX_LINE_SPRITES]; // sprite_count, ^flags, tile_count, [spritep]...\r
 \r
 int rendstatus, rendstatus_old;\r
+int rendlines;\r
 int DrawScanline;\r
 int PicoDrawMask = -1;\r
 \r
@@ -1404,21 +1405,25 @@ static int DrawDisplay(int sh)
 // MUST be called every frame\r
 PICO_INTERNAL void PicoFrameStart(void)\r
 {\r
+  int lines = 224;\r
+\r
   // prepare to do this frame\r
   rendstatus = 0;\r
-  if ((Pico.video.reg[12]&6) == 6)\r
+  if ((Pico.video.reg[12] & 6) == 6)\r
     rendstatus |= PDRAW_INTERLACE; // interlace mode\r
+  if (!(Pico.video.reg[12] & 1))\r
+    rendstatus |= PDRAW_32_COLS;\r
   if (Pico.video.reg[1] & 8)\r
-    rendstatus |= PDRAW_240LINES;\r
+    lines = 240;\r
 \r
   DrawScanline = 0;\r
   skip_next_line = 0;\r
 \r
-  if (rendstatus != rendstatus_old) {\r
+  if (rendstatus != rendstatus_old || lines != rendlines) {\r
+    rendlines = lines;\r
     rendstatus_old = rendstatus;\r
-    emu_video_mode_change((rendstatus & PDRAW_240LINES) ? 0 : 8,\r
-      (rendstatus & PDRAW_240LINES) ? 240 : 224,\r
-      (Pico.video.reg[12] & 1) ? 0 : 1);\r
+    emu_video_mode_change((lines == 240) ? 0 : 8,\r
+      lines, (Pico.video.reg[12] & 1) ? 0 : 1);\r
   }\r
 \r
   if (PicoOpt & POPT_ALT_RENDERER)\r
@@ -1445,6 +1450,8 @@ static void DrawBlankedLine(int line, int offs, int sh, int bgc)
 \r
 static void PicoLine(int line, int offs, int sh, int bgc)\r
 {\r
+  int skip = 0;\r
+\r
   if (skip_next_line > 0) {\r
     skip_next_line--;\r
     return;\r
@@ -1452,7 +1459,12 @@ static void PicoLine(int line, int offs, int sh, int bgc)
 \r
   DrawScanline = line;\r
   if (PicoScanBegin != NULL)\r
-    skip_next_line = PicoScanBegin(line + offs);\r
+    skip = PicoScanBegin(line + offs);\r
+\r
+  if (skip) {\r
+    skip_next_line = skip - 1;\r
+    return;\r
+  }\r
 \r
   // Draw screen:\r
   BackFill(bgc, sh);\r
@@ -1472,7 +1484,7 @@ void PicoDrawSync(int to, int blank_last_line)
   int sh = (Pico.video.reg[0xC] & 8) >> 3; // shadow/hilight?\r
   int bgc = Pico.video.reg[7];\r
 \r
-  if (!(rendstatus & PDRAW_240LINES))\r
+  if (rendlines != 240)\r
     offs = 8;\r
 \r
   // need to know which pixels are bg for 32x\r