famec: split fm68k_emulate
authornotaz <notasas@gmail.com>
Sat, 14 Oct 2017 21:45:55 +0000 (00:45 +0300)
committernotaz <notasas@gmail.com>
Sat, 14 Oct 2017 21:45:55 +0000 (00:45 +0300)
in FAMEC_NO_GOTOS mode at least

cpu/fame/fame.h
cpu/fame/famec.c
pico/cd/mcd.c
pico/cd/sek.c
pico/debugCPU.c
pico/pico_cmn.c
pico/pico_int.h
pico/sek.c

index 2f9d850..93172c8 100644 (file)
@@ -145,18 +145,29 @@ typedef struct
 \r
 extern M68K_CONTEXT *g_m68kcontext;\r
 \r
+typedef enum\r
+{\r
+       fm68k_reason_emulate = 0,\r
+       fm68k_reason_init,\r
+       fm68k_reason_idle_install,\r
+       fm68k_reason_idle_remove,\r
+} fm68k_call_reason;\r
+\r
 /************************/\r
 /* Function definition  */\r
 /************************/\r
 \r
 /* General purpose functions */\r
 void fm68k_init(void);\r
-int  fm68k_reset(void);\r
-int  fm68k_emulate(int n, int idle_mode);\r
-int  fm68k_would_interrupt(void); // to be called from fm68k_emulate()\r
+int  fm68k_reset(M68K_CONTEXT *ctx);\r
+int  fm68k_emulate(M68K_CONTEXT *ctx, int n, fm68k_call_reason reason);\r
+int  fm68k_would_interrupt(M68K_CONTEXT *ctx); // to be called from fm68k_emulate()\r
 \r
-unsigned fm68k_get_pc(M68K_CONTEXT *context);\r
+unsigned fm68k_get_pc(M68K_CONTEXT *ctx);\r
 \r
+// PICODRIVE_HACK\r
+int fm68k_idle_install(void);\r
+int fm68k_idle_remove(void);\r
 \r
 #ifdef __cplusplus\r
 }\r
index db4eae6..508a12f 100644 (file)
@@ -556,7 +556,7 @@ M68K_CONTEXT *g_m68kcontext;
 static u32 initialised = 0;\r
 \r
 #ifdef PICODRIVE_HACK\r
-extern M68K_CONTEXT PicoCpuFM68k, PicoCpuFS68k;\r
+extern M68K_CONTEXT PicoCpuFS68k;\r
 #endif\r
 \r
 /* Custom function handler */\r
@@ -640,6 +640,7 @@ static const s32 exception_cycle_table[256] =
          4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4\r
 };\r
 \r
+static int init_jump_table(void);\r
 \r
 /***********************/\r
 /* core main functions */\r
@@ -656,8 +657,8 @@ void fm68k_init(void)
        puts("Initializing FAME...");\r
 #endif\r
 \r
-    if (!initialised)\r
-           fm68k_emulate(0, 0);\r
+       if (!initialised)\r
+               init_jump_table();\r
 \r
 #ifdef FAMEC_DEBUG\r
        puts("FAME initialized.");\r
@@ -673,10 +674,12 @@ void fm68k_init(void)
 /*     M68K_NO_SUP_ADDR_SPACE (2):  No se puede resetear porque no hay mapa   */\r
 /*             de memoria supervisor de extraccion de opcodes                 */\r
 /******************************************************************************/\r
-int fm68k_reset(void)\r
+int fm68k_reset(M68K_CONTEXT *ctx)\r
 {\r
        if (!initialised)\r
-               fm68k_emulate(0, 0);\r
+               init_jump_table();\r
+\r
+       g_m68kcontext = ctx;\r
 \r
        // Si la CPU esta en ejecucion, salir con M68K_RUNNING\r
        if (m68kcontext.execinfo & M68K_RUNNING)\r
@@ -731,7 +734,7 @@ static FAMEC_EXTRA_INLINE s32 interrupt_chk__(void)
        return 0;\r
 }\r
 \r
-int fm68k_would_interrupt(void)\r
+int fm68k_would_interrupt(M68K_CONTEXT *ctx)\r
 {\r
        return interrupt_chk__();\r
 }\r
