Cyclone interface for new mem system, minor tweaks
[picodrive.git] / pico / memory.c
index 6bb79d5..11de641 100644 (file)
@@ -160,57 +160,15 @@ void log_io(unsigned int addr, int bits, int rw);
 #endif\r
 \r
 #if defined(EMU_C68K)\r
-static __inline int PicoMemBase(u32 pc)\r
+void cyclone_crashed(u32 pc, struct Cyclone *context)\r
 {\r
-  int membase=0;\r
-\r
-  if (pc<Pico.romsize+4)\r
-  {\r
-    membase=(int)Pico.rom; // Program Counter in Rom\r
-  }\r
-  else if ((pc&0xe00000)==0xe00000)\r
-  {\r
-    membase=(int)Pico.ram-(pc&0xff0000); // Program Counter in Ram\r
-  }\r
-  else\r
-  {\r
-    // Error - Program Counter is invalid\r
-    membase=(int)Pico.rom;\r
-  }\r
-\r
-  return membase;\r
+    elprintf(EL_STATUS|EL_ANOMALY, "%c68k crash detected @ %06x\n",\r
+      context == &PicoCpuCM68k ? 'm' : 's', pc);\r
+    context->membase = (u32)Pico.rom;\r
+    context->pc = (u32)Pico.rom + Pico.romsize;\r
 }\r
 #endif\r
 \r
-\r
-PICO_INTERNAL u32 PicoCheckPc(u32 pc)\r
-{\r
-  u32 ret=0;\r
-#if defined(EMU_C68K)\r
-  pc-=PicoCpuCM68k.membase; // Get real pc\r
-//  pc&=0xfffffe;\r
-  pc&=~1;\r
-  if ((pc<<8) == 0)\r
-  {\r
-    elprintf(EL_STATUS|EL_ANOMALY, "%i:%03i: game crash detected @ %06x\n",\r
-      Pico.m.frame_count, Pico.m.scanline, SekPc);\r
-    return (int)Pico.rom + Pico.romsize; // common crash condition, may happen with bad ROMs\r
-  }\r
-\r
-  PicoCpuCM68k.membase=PicoMemBase(pc&0x00ffffff);\r
-  PicoCpuCM68k.membase-=pc&0xff000000;\r
-\r
-  ret = PicoCpuCM68k.membase+pc;\r
-#endif\r
-  return ret;\r
-}\r
-\r
-\r
-PICO_INTERNAL void PicoInitPc(u32 pc)\r
-{\r
-  PicoCheckPc(pc);\r
-}\r
-\r
 // -----------------------------------------------------------------\r
 // memmap helpers\r
 \r
@@ -259,7 +217,7 @@ static u32 io_ports_read(u32 a)
   return d;\r
 }\r
 \r
-static void io_ports_write(u32 a, u32 d)\r
+static void NOINLINE io_ports_write(u32 a, u32 d)\r
 {\r
   a = (a>>1) & 0xf;\r
 \r
@@ -271,11 +229,11 @@ static void io_ports_write(u32 a, u32 d)
       Pico.m.padTHPhase[a - 1]++;\r
   }\r
 \r
-  // cartain IO ports can be used as RAM\r
+  // certain IO ports can be used as RAM\r
   Pico.ioports[a] = d;\r
 }\r
 \r
-static void ctl_write_z80busreq(u32 d)\r
+static void NOINLINE ctl_write_z80busreq(u32 d)\r
 {\r
   d&=1; d^=1;\r
   elprintf(EL_BUSREQ, "set_zrun: %i->%i [%i] @%06x", Pico.m.z80Run, d, SekCyclesDone(), SekPc);\r
@@ -295,7 +253,7 @@ static void ctl_write_z80busreq(u32 d)
   }\r
 }\r
 \r
