mcd, some cleanup, fix Word-RAM in 2M mode
authorkub <derkub@gmail.com>
Wed, 10 May 2023 22:20:06 +0000 (22:20 +0000)
committerkub <derkub@gmail.com>
Wed, 10 May 2023 22:20:06 +0000 (22:20 +0000)
pico/cd/mcd.c
pico/cd/memory.c
pico/cd/memory_arm.S
pico/memory.c
pico/memory.h
pico/pico_cmn.c
pico/pico_int.h

index abe3c4a..1ae5f25 100644 (file)
@@ -91,31 +91,6 @@ PICO_INTERNAL int PicoResetMCD(void)
   return 0;
 }
 
-static void SekRunM68kOnce(void)
-{
-  int cyc_do;
-  pevt_log_m68k_o(EVT_RUN_START);
-
-  if ((cyc_do = Pico.t.m68c_aim - Pico.t.m68c_cnt) > 0) {
-    Pico.t.m68c_cnt += cyc_do;
-
-#if defined(EMU_C68K)
-    PicoCpuCM68k.cycles = cyc_do;
-    CycloneRun(&PicoCpuCM68k);
-    Pico.t.m68c_cnt -= PicoCpuCM68k.cycles;
-#elif defined(EMU_M68K)
-    Pico.t.m68c_cnt += m68k_execute(cyc_do) - cyc_do;
-#elif defined(EMU_F68K)
-    Pico.t.m68c_cnt += fm68k_emulate(&PicoCpuFM68k, cyc_do, 0) - cyc_do;
-#endif
-  }
-
-  SekCyclesLeft = 0;
-
-  SekTrace(0);
-  pevt_log_m68k_o(EVT_RUN_END);
-}
-
 static void SekRunS68k(unsigned int to)
 {
   int cyc_do;
@@ -281,8 +256,7 @@ void pcd_irq_s68k(int irq, int state)
 {
   if (state) {
     SekInterruptS68k(irq);
-    if (SekIsStoppedS68k())
-      SekSetStopS68k(0);
+    Pico_mcd->m.state_flags &= ~(PCD_ST_S68K_POLL|PCD_ST_S68K_SLEEP);
     Pico_mcd->m.s68k_poll_cnt = 0;
   } else
     SekInterruptClearS68k(irq);
@@ -315,7 +289,7 @@ int pcd_sync_s68k(unsigned int m68k_target, int m68k_poll_sync)
     if (event_time_next && CYCLES_GT(target, event_time_next))
       target = event_time_next;
 
-    if (SekIsStoppedS68k())
+    if (Pico_mcd->m.state_flags & (PCD_ST_S68K_POLL|PCD_ST_S68K_SLEEP))
       SekCycleCntS68k = SekCycleAimS68k = target;
     else
       SekRunS68k(target);
@@ -331,40 +305,42 @@ int pcd_sync_s68k(unsigned int m68k_target, int m68k_poll_sync)
 #define pcd_run_cpus_normal pcd_run_cpus
 //#define pcd_run_cpus_lockstep pcd_run_cpus
 
-static void SekSyncM68k(void);
+static int SekSyncM68k(int once);
 
 void pcd_run_cpus_normal(int m68k_cycles)
 {
   Pico.t.m68c_aim += m68k_cycles;
 
   while (CYCLES_GT(Pico.t.m68c_aim, Pico.t.m68c_cnt)) {
-    if (SekShouldInterrupt())
+    if (SekShouldInterrupt()) {
+      Pico_mcd->m.state_flags &= ~PCD_ST_M68K_POLL;
       Pico_mcd->m.m68k_poll_cnt = 0;
+    }
 
 #ifdef USE_POLL_DETECT
-    if (Pico_mcd->m.m68k_poll_cnt >= 16) {
+    if (Pico_mcd->m.state_flags & (PCD_ST_M68K_POLL|PCD_ST_M68K_SLEEP)) {
       int s68k_left;
       // main CPU is polling, (wake and) run sub only
-      if (SekIsStoppedS68k()) {
-        SekSetStopS68k(0);
-        Pico_mcd->m.s68k_poll_cnt = 0;
-      }
+      Pico_mcd->m.state_flags &= ~(PCD_ST_S68K_POLL|PCD_ST_S68K_SLEEP);
+      Pico_mcd->m.s68k_poll_cnt = 0;
       s68k_left = pcd_sync_s68k(Pico.t.m68c_aim, 1);
 
       Pico.t.m68c_cnt = Pico.t.m68c_aim;
       if (s68k_left > 0)
         Pico.t.m68c_cnt -= ((long long)s68k_left * mcd_s68k_cycle_mult >> 16);
-      if (SekIsStoppedS68k()) {
+      if (Pico_mcd->m.state_flags & (PCD_ST_S68K_POLL|PCD_ST_S68K_SLEEP)) {
         // slave has stopped, wake master to avoid lockups
+        Pico_mcd->m.state_flags &= ~(PCD_ST_M68K_POLL|PCD_ST_M68K_SLEEP);
         Pico_mcd->m.m68k_poll_cnt = 0;
       }
+
       elprintf(EL_CDPOLL, "m68k poll [%02x] x%d @%06x",
         Pico_mcd->m.m68k_poll_a, Pico_mcd->m.m68k_poll_cnt, SekPc);
     } else
 #endif
-      SekRunM68kOnce();
-    if (Pico_mcd->m.need_sync) {
-      Pico_mcd->m.need_sync = 0;
+      SekSyncM68k(1);
+    if (Pico_mcd->m.state_flags & PCD_ST_S68K_SYNC) {
+      Pico_mcd->m.state_flags &= ~PCD_ST_S68K_SYNC;
       pcd_sync_s68k(Pico.t.m68c_cnt, 0);
     }
   }
@@ -375,7 +351,7 @@ void pcd_run_cpus_lockstep(int m68k_cycles)
   unsigned int target = Pico.t.m68c_aim + m68k_cycles;
   do {
     Pico.t.m68c_aim += 8;
-    SekSyncM68k();
+    SekSyncM68k(0);
     pcd_sync_s68k(Pico.t.m68c_aim, 0);
   } while (CYCLES_GT(target, Pico.t.m68c_aim));
 
@@ -438,6 +414,11 @@ void pcd_state_loaded(void)
   if ((unsigned int)diff > 12500000/50)
     Pico_mcd->pcm.update_cycles = cycles;
 
+  if (Pico_mcd->m.need_sync) {
+    Pico_mcd->m.state_flags |= PCD_ST_S68K_SYNC;
+    Pico_mcd->m.need_sync = 0;
+  }
+
   // reschedule
   event_time_next = 0;
   pcd_run_events(SekCycleCntS68k);
index 72dadfe..ae76451 100644 (file)
@@ -71,11 +71,11 @@ void m68k_comm_check(u32 a)
   u32 cycles = SekCyclesDone();\r
   u32 clkdiff = cycles - Pico_mcd->m.m68k_poll_clk;\r
   pcd_sync_s68k(cycles, 0);\r
-  if (a == 0x0e && !Pico_mcd->m.need_sync && (Pico_mcd->s68k_regs[3]&0x4)) {\r
+  if (a == 0x0e && !(Pico_mcd->m.state_flags & PCD_ST_S68K_SYNC) && (Pico_mcd->s68k_regs[3]&0x4)) {\r
     // there are cases when slave updates comm and only switches RAM\r
     // over after that (mcd1 bios), so there must be a resync..\r
     SekEndRun(64);\r
-    Pico_mcd->m.need_sync = 1;\r
+    Pico_mcd->m.state_flags |= PCD_ST_S68K_SYNC;\r
   }\r
   Pico_mcd->m.m68k_poll_clk = cycles;\r
   if (SekNotPolling || a != Pico_mcd->m.m68k_poll_a || clkdiff > POLL_CYCLES || clkdiff <= 16) {\r
@@ -85,8 +85,11 @@ void m68k_comm_check(u32 a)
     return;\r
   }\r
   Pico_mcd->m.m68k_poll_cnt++;\r
-  if(Pico_mcd->m.m68k_poll_cnt >= POLL_LIMIT)\r
+  Pico_mcd->m.state_flags &= ~PCD_ST_M68K_POLL;\r
+  if (Pico_mcd->m.m68k_poll_cnt >= POLL_LIMIT) {\r
+    Pico_mcd->m.state_flags |= PCD_ST_M68K_POLL;\r
     SekEndRun(8);\r
+  }\r
 }\r
 \r
 #ifndef _ASM_CD_MEMORY_C\r
@@ -149,6 +152,7 @@ void m68k_reg_write8(u32 a, u32 d)
   u32 dold;\r
   a &= 0x3f;\r
 \r
+  Pico_mcd->m.state_flags &= ~PCD_ST_M68K_POLL;\r
   Pico_mcd->m.m68k_poll_cnt = 0;\r
 \r
   switch (a) {\r
@@ -208,6 +212,8 @@ void m68k_reg_write8(u32 a, u32 d)
       }\r
       else\r
         d = (d & 0xc0) | (dold & 0x1c) | Pico_mcd->m.dmna_ret_2m;\r
+      if ((dold ^ d) & 0x1f)\r
+        remap_word_ram(d);\r
 \r
       goto write_comm;\r
     case 6:\r
@@ -243,12 +249,10 @@ write_comm:
     // Delay slave a bit to make sure master can check before slave changes.\r
     SekCycleCntS68k += 24; // Silpheed\r
   }\r
-  if (Pico_mcd->m.s68k_poll_a == (a & ~1))\r
-  {\r
-    if (SekIsStoppedS68k()) {\r
+  if ((Pico_mcd->m.s68k_poll_a ^ a) & ~1) {\r
+    if (Pico_mcd->m.state_flags & PCD_ST_S68K_POLL)\r
       elprintf(EL_CDPOLL, "s68k poll release, a=%02x", a);\r
-      SekSetStopS68k(0);\r
-    }\r
+    Pico_mcd->m.state_flags &= ~PCD_ST_S68K_POLL;\r
     Pico_mcd->m.s68k_poll_cnt = 0;\r
   }\r
 }\r
@@ -257,7 +261,7 @@ u32 s68k_poll_detect(u32 a, u32 d)
 {\r
 #ifdef USE_POLL_DETECT\r
   u32 cycles, cnt = 0;\r
-  if (SekIsStoppedS68k())\r
+  if (Pico_mcd->m.state_flags & (PCD_ST_S68K_POLL|PCD_ST_S68K_SLEEP))\r
     return d;\r
   SekEndRunS68k(8);\r
 \r
@@ -267,8 +271,9 @@ u32 s68k_poll_detect(u32 a, u32 d)
     if (clkdiff <= POLL_CYCLES) {\r
       cnt = Pico_mcd->m.s68k_poll_cnt + 1;\r
       //printf("-- diff: %u, cnt = %i\n", clkdiff, cnt);\r
+      Pico_mcd->m.state_flags &= ~PCD_ST_S68K_POLL;\r
       if (cnt > POLL_LIMIT) {\r
-        SekSetStopS68k(1);\r
+        Pico_mcd->m.state_flags |= PCD_ST_S68K_POLL;\r
         elprintf(EL_CDPOLL, "s68k poll detected @%06x, a=%02x",\r
           SekPcS68k, a);\r
       }\r
@@ -376,9 +381,6 @@ void s68k_reg_write8(u32 a, u32 d)
           wram_2M_to_1M(Pico_mcd->word_ram2M);\r
         }\r
 \r
-        if ((d ^ dold) & 0x1d)\r
-          remap_word_ram(d);\r
-\r
         if ((d ^ dold) & 0x05)\r
           d &= ~2; // clear DMNA - swap complete\r
       }\r
@@ -387,10 +389,11 @@ void s68k_reg_write8(u32 a, u32 d)
         if (dold & 4) {\r
           elprintf(EL_CDREG3, "wram mode 1M->2M");\r
           wram_1M_to_2M(Pico_mcd->word_ram2M);\r
-          remap_word_ram(d);\r
         }\r
         d = (d & ~3) | Pico_mcd->m.dmna_ret_2m;\r
       }\r
+      if ((dold ^ d) & 0x1f)\r
+        remap_word_ram(d);\r
       goto write_comm;\r
     }\r
     case 4:\r
@@ -495,15 +498,18 @@ write_comm:
     return;\r
 \r
   Pico_mcd->s68k_regs[a] = (u8) d;\r
-  if (Pico_mcd->m.m68k_poll_cnt)\r
+  if ((Pico_mcd->m.m68k_poll_a ^ a) & ~1) {\r
     SekEndRunS68k(8);\r
-  Pico_mcd->m.m68k_poll_cnt = 0;\r
+    Pico_mcd->m.state_flags &= ~PCD_ST_M68K_POLL;\r
+    Pico_mcd->m.m68k_poll_cnt = 0;\r
+  }\r
 }\r
 \r
 void s68k_reg_write16(u32 a, u32 d)\r
 {\r
   u8 *r = Pico_mcd->s68k_regs;\r
 \r
+  Pico_mcd->m.state_flags &= ~PCD_ST_S68K_POLL;\r
   Pico_mcd->m.s68k_poll_cnt = 0;\r
 \r
   if ((a & 0x1f0) == 0x20)\r
@@ -559,9 +565,11 @@ write_comm:
 \r
   r[a] = d >> 8;\r
   r[a + 1] = d;\r
-  if (Pico_mcd->m.m68k_poll_cnt)\r
+  if ((Pico_mcd->m.m68k_poll_a ^ a) & ~1) {\r
     SekEndRunS68k(8);\r
-  Pico_mcd->m.m68k_poll_cnt = 0;\r
+    Pico_mcd->m.state_flags &= ~PCD_ST_M68K_POLL;\r
+    Pico_mcd->m.m68k_poll_cnt = 0;\r
+  }\r
 }\r
 \r
 // -----------------------------------------------------------------\r
@@ -1065,35 +1073,104 @@ static void remap_prg_window(u32 r1, u32 r3)
   }\r
 }\r
 \r
