buffering, PCM DMA, memcpy12bswap
[picodrive.git] / Pico / cd / Memory.c
index b6a4a82..e8d0cdb 100644 (file)
@@ -421,6 +421,7 @@ u16 PicoReadM68k16(u32 a)
            a = (a&2) | (cell_map(a >> 2) << 2); // cell arranged\r
       else a &= 0x1fffe;\r
       d = *(u16 *)(Pico_mcd->word_ram1M[bank]+a);\r
+//d = 0xaaaa;\r
     } else {\r
       // allow access in any mode, like Gens does\r
       d = *(u16 *)(Pico_mcd->word_ram2M+(a&0x3fffe));\r
@@ -929,6 +930,63 @@ u32 PicoReadS68k32(u32 a)
 }\r
 \r
 \r
+/* check: jaguar xj 220 (draws entire world using decode) */\r
+static void decode_write8(u32 a, u8 d, int r3)\r
+{\r
+  u8 *pd = Pico_mcd->word_ram1M[!(r3 & 1)] + (((a>>1)^1)&0x1ffff);\r
+  u8 oldmask = (a&1) ? 0xf0 : 0x0f;\r
+\r
+  //if ((a & 0x3ffff) < 0x28000) return;\r
+  //return;\r
+\r
+  r3 &= 0x18;\r
+  d  &= 0x0f;\r
+  if (!(a&1)) d <<= 4;\r
+\r
+  //dprintf("FIXME: decode, r3 = %02x", r3);\r
+\r
+  if (r3 == 8) {\r
+    if ((!(*pd & (~oldmask))) && d) goto do_it;\r
+  } else if (r3 > 8) {\r
+    if (d) goto do_it;\r
+  } else {\r
+    goto do_it;\r
+  }\r
+\r
+  return;\r
+do_it:\r
+  *pd = d | (*pd & oldmask);\r
+}\r
+\r
+\r
+static void decode_write16(u32 a, u16 d, int r3)\r
+{\r
+  u8 *pd = Pico_mcd->word_ram1M[!(r3 & 1)] + (((a>>1)^1)&0x1ffff);\r
+\r
+  //if ((a & 0x3ffff) < 0x28000) return;\r
+\r
+  r3 &= 0x18;\r
+  d  &= 0x0f0f;\r
+  d  |= d >> 4;\r
+\r
+  if (r3 == 8) {\r
+    u8 dold = *pd;\r
+    if (!(dold & 0xf0)) dold |= d & 0xf0;\r
+    if (!(dold & 0x0f)) dold |= d & 0x0f;\r
+    *pd = dold;\r
+  } else if (r3 > 8) {\r
+    u8 dold = *pd;\r
+    if (!(d & 0xf0)) d |= dold & 0xf0;\r
+    if (!(d & 0x0f)) d |= dold & 0x0f;\r
+    *pd = d;\r
+  } else {\r
+    *pd = d;\r
+  }\r
+\r
+  //dprintf("FIXME: decode");\r
+}\r
+\r
+\r
 // -----------------------------------------------------------------\r
 \r
 void PicoWriteS68k8(u32 a,u8 d)\r
@@ -958,13 +1016,10 @@ void PicoWriteS68k8(u32 a,u8 d)
 \r
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
+    int r3 = Pico_mcd->s68k_regs[3];\r
     wrdprintf("s68k_wram2M w8: [%06x] %02x @%06x", a, d, SekPcS68k);\r
-    if (Pico_mcd->s68k_regs[3]&4) { // 1M decode mode?\r
-      int bank = !(Pico_mcd->s68k_regs[3]&1);\r
-      if (a&1) d &= 0x0f;\r
-      else d >>= 4;\r
-      Pico_mcd->word_ram1M[bank][((a>>1)^1)&0x1ffff]=d;\r
-      dprintf("FIXME: decode");\r
+    if (r3 & 4) { // 1M decode mode?\r
+      decode_write8(a, d, r3);\r
     } else {\r
       // allow access in any mode, like Gens does\r
       *(u8 *)(Pico_mcd->word_ram2M+((a^1)&0x3ffff))=d;\r
@@ -1039,12 +1094,10 @@ void PicoWriteS68k16(u32 a,u16 d)
 \r
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
+    int r3 = Pico_mcd->s68k_regs[3];\r
     wrdprintf("s68k_wram2M w16: [%06x] %04x @%06x", a, d, SekPcS68k);\r
-    if (Pico_mcd->s68k_regs[3]&4) { // 1M decode mode?\r
-      int bank = !(Pico_mcd->s68k_regs[3]&1);\r
-      d &= ~0xf0; d |= d >> 8;\r
-      Pico_mcd->word_ram1M[bank][((a>>1)^1)&0x1ffff] = d;\r
-      dprintf("FIXME: decode");\r
+    if (r3 & 4) { // 1M decode mode?\r
+      decode_write16(a, d, r3);\r
     } else {\r
       // allow access in any mode, like Gens does\r
       *(u16 *)(Pico_mcd->word_ram2M+(a&0x3fffe))=d;\r
@@ -1121,14 +1174,11 @@ void PicoWriteS68k32(u32 a,u32 d)
 \r
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
+    int r3 = Pico_mcd->s68k_regs[3];\r
     wrdprintf("s68k_wram2M w32: [%06x] %08x @%06x", a, d, SekPcS68k);\r
-    if (Pico_mcd->s68k_regs[3]&4) { // 1M decode mode?\r
-      int bank = !(Pico_mcd->s68k_regs[3]&1);\r
-      a >>= 1;\r
-      d &= 0x0f0f0f0f; d |= d >> 4;\r
-      Pico_mcd->word_ram1M[bank][((a+0)^1)&0x1ffff] = d >> 16;\r
-      Pico_mcd->word_ram1M[bank][((a+1)^1)&0x1ffff] = d;\r
-      dprintf("FIXME: decode");\r
+    if (r3 & 4) { // 1M decode mode?\r
+      decode_write16(a  , d >> 16, r3);\r
+      decode_write16(a+2, d      , r3);\r
     } else {\r
       // allow access in any mode, like Gens does\r
       u16 *pm=(u16 *)(Pico_mcd->word_ram2M+(a&0x3fffe));\r