DGen/SDL
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
cz80.h
Go to the documentation of this file.
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 0
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  {
203  } name;
204  } creg;
205 
209  uint16_t PC;
210 
215 
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 
228  int CycleSup;
229 
230  void *ctx;
231 
234 #if CZ80_USE_WORD_HANDLER
235  CZ80_READ_WORD *Read_Word;
236  CZ80_WRITE_WORD *Write_Word;
237 #endif
238 
241 
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 
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);
290 
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_