FAME + some random stuff added
[picodrive.git] / cpu / fame / fame.h
diff --git a/cpu/fame/fame.h b/cpu/fame/fame.h
new file mode 100644 (file)
index 0000000..1195593
--- /dev/null
@@ -0,0 +1,186 @@
+/*****************************************************************************/\r
+/* FAME Fast and Accurate Motorola 68000 Emulation Core                      */\r
+/* (c) 2005 Oscar Orallo Pelaez                                              */\r
+/* Version: 1.24                                                             */\r
+/* Date: 08-20-2005                                                          */\r
+/* See FAME.HTML for documentation and license information                   */\r
+/*****************************************************************************/\r
+\r
+#ifndef __FAME_H__\r
+#define __FAME_H__\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+// PicoDrive hacks\r
+#define FAMEC_FETCHBITS 8\r
+#define M68K_FETCHBANK1 (1 << FAMEC_FETCHBITS)\r
+\r
+//#define M68K_RUNNING    0x01\r
+#define M68K_HALTED     0x80\r
+#define M68K_WAITING    0x04\r
+#define M68K_DISABLE    0x20\r
+#define M68K_FAULTED    0x40\r
+#define M68K_EMULATE_GROUP_0  0x02\r
+#define M68K_EMULATE_TRACE    0x08\r
+#define M68K_DO_TRACE    0x10\r
+\r
+\r
+/************************************/\r
+/* General library defines          */\r
+/************************************/\r
+\r
+#ifndef M68K_OK\r
+    #define M68K_OK 0\r
+#endif\r
+#ifndef M68K_RUNNING\r
+    #define M68K_RUNNING 1\r
+#endif\r
+#ifndef M68K_NO_SUP_ADDR_SPACE\r
+    #define M68K_NO_SUP_ADDR_SPACE 2\r
+#endif\r
+#ifndef M68K_DOUBLE_BUS_FAULT\r
+    #define M68K_DOUBLE_BUS_FAULT -1\r
+#endif\r
+#ifndef M68K_INV_REG\r
+    #define M68K_INV_REG -1\r
+#endif\r
+\r
+/* Hardware interrupt state */\r
+\r
+#ifndef M68K_IRQ_LEVEL_ERROR\r
+    #define M68K_IRQ_LEVEL_ERROR -1\r
+#endif\r
+#ifndef M68K_IRQ_INV_PARAMS\r
+    #define M68K_IRQ_INV_PARAMS -2\r
+#endif\r
+\r
+/* Defines to specify hardware interrupt type */\r
+\r
+#ifndef M68K_AUTOVECTORED_IRQ\r
+    #define M68K_AUTOVECTORED_IRQ -1\r
+#endif\r
+#ifndef M68K_SPURIOUS_IRQ\r
+    #define M68K_SPURIOUS_IRQ -2\r
+#endif\r
+\r
+#ifndef M68K_AUTO_LOWER_IRQ\r
+       #define M68K_AUTO_LOWER_IRQ 1\r
+#endif\r
+#ifndef M68K_MANUAL_LOWER_IRQ\r
+       #define M68K_MANUAL_LOWER_IRQ 0\r
+#endif\r
+\r
+/* Defines to specify address space */\r
+\r
+#ifndef M68K_SUP_ADDR_SPACE\r
+    #define M68K_SUP_ADDR_SPACE 0\r
+#endif\r
+#ifndef M68K_USER_ADDR_SPACE\r
+    #define M68K_USER_ADDR_SPACE 2\r
+#endif\r
+#ifndef M68K_PROG_ADDR_SPACE\r
+    #define M68K_PROG_ADDR_SPACE 0\r
+#endif\r
+#ifndef M68K_DATA_ADDR_SPACE\r
+    #define M68K_DATA_ADDR_SPACE 1\r
+#endif\r
+\r
+\r
+/*******************/\r
+/* Data definition */\r
+/*******************/\r
+\r
+/* M68K registers */\r
+typedef enum {\r
+      M68K_REG_D0=0,\r
+      M68K_REG_D1,\r
+      M68K_REG_D2,\r
+      M68K_REG_D3,\r
+      M68K_REG_D4,\r
+      M68K_REG_D5,\r
+      M68K_REG_D6,\r
+      M68K_REG_D7,\r
+      M68K_REG_A0,\r
+      M68K_REG_A1,\r
+      M68K_REG_A2,\r
+      M68K_REG_A3,\r
+      M68K_REG_A4,\r
+      M68K_REG_A5,\r
+      M68K_REG_A6,\r
+      M68K_REG_A7,\r
+      M68K_REG_ASP,\r
+      M68K_REG_PC,\r
+      M68K_REG_SR\r
+} m68k_register;\r
+\r
+typedef union\r
+{\r
+       unsigned char B;\r
+       signed char SB;\r
+       unsigned short W;\r
+       signed short SW;\r
+       unsigned int D;\r
+       signed int SD;\r
+} famec_union32;\r
+\r
+/* The memory blocks must be in native (Motorola) format */\r
+struct M68K_PROGRAM {\r
+       unsigned low_addr;\r
+       unsigned high_addr;\r
+       unsigned offset;\r
+};\r
+\r
+/* The memory blocks must be in native (Motorola) format */\r
+struct M68K_DATA {\r
+       unsigned low_addr;\r
+       unsigned high_addr;\r
+       void    *mem_handler;\r
+       void    *data;\r
+};\r
+\r
+/* M68K CPU CONTEXT */\r
+typedef struct\r
+{\r
+       unsigned int   (*read_byte )(unsigned int a);\r
+       unsigned int   (*read_word )(unsigned int a);\r
+       unsigned int   (*read_long )(unsigned int a);\r
+       void           (*write_byte)(unsigned int a,unsigned char  d);\r
+       void           (*write_word)(unsigned int a,unsigned short d);\r
+       void           (*write_long)(unsigned int a,unsigned int   d);\r
+       void           (*reset_handler)(void);\r
+       void           (*iack_handler)(unsigned level);\r
+       famec_union32  dreg[8];\r
+       famec_union32  areg[8];\r
+       unsigned       asp;\r
+       unsigned       pc;\r
+       unsigned char  interrupts[8];\r
+       unsigned short sr;\r
+       unsigned short execinfo;\r
+       // PD extension\r
+       int            io_cycle_counter; // cycles left\r
+       unsigned int   Fetch[M68K_FETCHBANK1];\r
+} M68K_CONTEXT;\r
+\r
+extern M68K_CONTEXT *g_m68kcontext;\r
+\r
+/************************/\r
+/* Function definition  */\r
+/************************/\r
+\r
+/* General purpose functions */\r
+void m68k_init(void);\r
+int  m68k_reset(void);\r
+int  m68k_emulate(int n);\r
+\r
+unsigned m68k_get_pc(M68K_CONTEXT *context);\r
+unsigned m68k_get_register(M68K_CONTEXT *context, m68k_register reg);\r
+unsigned m68k_set_register(M68K_CONTEXT *context, m68k_register reg, unsigned value);\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif\r