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