mcd: text shows up
[picodrive.git] / Pico / cd / Memory.c
index a1cadb1..cbaeb9d 100644 (file)
@@ -34,11 +34,14 @@ static u32 m68k_reg_read16(u32 a, int realsize)
 {\r
   u32 d=0;\r
   a &= 0x3e;\r
-  dprintf("m68k_regs r%2i: [%02x] @%06x", realsize&~1, a+(realsize&1), SekPc);\r
+  // dprintf("m68k_regs r%2i: [%02x] @%06x", realsize&~1, a+(realsize&1), SekPc);\r
 \r
   switch (a) {\r
+    case 0:\r
+      d = ((Pico_mcd->s68k_regs[0x33]<<13)&0x8000) | Pico_mcd->m68k_regs[1]; // here IFL2 is always 0, just like in Gens\r
+      goto end;\r
     case 2:\r
-      d = (Pico_mcd->m68k_regs[a]<<8) | Pico_mcd->m68k_regs[a+1] | 1; // for now 2M to m68k\r
+      d = (Pico_mcd->s68k_regs[a]<<8) | (Pico_mcd->s68k_regs[a+1]&0xc7);\r
       goto end;\r
     case 8:\r
       dprintf("m68k host data read");\r
@@ -64,54 +67,66 @@ static u32 m68k_reg_read16(u32 a, int realsize)
 \r
 end:\r
 \r
-  dprintf("ret = %04x", d);\r
+  // dprintf("ret = %04x", d);\r
   return d;\r
 }\r
 \r
 static void m68k_reg_write8(u32 a, u32 d, int realsize)\r
 {\r
   a &= 0x3f;\r
-  dprintf("m68k_regs w%2i: [%02x] %02x @%06x", realsize, a, d, SekPc);\r
+  // dprintf("m68k_regs w%2i: [%02x] %02x @%06x", realsize, a, d, SekPc);\r
 \r
   switch (a) {\r
     case 0:\r
+      d &= 1;\r
       if ((d&1) && (Pico_mcd->s68k_regs[0x33]&(1<<2))) { dprintf("m68k: s68k irq 2"); SekInterruptS68k(2); }\r
       break;\r
     case 1:\r
+      d &= 3;\r
       if (!(d&1)) PicoMCD |= 2; // reset pending, needed to be sure we fetch the right vectors on reset\r
       if ( (Pico_mcd->m68k_regs[1]&1) != (d&1)) dprintf("m68k: s68k reset %i", !(d&1));\r
       if ( (Pico_mcd->m68k_regs[1]&2) != (d&2)) dprintf("m68k: s68k brq %i", (d&2)>>1);\r
       if (/*!(Pico_mcd->m68k_regs[1]&1) &&*/ (PicoMCD&2) && (d&3)==1) {\r
         SekResetS68k(); // S68k comes out of RESET or BRQ state\r
        PicoMCD&=~2;\r
-       dprintf("m68k: resetting s68k");\r
+       dprintf("m68k: resetting s68k, cycles=%i", SekCyclesLeft);\r
       }\r
       break;\r
+    case 2:\r
+      Pico_mcd->s68k_regs[2] = d; // really use s68k side register\r
+      return;\r
     case 3:\r
-      if ((Pico_mcd->m68k_regs[3]>>6) != ((d>>6)&3))\r
-        dprintf("m68k: prg bank: %i -> %i", (Pico_mcd->m68k_regs[a]>>6), ((d>>6)&3));\r
-      if ((Pico_mcd->m68k_regs[3]&4) != (d&4)) dprintf("m68k: ram mode %i mbit", (d&4) ? 1 : 2);\r
-      if ((Pico_mcd->m68k_regs[3]&2) != (d&2)) dprintf("m68k: %s", (d&4) ? ((d&2) ? "word swap req" : "noop?") :\r
-                                                   ((d&2) ? "word ram to s68k" : "word ram to m68k"));\r
-      break;\r
+      d &= 0xc2;\r
+      if ((Pico_mcd->s68k_regs[3]>>6) != ((d>>6)&3))\r
+        dprintf("m68k: prg bank: %i -> %i", (Pico_mcd->s68k_regs[a]>>6), ((d>>6)&3));\r
+      //if ((Pico_mcd->s68k_regs[3]&4) != (d&4)) dprintf("m68k: ram mode %i mbit", (d&4) ? 1 : 2);\r
+      //if ((Pico_mcd->s68k_regs[3]&2) != (d&2)) dprintf("m68k: %s", (d&4) ? ((d&2) ? "word swap req" : "noop?") :\r
+      //                                             ((d&2) ? "word ram to s68k" : "word ram to m68k"));\r
+      d |= Pico_mcd->s68k_regs[3]&0x1d;\r
+      if (d & 2) d &= ~1; // returning word RAM to s68k\r
+      Pico_mcd->s68k_regs[3] = d; // really use s68k side register\r
+      return;\r
     case 0xe:\r
-      dprintf("m68k: comm flag: %02x", d);\r
+      //dprintf("m68k: comm flag: %02x", d);\r
 \r
-      dprintf("s68k @ %06x", SekPcS68k);\r
+      //dprintf("s68k @ %06x", SekPcS68k);\r
 \r
       Pico_mcd->s68k_regs[0xe] = d;\r
       break;\r
   }\r
 \r
-  if ((a&0xff) == 0x10) {\r
+  if (a < 0x10) {\r
+    Pico_mcd->m68k_regs[a] = (u8) d;\r
+    return;\r
+  }\r
+\r
+  if ((a&0xf0) == 0x10) {\r
       Pico_mcd->s68k_regs[a] = d;\r
+      return;\r
   }\r
 \r
   if (a >= 0x20 || (a >= 0xa && a <= 0xd) || a == 0x0f)\r
     dprintf("m68k: invalid write?");\r
-\r
-  if (a < 0x10)\r
-    Pico_mcd->m68k_regs[a] = (u8) d;\r
 }\r
 \r
 \r
@@ -121,11 +136,14 @@ static u32 s68k_reg_read16(u32 a, int realsize)
   u32 d=0;\r
   a &= 0x1fe;\r
 \r
-  dprintf("s68k_regs r%2i: [%02x] @ %06x", realsize&~1, a+(realsize&1), SekPcS68k);\r
+  // dprintf("s68k_regs r%2i: [%02x] @ %06x", realsize&~1, a+(realsize&1), SekPcS68k);\r
 \r
   switch (a) {\r
     case 0:\r
       d = 1; goto end; // ver = 0, not in reset state\r
+    case 2:\r
+      d = (Pico_mcd->s68k_regs[a]<<8) | (Pico_mcd->s68k_regs[a+1]&0x1f);\r
+      goto end;\r
     case 6:\r
       d = CDC_Read_Reg();\r
       goto end;\r
@@ -145,7 +163,7 @@ static u32 s68k_reg_read16(u32 a, int realsize)
 \r
 end:\r
 \r
-  dprintf("ret = %04x", d);\r
+  // dprintf("ret = %04x", d);\r
 \r
   return d;\r
 }\r
@@ -153,10 +171,17 @@ end:
 static void s68k_reg_write8(u32 a, u32 d, int realsize)\r
 {\r
   a &= 0x1ff;\r
-  dprintf("s68k_regs w%2i: [%02x] %02x @ %06x", realsize, a, d, SekPcS68k);\r
+  //dprintf("s68k_regs w%2i: [%02x] %02x @ %06x", realsize, a, d, SekPcS68k);\r
 \r
   // TODO: review against Gens\r
   switch (a) {\r
+    case 2:\r
+      return; // only m68k can change WP\r
+    case 3:\r
+      d &= 0x1d;\r
+      d |= Pico_mcd->s68k_regs[3]&0xc2;\r
+      if (d&1) d &= ~2; // returning word RAM to m68k\r
+      break;\r
     case 4:\r
       dprintf("s68k CDC dest: %x", d&7);\r
       Pico_mcd->s68k_regs[4] = (Pico_mcd->s68k_regs[4]&0xC0) | (d&7); // CDC mode\r
@@ -180,12 +205,17 @@ static void s68k_reg_write8(u32 a, u32 d, int realsize)
     case 0x34: // fader\r
       Pico_mcd->s68k_regs[a] = (u8) d & 0x7f;\r
       return;\r
-    case 0x37:\r
-      if ((d&4) && !(Pico_mcd->s68k_regs[0x37]&4)) {\r
+    case 0x36:\r
+      return; // d/m bit is unsetable\r
+    case 0x37: {\r
+      u32 d_old = Pico_mcd->s68k_regs[0x37];\r
+      Pico_mcd->s68k_regs[0x37] = d&7;\r
+      if ((d&4) && !(d_old&4)) {\r
         CDD_Export_Status();\r
        // counter75hz = 0; // ???\r
       }\r
-      break;\r
+      return;\r
+    }\r
     case 0x4b:\r
       Pico_mcd->s68k_regs[a] = (u8) d;\r
       CDD_Import_Command();\r
@@ -302,7 +332,10 @@ static u32 OtherRead16(u32 a, int realsize)
 \r
   if ((a&0xe700e0)==0xc00000) { d=PicoVideoRead(a); goto end; }\r
 \r
-  if ((a&0xffffc0)==0xa12000) { d=m68k_reg_read16(a, realsize); goto end; }\r
+  if ((a&0xffffc0)==0xa12000) {\r
+    d=m68k_reg_read16(a, realsize);\r
+    goto end;\r
+  }\r
 \r
   d = UnusualRead16(a, realsize);\r
 \r
@@ -410,15 +443,21 @@ u8 PicoReadM68k8(u32 a)
 \r
   // prg RAM\r
   if ((a&0xfe0000)==0x020000) {\r
-    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->m68k_regs[3]>>6];\r
+    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];\r
     d = *(prg_bank+((a^1)&0x1ffff));\r
     goto end;\r
   }\r
 \r
   if ((a&0xff4000)==0xa00000) { d=z80Read8(a); goto end; } // Z80 Ram\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("m68k_regs r8: [%02x] @%06x", a&0x3f, SekPc);\r
+\r
   d=OtherRead16(a&~1, 8|(a&1)); if ((a&1)==0) d>>=8;\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("ret = %02x", (u8)d);\r
+\r
   end:\r
 \r
 #ifdef __debug_io\r
@@ -439,13 +478,19 @@ u16 PicoReadM68k16(u32 a)
 \r
   // prg RAM\r
   if ((a&0xfe0000)==0x020000) {\r
-    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->m68k_regs[3]>>6];\r
+    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];\r
     d = *(u16 *)(prg_bank+(a&0x1fffe));\r
     goto end;\r
   }\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("m68k_regs r16: [%02x] @%06x", a&0x3f, SekPc);\r
+\r
   d = (u16)OtherRead16(a, 16);\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("ret = %04x", d);\r
+\r
   end:\r
 \r
 #ifdef __debug_io\r
@@ -466,14 +511,20 @@ u32 PicoReadM68k32(u32 a)
 \r
   // prg RAM\r
   if ((a&0xfe0000)==0x020000) {\r
-    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->m68k_regs[3]>>6];\r
+    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];\r
     u16 *pm=(u16 *)(prg_bank+(a&0x1fffe));\r
     d = (pm[0]<<16)|pm[1];\r
     goto end;\r
   }\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("m68k_regs r32: [%02x] @%06x", a&0x3f, SekPc);\r
