famec: split fm68k_emulate
[picodrive.git] / pico / cd / sek.c
index 3a7b1d6..6f54801 100644 (file)
@@ -1,11 +1,16 @@
-// (c) Copyright 2007 notaz, All rights reserved.
-
+/*
+ * PicoDrive
+ * (C) notaz, 2007
+ *
+ * This work is licensed under the terms of MAME license.
+ * See COPYING file in the top-level directory.
+ */
 
 #include "../pico_int.h"
 
 
-int SekCycleCntS68k=0; // cycles done in this frame
-int SekCycleAimS68k=0; // cycle aim
+unsigned int SekCycleCntS68k;
+unsigned int SekCycleAimS68k;
 
 
 /* context */
@@ -52,10 +57,7 @@ static void SekResetAckS68k(void)
 
 static int SekUnrecognizedOpcodeS68k(void)
 {
-  unsigned int pc, op;
-  pc = SekPcS68k;
-  op = PicoCpuCS68k.read16(pc);
-  elprintf(EL_ANOMALY, "Unrecognized Opcode %04x @ %06x", op, pc);
+  elprintf(EL_ANOMALY, "Unrecognized Opcode @ %06x", SekPcS68k);
   //exit(1);
   return 0;
 }
@@ -133,14 +135,7 @@ PICO_INTERNAL int SekResetS68k(void)
   if (Pico.rom==NULL) return 1;
 
 #ifdef EMU_C68K
-  PicoCpuCS68k.state_flags=0;
-  PicoCpuCS68k.osp=0;
-  PicoCpuCS68k.srh =0x27; // Supervisor mode
-  PicoCpuCS68k.flags=4;   // Z set
-  PicoCpuCS68k.irq=0;
-  PicoCpuCS68k.a[7]=PicoCpuCS68k.read32(0); // Stack Pointer
-  PicoCpuCS68k.membase=0;
-  PicoCpuCS68k.pc=PicoCpuCS68k.checkpc(PicoCpuCS68k.read32(4)); // Program Counter
+  CycloneReset(&PicoCpuCS68k);
 #endif
 #ifdef EMU_M68K
   {
@@ -156,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
@@ -183,10 +177,8 @@ PICO_INTERNAL int SekInterruptS68k(int irq)
   PicoCpuCS68k.irq=real_irq;
 #endif
 #ifdef EMU_M68K
-  void *oldcontext = m68ki_cpu_p;
-  m68k_set_context(&PicoCpuMS68k);
-  m68k_set_irq(real_irq);
-  m68k_set_context(oldcontext);
+  // avoid m68k_set_irq() for delaying to work
+  PicoCpuMS68k.int_level = real_irq << 8;
 #endif
 #ifdef EMU_F68K
   PicoCpuFS68k.interrupts[0]=real_irq;
@@ -194,3 +186,17 @@ PICO_INTERNAL int SekInterruptS68k(int irq)
   return 0;
 }
 
+void SekInterruptClearS68k(int irq)
+{
+  int level_new = new_irq_level(irq);
+
+#ifdef EMU_C68K
+  PicoCpuCS68k.irq = level_new;
+#endif
+#ifdef EMU_M68K
+  CPU_INT_LEVEL = level_new << 8;
+#endif
+#ifdef EMU_F68K
+  PicoCpuFS68k.interrupts[0] = level_new;
+#endif
+}