forked from KolibriOS/kolibrios
342 lines
9.7 KiB
C
342 lines
9.7 KiB
C
|
/********************************************************************************/
|
||
|
/* */
|
||
|
/* CZ80 include file */
|
||
|
/* C Z80 emulator version 0.91 */
|
||
|
/* Copyright 2004 Stephane Dallongeville */
|
||
|
/* */
|
||
|
/********************************************************************************/
|
||
|
|
||
|
/*
|
||
|
2011-10-18: modified for DGen/SDL.
|
||
|
*/
|
||
|
|
||
|
#ifndef _CZ80_H_
|
||
|
#define _CZ80_H_
|
||
|
|
||
|
#include <stdint.h>
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/******************************/
|
||
|
/* Compiler dependant defines */
|
||
|
/******************************/
|
||
|
|
||
|
#ifndef FASTCALL
|
||
|
#define FASTCALL
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
/*************************************/
|
||
|
/* 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)
|
||
|
|
||
|
#ifdef WORDS_BIGENDIAN
|
||
|
#define CZ80_LITTLE_ENDIAN 0
|
||
|
#else
|
||
|
#define CZ80_LITTLE_ENDIAN 1
|
||
|
#endif
|
||
|
#define CZ80_USE_JUMPTABLE 0
|
||
|
#define CZ80_SIZE_OPT 0
|
||
|
#define CZ80_USE_WORD_HANDLER 1
|
||
|
#define CZ80_EXACT 1
|
||
|
#define CZ80_DEBUG 0
|
||
|
|
||
|
// use zR8 for B/C/D/E/H/L registers only
|
||
|
// use zR16 for BC/DE/HL registers only
|
||
|
|
||
|
#if CZ80_LITTLE_ENDIAN
|
||
|
#define zR8(A) CPU->creg.r8[(A) ^ 1]
|
||
|
#else
|
||
|
#define zR8(A) CPU->creg.r8[(A)]
|
||
|
#endif
|
||
|
#define zR16(A) CPU->creg.r16[A].W
|
||
|
#define pzR16(A) &(CPU->creg.r16[A])
|
||
|
|
||
|
#define pzFA &(CPU->creg.name.FA)
|
||
|
#define zFA CPU->creg.name.FA.W
|
||
|
#define zlFA CPU->creg.name.FA.B.L
|
||
|
#define zhFA CPU->creg.name.FA.B.H
|
||
|
#define zA zlFA
|
||
|
#define zF zhFA
|
||
|
|
||
|
#define pzBC &(CPU->creg.name.BC)
|
||
|
#define zBC CPU->creg.name.BC.W
|
||
|
#define zlBC CPU->creg.name.BC.B.L
|
||
|
#define zhBC CPU->creg.name.BC.B.H
|
||
|
#define zB zhBC
|
||
|
#define zC zlBC
|
||
|
|
||
|
#define pzDE &(CPU->creg.name.DE)
|
||
|
#define zDE CPU->creg.name.DE.W
|
||
|
#define zlDE CPU->creg.name.DE.B.L
|
||
|
#define zhDE CPU->creg.name.DE.B.H
|
||
|
#define zD zhDE
|
||
|
#define zE zlDE
|
||
|
|
||
|
#define pzHL &(CPU->creg.name.HL)
|
||
|
#define zHL CPU->creg.name.HL.W
|
||
|
#define zlHL CPU->creg.name.HL.B.L
|
||
|
#define zhHL CPU->creg.name.HL.B.H
|
||
|
#define zH zhHL
|
||
|
#define zL zlHL
|
||
|
|
||
|
#define zFA2 CPU->FA2.W
|
||
|
#define zlFA2 CPU->FA2.B.L
|
||
|
#define zhFA2 CPU->FA2.B.H
|
||
|
#define zA2 zlFA2
|
||
|
#define zF2 zhFA2
|
||
|
|
||
|
#define zBC2 CPU->BC2.W
|
||
|
#define zDE2 CPU->DE2.W
|
||
|
#define zHL2 CPU->HL2.W
|
||
|
|
||
|
#define pzIX &(CPU->IX)
|
||
|
#define zIX CPU->IX.W
|
||
|
#define zlIX CPU->IX.B.L
|
||
|
#define zhIX CPU->IX.B.H
|
||
|
|
||
|
#define pzIY &(CPU->IY)
|
||
|
#define zIY CPU->IY.W
|
||
|
#define zlIY CPU->IY.B.L
|
||
|
#define zhIY CPU->IY.B.H
|
||
|
|
||
|
#define pzSP &(CPU->SP)
|
||
|
#define zSP CPU->SP.W
|
||
|
#define zlSP CPU->SP.B.L
|
||
|
#define zhSP CPU->SP.B.H
|
||
|
|
||
|
#define zPC PC
|
||
|
|
||
|
#define zI CPU->I
|
||
|
#define zIM CPU->IM
|
||
|
|
||
|
#define zwR CPU->R.W
|
||
|
#define zR1 CPU->R.B.L
|
||
|
#define zR2 CPU->R.B.H
|
||
|
#define zR zR1
|
||
|
|
||
|
#define zIFF CPU->IFF.W
|
||
|
#define zIFF1 CPU->IFF.B.L
|
||
|
#define zIFF2 CPU->IFF.B.H
|
||
|
|
||
|
#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 uint8_t FASTCALL CZ80_READ(void *ctx, uint16_t adr);
|
||
|
typedef void FASTCALL CZ80_WRITE(void *ctx, uint16_t adr, uint8_t data);
|
||
|
|
||
|
#if CZ80_USE_WORD_HANDLER
|
||
|
typedef uint16_t FASTCALL CZ80_READ_WORD(void *ctx, uint16_t adr);
|
||
|
typedef void FASTCALL CZ80_WRITE_WORD(void *ctx, uint16_t adr, uint16_t data);
|
||
|
#endif
|
||
|
|
||
|
typedef void FASTCALL CZ80_RETI_CALLBACK(void *ctx);
|
||
|
typedef uint8_t FASTCALL CZ80_INT_CALLBACK(void *ctx, uint8_t param);
|
||
|
|
||
|
typedef union
|
||
|
{
|
||
|
struct
|
||
|
{
|
||
|
#if CZ80_LITTLE_ENDIAN
|
||
|
uint8_t L;
|
||
|
uint8_t H;
|
||
|
#else
|
||
|
uint8_t H;
|
||
|
uint8_t L;
|
||
|
#endif
|
||
|
} B;
|
||
|
uint16_t W;
|
||
|
} union16;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
union
|
||
|
{
|
||
|
uint8_t r8[8];
|
||
|
union16 r16[4];
|
||
|
struct
|
||
|
{
|
||
|
union16 BC;
|
||
|
union16 DE;
|
||
|
union16 HL;
|
||
|
union16 FA;
|
||
|
} name;
|
||
|
} creg;
|
||
|
|
||
|
union16 IX;
|
||
|
union16 IY;
|
||
|
union16 SP;
|
||
|
uint16_t PC;
|
||
|
|
||
|
union16 BC2;
|
||
|
union16 DE2;
|
||
|
union16 HL2;
|
||
|
union16 FA2;
|
||
|
|
||
|
union16 R;
|
||
|
union16 IFF;
|
||
|
|
||
|
uint8_t I;
|
||
|
uint8_t IM;
|
||
|
uint8_t IntVect;
|
||
|
uint8_t Status;
|
||
|
|
||
|
uintptr_t BasePC;
|
||
|
int CycleIO;
|
||
|
|
||
|
int CycleToDo;
|
||
|
int CycleSup;
|
||
|
|
||
|
void *ctx;
|
||
|
|
||
|
CZ80_READ *Read_Byte;
|
||
|
CZ80_WRITE *Write_Byte;
|
||
|
#if CZ80_USE_WORD_HANDLER
|
||
|
CZ80_READ_WORD *Read_Word;
|
||
|
CZ80_WRITE_WORD *Write_Word;
|
||
|
#endif
|
||
|
|
||
|
CZ80_READ *IN_Port;
|
||
|
CZ80_WRITE *OUT_Port;
|
||
|
|
||
|
CZ80_RETI_CALLBACK *RetI;
|
||
|
CZ80_INT_CALLBACK *Interrupt_Ack;
|
||
|
|
||
|
uint8_t *Fetch[CZ80_FETCH_BANK];
|
||
|
} cz80_struc;
|
||
|
|
||
|
|
||
|
/*************************/
|
||
|
/* Publics Z80 variables */
|
||
|
/*************************/
|
||
|
|
||
|
extern cz80_struc CZ80;
|
||
|
|
||
|
|
||
|
/*************************/
|
||
|
/* Publics Z80 functions */
|
||
|
/*************************/
|
||
|
|
||
|
void Cz80_Init(cz80_struc *cpu);
|
||
|
uint8_t Cz80_Reset(cz80_struc *cpu);
|
||
|
|
||
|
void Cz80_Set_Fetch(cz80_struc *cpu, uint16_t low_adr, uint16_t high_adr, void *fetch_adr);
|
||
|
|
||
|
void Cz80_Set_Ctx(cz80_struc *cpu, void *ctx);
|
||
|
void Cz80_Set_ReadB(cz80_struc *cpu, CZ80_READ *Func);
|
||
|
void Cz80_Set_WriteB(cz80_struc *cpu, CZ80_WRITE *Func);
|
||
|
#if CZ80_USE_WORD_HANDLER
|
||
|
void Cz80_Set_ReadW(cz80_struc *cpu, CZ80_READ_WORD *Func);
|
||
|
void Cz80_Set_WriteW(cz80_struc *cpu, CZ80_WRITE_WORD *Func);
|
||
|
#endif
|
||
|
|
||
|
void Cz80_Set_INPort(cz80_struc *cpu, CZ80_READ *Func);
|
||
|
void Cz80_Set_OUTPort(cz80_struc *cpu, CZ80_WRITE *Func);
|
||
|
|
||
|
void Cz80_Set_IRQ_Callback(cz80_struc *cpu, CZ80_INT_CALLBACK *Func);
|
||
|
void Cz80_Set_RETI_Callback(cz80_struc *cpu, CZ80_RETI_CALLBACK *Func);
|
||
|
|
||
|
uint8_t Cz80_Read_Byte(cz80_struc *cpu, uint16_t adr);
|
||
|
uint16_t Cz80_Read_Word(cz80_struc *cpu, uint16_t adr);
|
||
|
void Cz80_Write_Byte(cz80_struc *cpu, uint16_t adr, uint8_t data);
|
||
|
void Cz80_Write_Word(cz80_struc *cpu, uint16_t adr, uint16_t data);
|
||
|
|
||
|
int FASTCALL Cz80_Exec(cz80_struc *cpu, int cycles);
|
||
|
|
||
|
void FASTCALL Cz80_Set_IRQ(cz80_struc *cpu, uint8_t vector);
|
||
|
void FASTCALL Cz80_Set_NMI(cz80_struc *cpu);
|
||
|
void FASTCALL Cz80_Clear_IRQ(cz80_struc *cpu);
|
||
|
void FASTCALL Cz80_Clear_NMI(cz80_struc *cpu);
|
||
|
|
||
|
int FASTCALL Cz80_Get_CycleToDo(cz80_struc *cpu);
|
||
|
int FASTCALL Cz80_Get_CycleRemaining(cz80_struc *cpu);
|
||
|
int FASTCALL Cz80_Get_CycleDone(cz80_struc *cpu);
|
||
|
void FASTCALL Cz80_Release_Cycle(cz80_struc *cpu);
|
||
|
void FASTCALL Cz80_Add_Cycle(cz80_struc *cpu, unsigned int cycle);
|
||
|
|
||
|
uint16_t FASTCALL Cz80_Get_BC(cz80_struc *cpu);
|
||
|
uint16_t FASTCALL Cz80_Get_DE(cz80_struc *cpu);
|
||
|
uint16_t FASTCALL Cz80_Get_HL(cz80_struc *cpu);
|
||
|
uint16_t FASTCALL Cz80_Get_AF(cz80_struc *cpu);
|
||
|
|
||
|
uint16_t FASTCALL Cz80_Get_BC2(cz80_struc *cpu);
|
||
|
uint16_t FASTCALL Cz80_Get_DE2(cz80_struc *cpu);
|
||
|
uint16_t FASTCALL Cz80_Get_HL2(cz80_struc *cpu);
|
||
|
uint16_t FASTCALL Cz80_Get_AF2(cz80_struc *cpu);
|
||
|
|
||
|
uint16_t FASTCALL Cz80_Get_IX(cz80_struc *cpu);
|
||
|
uint16_t FASTCALL Cz80_Get_IY(cz80_struc *cpu);
|
||
|
uint16_t FASTCALL Cz80_Get_SP(cz80_struc *cpu);
|
||
|
uint16_t FASTCALL Cz80_Get_PC(cz80_struc *cpu);
|
||
|
|
||
|
uint16_t FASTCALL Cz80_Get_R(cz80_struc *cpu);
|
||
|
uint16_t FASTCALL Cz80_Get_IFF(cz80_struc *cpu);
|
||
|
uint8_t FASTCALL Cz80_Get_IM(cz80_struc *cpu);
|
||
|
uint8_t FASTCALL Cz80_Get_I(cz80_struc *cpu);
|
||
|
|
||
|
void FASTCALL Cz80_Set_BC(cz80_struc *cpu, uint16_t value);
|
||
|
void FASTCALL Cz80_Set_DE(cz80_struc *cpu, uint16_t value);
|
||
|
void FASTCALL Cz80_Set_HL(cz80_struc *cpu, uint16_t value);
|
||
|
void FASTCALL Cz80_Set_AF(cz80_struc *cpu, uint16_t value);
|
||
|
|
||
|
void FASTCALL Cz80_Set_BC2(cz80_struc *cpu, uint16_t value);
|
||
|
void FASTCALL Cz80_Set_DE2(cz80_struc *cpu, uint16_t value);
|
||
|
void FASTCALL Cz80_Set_HL2(cz80_struc *cpu, uint16_t value);
|
||
|
void FASTCALL Cz80_Set_AF2(cz80_struc *cpu, uint16_t value);
|
||
|
|
||
|
void FASTCALL Cz80_Set_IX(cz80_struc *cpu, uint16_t value);
|
||
|
void FASTCALL Cz80_Set_IY(cz80_struc *cpu, uint16_t value);
|
||
|
void FASTCALL Cz80_Set_SP(cz80_struc *cpu, uint16_t value);
|
||
|
void FASTCALL Cz80_Set_PC(cz80_struc *cpu, uint16_t value);
|
||
|
|
||
|
void FASTCALL Cz80_Set_R(cz80_struc *cpu, uint16_t value);
|
||
|
void FASTCALL Cz80_Set_IFF(cz80_struc *cpu, uint16_t value);
|
||
|
void FASTCALL Cz80_Set_IM(cz80_struc *cpu, uint8_t value);
|
||
|
void FASTCALL Cz80_Set_I(cz80_struc *cpu, uint8_t value);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif // _CZ80_H_
|