@@ -808,7 +811,7 @@ static FAMEC_EXTRA_INLINE u32 execute_exception_group_0(s32 vect, s32 addr, u16
 // main exec function\r
 //////////////////////\r
 \r
-int fm68k_emulate(s32 cycles, int idle_mode)\r
+int fm68k_emulate(M68K_CONTEXT *ctx, s32 cycles, fm68k_call_reason reason)\r
 {\r
 #ifndef FAMEC_NO_GOTOS\r
        u32 Opcode;\r
@@ -820,17 +823,23 @@ int fm68k_emulate(s32 cycles, int idle_mode)
        u32 flag_NotZ;\r
        u32 flag_N;\r
        u32 flag_X;\r
-#endif\r
 \r
-       if (!initialised)\r
+       switch (reason)\r
        {\r
+       case fm68k_reason_init:\r
                goto init_jump_table;\r
-       }\r
-\r
 #ifdef PICODRIVE_HACK\r
-       if      (idle_mode == 1) goto idle_install;\r
-       else if (idle_mode == 2) goto idle_remove;\r
+       case fm68k_reason_idle_install:\r
+               goto idle_install;\r
+       case fm68k_reason_idle_remove:\r
+               goto idle_remove;\r
 #endif\r
+       case fm68k_reason_emulate:\r
+               break;\r
+       }\r
+#endif // FAMEC_NO_GOTOS\r
+\r
+       g_m68kcontext = ctx;\r
 \r
        // won't emulate double fault\r
        // if (m68kcontext.execinfo & M68K_FAULTED) return -1;\r
@@ -975,7 +984,13 @@ famec_End:
 \r
        return cycles - m68kcontext.io_cycle_counter;\r
 \r
+#ifndef FAMEC_NO_GOTOS\r
 init_jump_table:\r
+#else\r
+}\r
+\r
+static int init_jump_table(void)\r
+#endif\r
 {\r
        u32 i, j;\r
 \r
@@ -5005,7 +5020,12 @@ init_jump_table:
        JumpTable[fake_op_base] = JumpTable[fake_op_base|0x0200] = CAST_OP(0x4AFC); \\r
        JumpTable[real_op] = CAST_OP(normal_handler)\r
 \r
+#ifndef FAMEC_NO_GOTOS\r
 idle_install:\r
+#else\r
+int fm68k_idle_install(void)\r
+#endif\r
+{\r
        // printf("install..\n");\r
        INSTALL_IDLE(0x71fa, 0x66fa, idle_detector_bcc8, 0x6601_idle, 0x6601);\r
        INSTALL_IDLE(0x71f8, 0x66f8, idle_detector_bcc8, 0x6601_idle, 0x6601);\r
@@ -5018,8 +5038,14 @@ idle_install:
        INSTALL_IDLE(0x7dfe, 0x60fe, idle_detector_bcc8, 0x6001_idle, 0x6001);\r
        INSTALL_IDLE(0x7dfc, 0x60fc, idle_detector_bcc8, 0x6001_idle, 0x6001);\r
        return 0;\r
+}\r
 \r
+#ifndef FAMEC_NO_GOTOS\r
 idle_remove:\r
+#else\r
+int fm68k_idle_remove(void)\r
+#endif\r
+{\r
        // printf("remove..\n");\r
        UNDO_IDLE(0x71fa, 0x66fa, 0x6601);\r
        UNDO_IDLE(0x71f8, 0x66f8, 0x6601);\r
@@ -5032,9 +5058,26 @@ idle_remove:
        UNDO_IDLE(0x7dfe, 0x60fe, 0x6001);\r
        UNDO_IDLE(0x7dfc, 0x60fc, 0x6001);\r
        return 0;\r
+}\r
+#endif // PICODRIVE_HACK\r
 \r
-#endif\r
+#ifndef FAMEC_NO_GOTOS\r
 }\r
 \r
-void *get_jumptab(void) { return JumpTable; }\r
+static int init_jump_table(void)\r
+{\r
+       return fm68k_emulate(NULL, 0, fm68k_reason_init);\r
+}\r
+\r
+#ifdef PICODRIVE_HACK\r
+int fm68k_idle_install(void)\r
+{\r
+       return fm68k_emulate(NULL, 0, fm68k_reason_idle_install);\r
+}\r
 \r
+int fm68k_idle_remove(void)\r
+{\r
+       return fm68k_emulate(NULL, 0, fm68k_reason_idle_remove);\r
+}\r
+#endif\r
+#endif // FAMEC_NO_GOTOS\r
index af320bd..929b57f 100644 (file)
@@ -107,7 +107,7 @@ static void SekRunM68kOnce(void)
 #elif defined(EMU_M68K)
     Pico.t.m68c_cnt += m68k_execute(cyc_do) - cyc_do;
 #elif defined(EMU_F68K)
