bios CD player runs
authornotaz <notasas@gmail.com>
Wed, 3 Jan 2007 23:07:22 +0000 (23:07 +0000)
committernotaz <notasas@gmail.com>
Wed, 3 Jan 2007 23:07:22 +0000 (23:07 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@15 be3aeb3a-fb24-0410-a615-afba39da0efa

Pico/cd/Memory.c

index cbaeb9d..49b1113 100644 (file)
@@ -103,7 +103,7 @@ static void m68k_reg_write8(u32 a, u32 d, int realsize)
       //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
+      if (!(d & 4) && (d & 2)) d &= ~1; // return word RAM to s68k in 2M mode\r
       Pico_mcd->s68k_regs[3] = d; // really use s68k side register\r
       return;\r
     case 0xe:\r
@@ -179,8 +179,13 @@ static void s68k_reg_write8(u32 a, u32 d, int realsize)
       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
+      if (d&4) {\r
+        d |= Pico_mcd->s68k_regs[3]&0xc2;\r
+        if ((d ^ Pico_mcd->s68k_regs[3]) & 5) d &= ~2; // in case of mode or bank change we clear DMNA (m68k req) bit\r
+      } else {\r
+        d |= Pico_mcd->s68k_regs[3]&0xc3;\r
+        if (d&1) d &= ~2; // return word RAM to m68k in 2M mode\r
+      }\r
       break;\r
     case 4:\r
       dprintf("s68k CDC dest: %x", d&7);\r
@@ -448,6 +453,19 @@ u8 PicoReadM68k8(u32 a)
     goto end;\r
   }\r
 \r
+  // word RAM\r
+  if ((a&0xfc0000)==0x200000) {\r
+    dprintf("m68k_wram r8: [%06x] @%06x", a, SekPc);\r
+    if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
+      // TODO\r
+    } else {\r
+      // allow access in any mode, like Gens does\r
+      d = Pico_mcd->word_ram[(a^1)&0x3ffff];\r
+    }\r
+    dprintf("ret = %02x", (u8)d);\r
+    goto end;\r
+  }\r
+\r
   if ((a&0xff4000)==0xa00000) { d=z80Read8(a); goto end; } // Z80 Ram\r
 \r
   if ((a&0xffffc0)==0xa12000)\r
@@ -483,6 +501,19 @@ u16 PicoReadM68k16(u32 a)
     goto end;\r
   }\r
 \r
+  // word RAM\r
+  if ((a&0xfc0000)==0x200000) {\r
+    dprintf("m68k_wram r16: [%06x] @%06x", a, SekPc);\r
+    if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
+      // TODO\r
+    } else {\r
+      // allow access in any mode, like Gens does\r
+      d = *(u16 *)(Pico_mcd->word_ram+(a&0x3fffe));\r
+    }\r
+    dprintf("ret = %04x", d);\r
+    goto end;\r
+  }\r
+\r
   if ((a&0xffffc0)==0xa12000)\r
     dprintf("m68k_regs r16: [%02x] @%06x", a&0x3f, SekPc);\r
 \r
@@ -517,6 +548,19 @@ u32 PicoReadM68k32(u32 a)
     goto end;\r
   }\r
 \r
+  // word RAM\r
+  if ((a&0xfc0000)==0x200000) {\r
+    dprintf("m68k_wram r32: [%06x] @%06x", a, SekPc);\r
+    if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
+      // TODO\r
+    } else {\r
+      // allow access in any mode, like Gens does\r
+      u16 *pm=(u16 *)(Pico_mcd->word_ram+(a&0x3fffe)); d = (pm[0]<<16)|pm[1];\r
+    }\r
+    dprintf("ret = %08x", d);\r
+    goto end;\r
+  }\r
+\r
   if ((a&0xffffc0)==0xa12000)\r
     dprintf("m68k_regs r32: [%02x] @%06x", a&0x3f, SekPc);\r
 \r
@@ -556,6 +600,19 @@ void PicoWriteM68k8(u32 a,u8 d)
     return;\r
   }\r
 \r
+  // word RAM\r
+  if ((a&0xfc0000)==0x200000) {\r
+    dprintf("m68k_wram w8: [%06x] %02x @%06x", a, d, SekPc);\r
+    if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
+      // TODO\r
+    } else {\r
+      // allow access in any mode, like Gens does\r
+      u8 *pm=(u8 *)(Pico_mcd->word_ram+((a^1)&0x3ffff));\r
+      *pm=d;\r
+    }\r
+    return;\r
+  }\r
+\r
   if ((a&0xffffc0)==0xa12000)\r
     dprintf("m68k_regs w8: [%02x] %02x @%06x", a&0x3f, d, SekPc);\r
 \r
