ee1140b8e2e752ac7e8dc7bd350d861c30ef8e73
[picodrive.git] / cpu / fame / fame.h
1 /*****************************************************************************/\r
2 /* FAME Fast and Accurate Motorola 68000 Emulation Core                      */\r
3 /* (c) 2005 Oscar Orallo Pelaez                                              */\r
4 /* Version: 1.24                                                             */\r
5 /* Date: 08-20-2005                                                          */\r
6 /* See FAME.HTML for documentation and license information                   */\r
7 /*****************************************************************************/\r
8 \r
9 #ifndef __FAME_H__\r
10 #define __FAME_H__\r
11 \r
12 // uintptr_t\r
13 #include <stdlib.h>\r
14 #ifndef _MSC_VER\r
15 #include <stdint.h>\r
16 #endif\r
17 \r
18 #ifdef __cplusplus\r
19 extern "C" {\r
20 #endif\r
21 \r
22 // PicoDrive hacks\r
23 #define FAMEC_FETCHBITS 8\r
24 #define M68K_FETCHBANK1 (1 << FAMEC_FETCHBITS)\r
25 \r
26 //#define M68K_RUNNING    0x01\r
27 #define FM68K_HALTED     0x80\r
28 //#define M68K_WAITING    0x04\r
29 //#define M68K_DISABLE    0x20\r
30 //#define M68K_FAULTED    0x40\r
31 #define FM68K_EMULATE_GROUP_0  0x02\r
32 #define FM68K_EMULATE_TRACE    0x08\r
33 #define FM68K_DO_TRACE    0x10\r
34 \r
35 \r
36 /************************************/\r
37 /* General library defines          */\r
38 /************************************/\r
39 \r
40 #ifndef M68K_OK\r
41     #define M68K_OK 0\r
42 #endif\r
43 #ifndef M68K_RUNNING\r
44     #define M68K_RUNNING 1\r
45 #endif\r
46 #ifndef M68K_NO_SUP_ADDR_SPACE\r
47     #define M68K_NO_SUP_ADDR_SPACE 2\r
48 #endif\r
49 #ifndef M68K_DOUBLE_BUS_FAULT\r
50     #define M68K_DOUBLE_BUS_FAULT -1\r
51 #endif\r
52 #ifndef M68K_INV_REG\r
53     #define M68K_INV_REG -1\r
54 #endif\r
55 \r
56 /* Hardware interrupt state */\r
57 \r
58 #ifndef M68K_IRQ_LEVEL_ERROR\r
59     #define M68K_IRQ_LEVEL_ERROR -1\r
60 #endif\r
61 #ifndef M68K_IRQ_INV_PARAMS\r
62     #define M68K_IRQ_INV_PARAMS -2\r
63 #endif\r
64 \r
65 /* Defines to specify hardware interrupt type */\r
66 \r
67 #ifndef M68K_AUTOVECTORED_IRQ\r
68     #define M68K_AUTOVECTORED_IRQ -1\r
69 #endif\r
70 #ifndef M68K_SPURIOUS_IRQ\r
71     #define M68K_SPURIOUS_IRQ -2\r
72 #endif\r
73 \r
74 #ifndef M68K_AUTO_LOWER_IRQ\r
75         #define M68K_AUTO_LOWER_IRQ 1\r
76 #endif\r
77 #ifndef M68K_MANUAL_LOWER_IRQ\r
78         #define M68K_MANUAL_LOWER_IRQ 0\r
79 #endif\r
80 \r
81 /* Defines to specify address space */\r
82 \r
83 #ifndef M68K_SUP_ADDR_SPACE\r
84     #define M68K_SUP_ADDR_SPACE 0\r
85 #endif\r
86 #ifndef M68K_USER_ADDR_SPACE\r
87     #define M68K_USER_ADDR_SPACE 2\r
88 #endif\r
89 #ifndef M68K_PROG_ADDR_SPACE\r
90     #define M68K_PROG_ADDR_SPACE 0\r
91 #endif\r
92 #ifndef M68K_DATA_ADDR_SPACE\r
93     #define M68K_DATA_ADDR_SPACE 1\r
94 #endif\r
95 \r
96 \r
97 /*******************/\r
98 /* Data definition */\r
99 /*******************/\r
100 \r
101 #include <pico/pico_port.h>\r
102 \r
103 /*\r
104 typedef unsigned char   u8;\r
105 typedef signed char     s8;\r
106 typedef unsigned short  u16;\r
107 typedef signed short    s16;\r
108 typedef unsigned int    u32;\r
109 typedef signed int      s32;\r
110 */\r
111 \r
112 typedef union\r
113 {\r
114         u8 B[4];\r
115         s8 SB[4];\r
116         u16 W[2];\r
117         s16 SW[2];\r
118         u32 D;\r
119         s32 SD;\r
120 } famec_union32;\r
121 \r
122 /* M68K CPU CONTEXT */\r
123 typedef struct\r
124 {\r
125         unsigned int   (*read_byte )(unsigned int a);\r
126         unsigned int   (*read_word )(unsigned int a);\r
127         unsigned int   (*read_long )(unsigned int a);\r
128         void           (*write_byte)(unsigned int a,unsigned char  d);\r
129         void           (*write_word)(unsigned int a,unsigned short d);\r
130         void           (*write_long)(unsigned int a,unsigned int   d);\r
131         void           (*reset_handler)(void);\r
132         void           (*iack_handler)(unsigned level);\r
133         famec_union32  dreg[8];\r
134         famec_union32  areg[8];\r
135         unsigned       asp;\r
136         unsigned       pc;\r
137         unsigned char  interrupts[8];\r
138         unsigned short sr;\r
139         unsigned short execinfo;\r
140         // PD extension\r
141         int            io_cycle_counter; // cycles left\r
142 \r
143         unsigned int   Opcode;\r
144         signed int     cycles_needed;\r
145 \r
146         unsigned short *PC;\r
147         uintptr_t      BasePC;\r
148         unsigned int   flag_C;\r
149         unsigned int   flag_V;\r
150         unsigned int   flag_NotZ;\r
151         unsigned int   flag_N;\r
152         unsigned int   flag_X;\r
153         unsigned int   flag_T;\r
154         unsigned int   flag_S;\r
155         unsigned int   flag_I;\r
156 \r
157         unsigned char  not_polling;\r
158         unsigned char  pad[3];\r
159 \r
160         uintptr_t      Fetch[M68K_FETCHBANK1];\r
161 } M68K_CONTEXT;\r
162 \r
163 typedef enum\r
164 {\r
165         fm68k_reason_emulate = 0,\r
166         fm68k_reason_init,\r
167         fm68k_reason_idle_install,\r
168         fm68k_reason_idle_remove,\r
169 } fm68k_call_reason;\r
170 \r
171 /************************/\r
172 /* Function definition  */\r
173 /************************/\r
174 \r
175 /* General purpose functions */\r
176 void fm68k_init(void);\r
177 int  fm68k_reset(M68K_CONTEXT *ctx);\r
178 int  fm68k_emulate(M68K_CONTEXT *ctx, int n, fm68k_call_reason reason);\r
179 int  fm68k_would_interrupt(M68K_CONTEXT *ctx); // to be called from fm68k_emulate()\r
180 \r
181 u32 fm68k_get_pc(const M68K_CONTEXT *ctx);\r
182 \r
183 // PICODRIVE_HACK\r
184 int fm68k_idle_install(void);\r
185 int fm68k_idle_remove(void);\r
186 \r
187 #ifdef __cplusplus\r
188 }\r
189 #endif\r
190 \r
191 #endif\r