-static void ctl_write_z80reset(u32 d)\r
+static void NOINLINE ctl_write_z80reset(u32 d)\r
 {\r
   d&=1; d^=1;\r
   elprintf(EL_BUSREQ, "set_zreset: %i->%i [%i] @%06x", Pico.m.z80_reset, d, SekCyclesDone(), SekPc);\r
@@ -491,13 +449,15 @@ u32 PicoRead8_io(u32 a)
   d = Pico.m.rotate++;\r
   d ^= d << 6;\r
 \r
-  // bit8 seems to be readable in this range\r
-  if ((a & 0xfc01) == 0x1000)\r
-    d &= ~0x01;\r
+  if ((a & 0xfc00) == 0x1000) {\r
+    // bit8 seems to be readable in this range\r
+    if (!(a & 1))\r
+      d &= ~0x01;\r
 \r
-  if ((a & 0xff01) == 0x1100) { // z80 busreq (verified)\r
-    d |= (Pico.m.z80Run | Pico.m.z80_reset) & 1;\r
-    elprintf(EL_BUSREQ, "get_zrun: %02x [%i] @%06x", d, SekCyclesDone(), SekPc);\r
+    if ((a & 0xff01) == 0x1100) { // z80 busreq (verified)\r
+      d |= (Pico.m.z80Run | Pico.m.z80_reset) & 1;\r
+      elprintf(EL_BUSREQ, "get_zrun: %02x [%i] @%06x", d, SekCyclesDone(), SekPc);\r
+    }\r
     goto end;\r
   }\r
 \r
@@ -526,12 +486,13 @@ u32 PicoRead16_io(u32 a)
   d ^= (d << 5) ^ (d << 8);\r
 \r
   // bit8 seems to be readable in this range\r
-  if ((a & 0xfc00) == 0x1000)\r
+  if ((a & 0xfc00) == 0x1000) {\r
     d &= ~0x0100;\r
 \r
-  if ((a & 0xff00) == 0x1100) { // z80 busreq\r
-    d |= ((Pico.m.z80Run | Pico.m.z80_reset) & 1) << 8;\r
-    elprintf(EL_BUSREQ, "get_zrun: %04x [%i] @%06x", d, SekCyclesDone(), SekPc);\r
+    if ((a & 0xff00) == 0x1100) { // z80 busreq\r
+      d |= ((Pico.m.z80Run | Pico.m.z80_reset) & 1) << 8;\r
+      elprintf(EL_BUSREQ, "get_zrun: %04x [%i] @%06x", d, SekCyclesDone(), SekPc);\r
+    }\r
     goto end;\r
   }\r
 \r
@@ -718,13 +679,16 @@ PICO_INTERNAL void PicoMemSetup(void)
 \r
   // Setup memory callbacks:\r
 #ifdef EMU_C68K\r
-  PicoCpuCM68k.checkpc = PicoCheckPc;\r
-  PicoCpuCM68k.fetch8  = PicoCpuCM68k.read8  = m68k_read8;\r
-  PicoCpuCM68k.fetch16 = PicoCpuCM68k.read16 = m68k_read16;\r
-  PicoCpuCM68k.fetch32 = PicoCpuCM68k.read32 = m68k_read32;\r
-  PicoCpuCM68k.write8  = m68k_write8;\r
-  PicoCpuCM68k.write16 = m68k_write16;\r
-  PicoCpuCM68k.write32 = m68k_write32;\r
+  PicoCpuCM68k.read8  = (void *)m68k_read8_map;\r
+  PicoCpuCM68k.read16 = (void *)m68k_read16_map;\r
+  PicoCpuCM68k.read32 = (void *)m68k_read16_map;\r
+  PicoCpuCM68k.write8  = (void *)m68k_write8_map;\r
+  PicoCpuCM68k.write16 = (void *)m68k_write16_map;\r
+  PicoCpuCM68k.write32 = (void *)m68k_write16_map;\r
+  PicoCpuCM68k.checkpc = NULL; /* unused */\r
+  PicoCpuCM68k.fetch8  = NULL;\r
+  PicoCpuCM68k.fetch16 = NULL;\r
+  PicoCpuCM68k.fetch32 = NULL;\r
 #endif\r
 #ifdef EMU_F68K\r
   PicoCpuFM68k.read_byte  = m68k_read8;\r