dualcore integration in famc, bram cart C code, psp bugfixes
[picodrive.git] / cpu / fame / famec.c
index 041413f..6b147b2 100644 (file)
@@ -20,7 +20,7 @@
 #define FAMEC_CHECK_BRANCHES\r
 #define FAMEC_EXTRA_INLINE\r
 // #define FAMEC_DEBUG\r
-#define FAMEC_NO_GOTOS\r
+//#define FAMEC_NO_GOTOS\r
 #define FAMEC_ADR_BITS  24\r
 // #define FAMEC_FETCHBITS 8\r
 #define FAMEC_DATABITS  8\r
@@ -523,7 +523,7 @@ static u32 flag_I;
 static u32 initialised = 0;\r
 \r
 #ifdef PICODRIVE_HACK\r
-extern M68K_CONTEXT PicoCpuFS68k;\r
+extern M68K_CONTEXT PicoCpuFM68k, PicoCpuFS68k;\r
 #endif\r
 \r
 /* Custom function handler */\r
@@ -624,7 +624,7 @@ void fm68k_init(void)
 #endif\r
 \r
     if (!initialised)\r
-           fm68k_emulate(0);\r
+           fm68k_emulate(0, 0);\r
 \r
 #ifdef FAMEC_DEBUG\r
        puts("FAME initialized.");\r
@@ -643,7 +643,7 @@ void fm68k_init(void)
 int fm68k_reset(void)\r
 {\r
        if (!initialised)\r
-               fm68k_emulate(0);\r
+               fm68k_emulate(0, 0);\r
 \r
        // Si la CPU esta en ejecucion, salir con M68K_RUNNING\r
        if (m68kcontext.execinfo & M68K_RUNNING)\r
@@ -771,7 +771,7 @@ static void setup_jumptable(void);
 // main exec function\r
 //////////////////////\r
 \r
-int fm68k_emulate(s32 cycles)\r
+int fm68k_emulate(s32 cycles, int dualcore)\r
 {\r
 #ifndef FAMEC_NO_GOTOS\r
        u32 Opcode;\r
@@ -795,6 +795,11 @@ int fm68k_emulate(s32 cycles)
 #endif\r
        }\r
 \r
+#ifdef PICODRIVE_HACK\r
+       if (dualcore) goto dualcore_mode;\r
+famec_restart:\r
+#endif\r
+\r
        // won't emulate double fault\r
        // if (m68kcontext.execinfo & M68K_FAULTED) return -1;\r
 \r
@@ -935,7 +940,60 @@ famec_End:
        printf("pc: 0x%08x\n",m68kcontext.pc);\r
 #endif\r
 \r
-       return cycles - m68kcontext.io_cycle_counter;\r
+#ifdef PICODRIVE_HACK\r
+       if (!dualcore)\r
+#endif\r
+               return cycles - m68kcontext.io_cycle_counter;\r
+\r
+#ifdef PICODRIVE_HACK\r
+dualcore_mode:\r
+\r
+       {\r
+               extern int SekCycleAim, SekCycleCnt, SekCycleAimS68k, SekCycleCntS68k;\r
+               #define PS_STEP_M68K ((488<<16)/20) // ~24\r
+               if (dualcore == 1)\r
+               {\r
+                       dualcore = (488<<16); // ~ cycn in Pico.c\r
+                       // adjust for first iteration\r
+                       g_m68kcontext = &PicoCpuFS68k;\r
+                       cycles = m68kcontext.io_cycle_counter = 0;\r
+               }\r
+               if (g_m68kcontext == &PicoCpuFS68k)\r
+               {\r
+                       SekCycleCntS68k += cycles - m68kcontext.io_cycle_counter;\r
+                       // end?\r
+                       dualcore -= PS_STEP_M68K;\r
+                       if (dualcore < 0) return 0;\r
+                       // become main 68k\r
+                       g_m68kcontext = &PicoCpuFM68k;\r
+                       if ((cycles = SekCycleAim-SekCycleCnt-(dualcore>>16)) > 0)\r
+                       {\r
+                               if ((m68kcontext.execinfo & FM68K_HALTED) && m68kcontext.interrupts[0] <= (M68K_PPL))\r
+                                    SekCycleCnt += cycles; // halted\r
+                               else goto famec_restart;\r
+                               //else { printf("go main %i\n", cycles); goto famec_restart; }\r
+                       }\r
+                       cycles = m68kcontext.io_cycle_counter = 0;\r
+               }\r
+               if (g_m68kcontext == &PicoCpuFM68k)\r
+               {\r
+                       int cycn_s68k = (dualcore + dualcore/2 + dualcore/8) >> 16;\r
+                       SekCycleCnt += cycles - m68kcontext.io_cycle_counter;\r
+                       // become sub 68k\r
+                       g_m68kcontext = &PicoCpuFS68k;\r
+                       if ((cycles = SekCycleAimS68k-SekCycleCntS68k-cycn_s68k) > 0)\r
+                       {\r
+                               if ((m68kcontext.execinfo & FM68K_HALTED) && m68kcontext.interrupts[0] <= (M68K_PPL))\r
+                                    SekCycleCntS68k += cycles; // halted\r
+                               else goto famec_restart;\r
+                       }\r
+                       cycles = m68kcontext.io_cycle_counter = 0;\r
+               }\r
+               goto dualcore_mode;\r
+       }\r
+#endif\r
+\r
+\r
 \r
 #ifdef FAMEC_NO_GOTOS\r
 }\r