+// if main or sub CPU accesses Word-RAM while it is assigned to the other CPU\r
+// GA doesn't assert DTACK, which means the CPU is blocked until the Word_RAM\r
+// is reassigned to it (e.g. Mega Race).\r
+static u32 m68k_wordram_read8(u32 a)\r
+{\r
+  Pico_mcd->m.state_flags |= PCD_ST_M68K_SLEEP;\r
+  SekEndRun(0);\r
+  return Pico_mcd->word_ram2M[MEM_BE2(a) & 0x3ffff];\r
+}\r
+\r
+static u32 m68k_wordram_read16(u32 a)\r
+{\r
+  Pico_mcd->m.state_flags |= PCD_ST_M68K_SLEEP;\r
+  SekEndRun(0);\r
+  return ((u16 *)Pico_mcd->word_ram2M)[(a >> 1) & 0x1ffff];\r
+}\r
+\r
+static void m68k_wordram_write8(u32 a, u32 d)\r
+{\r
+  Pico_mcd->m.state_flags |= PCD_ST_M68K_SLEEP;\r
+  SekEndRun(0);\r
+  Pico_mcd->word_ram2M[MEM_BE2(a) & 0x3ffff] = d;\r
+}\r
+\r
+static void m68k_wordram_write16(u32 a, u32 d)\r
+{\r
+  Pico_mcd->m.state_flags |= PCD_ST_M68K_SLEEP;\r
+  SekEndRun(0);\r
+  ((u16 *)Pico_mcd->word_ram2M)[(a >> 1) & 0x1ffff] = d;\r
+}\r
+\r
+static u32 s68k_wordram_read8(u32 a)\r
+{\r
+  Pico_mcd->m.state_flags |= PCD_ST_S68K_SLEEP;\r
+  SekEndRunS68k(0);\r
+  return Pico_mcd->word_ram2M[MEM_BE2(a) & 0x3ffff];\r
+}\r
+\r
+static u32 s68k_wordram_read16(u32 a)\r
+{\r
+  Pico_mcd->m.state_flags |= PCD_ST_S68K_SLEEP;\r
+  SekEndRunS68k(0);\r
+  return ((u16 *)Pico_mcd->word_ram2M)[(a >> 1) & 0x1ffff];\r
+}\r
+\r
+static void s68k_wordram_write8(u32 a, u32 d)\r
+{\r
+  Pico_mcd->m.state_flags |= PCD_ST_S68K_SLEEP;\r
+  SekEndRunS68k(0);\r
+  Pico_mcd->word_ram2M[MEM_BE2(a) & 0x3ffff] = d;\r
+}\r
+\r
+static void s68k_wordram_write16(u32 a, u32 d)\r
+{\r
+  Pico_mcd->m.state_flags |= PCD_ST_S68K_SLEEP;\r
+  SekEndRunS68k(0);\r
+  ((u16 *)Pico_mcd->word_ram2M)[(a >> 1) & 0x1ffff] = d;\r
+}\r
+\r
 static void remap_word_ram(u32 r3)\r
 {\r
   void *bank;\r
 \r
   // WORD RAM\r
   if (!(r3 & 4)) {\r
-    // 2M mode. XXX: allowing access in all cases for simplicity\r
+    // 2M mode.\r
     bank = Pico_mcd->word_ram2M;\r
-    cpu68k_map_all_ram(0x200000, 0x23ffff, bank, 0);\r
-    cpu68k_map_all_ram(0x080000, 0x0bffff, bank, 1);\r
+    if (r3 & 1) {\r
+      Pico_mcd->m.state_flags &= ~PCD_ST_M68K_SLEEP;\r
+      cpu68k_map_all_ram(0x200000, 0x23ffff, bank, 0);\r
+      cpu68k_map_all_funcs(0x80000, 0xbffff,\r
+          s68k_wordram_read8, s68k_wordram_read16,\r
+          s68k_wordram_write8, s68k_wordram_write16, 1);\r
+    } else {\r
+      Pico_mcd->m.state_flags &= ~PCD_ST_S68K_SLEEP;\r
+      cpu68k_map_all_ram(0x080000, 0x0bffff, bank, 1);\r
+      cpu68k_map_all_funcs(0x200000, 0x23ffff,\r
+          m68k_wordram_read8, m68k_wordram_read16,\r
+          m68k_wordram_write8, m68k_wordram_write16, 0);\r
+    }\r
     // TODO: handle 0x0c0000\r
   }\r
   else {\r
     int b0 = r3 & 1;\r
     int m = (r3 & 0x18) >> 3;\r
+    Pico_mcd->m.state_flags &= ~(PCD_ST_M68K_SLEEP|PCD_ST_S68K_SLEEP);\r
     bank = Pico_mcd->word_ram1M[b0];\r
     cpu68k_map_all_ram(0x200000, 0x21ffff, bank, 0);\r
     bank = Pico_mcd->word_ram1M[b0 ^ 1];\r
     cpu68k_map_all_ram(0x0c0000, 0x0effff, bank, 1);\r
     // "cell arrange" on m68k\r
-    cpu68k_map_set(m68k_read8_map,   0x220000, 0x23ffff, m68k_cell_read8[b0], 1);\r
-    cpu68k_map_set(m68k_read16_map,  0x220000, 0x23ffff, m68k_cell_read16[b0], 1);\r
-    cpu68k_map_set(m68k_write8_map,  0x220000, 0x23ffff, m68k_cell_write8[b0], 1);\r
-    cpu68k_map_set(m68k_write16_map, 0x220000, 0x23ffff, m68k_cell_write16[b0], 1);\r
+    cpu68k_map_all_funcs(0x220000, 0x23ffff,\r
+        m68k_cell_read8[b0], m68k_cell_read16[b0],\r
+        m68k_cell_write8[b0], m68k_cell_write16[b0], 0);\r
     // "decode format" on s68k\r
-    cpu68k_map_set(s68k_read8_map,   0x080000, 0x0bffff, s68k_dec_read8[b0 ^ 1], 1);\r
-    cpu68k_map_set(s68k_read16_map,  0x080000, 0x0bffff, s68k_dec_read16[b0 ^ 1], 1);\r
-    cpu68k_map_set(s68k_write8_map,  0x080000, 0x0bffff, s68k_dec_write8[b0 ^ 1][m], 1);\r
-    cpu68k_map_set(s68k_write16_map, 0x080000, 0x0bffff, s68k_dec_write16[b0 ^ 1][m], 1);\r
+    cpu68k_map_all_funcs(0x80000, 0xbffff,\r
+        s68k_dec_read8[b0^1], s68k_dec_read16[b0^1],\r
+        s68k_dec_write8[b0^1][m], s68k_dec_write16[b0^1][m], 1);\r
   }\r
 }\r
 \r
