Makefile revert
[picodrive.git] / Pico / cd / Memory.c
index ff787b0..c941806 100644 (file)
@@ -43,7 +43,7 @@ static u32 m68k_reg_read16(u32 a)
       goto end;\r
     case 2:\r
       d = (Pico_mcd->s68k_regs[a]<<8) | (Pico_mcd->s68k_regs[a+1]&0xc7);\r
-      dprintf("m68k_regs r3: %02x @%06x", (u8)d, SekPc);\r
+      dprintf("m68k_regs r3: %02x @%06x", (u8)d, SekPcS68k);\r
       goto end;\r
     case 4:\r
       d = Pico_mcd->s68k_regs[4]<<8;\r
@@ -59,7 +59,8 @@ static u32 m68k_reg_read16(u32 a)
       goto end;\r
     case 0xC:\r
       dprintf("m68k stopwatch timer read");\r
-      break;\r
+      d = Pico_mcd->m.timer_stopwatch >> 16;\r
+      goto end;\r
   }\r
 \r
   if (a < 0x30) {\r
@@ -123,9 +124,6 @@ static void m68k_reg_write8(u32 a, u32 d)
       return;\r
     case 0xe:\r
       //dprintf("m68k: comm flag: %02x", d);\r
-\r
-      //dprintf("s68k @ %06x", SekPcS68k);\r
-\r
       Pico_mcd->s68k_regs[0xe] = d;\r
       return;\r
   }\r
@@ -218,6 +216,10 @@ static void s68k_reg_write8(u32 a, u32 d)
       dprintf("s68k set stopwatch timer");\r
       Pico_mcd->m.timer_stopwatch = 0;\r
       return;\r
+    case 0xe:\r
+      Pico_mcd->s68k_regs[0Xf] = (d>>1) | (d<<7); // ror8, Gens note: Dragons lair\r
+      Pico_mcd->m.timer_stopwatch = 0;\r
+      return;\r
     case 0x31:\r
       dprintf("s68k set int3 timer: %02x", d);\r
       Pico_mcd->m.timer_int3 = d << 16;\r
@@ -247,9 +249,9 @@ static void s68k_reg_write8(u32 a, u32 d)
       return;\r
   }\r
 \r
-  if ((a&0x1f0) == 0x10 || a == 0x0e || (a >= 0x38 && a < 0x42))\r
+  if ((a&0x1f0) == 0x10 || (a >= 0x38 && a < 0x42))\r
   {\r
-    dprintf("m68k: invalid write @ %02x?", a);\r
+    dprintf("s68k: invalid write @ %02x?", a);\r
     return;\r
   }\r
 \r
@@ -813,7 +815,7 @@ u8 PicoReadS68k8(u32 a)
 \r
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
-    dprintf("s68k_wram2M r8: [%06x] @%06x", a, SekPc);\r
+    dprintf("s68k_wram2M r8: [%06x] @%06x", a, SekPcS68k);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
       // TODO (decode)\r
       dprintf("(decode)");\r
@@ -827,7 +829,7 @@ u8 PicoReadS68k8(u32 a)
 \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
+    dprintf("s68k_wram1M r8: [%06x] @%06x", a, SekPcS68k);\r
     a=((a&0x1fffe)<<1)|(a&1);\r
     if (!(Pico_mcd->s68k_regs[3]&1)) a+=2;\r
     d = Pico_mcd->word_ram[a^1];\r
