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