-
Notifications
You must be signed in to change notification settings - Fork 0
/
cz80.h
262 lines (204 loc) · 6.66 KB
/
cz80.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
/********************************************************************************/
/* */
/* CZ80 include file */
/* C Z80 emulator version 0.92 */
/* Copyright 2004-2005 St�phane Dallongeville */
/* */
/********************************************************************************/
#ifndef _CZ80_H_
#define _CZ80_H_
#if defined(__cplusplus) && !defined(USE_CPLUS)
extern "C" {
#endif
/******************************/
/* Compiler dependant defines */
/******************************/
#ifndef u8
#define u8 unsigned char
#endif
#ifndef s8
#define s8 char
#endif
#ifndef u16
#define u16 unsigned short
#endif
#ifndef s16
#define s16 short
#endif
#ifndef u32
#define u32 unsigned int
#endif
#ifndef s32
#define s32 int
#endif
//#define CZ80_FASTCALL __fastcall
#define CZ80_FASTCALL
/*************************************/
/* Z80 core Structures & definitions */
/*************************************/
#define CZ80_FETCH_BITS 4 // [4-12] default = 8
#define CZ80_FETCH_SFT (16 - CZ80_FETCH_BITS)
#define CZ80_FETCH_BANK (1 << CZ80_FETCH_BITS)
#define CZ80_LITTLE_ENDIAN 1
#define CZ80_USE_JUMPTABLE 1
#define CZ80_IRQ_CYCLES 1
#define CZ80_SIZE_OPT 1
#define CZ80_USE_WORD_HANDLER 0
#define CZ80_EXACT 0
#define CZ80_DEBUG 0
//use MAME's change_pc function or internal?
//#define CZ80_USE_MAME_CHANGE_PC
#define CZ80_SF_SFT 7
#define CZ80_ZF_SFT 6
#define CZ80_YF_SFT 5
#define CZ80_HF_SFT 4
#define CZ80_XF_SFT 3
#define CZ80_PF_SFT 2
#define CZ80_VF_SFT 2
#define CZ80_NF_SFT 1
#define CZ80_CF_SFT 0
#define CZ80_SF (1 << CZ80_SF_SFT)
#define CZ80_ZF (1 << CZ80_ZF_SFT)
#define CZ80_YF (1 << CZ80_YF_SFT)
#define CZ80_HF (1 << CZ80_HF_SFT)
#define CZ80_XF (1 << CZ80_XF_SFT)
#define CZ80_PF (1 << CZ80_PF_SFT)
#define CZ80_VF (1 << CZ80_VF_SFT)
#define CZ80_NF (1 << CZ80_NF_SFT)
#define CZ80_CF (1 << CZ80_CF_SFT)
#define CZ80_IFF_SFT CZ80_PF_SFT
#define CZ80_IFF CZ80_PF
#define CZ80_HAS_INT CZ80_IFF
#define CZ80_HAS_NMI 0x08
#define CZ80_RUNNING 0x10
#define CZ80_HALTED 0x20
#define CZ80_FAULTED 0x80
#define CZ80_DISABLE 0x40
typedef u32 CZ80_FASTCALL CZ80_READ(u32 adr);
typedef void CZ80_FASTCALL CZ80_WRITE(u32 adr, u32 data);
typedef void CZ80_FASTCALL CZ80_RETI_CALLBACK();
typedef s32 CZ80_FASTCALL CZ80_INT_CALLBACK(s32 param);
typedef union
{
u8 B;
s8 SB;
} union8;
typedef union
{
struct
{
#if CZ80_LITTLE_ENDIAN
u8 L;
u8 H;
#else
u8 H;
u8 L;
#endif
} B;
struct
{
#if CZ80_LITTLE_ENDIAN
s8 L;
s8 H;
#else
s8 H;
s8 L;
#endif
} SB;
u16 W;
s16 SW;
} union16;
typedef struct
{
union
{
u8 r8[8];
union16 r16[4];
struct
{
union16 BC; // 32 bytes aligned
union16 DE;
union16 HL;
union16 FA;
};
};
union16 IX;
union16 IY;
union16 SP;
u8 *PC;
union16 BC2;
union16 DE2;
union16 HL2;
union16 FA2;
union16 R;
union16 IFF;
u8 I;
u8 IM;
u8 IntVect;
u8 Status;
u32 BasePC;
u32 CycleIO;
u32 CycleToDo; // 32 bytes aligned
u32 CycleSup;
} cz80_struc;
/*************************/
/* Publics Z80 variables */
/*************************/
//extern cz80_struc CZ80;
/*************************/
/* Publics Z80 functions */
/*************************/
void Cz80_Init(cz80_struc *cpu);
u32 Cz80_Reset(cz80_struc *cpu);
u32 Cz80_Read_Byte(cz80_struc *cpu, u32 adr);
u32 Cz80_Read_Word(cz80_struc *cpu, u32 adr);
void Cz80_Write_Byte(cz80_struc *cpu, u32 adr, u32 data);
void Cz80_Write_Word(cz80_struc *cpu, u32 adr, u32 data);
void CZ80_FASTCALL Cz80_Enable(cz80_struc *cpu);
void CZ80_FASTCALL Cz80_Disable(cz80_struc *cpu);
s32 CZ80_FASTCALL Cz80_Exec(cz80_struc *cpu, s32 cycles);
void CZ80_FASTCALL Cz80_Set_IRQ(cz80_struc *cpu, s32 vector);
void CZ80_FASTCALL Cz80_Set_NMI(cz80_struc *cpu);
void CZ80_FASTCALL Cz80_Clear_IRQ(cz80_struc *cpu);
void CZ80_FASTCALL Cz80_Clear_NMI(cz80_struc *cpu);
s32 CZ80_FASTCALL Cz80_Get_CycleToDo(cz80_struc *cpu);
s32 CZ80_FASTCALL Cz80_Get_CycleRemaining(cz80_struc *cpu);
s32 CZ80_FASTCALL Cz80_Get_CycleDone(cz80_struc *cpu);
void CZ80_FASTCALL Cz80_End_Execute(cz80_struc *cpu);
void CZ80_FASTCALL Cz80_Waste_Cycle(cz80_struc *cpu, s32 cycle);
u32 CZ80_FASTCALL Cz80_Get_BC(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_DE(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_HL(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_AF(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_BC2(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_DE2(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_HL2(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_AF2(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_IX(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_IY(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_SP(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_PC(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_R(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_IFF(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_IM(cz80_struc *cpu);
u32 CZ80_FASTCALL Cz80_Get_I(cz80_struc *cpu);
void CZ80_FASTCALL Cz80_Set_BC(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_DE(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_HL(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_AF(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_BC2(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_DE2(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_HL2(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_AF2(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_IX(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_IY(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_SP(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_PC(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_R(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_IFF(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_IM(cz80_struc *cpu, u32 value);
void CZ80_FASTCALL Cz80_Set_I(cz80_struc *cpu, u32 value);
#if defined(__cplusplus) && !defined(USE_CPLUS)
};
#endif
#endif // _CZ80_H_