@@ -837,7 +839,7 @@ u8 PicoReadS68k8(u32 a)
 \r
   // PCM\r
   if ((a&0xff8000)==0xff0000) {\r
-    dprintf("s68k_pcm r8: [%06x] @%06x", a, SekPc);\r
+    dprintf("s68k_pcm r8: [%06x] @%06x", a, SekPcS68k);\r
     a &= 0x7fff;\r
     if (a >= 0x2000)\r
       d = Pico_mcd->pcm_ram_b[Pico_mcd->pcm.bank][(a>>1)&0xfff];\r
@@ -892,7 +894,7 @@ u16 PicoReadS68k16(u32 a)
 \r
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
-    dprintf("s68k_wram2M r16: [%06x] @%06x", a, SekPc);\r
+    dprintf("s68k_wram2M r16: [%06x] @%06x", a, SekPcS68k);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
       // TODO (decode)\r
       dprintf("(decode)");\r
@@ -906,7 +908,7 @@ u16 PicoReadS68k16(u32 a)
 \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
+    dprintf("s68k_wram1M r16: [%06x] @%06x", a, SekPcS68k);\r
     a=((a&0x1fffe)<<1);\r
     if (!(Pico_mcd->s68k_regs[3]&1)) a+=2;\r
     d = *(u16 *)(Pico_mcd->word_ram+a);\r
@@ -916,7 +918,7 @@ u16 PicoReadS68k16(u32 a)
 \r
   // bram\r
   if ((a&0xff0000)==0xfe0000) {\r
-    dprintf("s68k_bram r16: [%06x] @%06x", a, SekPc);\r
+    dprintf("s68k_bram r16: [%06x] @%06x", a, SekPcS68k);\r
     a = (a>>1)&0x1fff;\r
     d = Pico_mcd->bram[a++];           // Gens does little endian here, and so do we..\r
     d|= Pico_mcd->bram[a++] << 8;\r
@@ -926,7 +928,7 @@ u16 PicoReadS68k16(u32 a)
 \r
   // PCM\r
   if ((a&0xff8000)==0xff0000) {\r
-    dprintf("s68k_pcm r16: [%06x] @%06x", a, SekPc);\r
+    dprintf("s68k_pcm r16: [%06x] @%06x", a, SekPcS68k);\r
     a &= 0x7fff;\r
     if (a >= 0x2000)\r
       d = Pico_mcd->pcm_ram_b[Pico_mcd->pcm.bank][(a>>1)&0xfff];\r
@@ -976,7 +978,7 @@ u32 PicoReadS68k32(u32 a)
 \r
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
-    dprintf("s68k_wram2M r32: [%06x] @%06x", a, SekPc);\r
+    dprintf("s68k_wram2M r32: [%06x] @%06x", a, SekPcS68k);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
       // TODO (decode)\r
       dprintf("(decode)");\r
@@ -990,7 +992,7 @@ u32 PicoReadS68k32(u32 a)
 \r
   // word RAM (1M area)\r
   if ((a&0xfe0000)==0x0c0000 && (Pico_mcd->s68k_regs[3]&4)) { // 0c0000-0dffff\r
-    dprintf("s68k_wram1M r32: [%06x] @%06x", a, SekPc);\r
+    dprintf("s68k_wram1M r32: [%06x] @%06x", a, SekPcS68k);\r
     a=((a&0x1fffe)<<1);\r
     if (!(Pico_mcd->s68k_regs[3]&1)) a+=2;\r
     d  = *(u16 *)(Pico_mcd->word_ram+a) << 16;\r
@@ -1001,7 +1003,7 @@ u32 PicoReadS68k32(u32 a)
 \r
   // PCM\r
   if ((a&0xff8000)==0xff0000) {\r
-    dprintf("s68k_pcm r32: [%06x] @%06x", a, SekPc);\r
+    dprintf("s68k_pcm r32: [%06x] @%06x", a, SekPcS68k);\r
     a &= 0x7fff;\r
     if (a >= 0x2000) {\r
       a >>= 1;\r
@@ -1024,7 +1026,7 @@ u32 PicoReadS68k32(u32 a)
 \r
   // bram\r
   if ((a&0xff0000)==0xfe0000) {\r
-    dprintf("s68k_bram r32: [%06x] @%06x", a, SekPc);\r
+    dprintf("s68k_bram r32: [%06x] @%06x", a, SekPcS68k);\r
     a = (a>>1)&0x1fff;\r
     d = Pico_mcd->bram[a++] << 16;             // middle endian? TODO: verify against Fusion..\r
     d|= Pico_mcd->bram[a++] << 24;\r
@@ -1074,7 +1076,7 @@ void PicoWriteS68k8(u32 a,u8 d)
 \r
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
-    dprintf("s68k_wram2M w8: [%06x] %02x @%06x", a, d, SekPc);\r
+    dprintf("s68k_wram2M w8: [%06x] %02x @%06x", a, d, SekPcS68k);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
       // TODO (decode)\r
       dprintf("(decode)");\r
@@ -1088,7 +1090,7 @@ void PicoWriteS68k8(u32 a,u8 d)
   // 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
+      dprintf("s68k_wram1M w8: [%06x] %02x @%06x", a, d, SekPcS68k);\r
     a=((a&0x1fffe)<<1)|(a&1);\r
     if (!(Pico_mcd->s68k_regs[3]&1)) a+=2;\r
     *(u8 *)(Pico_mcd->word_ram+(a^1))=d;\r
@@ -1137,6 +1139,10 @@ void PicoWriteS68k16(u32 a,u16 d)
     if (a >= 0x50 && a < 0x68)\r
       gfx_cd_write(a, d);\r
     else {\r
+      if (a == 0xe) { // special case, 2 byte writes would be handled differently\r
+        Pico_mcd->s68k_regs[0xf] = d;\r
+       return;\r
+      }\r
       s68k_reg_write8(a,  d>>8);\r
       s68k_reg_write8(a+1,d&0xff);\r
     }\r
@@ -1145,7 +1151,7 @@ void PicoWriteS68k16(u32 a,u16 d)
 \r
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
-    dprintf("s68k_wram2M w16: [%06x] %04x @%06x", a, d, SekPc);\r
+    dprintf("s68k_wram2M w16: [%06x] %04x @%06x", a, d, SekPcS68k);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
       // TODO (decode)\r
       dprintf("(decode)");\r
@@ -1159,7 +1165,7 @@ void PicoWriteS68k16(u32 a,u16 d)
   // 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
+      dprintf("s68k_wram1M w16: [%06x] %04x @%06x", a, d, SekPcS68k);\r
     a=((a&0x1fffe)<<1);\r
     if (!(Pico_mcd->s68k_regs[3]&1)) a+=2;\r
     *(u16 *)(Pico_mcd->word_ram+a)=d;\r
@@ -1178,7 +1184,7 @@ void PicoWriteS68k16(u32 a,u16 d)
 \r
   // bram\r
   if ((a&0xff0000)==0xfe0000) {\r
-    dprintf("s68k_bram w16: [%06x] %04x @%06x", a, d, SekPc);\r
+    dprintf("s68k_bram w16: [%06x] %04x @%06x", a, d, SekPcS68k);\r
     a = (a>>1)&0x1fff;\r
     Pico_mcd->bram[a++] = d;           // Gens does little endian here, an so do we..\r
     Pico_mcd->bram[a++] = d >> 8;\r
@@ -1223,7 +1229,7 @@ void PicoWriteS68k32(u32 a,u32 d)
 \r
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
-    dprintf("s68k_wram2M w32: [%06x] %08x @%06x", a, d, SekPc);\r
+    dprintf("s68k_wram2M w32: [%06x] %08x @%06x", a, d, SekPcS68k);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
       // TODO (decode)\r
       dprintf("(decode)");\r
@@ -1238,7 +1244,7 @@ void PicoWriteS68k32(u32 a,u32 d)
   // 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
+      dprintf("s68k_wram1M w32: [%06x] %08x @%06x", a, d, SekPcS68k);\r
     a=((a&0x1fffe)<<1);\r
     if (!(Pico_mcd->s68k_regs[3]&1)) a+=2;\r
     *(u16 *)(Pico_mcd->word_ram+a) = d>>16;\r
@@ -1263,7 +1269,7 @@ void PicoWriteS68k32(u32 a,u32 d)
 \r
   // bram\r
   if ((a&0xff0000)==0xfe0000) {\r
-    dprintf("s68k_bram w32: [%06x] %08x @%06x", a, d, SekPc);\r
+    dprintf("s68k_bram w32: [%06x] %08x @%06x", a, d, SekPcS68k);\r
     a = (a>>1)&0x1fff;\r
     Pico_mcd->bram[a++] = d >> 16;             // middle endian? verify?\r
     Pico_mcd->bram[a++] = d >> 24;\r