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