+\r
   d = (OtherRead16(a, 32)<<16)|OtherRead16(a+2, 32);\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("ret = %08x", d);\r
+\r
   end:\r
 #ifdef __debug_io\r
   dprintf("r32: %06x, %08x @%06x", a&0xffffff, d, SekPc);\r
@@ -499,12 +550,15 @@ void PicoWriteM68k8(u32 a,u8 d)
 \r
   // prg RAM\r
   if ((a&0xfe0000)==0x020000) {\r
-    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->m68k_regs[3]>>6];\r
+    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];\r
     u8 *pm=(u8 *)(prg_bank+((a^1)&0x1ffff));\r
     *pm=d;\r
     return;\r
   }\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("m68k_regs w8: [%02x] %02x @%06x", a&0x3f, d, SekPc);\r
+\r
   OtherWrite8(a,d,8);\r
 }\r
 \r
@@ -522,11 +576,13 @@ void PicoWriteM68k16(u32 a,u16 d)
 \r
   // prg RAM\r
   if ((a&0xfe0000)==0x020000) {\r
-    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->m68k_regs[3]>>6];\r
+    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];\r
     *(u16 *)(prg_bank+(a&0x1fffe))=d;\r
     return;\r
   }\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("m68k_regs w16: [%02x] %04x @%06x", a&0x3f, d, SekPc);\r
 \r
   OtherWrite16(a,d);\r
 }\r