@@ -581,6 +638,18 @@ void PicoWriteM68k16(u32 a,u16 d)
     return;\r
   }\r
 \r
+  // word RAM\r
+  if ((a&0xfc0000)==0x200000) {\r
+    dprintf("m68k_wram w16: [%06x] %04x @%06x", a, d, SekPc);\r
+    if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
+      // TODO\r
+    } else {\r
+      // allow access in any mode, like Gens does\r
+      *(u16 *)(Pico_mcd->word_ram+(a&0x3fffe))=d;\r
+    }\r
+    return;\r
+  }\r
+\r
   if ((a&0xffffc0)==0xa12000)\r
     dprintf("m68k_regs w16: [%02x] %04x @%06x", a&0x3f, d, SekPc);\r
 \r
@@ -612,9 +681,18 @@ void PicoWriteM68k32(u32 a,u32 d)
   }\r
 \r
   // word RAM\r
-  if (a!=0x200000 && (a&0xfc0000)==0x200000) // tmp hack\r
+  if ((a&0xfc0000)==0x200000) {\r
+    if (d != 0) // don't log clears\r
+      dprintf("m68k_wram w32: [%06x] %08x @%06x", a, d, SekPc);\r
+    if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
+      // TODO\r
+    } else {\r
+      // allow access in any mode, like Gens does\r
+      u16 *pm=(u16 *)(Pico_mcd->word_ram+(a&0x3fffe));\r
+      pm[0]=(u16)(d>>16); pm[1]=(u16)d;\r
+    }\r
     return;\r
-\r
+  }\r
 \r
   if ((a&0xffffc0)==0xa12000)\r
     dprintf("m68k_regs w32: [%02x] %08x @%06x", a&0x3f, d, SekPc);\r
@@ -647,6 +725,27 @@ u8 PicoReadS68k8(u32 a)
     goto end;\r
   }\r
 \r
+  // word RAM (2M area)\r
+  if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
+    dprintf("s68k_wram2M r8: [%06x] @%06x", a, SekPc);\r
+    if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
+      // TODO (decode)\r
+      dprintf("(decode)");\r
+    } else {\r
+      // allow access in any mode, like Gens does\r
+      d = Pico_mcd->word_ram[(a^1)&0x3ffff];\r
+    }\r
+    dprintf("ret = %02x", (u8)d);\r
+    goto end;\r
+  }\r
+\r
+  // word RAM (1M area)\r
+  if ((a&0xfe0000)==0x0c0000 && (Pico_mcd->s68k_regs[3]&4)) { // 0c0000-0dffff\r
+    dprintf("s68k_wram1M r8: [%06x] @%06x", a, SekPc);\r
+    // TODO\r
+    goto end;\r
+  }\r
+\r
   dprintf("s68k r8 : %06x,   %02x @%06x", a&0xffffff, (u8)d, SekPcS68k);\r
 \r
   end:\r
@@ -677,6 +776,27 @@ u16 PicoReadS68k16(u32 a)
     goto end;\r
   }\r
 \r
+  // word RAM (2M area)\r
+  if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
+    dprintf("s68k_wram2M r16: [%06x] @%06x", a, SekPc);\r
+    if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
+      // TODO (decode)\r
+      dprintf("(decode)");\r
+    } else {\r
+      // allow access in any mode, like Gens does\r
+      d = *(u16 *)(Pico_mcd->word_ram+(a&0x3fffe));\r
+    }\r
+    dprintf("ret = %04x", (u8)d);\r
+    goto end;\r
+  }\r
+\r
+  // word RAM (1M area)\r
+  if ((a&0xfe0000)==0x0c0000 && (Pico_mcd->s68k_regs[3]&4)) { // 0c0000-0dffff\r
+    dprintf("s68k_wram1M r16: [%06x] @%06x", a, SekPc);\r
+    // TODO\r
+    goto end;\r
+  }\r
+\r
   dprintf("s68k r16: %06x, %04x  @%06x", a&0xffffff, d, SekPcS68k);\r
 \r
   end:\r
@@ -708,6 +828,27 @@ u32 PicoReadS68k32(u32 a)
     goto end;\r
   }\r
 \r
