/* -----------------------------------------------------------------------
*
* Z80C : Z80 Engine - GENERIC
*
* Copyright by Studio Milmake 1999-2000,2004
*
*------------------------------------------------------------------------ */
#include "compiler.h"
#include "z80core.h"
#include "iocore.h"
#include "z80c.h"
#include "z80c.mcr"
Z80FN _ld_nop(void) { }
Z80FN _ld_bc_word(void) LDW_w(R_Z80BC)
Z80FN _ld_xbc_a(void) LDx_B(R_Z80BC, R_Z80A)
Z80FN _inc_bc(void) MCR_INC_W(R_Z80BC)
Z80FN _inc_b(void) MCR_INC(R_Z80B)
Z80FN _dec_b(void) MCR_DEC(R_Z80B)
Z80FN _ld_b_byte(void) LDB_b(R_Z80B)
Z80FN _rlca(void) MCR_RLCA
Z80FN _ex_af_af(void) MCR_EX(R_Z80AF, R_Z80AF2)
Z80FN _add_hl_bc(void) MCR_ADD_W(R_Z80HL, R_Z80BC)
Z80FN _ld_a_xbc(void) LDB_x(R_Z80A, R_Z80BC)
Z80FN _dec_bc(void) MCR_DEC_W(R_Z80BC)
Z80FN _inc_c(void) MCR_INC(R_Z80C)
Z80FN _dec_c(void) MCR_DEC(R_Z80C)
Z80FN _ld_c_byte(void) LDB_b(R_Z80C)
Z80FN _rrca(void) MCR_RRCA
Z80FN _djnz(void) MCR_DJNZ
Z80FN _ld_de_word(void) LDW_w(R_Z80DE)
Z80FN _ld_xde_a(void) LDx_B(R_Z80DE, R_Z80A)
Z80FN _inc_de(void) MCR_INC_W(R_Z80DE)
Z80FN _inc_d(void) MCR_INC(R_Z80D)
Z80FN _dec_d(void) MCR_DEC(R_Z80D)
Z80FN _ld_d_byte(void) LDB_b(R_Z80D)
Z80FN _rla(void) MCR_RLA
Z80FN _jr(void) MCR_JR
Z80FN _add_hl_de(void) MCR_ADD_W(R_Z80HL, R_Z80DE)
Z80FN _ld_a_xde(void) LDB_x(R_Z80A, R_Z80DE)
Z80FN _dec_de(void) MCR_DEC_W(R_Z80DE)
Z80FN _inc_e(void) MCR_INC(R_Z80E)
Z80FN _dec_e(void) MCR_DEC(R_Z80E)
Z80FN _ld_e_byte(void) LDB_b(R_Z80E)
Z80FN _rra(void) MCR_RRA
Z80FN _jr_nz(void) MCR_JRNFLG(Z_FLAG)
Z80FN _ld_hl_word(void) LDW_w(R_Z80HL)
Z80FN _ld_xword_hl(void) LDx_W(R_Z80HL)
Z80FN _inc_hl(void) MCR_INC_W(R_Z80HL)
Z80FN _inc_h(void) MCR_INC(R_Z80H)
Z80FN _dec_h(void) MCR_DEC(R_Z80H)
Z80FN _ld_h_byte(void) LDB_b(R_Z80H)
Z80FN _daa(void) MCR_DDA
Z80FN _jr_z(void) MCR_JRFLG(Z_FLAG)
Z80FN _add_hl_hl(void) MCR_ADDx2(R_Z80HL)
Z80FN _ld_hl_xword(void) LDW_x(R_Z80HL)
Z80FN _dec_hl(void) MCR_DEC_W(R_Z80HL)
Z80FN _inc_l(void) MCR_INC(R_Z80L)
Z80FN _dec_l(void) MCR_DEC(R_Z80L)
Z80FN _ld_l_byte(void) LDB_b(R_Z80L)
Z80FN _cpl(void) MCR_CPL
Z80FN _jr_nc(void) MCR_JRNFLG(C_FLAG)
Z80FN _ld_sp_word(void) LDW_w(R_Z80SP)
Z80FN _ld_xbyte_a(void) LDB_x_a
Z80FN _inc_sp(void) MCR_INC_W(R_Z80SP)
Z80FN _inc_xhl(void) MCR_INC_MEM(R_Z80HL)
Z80FN _dec_xhl(void) MCR_DEC_MEM(R_Z80HL)
Z80FN _ld_xhl_byte(void) LDB_xhl_b
Z80FN _scf(void) MCR_SCF
Z80FN _jr_c(void) MCR_JRFLG(C_FLAG)
Z80FN _add_hl_sp(void) MCR_ADD_W(R_Z80HL, R_Z80SP)
Z80FN _ld_a_xbyte(void) LDB_a_x
Z80FN _dec_sp(void) MCR_DEC_W(R_Z80SP)
Z80FN _inc_a(void) MCR_INC(R_Z80A)
Z80FN _dec_a(void) MCR_DEC(R_Z80A)
Z80FN _ld_a_byte(void) LDB_b(R_Z80A)
Z80FN _ccf(void) MCR_CCF
Z80FN _ld_b_c(void) MCR_LD(R_Z80B, R_Z80C)
Z80FN _ld_b_d(void) MCR_LD(R_Z80B, R_Z80D)
Z80FN _ld_b_e(void) MCR_LD(R_Z80B, R_Z80E)
Z80FN _ld_b_h(void) MCR_LD(R_Z80B, R_Z80H)
Z80FN _ld_b_l(void) MCR_LD(R_Z80B, R_Z80L)
Z80FN _ld_b_xhl(void) LDB_x(R_Z80B, R_Z80HL)
Z80FN _ld_b_a(void) MCR_LD(R_Z80B, R_Z80A)
Z80FN _ld_c_b(void) MCR_LD(R_Z80C, R_Z80B)
Z80FN _ld_c_d(void) MCR_LD(R_Z80C, R_Z80D)
Z80FN _ld_c_e(void) MCR_LD(R_Z80C, R_Z80E)
Z80FN _ld_c_h(void) MCR_LD(R_Z80C, R_Z80H)
Z80FN _ld_c_l(void) MCR_LD(R_Z80C, R_Z80L)
Z80FN _ld_c_xhl(void) LDB_x(R_Z80C, R_Z80HL)
Z80FN _ld_c_a(void) MCR_LD(R_Z80C, R_Z80A)
Z80FN _ld_d_b(void) MCR_LD(R_Z80D, R_Z80B)
Z80FN _ld_d_c(void) MCR_LD(R_Z80D, R_Z80C)
Z80FN _ld_d_e(void) MCR_LD(R_Z80D, R_Z80E)
Z80FN _ld_d_h(void) MCR_LD(R_Z80D, R_Z80H)
Z80FN _ld_d_l(void) MCR_LD(R_Z80D, R_Z80L)
Z80FN _ld_d_xhl(void) LDB_x(R_Z80D, R_Z80HL)
Z80FN _ld_d_a(void) MCR_LD(R_Z80D, R_Z80A)
Z80FN _ld_e_b(void) MCR_LD(R_Z80E, R_Z80B)
Z80FN _ld_e_c(void) MCR_LD(R_Z80E, R_Z80C)
Z80FN _ld_e_d(void) MCR_LD(R_Z80E, R_Z80D)
Z80FN _ld_e_h(void) MCR_LD(R_Z80E, R_Z80H)
Z80FN _ld_e_l(void) MCR_LD(R_Z80E, R_Z80L)
Z80FN _ld_e_xhl(void) LDB_x(R_Z80E, R_Z80HL)
Z80FN _ld_e_a(void) MCR_LD(R_Z80E, R_Z80A)
Z80FN _ld_h_b(void) MCR_LD(R_Z80H, R_Z80B)
Z80FN _ld_h_c(void) MCR_LD(R_Z80H, R_Z80C)
Z80FN _ld_h_d(void) MCR_LD(R_Z80H, R_Z80D)
Z80FN _ld_h_e(void) MCR_LD(R_Z80H, R_Z80E)
Z80FN _ld_h_l(void) MCR_LD(R_Z80H, R_Z80L)
Z80FN _ld_h_xhl(void) LDB_x(R_Z80H, R_Z80HL)
Z80FN _ld_h_a(void) MCR_LD(R_Z80H, R_Z80A)
Z80FN _ld_l_b(void) MCR_LD(R_Z80L, R_Z80B)
Z80FN _ld_l_c(void) MCR_LD(R_Z80L, R_Z80C)
Z80FN _ld_l_d(void) MCR_LD(R_Z80L, R_Z80D)
Z80FN _ld_l_e(void) MCR_LD(R_Z80L, R_Z80E)
Z80FN _ld_l_h(void) MCR_LD(R_Z80L, R_Z80H)
Z80FN _ld_l_xhl(void) LDB_x(R_Z80L, R_Z80HL)
Z80FN _ld_l_a(void) MCR_LD(R_Z80L, R_Z80A)
Z80FN _ld_xhl_b(void) LDx_B(R_Z80HL, R_Z80B)
Z80FN _ld_xhl_c(void) LDx_B(R_Z80HL, R_Z80C)
Z80FN _ld_xhl_d(void) LDx_B(R_Z80HL, R_Z80D)
Z80FN _ld_xhl_e(void) LDx_B(R_Z80HL, R_Z80E)
Z80FN _ld_xhl_h(void) LDx_B(R_Z80HL, R_Z80H)
Z80FN _ld_xhl_l(void) LDx_B(R_Z80HL, R_Z80L)
Z80FN _halt(void) MCR_HALT
Z80FN _ld_xhl_a(void) LDx_B(R_Z80HL, R_Z80A)
Z80FN _ld_a_b(void) MCR_LD(R_Z80A, R_Z80B)
Z80FN _ld_a_c(void) MCR_LD(R_Z80A, R_Z80C)
Z80FN _ld_a_d(void) MCR_LD(R_Z80A, R_Z80D)
Z80FN _ld_a_e(void) MCR_LD(R_Z80A, R_Z80E)
Z80FN _ld_a_h(void) MCR_LD(R_Z80A, R_Z80H)
Z80FN _ld_a_l(void) MCR_LD(R_Z80A, R_Z80L)
Z80FN _ld_a_xhl(void) LDB_x(R_Z80A, R_Z80HL)
Z80FN _add_a_b(void) MCR_ADD(R_Z80B)
Z80FN _add_a_c(void) MCR_ADD(R_Z80C)
Z80FN _add_a_d(void) MCR_ADD(R_Z80D)
Z80FN _add_a_e(void) MCR_ADD(R_Z80E)
Z80FN _add_a_h(void) MCR_ADD(R_Z80H)
Z80FN _add_a_l(void) MCR_ADD(R_Z80L)
Z80FN _add_a_xhl(void) MCR_ADD_XHL
Z80FN _add_a_a(void) MCR_ADD(R_Z80A) /* !! */
Z80FN _adc_a_b(void) MCR_ADC(R_Z80B)
Z80FN _adc_a_c(void) MCR_ADC(R_Z80C)
Z80FN _adc_a_d(void) MCR_ADC(R_Z80D)
Z80FN _adc_a_e(void) MCR_ADC(R_Z80E)
Z80FN _adc_a_h(void) MCR_ADC(R_Z80H)
Z80FN _adc_a_l(void) MCR_ADC(R_Z80L)
Z80FN _adc_a_xhl(void) MCR_ADC_XHL
Z80FN _adc_a_a(void) MCR_ADC(R_Z80A) /* !! */
Z80FN _sub_b(void) MCR_SUB(R_Z80B)
Z80FN _sub_c(void) MCR_SUB(R_Z80C)
Z80FN _sub_d(void) MCR_SUB(R_Z80D)
Z80FN _sub_e(void) MCR_SUB(R_Z80E)
Z80FN _sub_h(void) MCR_SUB(R_Z80H)
Z80FN _sub_l(void) MCR_SUB(R_Z80L)
Z80FN _sub_xhl(void) MCR_SUB_XHL
Z80FN _sub_a(void) MCR_SUB(R_Z80A) /* !! */
Z80FN _sbc_a_b(void) MCR_SBC(R_Z80B)
Z80FN _sbc_a_c(void) MCR_SBC(R_Z80C)
Z80FN _sbc_a_d(void) MCR_SBC(R_Z80D)
Z80FN _sbc_a_e(void) MCR_SBC(R_Z80E)
Z80FN _sbc_a_h(void) MCR_SBC(R_Z80H)
Z80FN _sbc_a_l(void) MCR_SBC(R_Z80L)
Z80FN _sbc_a_xhl(void) MCR_SBC_XHL
Z80FN _sbc_a_a(void) MCR_SBC(R_Z80A) /* !! */
Z80FN _and_b(void) MCR_AND(R_Z80B)
Z80FN _and_c(void) MCR_AND(R_Z80C)
Z80FN _and_d(void) MCR_AND(R_Z80D)
Z80FN _and_e(void) MCR_AND(R_Z80E)
Z80FN _and_h(void) MCR_AND(R_Z80H)
Z80FN _and_l(void) MCR_AND(R_Z80L)
Z80FN _and_xhl(void) MCR_AND_XHL
Z80FN _and_a(void) MCR_AND(R_Z80A) /* !! */
Z80FN _xor_b(void) MCR_XOR(R_Z80B)
Z80FN _xor_c(void) MCR_XOR(R_Z80C)
Z80FN _xor_d(void) MCR_XOR(R_Z80D)
Z80FN _xor_e(void) MCR_XOR(R_Z80E)
Z80FN _xor_h(void) MCR_XOR(R_Z80H)
Z80FN _xor_l(void) MCR_XOR(R_Z80L)
Z80FN _xor_xhl(void) MCR_XOR_XHL
Z80FN _xor_a(void) MCR_XOR(R_Z80A) /* !! */
Z80FN _or_b(void) MCR_OR(R_Z80B)
Z80FN _or_c(void) MCR_OR(R_Z80C)
Z80FN _or_d(void) MCR_OR(R_Z80D)
Z80FN _or_e(void) MCR_OR(R_Z80E)
Z80FN _or_h(void) MCR_OR(R_Z80H)
Z80FN _or_l(void) MCR_OR(R_Z80L)
Z80FN _or_xhl(void) MCR_OR_XHL
Z80FN _or_a(void) MCR_OR(R_Z80A) /* !! */
Z80FN _cp_b(void) MCR_CP(R_Z80B)
Z80FN _cp_c(void) MCR_CP(R_Z80C)
Z80FN _cp_d(void) MCR_CP(R_Z80D)
Z80FN _cp_e(void) MCR_CP(R_Z80E)
Z80FN _cp_h(void) MCR_CP(R_Z80H)
Z80FN _cp_l(void) MCR_CP(R_Z80L)
Z80FN _cp_xhl(void) MCR_CP_XHL
Z80FN _cp_a(void) MCR_CP(R_Z80A) /* !! */
Z80FN _ret_nz(void) MCR_RETNFLG(Z_FLAG)
Z80FN _pop_bc(void) MCR_POP(R_Z80BC)
Z80FN _jp_nz(void) MCR_JPNFLG(Z_FLAG)
Z80FN _jp(void) MCR_JP
Z80FN _call_nz(void) MCR_CALLNFLG(Z_FLAG)
Z80FN _push_bc(void) MCR_PUSH(R_Z80BC)
Z80FN _add_a_byte(void) MCR_ADD_BYTE
Z80FN _rst_00(void) MCR_RST(0x00)
Z80FN _ret_z(void) MCR_RETFLG(Z_FLAG)
Z80FN _ret(void) MCR_RET
Z80FN _jp_z(void) MCR_JPFLG(Z_FLAG)
Z80FN _call_z(void) MCR_CALLFLG(Z_FLAG)
Z80FN _call(void) MCR_CALL
Z80FN _adc_a_byte(void) MCR_ADC_BYTE
Z80FN _rst_08(void) MCR_RST(0x08)
Z80FN _ret_nc(void) MCR_RETNFLG(C_FLAG)
Z80FN _pop_de(void) MCR_POP(R_Z80DE)
Z80FN _jp_nc(void) MCR_JPNFLG(C_FLAG)
Z80FN _out_byte_a(void) MCR_OUT_BYTE
Z80FN _call_nc(void) MCR_CALLNFLG(C_FLAG)
Z80FN _push_de(void) MCR_PUSH(R_Z80DE)
Z80FN _sub_byte(void) MCR_SUB_BYTE
Z80FN _rst_10(void) MCR_RST(0x10)
Z80FN _ret_c(void) MCR_RETFLG(C_FLAG)
Z80FN _exx(void) MCR_EXX
Z80FN _jp_c(void) MCR_JPFLG(C_FLAG)
Z80FN _in_a_byte(void) MCR_IN_BYTE
Z80FN _call_c(void) MCR_CALLFLG(C_FLAG)
Z80FN _sbc_a_byte(void) MCR_SBC_BYTE
Z80FN _rst_18(void) MCR_RST(0x18)
Z80FN _ret_po(void) MCR_RETNFLG(V_FLAG)
Z80FN _pop_hl(void) MCR_POP(R_Z80HL)
Z80FN _jp_po(void) MCR_JPNFLG(V_FLAG)
Z80FN _ex_xsp_hl(void) MCR_EX_XSP(R_Z80HL)
Z80FN _call_po(void) MCR_CALLNFLG(V_FLAG)
Z80FN _push_hl(void) MCR_PUSH(R_Z80HL)
Z80FN _and_byte(void) MCR_AND_BYTE
Z80FN _rst_20(void) MCR_RST(0x20)
Z80FN _ret_pe(void) MCR_RETFLG(V_FLAG)
Z80FN _jp_hl(void) MCR_LD_W(R_Z80PC, R_Z80HL)
Z80FN _jp_pe(void) MCR_JPFLG(V_FLAG)
Z80FN _ex_de_hl(void) MCR_EX(R_Z80DE, R_Z80HL)
Z80FN _call_pe(void) MCR_CALLFLG(V_FLAG)
Z80FN _xor_byte(void) MCR_XOR_BYTE
Z80FN _rst_28(void) MCR_RST(0x28)
Z80FN _ret_p(void) MCR_RETNFLG(S_FLAG)
Z80FN _pop_af(void) MCR_POP(R_Z80AF)
Z80FN _jp_p(void) MCR_JPNFLG(S_FLAG)
Z80FN _di(void) MCR_DI
Z80FN _call_p(void) MCR_CALLNFLG(S_FLAG)
Z80FN _push_af(void) MCR_PUSH(R_Z80AF)
Z80FN _or_byte(void) MCR_OR_BYTE
Z80FN _rst_30(void) MCR_RST(0x30)
Z80FN _ret_m(void) MCR_RETFLG(S_FLAG)
Z80FN _ld_sp_hl(void) MCR_LD_W(R_Z80SP, R_Z80HL)
Z80FN _jp_m(void) MCR_JPFLG(S_FLAG)
Z80FN _ei(void) MCR_EI
Z80FN _call_m(void) MCR_CALLFLG(S_FLAG)
Z80FN _cp_byte(void) MCR_CP_BYTE
Z80FN _rst_38(void) MCR_RST(0x38)
const Z80OP z80c_mainop[256] = {
_ld_nop, _ld_bc_word, _ld_xbc_a, _inc_bc, /* 00 */
_inc_b, _dec_b, _ld_b_byte, _rlca,
_ex_af_af, _add_hl_bc, _ld_a_xbc, _dec_bc,
_inc_c, _dec_c, _ld_c_byte, _rrca,
_djnz, _ld_de_word, _ld_xde_a, _inc_de, /* 10 */
_inc_d, _dec_d, _ld_d_byte, _rla,
_jr, _add_hl_de, _ld_a_xde, _dec_de,
_inc_e, _dec_e, _ld_e_byte, _rra,
_jr_nz, _ld_hl_word, _ld_xword_hl, _inc_hl, /* 20 */
_inc_h, _dec_h, _ld_h_byte, _daa,
_jr_z, _add_hl_hl, _ld_hl_xword, _dec_hl,
_inc_l, _dec_l, _ld_l_byte, _cpl,
_jr_nc, _ld_sp_word, _ld_xbyte_a, _inc_sp, /* 30 */
_inc_xhl, _dec_xhl, _ld_xhl_byte, _scf,
_jr_c, _add_hl_sp, _ld_a_xbyte, _dec_sp,
_inc_a, _dec_a, _ld_a_byte, _ccf,
_ld_nop, _ld_b_c, _ld_b_d, _ld_b_e, /* 40 */
_ld_b_h, _ld_b_l, _ld_b_xhl, _ld_b_a,
_ld_c_b, _ld_nop, _ld_c_d, _ld_c_e,
_ld_c_h, _ld_c_l, _ld_c_xhl, _ld_c_a,
_ld_d_b, _ld_d_c, _ld_nop, _ld_d_e, /* 50 */
_ld_d_h, _ld_d_l, _ld_d_xhl, _ld_d_a,
_ld_e_b, _ld_e_c, _ld_e_d, _ld_nop,
_ld_e_h, _ld_e_l, _ld_e_xhl, _ld_e_a,
_ld_h_b, _ld_h_c, _ld_h_d, _ld_h_e, /* 60 */
_ld_nop, _ld_h_l, _ld_h_xhl, _ld_h_a,
_ld_l_b, _ld_l_c, _ld_l_d, _ld_l_e,
_ld_l_h, _ld_nop, _ld_l_xhl, _ld_l_a,
_ld_xhl_b, _ld_xhl_c, _ld_xhl_d, _ld_xhl_e, /* 70 */
_ld_xhl_h, _ld_xhl_l, _halt, _ld_xhl_a,
_ld_a_b, _ld_a_c, _ld_a_d, _ld_a_e,
_ld_a_h, _ld_a_l, _ld_a_xhl, _ld_nop,
_add_a_b, _add_a_c, _add_a_d, _add_a_e, /* 80 */
_add_a_h, _add_a_l, _add_a_xhl, _add_a_a,
_adc_a_b, _adc_a_c, _adc_a_d, _adc_a_e,
_adc_a_h, _adc_a_l, _adc_a_xhl, _adc_a_a,
_sub_b, _sub_c, _sub_d, _sub_e, /* 90 */
_sub_h, _sub_l, _sub_xhl, _sub_a,
_sbc_a_b, _sbc_a_c, _sbc_a_d, _sbc_a_e,
_sbc_a_h, _sbc_a_l, _sbc_a_xhl, _sbc_a_a,
_and_b, _and_c, _and_d, _and_e, /* a0 */
_and_h, _and_l, _and_xhl, _and_a,
_xor_b, _xor_c, _xor_d, _xor_e,
_xor_h, _xor_l, _xor_xhl, _xor_a,
_or_b, _or_c, _or_d, _or_e, /* b0 */
_or_h, _or_l, _or_xhl, _or_a,
_cp_b, _cp_c, _cp_d, _cp_e,
_cp_h, _cp_l, _cp_xhl, _cp_a,
_ret_nz, _pop_bc, _jp_nz, _jp, /* c0 */
_call_nz, _push_bc, _add_a_byte, _rst_00,
_ret_z, _ret, _jp_z, z80c_cb,
_call_z, _call, _adc_a_byte, _rst_08,
_ret_nc, _pop_de, _jp_nc, _out_byte_a, /* d0 */
_call_nc, _push_de, _sub_byte, _rst_10,
_ret_c, _exx, _jp_c, _in_a_byte,
_call_c, z80c_ix, _sbc_a_byte, _rst_18,
_ret_po, _pop_hl, _jp_po, _ex_xsp_hl, /* e0 */
_call_po, _push_hl, _and_byte, _rst_20,
_ret_pe, _jp_hl, _jp_pe, _ex_de_hl,
_call_pe, z80c_sub, _xor_byte, _rst_28,
_ret_p, _pop_af, _jp_p, _di, /* f0 */
_call_p, _push_af, _or_byte, _rst_30,
_ret_m, _ld_sp_hl, _jp_m, _ei,
_call_m, z80c_iy, _cp_byte, _rst_38
};
RetroPC.NET-CVS <cvs@retropc.net>