@@ -549,12 +605,19 @@ void PicoWriteM68k32(u32 a,u32 d)
 \r
   // prg RAM\r
   if ((a&0xfe0000)==0x020000) {\r
-    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->m68k_regs[3]>>6];\r
+    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];\r
     u16 *pm=(u16 *)(prg_bank+(a&0x1fffe));\r
     pm[0]=(u16)(d>>16); pm[1]=(u16)d;\r
     return;\r
   }\r
 \r
+  // word RAM\r
+  if (a!=0x200000 && (a&0xfc0000)==0x200000) // tmp hack\r
+    return;\r
+\r
+\r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("m68k_regs w32: [%02x] %08x @%06x", a&0x3f, d, SekPc);\r
 \r
   OtherWrite16(a,  (u16)(d>>16));\r
   OtherWrite16(a+2,(u16)d);\r
@@ -578,7 +641,9 @@ u8 PicoReadS68k8(u32 a)
 \r
   // regs\r
   if ((a&0xfffe00) == 0xff8000) {\r
+    dprintf("s68k_regs r8: [%02x] @ %06x", a&0x1ff, SekPcS68k);\r
     d = s68k_reg_read16(a&~1, 8|(a&1)); if ((a&1)==0) d>>=8;\r
+    dprintf("ret = %02x", (u8)d);\r
     goto end;\r
   }\r
 \r
