/********************************************************************************/ /* */ /* CZ80 XY opcode include source file */ /* C Z80 emulator version 0.91 */ /* Copyright 2004-2005 Stephane Dallongeville */ /* */ /********************************************************************************/ #if CZ80_USE_JUMPTABLE goto *JumpTableXY[Opcode]; #else switch (Opcode) { #endif OPXY(0x00): // NOP // 8 BITS LOAD OPXY(0x40): // LD B,B OPXY(0x49): // LD C,C OPXY(0x52): // LD D,D OPXY(0x5b): // LD E,E OPXY(0x64): // LD H,H OPXY(0x6d): // LD L,L OPXY(0x7f): // LD A,A goto OP_NOP; OPXY(0x41): // LD B,C OPXY(0x42): // LD B,D OPXY(0x43): // LD B,E OPXY(0x47): // LD B,A OPXY(0x48): // LD C,B OPXY(0x4a): // LD C,D OPXY(0x4b): // LD C,E OPXY(0x4f): // LD C,A OPXY(0x50): // LD D,B OPXY(0x51): // LD D,C OPXY(0x53): // LD D,E OPXY(0x57): // LD D,A OPXY(0x58): // LD E,B OPXY(0x59): // LD E,C OPXY(0x5a): // LD E,D OPXY(0x5f): // LD E,A OPXY(0x78): // LD A,B OPXY(0x79): // LD A,C OPXY(0x7a): // LD A,D OPXY(0x7b): // LD A,E goto OP_LD_R_R; OPXY(0x44): // LD B,HX OPXY(0x4c): // LD C,HX OPXY(0x54): // LD D,HX OPXY(0x5c): // LD E,HX OPXY(0x7c): // LD A,HX zR8((Opcode >> 3) & 7) = data->B.H; RET(4) OPXY(0x45): // LD B,LX OPXY(0x4d): // LD C,LX OPXY(0x55): // LD D,LX OPXY(0x5d): // LD E,LX OPXY(0x7d): // LD A,LX zR8((Opcode >> 3) & 7) = data->B.L; RET(4) OPXY(0x60): // LD HX,B OPXY(0x61): // LD HX,C OPXY(0x62): // LD HX,D OPXY(0x63): // LD HX,E OPXY(0x67): // LD HX,A data->B.H = zR8(Opcode & 7); RET(4) OPXY(0x68): // LD LX,B OPXY(0x69): // LD LX,C OPXY(0x6a): // LD LX,D OPXY(0x6b): // LD LX,E OPXY(0x6f): // LD LX,A data->B.L = zR8(Opcode & 7); RET(4) OPXY(0x65): // LD HX,LX data->B.H = data->B.L; RET(4) OPXY(0x6c): // LD LX,HX data->B.L = data->B.H; RET(4) OPXY(0x06): // LD B,#imm OPXY(0x0e): // LD C,#imm OPXY(0x16): // LD D,#imm OPXY(0x1e): // LD E,#imm OPXY(0x3e): // LD A,#imm goto OP_LD_R_imm; OPXY(0x26): // LD HX,#imm data->B.H = FETCH_BYTE; RET(7) OPXY(0x2e): // LD LX,#imm data->B.L = FETCH_BYTE; RET(7) OPXY(0x0a): // LD A,(BC) goto OP_LOAD_A_mBC; OPXY(0x1a): // LD A,(DE) goto OP_LOAD_A_mDE; OPXY(0x3a): // LD A,(nn) goto OP_LOAD_A_mNN; OPXY(0x02): // LD (BC),A goto OP_LOAD_mBC_A; OPXY(0x12): // LD (DE),A goto OP_LOAD_mDE_A; OPXY(0x32): // LD (nn),A goto OP_LOAD_mNN_A; { uint16_t adr; OPXY(0x46): // LD B,(IX+o) OPXY(0x56): // LD D,(IX+o) OPXY(0x5e): // LD E,(IX+o) OPXY(0x66): // LD H,(IX+o) OPXY(0x6e): // LD L,(IX+o) OPXY(0x4e): // LD C,(IX+o) OPXY(0x7e): // LD A,(IX+o) PRE_IO adr = data->W + FETCH_BYTE_S; READ_BYTE(adr, zR8((Opcode >> 3) & 7)) POST_IO RET(15) OPXY(0x70): // LD (IX+o),B OPXY(0x71): // LD (IX+o),C OPXY(0x72): // LD (IX+o),D OPXY(0x73): // LD (IX+o),E OPXY(0x74): // LD (IX+o),H OPXY(0x75): // LD (IX+o),L OPXY(0x77): // LD (IX+o),A PRE_IO adr = data->W + FETCH_BYTE_S; WRITE_BYTE(adr, zR8(Opcode & 7)) POST_IO RET(15) OPXY(0x36): // LD (IX+o),#imm PRE_IO adr = data->W + FETCH_BYTE_S; WRITE_BYTE(adr, FETCH_BYTE) POST_IO RET(15) } // 16 BITS LOAD OPXY(0x01): // LD BC,nn OPXY(0x11): // LD DE,nn goto OP_LOAD_RR_imm16; OPXY(0x21): // LD IX,nn FETCH_WORD(data->W) RET(10) OPXY(0x31): // LD SP,nn goto OP_LOAD_SP_imm16; OPXY(0x2a): // LD IX,(w) goto OP_LD_xx_mNN; OPXY(0x22): // LD (w),IX goto OP_LD_mNN_xx; OPXY(0xf9): // LD SP,IX goto OP_LD_SP_xx; // PUSH / POP OPXY(0xf1): // POP AF goto OP_POP_AF; OPXY(0xc1): // POP BC OPXY(0xd1): // POP DE goto OP_POP_RR; OPXY(0xe1): // POP IX goto OP_POP; OPXY(0xf5): // PUSH AF goto OP_PUSH_AF; OPXY(0xc5): // PUSH BC OPXY(0xd5): // PUSH DE goto OP_PUSH_RR; OPXY(0xe5): // PUSH IX goto OP_PUSH; // EXCHANGE OPXY(0x08): // EX AF,AF' goto OP_EX_AF_AF2; OPXY(0xeb): // EX DE,HL goto OP_EX_DE_HL; OPXY(0xd9): // EXX goto OP_EXX; OPXY(0xe3): // EX (SP),IX goto OP_EX_xx_mSP; // 8 BITS ARITHMETIC // INC OPXY(0x04): // INC B OPXY(0x0c): // INC C OPXY(0x14): // INC D OPXY(0x1c): // INC E OPXY(0x3c): // INC A goto OP_INC_R; OPXY(0x24): // INC HX data->B.H++; zF = (zF & CZ80_CF) | SZXYHV_inc[data->B.H]; RET(4) OPXY(0x2c): // INC LX data->B.L++; zF = (zF & CZ80_CF) | SZXYHV_inc[data->B.L]; RET(4) OPXY(0x34): // INC (IX+o) goto OP_INC_mIx; // DEC OPXY(0x05): // DEC B OPXY(0x0d): // DEC C OPXY(0x15): // DEC D OPXY(0x1d): // DEC E OPXY(0x3d): // DEC A goto OP_DEC_R; OPXY(0x25): // DEC HX data->B.H--; zF = (zF & CZ80_CF) | SZXYHV_dec[data->B.H]; RET(4) OPXY(0x2d): // DEC LX data->B.L--; zF = (zF & CZ80_CF) | SZXYHV_dec[data->B.L]; RET(4) OPXY(0x35): // DEC (IX+o) goto OP_DEC_mIx; // ADD OPXY(0x80): // ADD A,B OPXY(0x81): // ADD A,C OPXY(0x82): // ADD A,D OPXY(0x83): // ADD A,E OPXY(0x87): // ADD A,A goto OP_ADD_R; OPXY(0x84): // ADD A,HX goto OP_ADD_IxH; OPXY(0x85): // ADD A,LX goto OP_ADD_IxL; OPXY(0xc6): // ADD A,n goto OP_ADD_imm; OPXY(0x86): // ADD A,(IX+o) goto OP_ADD_mIx; // ADC OPXY(0x88): // ADC A,B OPXY(0x89): // ADC A,C OPXY(0x8a): // ADC A,D OPXY(0x8b): // ADC A,E OPXY(0x8f): // ADC A,A goto OP_ADC_R; OPXY(0xce): // ADC A,n goto OP_ADC_imm; OPXY(0x8c): // ADC A,HX goto OP_ADC_IxH; OPXY(0x8d): // ADC A,LX goto OP_ADC_IxL; OPXY(0x8e): // ADC A,(IX+o) goto OP_ADC_mIx; // SUB OPXY(0x90): // SUB B OPXY(0x91): // SUB C OPXY(0x92): // SUB D OPXY(0x93): // SUB E OPXY(0x97): // SUB A goto OP_SUB_R; OPXY(0x94): // SUB HX goto OP_SUB_IxH; OPXY(0x95): // SUB LX goto OP_SUB_IxL; OPXY(0xd6): // SUB A,n goto OP_SUB_imm; OPXY(0x96): // SUB (IX+o) goto OP_SUB_mIx; // SBC OPXY(0x98): // SBC A,B OPXY(0x99): // SBC A,C OPXY(0x9a): // SBC A,D OPXY(0x9b): // SBC A,E OPXY(0x9f): // SBC A,A goto OP_SBC_R; OPXY(0x9c): // SBC A,HX goto OP_SBC_IxH; OPXY(0x9d): // SBC A,LX goto OP_SBC_IxL; OPXY(0xde): // SBC A,n goto OP_SBC_imm; OPXY(0x9e): // SBC A,(IX+o) goto OP_SBC_mIx; // CP OPXY(0xb8): // CP B OPXY(0xb9): // CP C OPXY(0xba): // CP D OPXY(0xbb): // CP E OPXY(0xbf): // CP A goto OP_CP_R; OPXY(0xbc): // CP HX goto OP_CP_IxH; OPXY(0xbd): // CP LX goto OP_CP_IxL; OPXY(0xfe): // CP n goto OP_CP_imm; OPXY(0xbe): // CP (IX+o) goto OP_CP_mIx; // AND OPXY(0xa0): // AND B OPXY(0xa1): // AND C OPXY(0xa2): // AND D OPXY(0xa3): // AND E goto OP_AND_R; OPXY(0xa7): // AND A goto OP_AND_A; OPXY(0xa4): // AND HX goto OP_AND_IxH; OPXY(0xa5): // AND LX goto OP_AND_IxL; OPXY(0xe6): // AND A,n goto OP_AND_imm; OPXY(0xa6): // AND (IX+o) { uint8_t val; PRE_IO READ_BYTE(data->W + FETCH_BYTE_S, val) POST_IO zA = zA & val; zF = SZXYP[zA] | CZ80_HF; RET(15) } // XOR OPXY(0xa8): // XOR B OPXY(0xa9): // XOR C OPXY(0xaa): // XOR D OPXY(0xab): // XOR E goto OP_XOR_R; OPXY(0xaf): // XOR A goto OP_XOR_A; OPXY(0xac): // XOR HX goto OP_XOR_IxH; OPXY(0xad): // XOR LX goto OP_XOR_IxL; OPXY(0xee): // XOR A,n goto OP_XOR_imm; OPXY(0xae): // XOR (IX+o) { uint8_t val; PRE_IO READ_BYTE(data->W + FETCH_BYTE_S, val) POST_IO zA = zA ^ val; zF = SZXYP[zA]; RET(15) } // OR OPXY(0xb0): // OR B OPXY(0xb1): // OR C OPXY(0xb2): // OR D OPXY(0xb3): // OR E goto OP_OR_R; OPXY(0xb7): // OR A goto OP_OR_A; OPXY(0xb4): // OR HX goto OP_OR_IxH; OPXY(0xb5): // OR LX goto OP_OR_IxL; OPXY(0xf6): // OR A,n goto OP_OR_imm; OPXY(0xb6): // OR (IX+o) { uint8_t val; PRE_IO READ_BYTE(data->W + FETCH_BYTE_S, val) POST_IO zA = zA | val; zF = SZXYP[zA]; RET(15) } // MISC ARITHMETIC & CPU CONTROL OPXY(0x27): // DAA goto OP_DAA; OPXY(0x2f): // CPL goto OP_CPL; OPXY(0x37): // SCF goto OP_SCF; OPXY(0x3f): // CCF goto OP_CCF; OPXY(0x76): // HALT goto OP_HALT; OPXY(0xf3): // DI goto OP_DI; OPXY(0xfb): // EI goto OP_EI; // 16 BITS ARITHMETIC OPXY(0x03): // INC BC goto OP_INC_BC; OPXY(0x13): // INC DE goto OP_INC_DE; OPXY(0x23): // INC IX goto OP_INC_xx; OPXY(0x33): // INC SP goto OP_INC_SP; OPXY(0x0b): // DEC BC goto OP_DEC_BC; OPXY(0x1b): // DEC DE goto OP_DEC_DE; OPXY(0x2b): // DEC IX goto OP_DEC_xx; OPXY(0x3b): // DEC SP goto OP_DEC_SP; // ADD16 OPXY(0x09): // ADD IX,BC goto OP_ADD16_xx_BC; OPXY(0x19): // ADD IX,DE goto OP_ADD16_xx_DE; OPXY(0x29): // ADD IX,IX goto OP_ADD16_xx_xx; OPXY(0x39): // ADD IX,SP goto OP_ADD16_xx_SP; // ROTATE OPXY(0x07): // RLCA goto OP_RLCA; OPXY(0x0f): // RRCA goto OP_RRCA; OPXY(0x17): // RLA goto OP_RLA; OPXY(0x1f): // RRA goto OP_RRA; // JUMP OPXY(0xc3): // JP nn goto OP_JP; OPXY(0xe9): // JP (IX) goto OP_JP_xx; OPXY(0xd2): // JP NC,nn goto OP_JP_NC; OPXY(0xda): // JP C,nn goto OP_JP_C; OPXY(0xe2): // JP PO,nn goto OP_JP_PO; OPXY(0xea): // JP PE,nn goto OP_JP_PE; OPXY(0xf2): // JP P,nn goto OP_JP_P; OPXY(0xfa): // JP M,nn goto OP_JP_M; OPXY(0xca): // JP Z,nn goto OP_JP_Z; OPXY(0xc2): // JP NZ,nn goto OP_JP_NZ; OPXY(0x18): // JR n goto OP_JR; OPXY(0x38): // JR C,n goto OP_JR_C; OPXY(0x30): // JR NC,n goto OP_JR_NC; OPXY(0x28): // JR Z,n goto OP_JR_Z; OPXY(0x20): // JR NZ,n goto OP_JR_NZ; OPXY(0x10): // DJNZ n goto OP_DJNZ; // CALL & RETURN OPXY(0xcd): // CALL nn goto OP_CALL; OPXY(0xd4): // CALL NC,nn goto OP_CALL_NC; OPXY(0xdc): // CALL C,nn goto OP_CALL_C; OPXY(0xe4): // CALL PO,nn goto OP_CALL_PO; OPXY(0xec): // CALL PE,nn goto OP_CALL_PE; OPXY(0xf4): // CALL P,nn goto OP_CALL_P; OPXY(0xfc): // CALL M,nn goto OP_CALL_M; OPXY(0xcc): // CALL Z,nn goto OP_CALL_Z; OPXY(0xc4): // CALL NZ,nn goto OP_CALL_NZ; OPXY(0xc9): // RET goto OP_RET; OPXY(0xd0): // RET NC goto OP_RET_NC; OPXY(0xd8): // RET C goto OP_RET_C; OPXY(0xe0): // RET PO goto OP_RET_PO; OPXY(0xe8): // RET PE goto OP_RET_PE; OPXY(0xf0): // RET P goto OP_RET_P; OPXY(0xf8): // RET M goto OP_RET_M; OPXY(0xc0): // RET NZ goto OP_RET_NZ; OPXY(0xc8): // RET Z goto OP_RET_Z; OPXY(0xc7): // RST 0 OPXY(0xcf): // RST 1 OPXY(0xd7): // RST 2 OPXY(0xdf): // RST 3 OPXY(0xe7): // RST 4 OPXY(0xef): // RST 5 OPXY(0xf7): // RST 6 OPXY(0xff): // RST 7 goto OP_RST; // INPUT & OUTPUT OPXY(0xd3): // OUT (n),A goto OP_OUT_mN_A; OPXY(0xdb): // IN A,(n) goto OP_IN_A_mN; // PREFIXE OPXY(0xcb): // XYCB PREFIXE { uint16_t adr; uint8_t src; uint8_t res; adr = data->W + FETCH_BYTE_S; Opcode = FETCH_BYTE; #include "cz80_opxycb.inc" } OPXY(0xed): // ED PREFIXE goto ED_PREFIXE; OPXY(0xdd): // DD PREFIXE (IX) goto DD_PREFIXE; OPXY(0xfd): // FD PREFIXE (IY) goto FD_PREFIXE; #if CZ80_USE_JUMPTABLE #else } #endif