1 /********************************************************************************/
2 /*                                                                              */
3 /* CZ80 include file                                                            */
4 /* C Z80 emulator version 0.91 	                                                */
5 /* Copyright 2004 Stephane Dallongeville                                        */
6 /*                                                                              */
7 /********************************************************************************/
8 
9 /*
10   2011-10-18: modified for DGen/SDL.
11 */
12 
13 #ifndef _CZ80_H_
14 #define _CZ80_H_
15 
16 #include <stdint.h>
17 
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21 
22 
23 
24 
25 /******************************/
26 /* Compiler dependant defines */
27 /******************************/
28 
29 #ifndef FASTCALL
30 #define FASTCALL
31 #endif
32 
33 
34 
35 /*************************************/
36 /* Z80 core Structures & definitions */
37 /*************************************/
38 
39 #define CZ80_FETCH_BITS         4   // [4-12]   default = 8
40 
41 #define CZ80_FETCH_SFT          (16 - CZ80_FETCH_BITS)
42 #define CZ80_FETCH_BANK         (1 << CZ80_FETCH_BITS)
43 
44 #ifdef WORDS_BIGENDIAN
45 #define CZ80_LITTLE_ENDIAN 0
46 #else
47 #define CZ80_LITTLE_ENDIAN      1
48 #endif
49 #define CZ80_USE_JUMPTABLE      0
50 #define CZ80_SIZE_OPT           0
51 #define CZ80_USE_WORD_HANDLER   1
52 #define CZ80_EXACT              1
53 #define CZ80_DEBUG              0
54 
55 // use zR8 for B/C/D/E/H/L registers only
56 // use zR16 for BC/DE/HL registers only
57 
58 #if CZ80_LITTLE_ENDIAN
59 #define zR8(A)          CPU->creg.r8[(A) ^ 1]
60 #else
61 #define zR8(A)          CPU->creg.r8[(A)]
62 #endif
63 #define zR16(A)         CPU->creg.r16[A].W
64 #define pzR16(A)        &(CPU->creg.r16[A])
65 
66 #define pzFA            &(CPU->creg.name.FA)
67 #define zFA             CPU->creg.name.FA.W
68 #define zlFA            CPU->creg.name.FA.B.L
69 #define zhFA            CPU->creg.name.FA.B.H
70 #define zA              zlFA
71 #define zF              zhFA
72 
73 #define pzBC            &(CPU->creg.name.BC)
74 #define zBC             CPU->creg.name.BC.W
75 #define zlBC            CPU->creg.name.BC.B.L
76 #define zhBC            CPU->creg.name.BC.B.H
77 #define zB              zhBC
78 #define zC              zlBC
79 
80 #define pzDE            &(CPU->creg.name.DE)
81 #define zDE             CPU->creg.name.DE.W
82 #define zlDE            CPU->creg.name.DE.B.L
83 #define zhDE            CPU->creg.name.DE.B.H
84 #define zD              zhDE
85 #define zE              zlDE
86 
87 #define pzHL            &(CPU->creg.name.HL)
88 #define zHL             CPU->creg.name.HL.W
89 #define zlHL            CPU->creg.name.HL.B.L
90 #define zhHL            CPU->creg.name.HL.B.H
91 #define zH              zhHL
92 #define zL              zlHL
93 
94 #define zFA2            CPU->FA2.W
95 #define zlFA2           CPU->FA2.B.L
96 #define zhFA2           CPU->FA2.B.H
97 #define zA2             zlFA2
98 #define zF2             zhFA2
99 
100 #define zBC2            CPU->BC2.W
101 #define zDE2            CPU->DE2.W
102 #define zHL2            CPU->HL2.W
103 
104 #define pzIX            &(CPU->IX)
105 #define zIX             CPU->IX.W
106 #define zlIX            CPU->IX.B.L
107 #define zhIX            CPU->IX.B.H
108 
109 #define pzIY            &(CPU->IY)
110 #define zIY             CPU->IY.W
111 #define zlIY            CPU->IY.B.L
112 #define zhIY            CPU->IY.B.H
113 
114 #define pzSP            &(CPU->SP)
115 #define zSP             CPU->SP.W
116 #define zlSP            CPU->SP.B.L
117 #define zhSP            CPU->SP.B.H
118 
119 #define zPC             PC
120 
121 #define zI              CPU->I
122 #define zIM             CPU->IM
123 
124 #define zwR             CPU->R.W
125 #define zR1             CPU->R.B.L
126 #define zR2             CPU->R.B.H
127 #define zR              zR1
128 
129 #define zIFF            CPU->IFF.W
130 #define zIFF1           CPU->IFF.B.L
131 #define zIFF2           CPU->IFF.B.H
132 
133 #define CZ80_SF_SFT     7
134 #define CZ80_ZF_SFT     6
135 #define CZ80_YF_SFT     5
136 #define CZ80_HF_SFT     4
137 #define CZ80_XF_SFT     3
138 #define CZ80_PF_SFT     2
139 #define CZ80_VF_SFT     2
140 #define CZ80_NF_SFT     1
141 #define CZ80_CF_SFT     0
142 
143 #define CZ80_SF         (1 << CZ80_SF_SFT)
144 #define CZ80_ZF         (1 << CZ80_ZF_SFT)
145 #define CZ80_YF         (1 << CZ80_YF_SFT)
146 #define CZ80_HF         (1 << CZ80_HF_SFT)
147 #define CZ80_XF         (1 << CZ80_XF_SFT)
148 #define CZ80_PF         (1 << CZ80_PF_SFT)
149 #define CZ80_VF         (1 << CZ80_VF_SFT)
150 #define CZ80_NF         (1 << CZ80_NF_SFT)
151 #define CZ80_CF         (1 << CZ80_CF_SFT)
152 
153 #define CZ80_IFF_SFT    CZ80_PF_SFT
154 #define CZ80_IFF        CZ80_PF
155 
156 #define CZ80_HAS_INT    CZ80_IFF
157 #define CZ80_HAS_NMI    0x08
158 
159 #define CZ80_RUNNING    0x10
160 #define CZ80_HALTED     0x20
161 #define CZ80_FAULTED    0x80
162 #define CZ80_DISABLE    0x40
163 
164 
165 typedef uint8_t FASTCALL CZ80_READ(void *ctx, uint16_t adr);
166 typedef void FASTCALL CZ80_WRITE(void *ctx, uint16_t adr, uint8_t data);
167 
168 #if CZ80_USE_WORD_HANDLER
169 typedef uint16_t FASTCALL CZ80_READ_WORD(void *ctx, uint16_t adr);
170 typedef void FASTCALL CZ80_WRITE_WORD(void *ctx, uint16_t adr, uint16_t data);
171 #endif
172 
173 typedef void FASTCALL CZ80_RETI_CALLBACK(void *ctx);
174 typedef uint8_t FASTCALL CZ80_INT_CALLBACK(void *ctx, uint8_t param);
175 
176 typedef union
177 {
178         struct
179         {
180 #if CZ80_LITTLE_ENDIAN
181                 uint8_t L;
182                 uint8_t H;
183 #else
184                 uint8_t H;
185                 uint8_t L;
186 #endif
187         } B;
188         uint16_t W;
189 } union16;
190 
191 typedef struct
192 {
193     union
194     {
195         uint8_t r8[8];
196         union16 r16[4];
197         struct
198         {
199             union16 BC;
200             union16 DE;
201             union16 HL;
202             union16 FA;
203         } name;
204     } creg;
205 
206     union16 IX;
207     union16 IY;
208     union16 SP;
209     uint16_t PC;
210 
211     union16 BC2;
212     union16 DE2;
213     union16 HL2;
214     union16 FA2;
215 
216         union16 R;
217         union16 IFF;
218 
219         uint8_t I;
220         uint8_t IM;
221         uint8_t IntVect;
222         uint8_t Status;
223 
224         uintptr_t BasePC;
225         int CycleIO;
226 
227         int CycleToDo;
228         int CycleSup;
229 
230 	void *ctx;
231 
232         CZ80_READ *Read_Byte;
233         CZ80_WRITE *Write_Byte;
234 #if CZ80_USE_WORD_HANDLER
235         CZ80_READ_WORD *Read_Word;
236         CZ80_WRITE_WORD *Write_Word;
237 #endif
238 
239         CZ80_READ *IN_Port;
240         CZ80_WRITE *OUT_Port;
241 
242         CZ80_RETI_CALLBACK *RetI;
243         CZ80_INT_CALLBACK *Interrupt_Ack;
244 
245         uint8_t *Fetch[CZ80_FETCH_BANK];
246 } cz80_struc;
247 
248 
249 /*************************/
250 /* Publics Z80 variables */
251 /*************************/
252 
253 extern cz80_struc CZ80;
254 
255 
256 /*************************/
257 /* Publics Z80 functions */
258 /*************************/
259 
260 void    Cz80_Init(cz80_struc *cpu);
261 uint8_t Cz80_Reset(cz80_struc *cpu);
262 
263 void    Cz80_Set_Fetch(cz80_struc *cpu, uint16_t low_adr, uint16_t high_adr, void *fetch_adr);
264 
265 void    Cz80_Set_Ctx(cz80_struc *cpu, void *ctx);
266 void    Cz80_Set_ReadB(cz80_struc *cpu, CZ80_READ *Func);
267 void    Cz80_Set_WriteB(cz80_struc *cpu, CZ80_WRITE *Func);
268 #if CZ80_USE_WORD_HANDLER
269 void    Cz80_Set_ReadW(cz80_struc *cpu, CZ80_READ_WORD *Func);
270 void    Cz80_Set_WriteW(cz80_struc *cpu, CZ80_WRITE_WORD *Func);
271 #endif
272 
273 void    Cz80_Set_INPort(cz80_struc *cpu, CZ80_READ *Func);
274 void    Cz80_Set_OUTPort(cz80_struc *cpu, CZ80_WRITE *Func);
275 
276 void    Cz80_Set_IRQ_Callback(cz80_struc *cpu, CZ80_INT_CALLBACK *Func);
277 void    Cz80_Set_RETI_Callback(cz80_struc *cpu, CZ80_RETI_CALLBACK *Func);
278 
279 uint8_t Cz80_Read_Byte(cz80_struc *cpu, uint16_t adr);
280 uint16_t Cz80_Read_Word(cz80_struc *cpu, uint16_t adr);
281 void    Cz80_Write_Byte(cz80_struc *cpu, uint16_t adr, uint8_t data);
282 void    Cz80_Write_Word(cz80_struc *cpu, uint16_t adr, uint16_t data);
283 
284 int     FASTCALL Cz80_Exec(cz80_struc *cpu, int cycles);
285 
286 void    FASTCALL Cz80_Set_IRQ(cz80_struc *cpu, uint8_t vector);
287 void    FASTCALL Cz80_Set_NMI(cz80_struc *cpu);
288 void    FASTCALL Cz80_Clear_IRQ(cz80_struc *cpu);
289 void    FASTCALL Cz80_Clear_NMI(cz80_struc *cpu);
290 
291 int     FASTCALL Cz80_Get_CycleToDo(cz80_struc *cpu);
292 int     FASTCALL Cz80_Get_CycleRemaining(cz80_struc *cpu);
293 int     FASTCALL Cz80_Get_CycleDone(cz80_struc *cpu);
294 void    FASTCALL Cz80_Release_Cycle(cz80_struc *cpu);
295 void    FASTCALL Cz80_Add_Cycle(cz80_struc *cpu, unsigned int cycle);
296 
297 uint16_t     FASTCALL Cz80_Get_BC(cz80_struc *cpu);
298 uint16_t     FASTCALL Cz80_Get_DE(cz80_struc *cpu);
299 uint16_t     FASTCALL Cz80_Get_HL(cz80_struc *cpu);
300 uint16_t     FASTCALL Cz80_Get_AF(cz80_struc *cpu);
301 
302 uint16_t     FASTCALL Cz80_Get_BC2(cz80_struc *cpu);
303 uint16_t     FASTCALL Cz80_Get_DE2(cz80_struc *cpu);
304 uint16_t     FASTCALL Cz80_Get_HL2(cz80_struc *cpu);
305 uint16_t     FASTCALL Cz80_Get_AF2(cz80_struc *cpu);
306 
307 uint16_t     FASTCALL Cz80_Get_IX(cz80_struc *cpu);
308 uint16_t     FASTCALL Cz80_Get_IY(cz80_struc *cpu);
309 uint16_t     FASTCALL Cz80_Get_SP(cz80_struc *cpu);
310 uint16_t     FASTCALL Cz80_Get_PC(cz80_struc *cpu);
311 
312 uint16_t     FASTCALL Cz80_Get_R(cz80_struc *cpu);
313 uint16_t     FASTCALL Cz80_Get_IFF(cz80_struc *cpu);
314 uint8_t      FASTCALL Cz80_Get_IM(cz80_struc *cpu);
315 uint8_t      FASTCALL Cz80_Get_I(cz80_struc *cpu);
316 
317 void    FASTCALL Cz80_Set_BC(cz80_struc *cpu, uint16_t value);
318 void    FASTCALL Cz80_Set_DE(cz80_struc *cpu, uint16_t value);
319 void    FASTCALL Cz80_Set_HL(cz80_struc *cpu, uint16_t value);
320 void    FASTCALL Cz80_Set_AF(cz80_struc *cpu, uint16_t value);
321 
322 void    FASTCALL Cz80_Set_BC2(cz80_struc *cpu, uint16_t value);
323 void    FASTCALL Cz80_Set_DE2(cz80_struc *cpu, uint16_t value);
324 void    FASTCALL Cz80_Set_HL2(cz80_struc *cpu, uint16_t value);
325 void    FASTCALL Cz80_Set_AF2(cz80_struc *cpu, uint16_t value);
326 
327 void    FASTCALL Cz80_Set_IX(cz80_struc *cpu, uint16_t value);
328 void    FASTCALL Cz80_Set_IY(cz80_struc *cpu, uint16_t value);
329 void    FASTCALL Cz80_Set_SP(cz80_struc *cpu, uint16_t value);
330 void    FASTCALL Cz80_Set_PC(cz80_struc *cpu, uint16_t value);
331 
332 void    FASTCALL Cz80_Set_R(cz80_struc *cpu, uint16_t value);
333 void    FASTCALL Cz80_Set_IFF(cz80_struc *cpu, uint16_t value);
334 void    FASTCALL Cz80_Set_IM(cz80_struc *cpu, uint8_t value);
335 void    FASTCALL Cz80_Set_I(cz80_struc *cpu, uint8_t value);
336 
337 #ifdef __cplusplus
338 }
339 #endif
340 
341 #endif  // _CZ80_H_
342