Sonic CD shows it's title screen
[picodrive.git] / Pico / VideoPort.c
index 537e917..0edf1be 100644 (file)
@@ -14,6 +14,7 @@ extern const unsigned char  hcounts_40[];
 extern const unsigned short vcounts[];\r
 extern int rendstatus;\r
 \r
+typedef unsigned char  u8;\r
 typedef unsigned short u16;\r
 \r
 \r
@@ -93,13 +94,44 @@ static void DmaSlow(int len)
     SekSetCyclesLeft(SekCyclesLeft - (len*(((488<<8)/167))>>8));\r
   }\r
 \r
-  if ((source&0xe00000)==0xe00000) { pd=(u16 *)(Pico.ram+(source&0xfffe)); pdend=(u16 *)(Pico.ram+0x10000); } // Ram\r
-  else if(PicoMCD & 1) {\r
-    if(source<0x20000) { pd=(u16 *)(Pico_mcd->bios+(source&~1)); pdend=(u16 *)(Pico_mcd->bios+0x20000); } // Bios area\r
-    else { dprintf("unsupported src"); return; } // Invalid source address\r
+  if ((source&0xe00000)==0xe00000) { // Ram\r
+    pd=(u16 *)(Pico.ram+(source&0xfffe));\r
+    pdend=(u16 *)(Pico.ram+0x10000);\r
+  } else if(PicoMCD & 1) {\r
+    dprintf("DmaSlow CD");\r
+    if(source<0x20000) { // Bios area\r
+      pd=(u16 *)(Pico_mcd->bios+(source&~1));\r
+      pdend=(u16 *)(Pico_mcd->bios+0x20000);\r
+    } else if ((source&0xfc0000)==0x200000 && (!(Pico_mcd->s68k_regs[3]&4))) { // Word Ram\r
+      if (!(Pico_mcd->s68k_regs[3]&4)) { // 2M mode\r
+        pd=(u16 *)(Pico_mcd->word_ram+(source&0x3fffe));\r
+        pdend=(u16 *)(Pico_mcd->word_ram+0x40000);\r
+      } else {\r
+        dprintf("DmaSlow: unsupported src");\r
+       return;\r
+      }\r
+    } else if ((source&0xfe0000)==0x020000) { // Prg Ram\r
+      u8 *prg_ram = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];\r
+      pd=(u16 *)(prg_ram+(source&0x1fffe));\r
+      pdend=(u16 *)(prg_ram+0x20000);\r
+    } else {\r
+      dprintf("DmaSlow: unsupported src");\r
+      return;\r
+    }\r
   } else {\r
-    if(source<Pico.romsize) { pd=(u16 *)(Pico.rom+(source&~1)); pdend=(u16 *)(Pico.rom+Pico.romsize); } // Rom\r
-    else { dprintf("invalid dma src"); return; } // Invalid source address\r
+    if(source<Pico.romsize) { // Rom\r
+      pd=(u16 *)(Pico.rom+(source&~1));\r
+      pdend=(u16 *)(Pico.rom+Pico.romsize);\r
+    } else {\r
+      dprintf("DmaSlow: invalid dma src");\r
+      return;\r
+    }\r
+  }\r
+\r
+  // overflow protection, might break something..\r
+  if (len > pdend - pd) {\r
+    len = pdend - pd;\r
+    dprintf("DmaSlow overflow");\r
   }\r
 \r
   switch (Pico.video.type)\r
@@ -114,7 +146,7 @@ static void DmaSlow(int len)
         // AutoIncrement\r
         a=(u16)(a+inc);\r
         // didn't src overlap?\r
-        if(pd >= pdend) pd-=0x8000; // should be good for RAM, bad for ROM\r
+        //if(pd >= pdend) pd-=0x8000; // should be good for RAM, bad for ROM\r
       }\r
       rendstatus|=0x10;\r
       break;\r
@@ -128,7 +160,7 @@ static void DmaSlow(int len)
         // AutoIncrement\r
         a2+=inc;\r
         // didn't src overlap?\r
-        if(pd >= pdend) pd-=0x8000;\r
+        //if(pd >= pdend) pd-=0x8000;\r
         // good dest?\r
         if(a2 >= 0x80) break; // Todds Adventures in Slime World / Andre Agassi tennis\r
       }\r
@@ -143,7 +175,7 @@ static void DmaSlow(int len)
         // AutoIncrement\r
         a2+=inc;\r
         // didn't src overlap?\r
-        if(pd >= pdend) pd-=0x8000;\r
+        //if(pd >= pdend) pd-=0x8000;\r
         // good dest?\r
         if(a2 >= 0x80) break;\r
       }\r