improve 64bit portability
[picodrive.git] / cpu / cz80 / cz80.h
1 /******************************************************************************\r
2  *\r
3  * CZ80 (Z80 CPU emulator) version 0.9\r
4  * Compiled with Dev-C++\r
5  * Copyright 2004-2005 Stéphane Dallongeville\r
6  *\r
7  * (Modified by NJ)\r
8  *\r
9  *****************************************************************************/\r
10 \r
11 #ifndef CZ80_H\r
12 #define CZ80_H\r
13 \r
14 // uintptr_t\r
15 #include <stdlib.h>\r
16 #ifndef _MSC_VER\r
17 #include <stdint.h>\r
18 #endif\r
19 \r
20 #ifdef __cplusplus\r
21 extern "C" {\r
22 #endif\r
23 \r
24 /******************************/\r
25 /* Compiler dependant defines */\r
26 /******************************/\r
27 \r
28 #ifndef UINT8\r
29 #define UINT8   unsigned char\r
30 #endif\r
31 \r
32 #ifndef INT8\r
33 #define INT8    signed char\r
34 #endif\r
35 \r
36 #ifndef UINT16\r
37 #define UINT16  unsigned short\r
38 #endif\r
39 \r
40 #ifndef INT16\r
41 #define INT16   signed short\r
42 #endif\r
43 \r
44 #ifndef UINT32\r
45 #define UINT32  unsigned int\r
46 #endif\r
47 \r
48 #ifndef INT32\r
49 #define INT32   signed int\r
50 #endif\r
51 \r
52 #ifndef FPTR\r
53 #define FPTR    uintptr_t\r
54 #endif\r
55 \r
56 /*************************************/\r
57 /* Z80 core Structures & definitions */\r
58 /*************************************/\r
59 \r
60 #define CZ80_FETCH_BITS                 4   // [4-12]   default = 8\r
61 \r
62 #define CZ80_FETCH_SFT                  (16 - CZ80_FETCH_BITS)\r
63 #define CZ80_FETCH_BANK                 (1 << CZ80_FETCH_BITS)\r
64 \r
65 #define PICODRIVE_HACKS         1\r
66 #define CZ80_LITTLE_ENDIAN              1\r
67 #define CZ80_USE_JUMPTABLE              1\r
68 #define CZ80_BIG_FLAGS_ARRAY    1\r
69 //#ifdef BUILD_CPS1PSP\r
70 //#define CZ80_ENCRYPTED_ROM            1\r
71 //#else\r
72 #define CZ80_ENCRYPTED_ROM              0\r
73 //#endif\r
74 #define CZ80_EMULATE_R_EXACTLY  1\r
75 \r
76 #define zR8(A)          (*CPU->pzR8[A])\r
77 #define zR16(A)         (CPU->pzR16[A]->W)\r
78 \r
79 #define pzAF            &(CPU->AF)\r
80 #define zAF                     CPU->AF.W\r
81 #define zlAF            CPU->AF.B.L\r
82 #define zhAF            CPU->AF.B.H\r
83 #define zA                      zhAF\r
84 #define zF                      zlAF\r
85 \r
86 #define pzBC            &(CPU->BC)\r
87 #define zBC                     CPU->BC.W\r
88 #define zlBC            CPU->BC.B.L\r
89 #define zhBC            CPU->BC.B.H\r
90 #define zB                      zhBC\r
91 #define zC                      zlBC\r
92 \r
93 #define pzDE            &(CPU->DE)\r
94 #define zDE                     CPU->DE.W\r
95 #define zlDE            CPU->DE.B.L\r
96 #define zhDE            CPU->DE.B.H\r
97 #define zD                      zhDE\r
98 #define zE                      zlDE\r
99 \r
100 #define pzHL            &(CPU->HL)\r
101 #define zHL                     CPU->HL.W\r
102 #define zlHL            CPU->HL.B.L\r
103 #define zhHL            CPU->HL.B.H\r
104 #define zH                      zhHL\r
105 #define zL                      zlHL\r
106 \r
107 #define zAF2            CPU->AF2.W\r
108 #define zlAF2           CPU->AF2.B.L\r
109 #define zhAF2           CPU->AF2.B.H\r
110 #define zA2                     zhAF2\r
111 #define zF2                     zlAF2\r
112 \r
113 #define zBC2            CPU->BC2.W\r
114 #define zDE2            CPU->DE2.W\r
115 #define zHL2            CPU->HL2.W\r
116 \r
117 #define pzIX            &(CPU->IX)\r
118 #define zIX                     CPU->IX.W\r
119 #define zlIX            CPU->IX.B.L\r
120 #define zhIX            CPU->IX.B.H\r
121 \r
122 #define pzIY            &(CPU->IY)\r
123 #define zIY                     CPU->IY.W\r
124 #define zlIY            CPU->IY.B.L\r
125 #define zhIY            CPU->IY.B.H\r
126 \r
127 #define pzSP            &(CPU->SP)\r
128 #define zSP                     CPU->SP.W\r
129 #define zlSP            CPU->SP.B.L\r
130 #define zhSP            CPU->SP.B.H\r
131 \r
132 #define zRealPC         (PC - CPU->BasePC)\r
133 #define zPC                     PC\r
134 \r
135 #define zI                      CPU->I\r
136 #define zIM                     CPU->IM\r
137 \r
138 #define zwR                     CPU->R.W\r
139 #define zR1                     CPU->R.B.L\r
140 #define zR2                     CPU->R.B.H\r
141 #define zR                      zR1\r
142 \r
143 #define zIFF            CPU->IFF.W\r
144 #define zIFF1           CPU->IFF.B.L\r
145 #define zIFF2           CPU->IFF.B.H\r
146 \r
147 #define CZ80_SF_SFT      7\r
148 #define CZ80_ZF_SFT      6\r
149 #define CZ80_YF_SFT      5\r
150 #define CZ80_HF_SFT      4\r
151 #define CZ80_XF_SFT      3\r
152 #define CZ80_PF_SFT      2\r
153 #define CZ80_VF_SFT      2\r
154 #define CZ80_NF_SFT      1\r
155 #define CZ80_CF_SFT      0\r
156 \r
157 #define CZ80_SF         (1 << CZ80_SF_SFT)\r
158 #define CZ80_ZF         (1 << CZ80_ZF_SFT)\r
159 #define CZ80_YF         (1 << CZ80_YF_SFT)\r
160 #define CZ80_HF         (1 << CZ80_HF_SFT)\r
161 #define CZ80_XF         (1 << CZ80_XF_SFT)\r
162 #define CZ80_PF         (1 << CZ80_PF_SFT)\r
163 #define CZ80_VF         (1 << CZ80_VF_SFT)\r
164 #define CZ80_NF         (1 << CZ80_NF_SFT)\r
165 #define CZ80_CF         (1 << CZ80_CF_SFT)\r
166 \r
167 #define CZ80_IFF_SFT    CZ80_PF_SFT\r
168 #define CZ80_IFF                CZ80_PF\r
169 \r
170 #ifndef IRQ_LINE_STATE\r
171 #define IRQ_LINE_STATE\r
172 #define CLEAR_LINE              0               /* clear (a fired, held or pulsed) line */\r
173 #define ASSERT_LINE             1               /* assert an interrupt immediately */\r
174 #define HOLD_LINE               2               /* hold interrupt line until acknowledged */\r
175 #define PULSE_LINE              3               /* pulse interrupt line for one instruction */\r
176 #define IRQ_LINE_NMI    127             /* IRQ line for NMIs */\r
177 #endif\r
178 \r
179 enum\r
180 {\r
181         CZ80_PC = 1,\r
182         CZ80_SP,\r
183         CZ80_AF,\r
184         CZ80_BC,\r
185         CZ80_DE,\r
186         CZ80_HL,\r
187         CZ80_IX,\r
188         CZ80_IY,\r
189         CZ80_AF2,\r
190         CZ80_BC2,\r
191         CZ80_DE2,\r
192         CZ80_HL2,\r
193         CZ80_R,\r
194         CZ80_I,\r
195         CZ80_IM,\r
196         CZ80_IFF1,\r
197         CZ80_IFF2,\r
198         CZ80_HALT,\r
199         CZ80_IRQ\r
200 };\r
201 \r
202 typedef union\r
203 {\r
204         struct\r
205         {\r
206 #if CZ80_LITTLE_ENDIAN\r
207                 UINT8 L;\r
208                 UINT8 H;\r
209 #else\r
210                 UINT8 H;\r
211                 UINT8 L;\r
212 #endif\r
213         } B;\r
214         UINT16 W;\r
215 } union16;\r
216 \r
217 typedef struct cz80_t\r
218 {\r
219         union\r
220         {\r
221                 UINT8 r8[8];\r
222                 union16 r16[4];\r
223                 struct\r
224                 {\r
225                         union16 BC;\r
226                         union16 DE;\r
227                         union16 HL;\r
228                         union16 AF;\r
229                 };\r
230         };\r
231 \r
232         union16 IX;\r
233         union16 IY;\r
234         union16 SP;\r
235         UINT32 unusedPC;        /* left for binary compat */\r
236 \r
237         union16 BC2;\r
238         union16 DE2;\r
239         union16 HL2;\r
240         union16 AF2;\r
241 \r
242         union16 R;\r
243         union16 IFF;\r
244 \r
245         UINT8 I;\r
246         UINT8 IM;\r
247         UINT8 HaltState;\r
248         UINT8 dummy;\r
249 \r
250         INT32 IRQLine;\r
251         INT32 IRQState;\r
252         INT32 ICount;\r
253         INT32 ExtraCycles;\r
254 \r
255         FPTR BasePC;\r
256         FPTR PC;\r
257         FPTR Fetch[CZ80_FETCH_BANK];\r
258 #if CZ80_ENCRYPTED_ROM\r
259         FPTR OPBase;\r
260         FPTR OPFetch[CZ80_FETCH_BANK];\r
261 #endif\r
262 \r
263         UINT8 *pzR8[8];\r
264         union16 *pzR16[4];\r
265 \r
266         UINT8   (*Read_Byte)(UINT32 address);\r
267         void (*Write_Byte)(UINT32 address, UINT8 data);\r
268 \r
269         UINT8   (*IN_Port)(UINT16 port);\r
270         void (*OUT_Port)(UINT16 port, UINT8 value);\r
271 \r
272         INT32  (*Interrupt_Callback)(INT32 irqline);\r
273 \r
274 } cz80_struc;\r
275 \r
276 \r
277 /*************************/\r
278 /* Publics Z80 variables */\r
279 /*************************/\r
280 \r
281 extern cz80_struc CZ80;\r
282 \r
283 /*************************/\r
284 /* Publics Z80 functions */\r
285 /*************************/\r
286 \r
287 void Cz80_Init(cz80_struc *CPU);\r
288 \r
289 void Cz80_Reset(cz80_struc *CPU);\r
290 \r
291 INT32  Cz80_Exec(cz80_struc *CPU, INT32 cycles);\r
292 \r
293 void Cz80_Set_IRQ(cz80_struc *CPU, INT32 line, INT32 state);\r
294 \r
295 UINT32  Cz80_Get_Reg(cz80_struc *CPU, INT32 regnum);\r
296 void Cz80_Set_Reg(cz80_struc *CPU, INT32 regnum, UINT32 value);\r
297 \r
298 void Cz80_Set_Fetch(cz80_struc *CPU, UINT32 low_adr, UINT32 high_adr, FPTR fetch_adr);\r
299 #if CZ80_ENCRYPTED_ROM\r
300 void Cz80_Set_Encrypt_Range(cz80_struc *CPU, UINT32 low_adr, UINT32 high_adr, UINT32 decrypted_rom);\r
301 #endif\r
302 \r
303 void Cz80_Set_ReadB(cz80_struc *CPU, UINT8 (*Func)(UINT32 address));\r
304 void Cz80_Set_WriteB(cz80_struc *CPU, void (*Func)(UINT32 address, UINT8 data));\r
305 \r
306 void Cz80_Set_INPort(cz80_struc *CPU, UINT8 (*Func)(UINT16 port));\r
307 void Cz80_Set_OUTPort(cz80_struc *CPU, void (*Func)(UINT16 port, UINT8 value));\r
308 \r
309 void Cz80_Set_IRQ_Callback(cz80_struc *CPU, INT32 (*Func)(INT32 irqline));\r
310 \r
311 #ifdef __cplusplus\r
312 };\r
313 #endif\r
314 \r
315 #endif  /* CZ80_H */\r