improve 64bit portability
[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 typedef union\r
102 {\r
103         unsigned char B;\r
104         signed char SB;\r
105         unsigned short W;\r
106         signed short SW;\r
107         unsigned int D;\r
108         signed int SD;\r
109 } famec_union32;\r
110 \r
111 /* M68K CPU CONTEXT */\r
112 typedef struct\r
113 {\r
114         unsigned int   (*read_byte )(unsigned int a);\r
115         unsigned int   (*read_word )(unsigned int a);\r
116         unsigned int   (*read_long )(unsigned int a);\r
117         void           (*write_byte)(unsigned int a,unsigned char  d);\r
118         void           (*write_word)(unsigned int a,unsigned short d);\r
119         void           (*write_long)(unsigned int a,unsigned int   d);\r
120         void           (*reset_handler)(void);\r
121         void           (*iack_handler)(unsigned level);\r
122         famec_union32  dreg[8];\r
123         famec_union32  areg[8];\r
124         unsigned       asp;\r
125         unsigned       pc;\r
126         unsigned char  interrupts[8];\r
127         unsigned short sr;\r
128         unsigned short execinfo;\r
129         // PD extension\r
130         int            io_cycle_counter; // cycles left\r
131 \r
132         unsigned int   Opcode;\r
133         signed int     cycles_needed;\r
134 \r
135         unsigned short *PC;\r
136         uintptr_t      BasePC;\r
137         unsigned int   flag_C;\r
138         unsigned int   flag_V;\r
139         unsigned int   flag_NotZ;\r
140         unsigned int   flag_N;\r
141         unsigned int   flag_X;\r
142         unsigned int   flag_T;\r
143         unsigned int   flag_S;\r
144         unsigned int   flag_I;\r
145 \r
146         unsigned char  not_polling;\r
147         unsigned char  pad[3];\r
148 \r
149         uintptr_t      Fetch[M68K_FETCHBANK1];\r
150 } M68K_CONTEXT;\r
151 \r
152 typedef enum\r
153 {\r
154         fm68k_reason_emulate = 0,\r
155         fm68k_reason_init,\r
156         fm68k_reason_idle_install,\r
157         fm68k_reason_idle_remove,\r
158 } fm68k_call_reason;\r
159 \r
160 /************************/\r
161 /* Function definition  */\r
162 /************************/\r
163 \r
164 /* General purpose functions */\r
165 void fm68k_init(void);\r
166 int  fm68k_reset(M68K_CONTEXT *ctx);\r
167 int  fm68k_emulate(M68K_CONTEXT *ctx, int n, fm68k_call_reason reason);\r
168 int  fm68k_would_interrupt(M68K_CONTEXT *ctx); // to be called from fm68k_emulate()\r
169 \r
170 unsigned int fm68k_get_pc(const M68K_CONTEXT *ctx);\r
171 \r
172 // PICODRIVE_HACK\r
173 int fm68k_idle_install(void);\r
174 int fm68k_idle_remove(void);\r
175 \r
176 #ifdef __cplusplus\r
177 }\r
178 #endif\r
179 \r
180 #endif\r