@@ -606,7 +671,9 @@ u16 PicoReadS68k16(u32 a)
 \r
   // regs\r
   if ((a&0xfffe00) == 0xff8000) {\r
+    dprintf("s68k_regs r16: [%02x] @ %06x", a&0x1fe, SekPcS68k);\r
     d = s68k_reg_read16(a, 16);\r
+    dprintf("ret = %04x", d);\r
     goto end;\r
   }\r
 \r
@@ -635,7 +702,9 @@ u32 PicoReadS68k32(u32 a)
 \r
   // regs\r
   if ((a&0xfffe00) == 0xff8000) {\r
+    dprintf("s68k_regs r32: [%02x] @ %06x", a&0x1fe, SekPcS68k);\r
     d = (s68k_reg_read16(a, 32)<<16)|s68k_reg_read16(a+2, 32);\r
+    dprintf("ret = %08x", d);\r
     goto end;\r
   }\r
 \r
@@ -666,8 +735,12 @@ void PicoWriteS68k8(u32 a,u8 d)
     return;\r
   }\r
 \r
+  if (a != 0xff0011 && (a&0xff8000) == 0xff0000) // PCM hack\r
+    return;\r
+\r
   // regs\r
   if ((a&0xfffe00) == 0xff8000) {\r
+    dprintf("s68k_regs w8: [%02x] %02x @ %06x", a&0x1ff, d, SekPcS68k);\r
     s68k_reg_write8(a,d,8);\r
     return;\r
   }\r
@@ -691,6 +764,7 @@ void PicoWriteS68k16(u32 a,u16 d)
 \r
   // regs\r
   if ((a&0xfffe00) == 0xff8000) {\r
+    dprintf("s68k_regs w16: [%02x] %04x @ %06x", a&0x1ff, d, SekPcS68k);\r
     s68k_reg_write8(a,  d>>8, 16);\r
     s68k_reg_write8(a+1,d&0xff, 16);\r
     return;\r
@@ -716,6 +790,7 @@ void PicoWriteS68k32(u32 a,u32 d)
 \r
   // regs\r
   if ((a&0xfffe00) == 0xff8000) {\r
+    dprintf("s68k_regs w32: [%02x] %08x @ %06x", a&0x1ff, d, SekPcS68k);\r
     s68k_reg_write8(a,   d>>24, 32);\r
     s68k_reg_write8(a+1,(d>>16)&0xff, 32);\r
     s68k_reg_write8(a+2,(d>>8) &0xff, 32);\r