mcd, fix MD+ playing binary track as audio
authorkub <derkub@gmail.com>
Sat, 25 Jan 2025 18:58:47 +0000 (19:58 +0100)
committerkub <derkub@gmail.com>
Sat, 25 Jan 2025 18:58:47 +0000 (19:58 +0100)
pico/cd/cdd.c
pico/cd/megasd.c
pico/cd/memory.c

index 806bb2d..2e95a89 100644 (file)
@@ -188,6 +188,7 @@ void cdd_play_audio(int index, int lba)
   for (i = index; i >= 0; i--)
     if (cdd.toc.tracks[i].fd != NULL)
       break;
+  if (! is_audio(i)) return;
 
   Pico_mcd->cdda_stream = cdd.toc.tracks[i].fd;
   base = cdd.toc.tracks[index].offset;
index f0228a4..98e2dcb 100644 (file)
@@ -192,20 +192,20 @@ void msd_reset(void)
 static u32 msd_read16(u32 a)
 {
   u16 d = 0;
+  u16 a16 = a;
 
-  a = (u16)a;
-  if (a >= 0x0f800) {
+  if (a16 >= 0x0f800) {
     d = Pico_msd.data[(a&0x7ff)>>1];
-  } else if (a >= 0xf7f6) {
-    switch (a&0xe) {
+  } else if (a16 >= 0xf7f6) {
+    switch (a16&0xe) {
       case 0x6: d = 0x5241; break; // RA
       case 0x8: d = 0x5445; break; // TE
       case 0xa: d = 0xcd54; break;
       case 0xc: d = Pico_msd.result; break;
       case 0xe: d = Pico_msd.command; break;
     }
-  } else if (Pico.romsize > 0x30000)
-    d = *(u16 *)(Pico.rom + 0x30000 + a);
+  } else if (Pico.romsize > a)
+    d = *(u16 *)(Pico.rom + a);
 
   return d;
 }
@@ -236,6 +236,9 @@ void msd_write16(u32 a, u32 d)
     } else if (Pico.romsize > base) {
       cpu68k_map_set(m68k_read8_map,  base, 0x03ffff, Pico.rom+base, 0);
       cpu68k_map_set(m68k_read16_map, base, 0x03ffff, Pico.rom+base, 0);
+      base += 0x800000; // mirror
+      cpu68k_map_set(m68k_read8_map,  base, 0x0bffff, Pico.rom+base, 0);
+      cpu68k_map_set(m68k_read16_map, base, 0x0bffff, Pico.rom+base, 0);
     }
   } else if (a == 0xf7fe) {
     // command port
index 7b9452f..b383890 100644 (file)
@@ -674,7 +674,7 @@ static u32 PicoReadM68k8_ramc(u32 a)
 {\r
   u32 d = 0;\r
 \r
-  if (PicoIn.opt & POPT_EN_MCD_RAMCART) {\r
+  if (Pico.romsize == 0 && (PicoIn.opt & POPT_EN_MCD_RAMCART)) {\r
     if ((a & 0xf00001) == 0x400001) {\r
       if (Pico.sv.data != NULL)\r
         d = 3; // 64k cart\r
@@ -703,7 +703,7 @@ static u32 PicoReadM68k16_ramc(u32 a)
 \r
 static void PicoWriteM68k8_ramc(u32 a, u32 d)\r
 {\r
-  if (PicoIn.opt & POPT_EN_MCD_RAMCART) {\r
+  if (Pico.romsize == 0 && (PicoIn.opt & POPT_EN_MCD_RAMCART)) {\r
     if ((a & 0xf00001) == 0x600001) {\r
       if (Pico.sv.data != NULL && (Pico_mcd->m.bcram_reg & 1)) {\r
         Pico.sv.data[((a >> 1) & 0xffff) + 0x2000] = d;\r