core, floating bus read for 68k in some more places
authorkub <derkub@gmail.com>
Sat, 16 Mar 2024 14:58:38 +0000 (15:58 +0100)
committerkub <derkub@gmail.com>
Sat, 16 Mar 2024 14:58:47 +0000 (15:58 +0100)
pico/memory.c
pico/pico_int.h
pico/videoport.c

index bedcc1d..1bd230d 100644 (file)
@@ -199,16 +199,25 @@ void cpu68k_map_all_funcs(u32 start_addr, u32 end_addr, u32 (*r8)(u32), u32 (*r1
     r8map[i] = ar8, r16map[i] = ar16, w8map[i] = aw8, w16map[i] = aw16;\r
 }\r
 \r
+u32 PicoRead16_floating(u32 a)\r
+{\r
+  // faking open bus\r
+  u32 d = (Pico.m.rotate += 0x41);\r
+  d ^= (d << 5) ^ (d << 8);\r
+  if ((a & 0xff0000) == 0xa10000) d = 0; // MegaCD pulldowns don't work here curiously\r
+  return (PicoIn.AHW & PAHW_MCD) ? 0x00 : d; // pulldown if MegaCD2 attached\r
+}\r
+\r
 static u32 m68k_unmapped_read8(u32 a)\r
 {\r
   elprintf(EL_UIO, "m68k unmapped r8  [%06x] @%06x", a, SekPc);\r
-  return (PicoIn.AHW & PAHW_MCD) ? 0x00 : 0xff; // pulldown if MegaCD2 attached\r
+  return (u8)PicoRead16_floating(a);\r
 }\r
 \r
 static u32 m68k_unmapped_read16(u32 a)\r
 {\r
   elprintf(EL_UIO, "m68k unmapped r16 [%06x] @%06x", a, SekPc);\r
-  return (PicoIn.AHW & PAHW_MCD) ? 0x00 : 0xffff;\r
+  return PicoRead16_floating(a);\r
 }\r
 \r
 static void m68k_unmapped_write8(u32 a, u32 d)\r
@@ -680,12 +689,11 @@ static void PicoWrite16_sram(u32 a, u32 d)
 // TODO: verify mirrors VDP and bank reg (bank area mirroring verified)\r
 static u32 PicoRead8_z80(u32 a)\r
 {\r
-  u32 d = 0xff;\r
+  u32 d;\r
   if ((Pico.m.z80Run | Pico.m.z80_reset | (z80_cycles_from_68k() < Pico.t.z80c_cnt)) &&\r
       !(PicoIn.quirks & PQUIRK_NO_Z80_BUS_LOCK)) {\r
     elprintf(EL_ANOMALY, "68k z80 read with no bus! [%06x] @ %06x", a, SekPc);\r
-    // open bus. Pulled down if MegaCD2 is attached.\r
-    return (PicoIn.AHW & PAHW_MCD ? 0 : d);\r
+    return (u8)PicoRead16_floating(a);\r
   }\r
   SekCyclesBurnRun(1);\r
 \r
@@ -693,8 +701,10 @@ static u32 PicoRead8_z80(u32 a)
     d = PicoMem.zram[a & 0x1fff];\r
   } else if ((a & 0x6000) == 0x4000) // 0x4000-0x5fff\r
     d = ym2612_read_local_68k(); \r
-  else\r
+  else {\r
     elprintf(EL_UIO|EL_ANOMALY, "68k bad read [%06x] @%06x", a, SekPc);\r
+    d = (u8)PicoRead16_floating(a);\r
+  }\r
   return d;\r
 }\r
 \r
@@ -757,9 +767,7 @@ u32 PicoRead8_io(u32 a)
     goto end;\r
   }\r
 \r
-  // faking open bus (MegaCD pulldowns don't work here curiously)\r
-  d = Pico.m.rotate++;\r
-  d ^= d << 6;\r
+  d = PicoRead16_floating(a);\r
 \r
   if ((a & 0xfc00) == 0x1000) {\r
     if ((a & 0xff01) == 0x1100) { // z80 busreq (verified)\r
@@ -791,9 +799,7 @@ u32 PicoRead16_io(u32 a)
     goto end;\r
   }\r
 \r
-  // faking open bus\r
-  d = (Pico.m.rotate += 0x41);\r
-  d ^= (d << 5) ^ (d << 8);\r
+  d = PicoRead16_floating(a);\r
 \r
   // bit8 seems to be readable in this range\r
   if ((a & 0xfc00) == 0x1000) {\r
@@ -864,7 +870,7 @@ void PicoWrite16_io(u32 a, u32 d)
 // TODO: verify if lower byte goes to PSG on word writes\r
 u32 PicoRead8_vdp(u32 a)\r
 {\r
-  u32 d = 0;\r
+  u32 d;\r
   if ((a & 0x00f0) == 0x0000) {\r
     switch (a & 0x0d)\r
     {\r
@@ -876,9 +882,12 @@ u32 PicoRead8_vdp(u32 a)
       case 0x0c: d = PicoVideoRead8HV_H(0); break;\r
       case 0x09:\r
       case 0x0d: d = PicoVideoRead8HV_L(0); break;\r
+      default:   d = (u8)PicoRead16_floating(a); break;\r
     }\r
-  } else\r
+  } else {\r
     elprintf(EL_UIO|EL_ANOMALY, "68k bad read [%06x] @%06x", a, SekPc);\r
+    d = (u8)PicoRead16_floating(a);\r
+  }\r
   return d;\r
 }\r
 \r
index 5535e14..31802f4 100644 (file)
@@ -740,6 +740,7 @@ void PicoDrawSetOutputSMS(pdso_t which);
 \r
 // memory.c\r
 PICO_INTERNAL void PicoMemSetup(void);\r
+PICO_INTERNAL u32 PicoRead16_floating(u32 a);\r
 u32 PicoRead8_io(u32 a);\r
 u32 PicoRead16_io(u32 a);\r
 void PicoWrite8_io(u32 a, u32 d);\r
index 73c90ed..d4a986f 100644 (file)
@@ -1087,7 +1087,7 @@ PICO_INTERNAL_ASM u32 PicoVideoRead(u32 a)
     return d;\r
   }\r
 \r
-  if ((a&0x1c)==0x08)\r
+  if (a == 0x08)\r
   {\r
     unsigned int c;\r
     u32 d;\r
@@ -1106,7 +1106,7 @@ PICO_INTERNAL_ASM u32 PicoVideoRead(u32 a)
     return VideoRead(0);\r
   }\r
 \r
-  return 0;\r
+  return PicoRead16_floating(a | 0xc00000);\r
 }\r
 \r
 unsigned char PicoVideoRead8DataH(int is_from_z80)\r