index d3c2bb8..e4c314b 100644 (file)
@@ -181,6 +181,7 @@ m_m68k_read8_r02:
 m_m68k_read8_r03:
     add     r1, r1, #0x110000
     stmfd   sp!, {r1, lr}
+    bic     r0, r0, #1
     bl      m68k_comm_check
     ldmfd   sp!, {r1, lr}
     ldrb    r0, [r1, #3]
@@ -223,6 +224,7 @@ m_m68k_read8_hi:
     bxge    lr
     add     r1, r1, r0
     stmfd   sp!, {r1, lr}
+    bic     r0, r0, #1
     bl      m68k_comm_check
     ldmfd   sp!, {r1, lr}
     ldrb    r0, [r1]
@@ -378,10 +380,10 @@ m_m68k_write16_regs:
     beq     m_m68k_write16_regs_spec
     and     r3, r1, #0xff
     add     r2, r0, #1
-    stmfd   sp!,{r2,r3,lr}
+    stmfd   sp!,{r2,r3,r12,lr}
     mov     r1, r1, lsr #8
     bl      m68k_reg_write8
-    ldmfd   sp!,{r0,r1,lr}
+    ldmfd   sp!,{r0,r1,r12,lr}
     b       m68k_reg_write8
 
 m_m68k_write16_regs_spec:               @ special case
index e7c3d53..ebadaf1 100644 (file)
@@ -81,6 +81,38 @@ void cpu68k_map_set(uptr *map, u32 start_addr, u32 end_addr,
 }\r
 \r
 // more specialized/optimized function (does same as above)\r
+void cpu68k_map_read_mem(u32 start_addr, u32 end_addr, void *ptr, int is_sub)\r
+{\r
+  uptr *r8map, *r16map;\r
+  uptr addr = (uptr)ptr;\r
+  int shift = M68K_MEM_SHIFT;\r
+  int i;\r
+\r
+  if (!is_sub) {\r
+    r8map = m68k_read8_map;\r
+    r16map = m68k_read16_map;\r
+  } else {\r
+    r8map = s68k_read8_map;\r
+    r16map = s68k_read16_map;\r
+  }\r
+\r
+  addr -= start_addr;\r
+  addr >>= 1;\r
+  for (i = start_addr >> shift; i <= end_addr >> shift; i++)\r
+    r8map[i] = r16map[i] = addr;\r
+#ifdef EMU_F68K\r
+  // setup FAME fetchmap\r
+  {\r
+    M68K_CONTEXT *ctx = is_sub ? &PicoCpuFS68k : &PicoCpuFM68k;\r
+    int shiftout = 24 - FAMEC_FETCHBITS;\r
+    i = start_addr >> shiftout;\r
+    addr = (uptr)ptr - (i << shiftout);\r
+    for (; i <= (end_addr >> shiftout); i++)\r
+      ctx->Fetch[i] = addr;\r
+  }\r
+#endif\r
+}\r
+\r
 void cpu68k_map_all_ram(u32 start_addr, u32 end_addr, void *ptr, int is_sub)\r
 {\r
   uptr *r8map, *r16map, *w8map, *w16map;\r
@@ -117,6 +149,55 @@ void cpu68k_map_all_ram(u32 start_addr, u32 end_addr, void *ptr, int is_sub)
 #endif\r
 }\r
 \r
+void cpu68k_map_read_funcs(u32 start_addr, u32 end_addr, u32 (*r8)(u32), u32 (*r16)(u32), int is_sub)\r
+{\r
+  uptr *r8map, *r16map;\r
+  uptr ar8 = (uptr)r8, ar16 = (uptr)r16;\r
+  int shift = M68K_MEM_SHIFT;\r
+  int i;\r
+\r
+  if (!is_sub) {\r
+    r8map = m68k_read8_map;\r
+    r16map = m68k_read16_map;\r
+  } else {\r
+    r8map = s68k_read8_map;\r
+    r16map = s68k_read16_map;\r
+  }\r
+\r
+  ar8 = (ar8 >> 1 ) | MAP_FLAG;\r
+  ar16 = (ar16 >> 1 ) | MAP_FLAG;\r
+  for (i = start_addr >> shift; i <= end_addr >> shift; i++)\r
+    r8map[i] = ar8, r16map[i] = ar16;\r
+}\r
+\r
+void cpu68k_map_all_funcs(u32 start_addr, u32 end_addr, u32 (*r8)(u32), u32 (*r16)(u32), void (*w8)(u32, u32), void (*w16)(u32, u32), int is_sub)\r
+{\r
+  uptr *r8map, *r16map, *w8map, *w16map;\r
+  uptr ar8 = (uptr)r8, ar16 = (uptr)r16;\r
+  uptr aw8 = (uptr)w8, aw16 = (uptr)w16;\r
+  int shift = M68K_MEM_SHIFT;\r
+  int i;\r
+\r
+  if (!is_sub) {\r
+    r8map = m68k_read8_map;\r
+    r16map = m68k_read16_map;\r
+    w8map = m68k_write8_map;\r
+    w16map = m68k_write16_map;\r
+  } else {\r
+    r8map = s68k_read8_map;\r
+    r16map = s68k_read16_map;\r
+    w8map = s68k_write8_map;\r
+    w16map = s68k_write16_map;\r
+  }\r
+\r
+  ar8 = (ar8 >> 1 ) | MAP_FLAG;\r
+  ar16 = (ar16 >> 1 ) | MAP_FLAG;\r
+  aw8 = (aw8 >> 1 ) | MAP_FLAG;\r
+  aw16 = (aw16 >> 1 ) | MAP_FLAG;\r
+  for (i = start_addr >> shift; i <= end_addr >> shift; i++)\r
+    r8map[i] = ar8, r16map[i] = ar16, w8map[i] = aw8, w16map[i] = aw16;\r
+}\r
+\r
 static u32 m68k_unmapped_read8(u32 a)\r
 {\r
   elprintf(EL_UIO, "m68k unmapped r8  [%06x] @%06x", a, SekPc);\r
index e3da68d..27e2940 100644 (file)
@@ -48,7 +48,10 @@ void z80_map_set(uptr *map, u16 start_addr, u16 end_addr,
     const void *func_or_mh, int is_func);
 void cpu68k_map_set(uptr *map, u32 start_addr, u32 end_addr,
     const void *func_or_mh, int is_func);
+void cpu68k_map_read_mem(u32 start_addr, u32 end_addr, void *ptr, int is_sub);
 void cpu68k_map_all_ram(u32 start_addr, u32 end_addr, void *ptr, int is_sub);
+void cpu68k_map_read_funcs(u32 start_addr, u32 end_addr, u32 (*r8)(u32), u32 (*r16)(u32), int is_sub);
+void cpu68k_map_all_funcs(u32 start_addr, u32 end_addr, u32 (*r8)(u32), u32 (*r16)(u32), void (*w8)(u32, u32), void (*w16)(u32, u32), int is_sub);
 void m68k_map_unmap(u32 start_addr, u32 end_addr);
 
 #define MAP_FLAG ((uptr)1 << (sizeof(uptr) * 8 - 1))
index ed369e3..2be1c47 100644 (file)
@@ -38,7 +38,7 @@ static void SekExecM68k(int cyc_do)
   SekCyclesLeft = 0;
 }
 
-static void SekSyncM68k(void)
+static int SekSyncM68k(int once)
 {
   int cyc_do;
 
@@ -56,11 +56,14 @@ static void SekSyncM68k(void)
       z80_buscyc = cyc_do;
     Pico.t.m68c_cnt += z80_buscyc;
     Pico.t.z80_buscycles -= z80_buscyc;
+    if (once) break;
   }
 
   SekTrace(0);
   pevt_log_m68k_o(EVT_RUN_END);
   pprof_end(m68k);
+
+  return Pico.t.m68c_aim > Pico.t.m68c_cnt;
 }
 
 static __inline void SekRunM68k(int cyc)
@@ -72,7 +75,7 @@ static __inline void SekRunM68k(int cyc)
   refresh = (cyc + refresh) & 0x3f;
   Pico.t.m68c_aim += cyc;
 
-  SekSyncM68k();
+  SekSyncM68k(0);
 }
 
 static void SyncCPUs(unsigned int cycles)
@@ -300,7 +303,7 @@ static int PicoFrameHints(void)
     while (l-- > 0) {
       Pico.t.m68c_cnt -= CYCLES_M68K_LINE;
       do_timing_hacks_start(pv);
-      SekSyncM68k();
+      SekSyncM68k(0);
       do_timing_hacks_end(pv);
     }
   }
index b08db6a..970ee60 100644 (file)
@@ -506,7 +506,12 @@ struct mcd_pcm
        } ch[8];\r
 };\r
 \r
-#define PCD_ST_S68K_RST 1\r
+#define PCD_ST_S68K_RST     1\r
+#define PCD_ST_S68K_SYNC    2\r
+#define PCD_ST_S68K_SLEEP   4\r
+#define PCD_ST_M68K_SLEEP   8\r
+#define PCD_ST_S68K_POLL   16\r
+#define PCD_ST_M68K_POLL   32\r
 \r
 struct mcd_misc\r
 {\r