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