Pico_msd.currentlba = lba;
 
   cdd_play_audio(Pico_msd.index, Pico_msd.currentlba);
-  Pico_msd.state = 3;
+  Pico_msd.state |= MSD_ST_PLAY;
 }
 
 static void cdd_pause(void)
 {
-  Pico_msd.state |= 4;
+  Pico_msd.state |= MSD_ST_PAUSE;
 }
 
 static void cdd_resume(void)
 {
-  Pico_msd.state &= ~4;
+  Pico_msd.state &= ~MSD_ST_PAUSE;
 }
 
 static void cdd_stop(void)
 {
   Pico_msd.index = -1;
-  Pico_msd.state &= ~6;
+  Pico_msd.state &= ~(MSD_ST_PAUSE | MSD_ST_PLAY);
 }
 
 // play a track, looping from offset if enabled
 void msd_update()
 {
   if (Pico_msd.state && Pico_msd.index >= 0) {
-    // CD LEDs
-
-    if (Pico_msd.state & 2) {
-      s68k_write8(0xff8000, 0x3);
+    if (Pico_msd.state & MSD_ST_PLAY) {
       Pico_msd.command = 0;
-      if (!(Pico_msd.state & 4))
+      if (!(Pico_msd.state & MSD_ST_PAUSE))
         Pico_msd.currentlba ++;
       if (Pico_msd.currentlba >= Pico_msd.endlba-1) {
         if (!Pico_msd.loop || Pico_msd.index < 0) {
-          Pico_msd.state = 1;
+          Pico_msd.state &= MSD_ST_INIT;
           // audio done
           Pico_msd.index = -1;
-          s68k_write8(0xff8000, 0x2);
         } else
           cdd_play(Pico_msd.looplba);
       }
   case 0x14: cdd_resume();
              Pico_msd.command = 0; break;
 
-  case 0x16: Pico_msd.result = !!(Pico_msd.state & 2) << 8;
+  case 0x16: Pico_msd.result = !!(Pico_msd.state & MSD_ST_PLAY) << 8;
              Pico_msd.command = 0; break;
 
   case 0x27: Pico_msd.result = cdd.toc.last << 8;
 // initialize MEGASD
 static void msd_init(void)
 {
-  if (!(Pico_msd.state & 1)) {
-    Pico_msd.state = 1;
+  if (!(Pico_msd.state & MSD_ST_INIT)) {
+    Pico_msd.state = MSD_ST_INIT;
     Pico_msd.index = -1;
 
-    // CD LEDs
-    s68k_write8(0xff8000, 0x2);
-
     PicoResetHook = msd_reset;
   }
 }
 void msd_reset(void)
 {
   if (Pico_msd.state) {
-    Pico_msd.state = Pico_msd.command = 0;
+    Pico_msd.state = Pico_msd.command = Pico_msd.result = 0;
     cdd_stop();
 
-    s68k_write8(0xff8000, 0x0);
-
     PicoResetHook = NULL;
   }
 }
 {
   u16 d = 0;
 
-  if ((u16)a >= 0x0f800) {
+  a = (u16)a;
+  if (a >= 0x0f800) {
     d = Pico_msd.data[(a&0x7ff)>>1];
-  } else if ((u16)a >= 0xf7f0) {
+  } else if (a >= 0xf7f6) {
     switch (a&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 (a < Pico.romsize)
-    d = *(u16 *)(Pico.rom + a);
+  } else if (Pico.romsize > 0x30000)
+    d = *(u16 *)(Pico.rom + 0x30000 + a);
 
   return d;
 }
 
 static u32 msd_read8(u32 a)
 {
-  u16 d = msd_read16(a);
+  u16 d = msd_read16(a&~1);
 
   if (!(a&1)) d >>= 8;
-  return d;
+  return (u8)d;
 }
 
 void msd_write16(u32 a, u32 d)
       base += 0x800000; // mirror
       cpu68k_map_set(m68k_read8_map,  base, 0x0bffff, msd_read8, 1);
       cpu68k_map_set(m68k_read16_map, base, 0x0bffff, msd_read16, 1);
+      if (Pico.romsize > base)
+        memcpy(Pico_msd.data, Pico.rom + 0x3f800, 0x800);
     } 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);
     }
   } else if (a == 0xf7fe) {
     // command port
-    msd_process(d);
+    if (Pico_msd.state & MSD_ST_INIT)
+      msd_process(d);
   } else if (a >= 0xf800) {
     // data area
-    Pico_msd.data[(a&0x7ff) >> 1] = d;
+    if (Pico_msd.state & MSD_ST_INIT)
+      Pico_msd.data[(a&0x7ff) >> 1] = d;
   }
 }
 
 {
   if ((u16)a >= 0xf800) {
     // data area
-    ((u8 *)Pico_msd.data)[MEM_BE2(a&0x7ff)] = d;
+    if (Pico_msd.state & MSD_ST_INIT)
+      ((u8 *)Pico_msd.data)[MEM_BE2(a&0x7ff)] = d;
   }
 }
 
   cpu68k_map_set(m68k_read16_map,  BASE, BASE+0x01ffff, Pico_mcd->bios, 0);\r
   if (pcd_base_address != 0) { // cartridge (for MSU/MD+)\r
     // MD+ on MEGASD plus mirror\r
-    cpu68k_map_set(m68k_write8_map,  0x040000-(1<<M68K_MEM_SHIFT), 0x03ffff, msd_write8, 1);\r
-    cpu68k_map_set(m68k_write16_map, 0x040000-(1<<M68K_MEM_SHIFT), 0x03ffff, msd_write16, 1);\r
-    cpu68k_map_set(m68k_write8_map,  0x0c0000-(1<<M68K_MEM_SHIFT), 0x0bffff, msd_write8, 1);\r
-    cpu68k_map_set(m68k_write16_map, 0x0c0000-(1<<M68K_MEM_SHIFT), 0x0bffff, msd_write16, 1);\r
+    u32 base = 0x040000-(1<<M68K_MEM_SHIFT);\r
+    cpu68k_map_set(m68k_write8_map,  base, 0x03ffff, msd_write8, 1);\r
+    cpu68k_map_set(m68k_write16_map, base, 0x03ffff, msd_write16, 1);\r
+    cpu68k_map_set(m68k_write8_map,  base+0x080000, 0x0bffff, msd_write8, 1);\r
+    cpu68k_map_set(m68k_write16_map, base+0x080000, 0x0bffff, msd_write16, 1);\r
     msd_reset();\r
   } else { // no cartridge\r
     // RAM cart\r
 
 u32 PicoRead16_floating(u32 a)\r
 {\r
   // faking open bus\r
-  u32 d = (Pico.m.rotate += 0x41);\r
+  u16 d = (Pico.m.rotate += 0x41);\r
   d ^= (d << 5) ^ (d << 8);\r
   if ((a & 0xff0000) == 0xa10000) return d; // MegaCD pulldowns don't work here curiously\r
   return (PicoIn.AHW & PAHW_MCD) ? 0x00 : d; // pulldown if MegaCD2 attached\r
     goto end;\r
   }\r
 \r
-  d = PicoRead16_floating(a);\r
-\r
   if ((a & 0xfc00) == 0x1000) {\r
+    d = (u8)PicoRead16_floating(a);\r
+\r
     if ((a & 0xff01) == 0x1100) { // z80 busreq (verified)\r
       // bit8 seems to be readable in this range\r
       if (!(a & 1)) {\r
     goto end;\r
   }\r
 \r
-  d = PicoRead16_floating(a);\r
-\r
   // bit8 seems to be readable in this range\r
   if ((a & 0xfc00) == 0x1000) {\r
+    d = PicoRead16_floating(a);\r
+\r
     if ((a & 0xff00) == 0x1100) { // z80 busreq\r
       d &= ~0x0100;\r
       d |= (z80_cycles_from_68k() < Pico.t.z80c_cnt) << 8;\r