Added 0.030 of PicoDrive and moved license files into root
[cyclone68000.git] / Pico / Sek.cpp
diff --git a/Pico/Sek.cpp b/Pico/Sek.cpp
new file mode 100644 (file)
index 0000000..f88b9be
--- /dev/null
@@ -0,0 +1,133 @@
+\r
+#include "PicoInt.h"\r
+\r
+char PicoStatus[128]=""; // 68000 state for debug\r
+\r
+#ifdef EMU_C68K\r
+// ---------------------- Cyclone 68000 ----------------------\r
+\r
+struct Cyclone PicoCpu;\r
+\r
+int SekInit()\r
+{\r
+  memset(&PicoCpu,0,sizeof(PicoCpu));\r
+  return 0;\r
+}\r
+\r
+// Reset the 68000:\r
+int SekReset()\r
+{\r
+  if (Pico.rom==NULL) return 1;\r
+\r
+  PicoCpu.srh =0x27; // Supervisor mode\r
+  PicoCpu.a[7]=PicoCpu.read32(0); // Stack Pointer\r
+  PicoCpu.membase=0;\r
+  PicoCpu.pc=PicoCpu.checkpc(PicoCpu.read32(4)); // Program Counter\r
+\r
+  return 0;\r
+}\r
+\r
+\r
+// Run the 68000 for 'cyc' number of cycles and return the number of cycles actually executed\r
+static inline int DoRun(int cyc)\r
+{\r
+  PicoCpu.cycles=cyc;\r
+  CycloneRun(&PicoCpu);\r
+  return cyc-PicoCpu.cycles;\r
+}\r
+\r
+int SekInterrupt(int irq)\r
+{\r
+  PicoCpu.irq=(unsigned char)irq;\r
+  return 0;\r
+}\r
+\r
+int SekPc() { return PicoCpu.pc-PicoCpu.membase; }\r
+\r
+void SekState(unsigned char *data)\r
+{\r
+  memcpy(data,PicoCpu.d,0x44);\r
+}\r
+\r
+#endif\r
+\r
+#ifdef EMU_A68K\r
+// ---------------------- A68K ----------------------\r
+\r
+extern "C" void __cdecl M68000_RUN();\r
+extern "C" void __cdecl M68000_RESET();\r
+extern "C" int m68k_ICount=0;\r
+extern "C" unsigned int mem_amask=0xffffff; // 24-bit bus\r
+extern "C" unsigned int mame_debug=0,cur_mrhard=0,m68k_illegal_opcode=0,illegal_op=0,illegal_pc=0,opcode_entry=0; // filler\r
+\r
+static int IrqCallback(int) { return -1; }\r
+static int DoReset() { return 0; }\r
+static int (*ResetCallback)()=DoReset;\r
+\r
+int SekInit()\r
+{\r
+  memset(&M68000_regs,0,sizeof(M68000_regs));\r
+  M68000_regs.IrqCallback=IrqCallback;\r
+  M68000_regs.pResetCallback=ResetCallback;\r
+  M68000_RESET(); // Init cpu emulator\r
+  return 0;\r
+}\r
+\r
+int SekReset()\r
+{\r
+  // Reset CPU: fetch SP and PC\r
+  M68000_regs.srh=0x27; // Supervisor mode\r
+  M68000_regs.a[7]=PicoRead32(0);\r
+  M68000_regs.pc  =PicoRead32(4);\r
+  PicoInitPc(M68000_regs.pc);\r
+\r
+  return 0;\r
+}\r
+\r
+static inline int DoRun(int cyc)\r
+{\r
+  m68k_ICount=cyc;\r
+  M68000_RUN();\r
+  return cyc-m68k_ICount;\r
+}\r
+\r
+int SekInterrupt(int irq)\r
+{\r
+  M68000_regs.irq=irq; // raise irq (gets lowered after taken)\r
+  return 0;\r
+}\r
+\r
+int SekPc() { return M68000_regs.pc; }\r
+\r
+void SekState(unsigned char *data)\r
+{\r
+  memcpy(data,      M68000_regs.d, 0x40);\r
+  memcpy(data+0x40,&M68000_regs.pc,0x04);\r
+}\r
+\r
+#endif\r
+\r
+#ifdef EMU_NULL\r
+// -----------------------------------------------------------\r
+int SekInit() { return 0; }\r
+int SekReset() { return 0; }\r
+static inline int DoRun(int cyc) { return cyc; }\r
+int SekInterrupt(int) { return 0; }\r
+\r
+int SekPc()\r
+{\r
+  return 0;\r
+}\r
+\r
+void SekState(unsigned char *) { }\r
+\r
+#endif\r
+\r
+int SekRun(int cyc)\r
+{\r
+  int did=0;\r
+\r
+  did=DoRun(cyc);\r
+\r
+  return did;\r
+}\r