--- /dev/null
+/*****************************************************************************/\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