+  // word RAM (2M area)\r
+  if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
+    dprintf("s68k_wram2M r32: [%06x] @%06x", a, SekPc);\r
+    if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
+      // TODO (decode)\r
+      dprintf("(decode)");\r
+    } else {\r
+      // allow access in any mode, like Gens does\r
+      u16 *pm=(u16 *)(Pico_mcd->word_ram+(a&0x3fffe)); d = (pm[0]<<16)|pm[1];\r
+    }\r
+    dprintf("ret = %08x", (u8)d);\r
+    goto end;\r
+  }\r
+\r
+  // word RAM (1M area)\r
+  if ((a&0xfe0000)==0x0c0000 && (Pico_mcd->s68k_regs[3]&4)) { // 0c0000-0dffff\r
+    dprintf("s68k_wram1M 32: [%06x] @%06x", a, SekPc);\r
+    // TODO\r
+    goto end;\r
+  }\r
+\r
   dprintf("s68k r32: %06x, %08x @%06x", a&0xffffff, d, SekPcS68k);\r
 \r
   end:\r
@@ -745,6 +886,28 @@ void PicoWriteS68k8(u32 a,u8 d)
     return;\r
   }\r
 \r
+  // word RAM (2M area)\r
+  if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
+    dprintf("s68k_wram2M w8: [%06x] %02x @%06x", a, d, SekPc);\r
+    if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
+      // TODO (decode)\r
+      dprintf("(decode)");\r
+    } else {\r
+      // allow access in any mode, like Gens does\r
+      u8 *pm=(u8 *)(Pico_mcd->word_ram+((a^1)&0x3ffff));\r
+      *pm=d;\r
+    }\r
+    return;\r
+  }\r
+\r
+  // word RAM (1M area)\r
+  if ((a&0xfe0000)==0x0c0000 && (Pico_mcd->s68k_regs[3]&4)) { // 0c0000-0dffff\r
+    if (d)\r
+      dprintf("s68k_wram1M w8: [%06x] %02x @%06x", a, d, SekPc);\r
+    // TODO\r
+    return;\r
+  }\r
+\r
   dprintf("s68k w8 : %06x,   %02x @%06x", a&0xffffff, d, SekPcS68k);\r
 }\r
 \r
@@ -770,6 +933,27 @@ void PicoWriteS68k16(u32 a,u16 d)
     return;\r
   }\r
 \r
+  // word RAM (2M area)\r
+  if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
+    dprintf("s68k_wram2M w16: [%06x] %04x @%06x", a, d, SekPc);\r
+    if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
+      // TODO (decode)\r
+      dprintf("(decode)");\r
+    } else {\r
+      // allow access in any mode, like Gens does\r
+      *(u16 *)(Pico_mcd->word_ram+(a&0x3fffe))=d;\r
+    }\r
+    return;\r
+  }\r
+\r
+  // word RAM (1M area)\r
+  if ((a&0xfe0000)==0x0c0000 && (Pico_mcd->s68k_regs[3]&4)) { // 0c0000-0dffff\r
+    if (d)\r
+      dprintf("s68k_wram1M w16: [%06x] %04x @%06x", a, d, SekPc);\r
+    // TODO\r
+    return;\r
+  }\r
+\r
   dprintf("s68k w16: %06x, %04x @%06x", a&0xffffff, d, SekPcS68k);\r
 }\r
 \r
@@ -798,6 +982,27 @@ void PicoWriteS68k32(u32 a,u32 d)
     return;\r
   }\r
 \r
+  // word RAM (2M area)\r
+  if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
+    dprintf("s68k_wram2M w32: [%06x] %08x @%06x", a, d, SekPc);\r
+    if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
+      // TODO (decode)\r
+      dprintf("(decode)");\r
+    } else {\r
+      // allow access in any mode, like Gens does\r
+      u16 *pm=(u16 *)(Pico_mcd->word_ram+(a&0x3fffe));\r
+      pm[0]=(u16)(d>>16); pm[1]=(u16)d;\r
+    }\r
+    return;\r
+  }\r
+\r
+  // word RAM (1M area)\r
+  if ((a&0xfe0000)==0x0c0000 && (Pico_mcd->s68k_regs[3]&4)) { // 0c0000-0dffff\r
+    if (d)\r
+      dprintf("s68k_wram1M w32: [%06x] %08x @%06x", a, d, SekPc);\r
+    // TODO\r
+    return;\r
+  }\r
   dprintf("s68k w32: %06x, %08x @%06x", a&0xffffff, d, SekPcS68k);\r
 }\r
 \r