-    Pico.t.m68c_cnt += fm68k_emulate(cyc_do, 0) - cyc_do;
+    Pico.t.m68c_cnt += fm68k_emulate(&PicoCpuFM68k, cyc_do, 0) - cyc_do;
 #endif
   }
 
@@ -138,8 +138,7 @@ static void SekRunS68k(unsigned int to)
   SekCycleCntS68k += m68k_execute(cyc_do) - cyc_do;
   m68k_set_context(&PicoCpuMM68k);
 #elif defined(EMU_F68K)
-  g_m68kcontext = &PicoCpuFS68k;
-  SekCycleCntS68k += fm68k_emulate(cyc_do, 0) - cyc_do;
+  SekCycleCntS68k += fm68k_emulate(&PicoCpuFS68k, cyc_do, 0) - cyc_do;
   g_m68kcontext = &PicoCpuFM68k;
 #endif
 }
index 42fea93..6f54801 100644 (file)
@@ -151,8 +151,7 @@ PICO_INTERNAL int SekResetS68k(void)
 #ifdef EMU_F68K
   {
     void *oldcontext = g_m68kcontext;
-    g_m68kcontext = &PicoCpuFS68k;
-    fm68k_reset();
+    fm68k_reset(&PicoCpuFS68k);
     g_m68kcontext = oldcontext;
   }
 #endif
index fd31214..36e71a7 100644 (file)
@@ -49,7 +49,7 @@ static int otherRun(void)
   CycloneRun(currentC68k);\r
   return 1-currentC68k->cycles;\r
 #elif defined(EMU_F68K)\r
-  return fm68k_emulate(1, 0);\r
+  return fm68k_emulate(g_m68kcontext, 1, 0);\r
 #endif\r
 }\r
 \r
index 27a66cd..d2a1d94 100644 (file)
@@ -38,7 +38,7 @@ static void SekSyncM68k(void)
 #elif defined(EMU_M68K)
     Pico.t.m68c_cnt += m68k_execute(cyc_do) - cyc_do;
 #elif defined(EMU_F68K)
-    Pico.t.m68c_cnt += fm68k_emulate(cyc_do, 0) - cyc_do;
+    Pico.t.m68c_cnt += fm68k_emulate(&PicoCpuFM68k, cyc_do, 0) - cyc_do;
 #endif
   }
 
index e3bf03a..f356d40 100644 (file)
@@ -81,7 +81,7 @@ extern M68K_CONTEXT PicoCpuFM68k, PicoCpuFS68k;
 }\r
 #define SekIsStoppedM68k() (PicoCpuFM68k.execinfo&FM68K_HALTED)\r
 #define SekIsStoppedS68k() (PicoCpuFS68k.execinfo&FM68K_HALTED)\r
-#define SekShouldInterrupt() fm68k_would_interrupt()\r
+#define SekShouldInterrupt() fm68k_would_interrupt(&PicoCpuFM68k)\r
 \r
 #define SekNotPolling     PicoCpuFM68k.not_polling\r
 #define SekNotPollingS68k PicoCpuFS68k.not_polling\r
index 8fece1a..c76a3e8 100644 (file)
@@ -157,10 +157,7 @@ PICO_INTERNAL int SekReset(void)
   REG_USP = 0; // ?\r
 #endif\r
 #ifdef EMU_F68K\r
-  {\r
-    g_m68kcontext = &PicoCpuFM68k;\r
-    fm68k_reset();\r
-  }\r
+  fm68k_reset(&PicoCpuFM68k);\r
 #endif\r
 \r
   return 0;\r
@@ -178,7 +175,7 @@ void SekStepM68k(void)
 #elif defined(EMU_M68K)\r
   Pico.t.m68c_cnt += m68k_execute(1);\r
 #elif defined(EMU_F68K)\r
-  Pico.t.m68c_cnt += fm68k_emulate(1, 0);\r
+  Pico.t.m68c_cnt += fm68k_emulate(&PicoCpuFM68k, 1, 0);\r
 #endif\r
 }\r
 \r
@@ -320,7 +317,7 @@ void SekInitIdleDet(void)
   CycloneInitIdle();\r
 #endif\r
 #ifdef EMU_F68K\r
-  fm68k_emulate(0, 1);\r
+  fm68k_idle_install();\r
 #endif\r
 }\r
 \r
@@ -431,7 +428,7 @@ void SekFinishIdleDet(void)
   CycloneFinishIdle();\r
 #endif\r
 #ifdef EMU_F68K\r
-  fm68k_emulate(0, 2);\r
+  fm68k_idle_remove();\r
 #endif\r
   while (idledet_count > 0)\r
   {\r