--- /dev/null
+/******************************************************************************\r
+ *\r
+ * CZ80 opcode include source file\r
+ * CZ80 emulator version 0.9\r
+ * Copyright 2004-2005 Stéphane Dallongeville\r
+ *\r
+ * (Modified by NJ)\r
+ *\r
+ *****************************************************************************/\r
+\r
+#if CZ80_USE_JUMPTABLE\r
+ goto *JumpTable[Opcode];\r
+#else\r
+switch (Opcode)\r
+{\r
+#endif\r
+\r
+/*-----------------------------------------\r
+ NOP\r
+-----------------------------------------*/\r
+\r
+ OP(0x00): // NOP\r
+\r
+/*-----------------------------------------\r
+ LD r8 (same register)\r
+-----------------------------------------*/\r
+\r
+ OP(0x40): // LD B,B\r
+ OP(0x49): // LD C,C\r
+ OP(0x52): // LD D,D\r
+ OP(0x5b): // LD E,E\r
+ OP(0x64): // LD H,H\r
+ OP(0x6d): // LD L,L\r
+ OP(0x7f): // LD A,A\r
+ RET(4)\r
+\r
+/*-----------------------------------------\r
+ LD r8\r
+-----------------------------------------*/\r
+\r
+ OP(0x41): // LD B,C\r
+ OP(0x42): // LD B,D\r
+ OP(0x43): // LD B,E\r
+ OP(0x44): // LD B,H\r
+ OP(0x45): // LD B,L\r
+ OP(0x47): // LD B,A\r
+\r
+ OP(0x48): // LD C,B\r
+ OP(0x4a): // LD C,D\r
+ OP(0x4b): // LD C,E\r
+ OP(0x4c): // LD C,H\r
+ OP(0x4d): // LD C,L\r
+ OP(0x4f): // LD C,A\r
+\r
+ OP(0x50): // LD D,B\r
+ OP(0x51): // LD D,C\r
+ OP(0x53): // LD D,E\r
+ OP(0x54): // LD D,H\r
+ OP(0x55): // LD D,L\r
+ OP(0x57): // LD D,A\r
+\r
+ OP(0x58): // LD E,B\r
+ OP(0x59): // LD E,C\r
+ OP(0x5a): // LD E,D\r
+ OP(0x5c): // LD E,H\r
+ OP(0x5d): // LD E,L\r
+ OP(0x5f): // LD E,A\r
+\r
+ OP(0x60): // LD H,B\r
+ OP(0x61): // LD H,C\r
+ OP(0x62): // LD H,D\r
+ OP(0x63): // LD H,E\r
+ OP(0x65): // LD H,L\r
+ OP(0x67): // LD H,A\r
+\r
+ OP(0x68): // LD L,B\r
+ OP(0x69): // LD L,C\r
+ OP(0x6a): // LD L,D\r
+ OP(0x6b): // LD L,E\r
+ OP(0x6c): // LD L,H\r
+ OP(0x6f): // LD L,A\r
+\r
+ OP(0x78): // LD A,B\r
+ OP(0x79): // LD A,C\r
+ OP(0x7a): // LD A,D\r
+ OP(0x7b): // LD A,E\r
+ OP(0x7c): // LD A,H\r
+ OP(0x7d): // LD A,L\r
+OP_LD_R_R:\r
+ zR8((Opcode >> 3) & 7) = zR8(Opcode & 7);\r
+ RET(4)\r
+\r
+ OP(0x06): // LD B,#imm\r
+ OP(0x0e): // LD C,#imm\r
+ OP(0x16): // LD D,#imm\r
+ OP(0x1e): // LD E,#imm\r
+ OP(0x26): // LD H,#imm\r
+ OP(0x2e): // LD L,#imm\r
+ OP(0x3e): // LD A,#imm\r
+OP_LD_R_imm:\r
+ zR8(Opcode >> 3) = READ_ARG();\r
+ RET(7)\r
+\r
+ OP(0x46): // LD B,(HL)\r
+ OP(0x4e): // LD C,(HL)\r
+ OP(0x56): // LD D,(HL)\r
+ OP(0x5e): // LD E,(HL)\r
+ OP(0x66): // LD H,(HL)\r
+ OP(0x6e): // LD L,(HL)\r
+ OP(0x7e): // LD A,(HL)\r
+ zR8((Opcode >> 3) & 7) = READ_MEM8(zHL);\r
+ RET(7)\r
+\r
+ OP(0x70): // LD (HL),B\r
+ OP(0x71): // LD (HL),C\r
+ OP(0x72): // LD (HL),D\r
+ OP(0x73): // LD (HL),E\r
+ OP(0x74): // LD (HL),H\r
+ OP(0x75): // LD (HL),L\r
+ OP(0x77): // LD (HL),A\r
+ WRITE_MEM8(zHL, zR8(Opcode & 7));\r
+ RET(7)\r
+\r
+ OP(0x36): // LD (HL), #imm\r
+ WRITE_MEM8(zHL, READ_ARG());\r
+ RET(10)\r
+\r
+ OP(0x0a): // LD A,(BC)\r
+OP_LOAD_A_mBC:\r
+ adr = zBC;\r
+ goto OP_LOAD_A_mxx;\r
+\r
+ OP(0x1a): // LD A,(DE)\r
+OP_LOAD_A_mDE:\r
+ adr = zDE;\r
+\r
+OP_LOAD_A_mxx:\r
+ zA = READ_MEM8(adr);\r
+ RET(7)\r
+\r
+ OP(0x3a): // LD A,(nn)\r
+OP_LOAD_A_mNN:\r
+ adr = READ_ARG16();\r
+ zA = READ_MEM8(adr);\r
+ RET(13)\r
+\r
+ OP(0x02): // LD (BC),A\r
+OP_LOAD_mBC_A:\r
+ adr = zBC;\r
+ goto OP_LOAD_mxx_A;\r
+\r
+ OP(0x12): // LD (DE),A\r
+OP_LOAD_mDE_A:\r
+ adr = zDE;\r
+\r
+OP_LOAD_mxx_A:\r
+ WRITE_MEM8(adr, zA);\r
+ RET(7)\r
+\r
+ OP(0x32): // LD (nn),A\r
+OP_LOAD_mNN_A:\r
+ adr = READ_ARG16();\r
+ WRITE_MEM8(adr, zA);\r
+ RET(13)\r
+\r
+/*-----------------------------------------\r
+ LD r16\r
+-----------------------------------------*/\r
+\r
+ OP(0x01): // LD BC,nn\r
+ OP(0x11): // LD DE,nn\r
+ OP(0x21): // LD HL,nn\r
+OP_LOAD_RR_imm16:\r
+ zR16(Opcode >> 4) = READ_ARG16();\r
+ RET(10)\r
+\r
+ OP(0x31): // LD SP,nn\r
+OP_LOAD_SP_imm16:\r
+ zSP = READ_ARG16();\r
+ RET(10)\r
+\r
+ OP(0xf9): // LD SP,HL\r
+OP_LD_SP_xx:\r
+ zSP = data->W;\r
+ RET(6)\r
+\r
+ OP(0x2a): // LD HL,(nn)\r
+OP_LD_xx_mNN:\r
+ adr = READ_ARG16();\r
+ data->W = READ_MEM16(adr);\r
+ RET(16)\r
+\r
+ OP(0x22): // LD (nn),HL\r
+OP_LD_mNN_xx:\r
+ adr = READ_ARG16();\r
+ WRITE_MEM16(adr, data->W);\r
+ RET(16)\r
+\r
+/*-----------------------------------------\r
+ POP\r
+-----------------------------------------*/\r
+\r
+ OP(0xc1): // POP BC\r
+ OP(0xd1): // POP DE\r
+ OP(0xf1): // POP AF\r
+OP_POP_RR:\r
+ data = CPU->pzR16[(Opcode >> 4) & 3];\r
+\r
+ OP(0xe1): // POP HL\r
+OP_POP:\r
+ POP_16(data->W)\r
+ RET(10)\r
+\r
+/*-----------------------------------------\r
+ PUSH\r
+-----------------------------------------*/\r
+\r
+ OP(0xc5): // PUSH BC\r
+ OP(0xd5): // PUSH DE\r
+ OP(0xf5): // PUSH AF\r
+OP_PUSH_RR:\r
+ data = CPU->pzR16[(Opcode >> 4) & 3];\r
+\r
+ OP(0xe5): // PUSH HL\r
+OP_PUSH:\r
+ PUSH_16(data->W);\r
+ RET(11)\r
+\r
+/*-----------------------------------------\r
+ EX\r
+-----------------------------------------*/\r
+\r
+ OP(0x08): // EX AF,AF'\r
+OP_EX_AF_AF2:\r
+ res = zAF;\r
+ zAF = zAF2;\r
+ zAF2 = res;\r
+ RET(4)\r
+\r
+ OP(0xeb): // EX DE,HL\r
+OP_EX_DE_HL:\r
+ res = zDE;\r
+ zDE = zHL;\r
+ zHL = res;\r
+ RET(4)\r
+\r
+ OP(0xd9): // EXX\r
+OP_EXX:\r
+ res = zBC;\r
+ zBC = zBC2;\r
+ zBC2 = res;\r
+ res = zDE;\r
+ zDE = zDE2;\r
+ zDE2 = res;\r
+ res = zHL;\r
+ zHL = zHL2;\r
+ zHL2 = res;\r
+ RET(4)\r
+\r
+ OP(0xe3): // EX HL,(SP)\r
+OP_EX_xx_mSP:\r
+ adr = zSP;\r
+ res = data->W;\r
+ data->W = READ_MEM16(adr);\r
+ WRITE_MEM16(adr, res);\r
+ RET(19)\r
+\r
+/*-----------------------------------------\r
+ INC r8\r
+-----------------------------------------*/\r
+\r
+ OP(0x04): // INC B\r
+ OP(0x0c): // INC C\r
+ OP(0x14): // INC D\r
+ OP(0x1c): // INC E\r
+ OP(0x24): // INC H\r
+ OP(0x2c): // INC L\r
+ OP(0x3c): // INC A\r
+OP_INC_R:\r
+ zR8(Opcode >> 3)++;\r
+ zF = (zF & CF) | SZHV_inc[zR8(Opcode >> 3)];\r
+ RET(4)\r
+\r
+ OP(0x34): // INC (HL)\r
+ adr = zHL;\r
+\r
+OP_INC_m:\r
+ res = READ_MEM8(adr);\r
+ res = (res + 1) & 0xff;\r
+ zF = (zF & CF) | SZHV_inc[res];\r
+ WRITE_MEM8(adr, res);\r
+ RET(11)\r
+\r
+/*-----------------------------------------\r
+ DEC r8\r
+-----------------------------------------*/\r
+\r
+ OP(0x05): // DEC B\r
+ OP(0x0d): // DEC C\r
+ OP(0x15): // DEC D\r
+ OP(0x1d): // DEC E\r
+ OP(0x25): // DEC H\r
+ OP(0x2d): // DEC L\r
+ OP(0x3d): // DEC A\r
+OP_DEC_R:\r
+ zR8(Opcode >> 3)--;\r
+ zF = (zF & CF) | SZHV_dec[zR8(Opcode >> 3)];\r
+ RET(4)\r
+\r
+ OP(0x35): // DEC (HL)\r
+ adr = zHL;\r
+\r
+OP_DEC_m:\r
+ res = READ_MEM8(adr);\r
+ res = (res - 1) & 0xff;\r
+ zF = (zF & CF) | SZHV_dec[res];\r
+ WRITE_MEM8(adr, res);\r
+ RET(11)\r
+\r
+/*-----------------------------------------\r
+ ADD r8\r
+-----------------------------------------*/\r
+\r
+ OP(0x86): // ADD A,(HL)\r
+ val = READ_MEM8(zHL);\r
+ USE_CYCLES(3)\r
+ goto OP_ADD;\r
+\r
+ OP(0xc6): // ADD A,n\r
+OP_ADD_imm:\r
+ val = READ_ARG();\r
+ USE_CYCLES(3)\r
+ goto OP_ADD;\r
+\r
+ OP(0x80): // ADD A,B\r
+ OP(0x81): // ADD A,C\r
+ OP(0x82): // ADD A,D\r
+ OP(0x83): // ADD A,E\r
+ OP(0x84): // ADD A,H\r
+ OP(0x85): // ADD A,L\r
+ OP(0x87): // ADD A,A\r
+OP_ADD_R:\r
+ val = zR8(Opcode & 7);\r
+\r
+OP_ADD:\r
+#if CZ80_BIG_FLAGS_ARRAY\r
+ {\r
+ UINT16 A = zA;\r
+ res = (UINT8)(A + val);\r
+ zF = SZHVC_add[(A << 8) | res];\r
+ zA = res;\r
+ }\r
+#else\r
+ res = zA + val;\r
+ zF = SZ[(UINT8)res] | ((res >> 8) & CF) |\r
+ ((zA ^ res ^ val) & HF) |\r
+ (((val ^ zA ^ 0x80) & (val ^ res) & 0x80) >> 5);\r
+ zA = res;\r
+#endif\r
+ RET(4)\r
+\r
+/*-----------------------------------------\r
+ ADC r8\r
+-----------------------------------------*/\r
+\r
+ OP(0x8e): // ADC A,(HL)\r
+ val = READ_MEM8(zHL);\r
+ USE_CYCLES(3)\r
+ goto OP_ADC;\r
+\r
+ OP(0xce): // ADC A,n\r
+OP_ADC_imm:\r
+ val = READ_ARG();\r
+ USE_CYCLES(3)\r
+ goto OP_ADC;\r
+\r
+ OP(0x88): // ADC A,B\r
+ OP(0x89): // ADC A,C\r
+ OP(0x8a): // ADC A,D\r
+ OP(0x8b): // ADC A,E\r
+ OP(0x8c): // ADC A,H\r
+ OP(0x8d): // ADC A,L\r
+ OP(0x8f): // ADC A,A\r
+OP_ADC_R:\r
+ val = zR8(Opcode & 7);\r
+\r
+OP_ADC:\r
+#if CZ80_BIG_FLAGS_ARRAY\r
+ {\r
+ UINT8 A = zA;\r
+ UINT8 c = zF & CF;\r
+ res = (UINT8)(A + val + c);\r
+ zF = SZHVC_add[(c << 16) | (A << 8) | res];\r
+ zA = res;\r
+ }\r
+#else\r
+ res = zA + val + (zF & CF);\r
+ zF = SZ[res & 0xff] | ((res >> 8) & CF) |\r
+ ((zA ^ res ^ val) & HF) |\r
+ (((val ^ zA ^ 0x80) & (val ^ res) & 0x80) >> 5);\r
+ zA = res;\r
+#endif\r
+ RET(4)\r
+\r
+/*-----------------------------------------\r
+ SUB r8\r
+-----------------------------------------*/\r
+\r
+ OP(0x96): // SUB (HL)\r
+ val = READ_MEM8(zHL);\r
+ USE_CYCLES(3)\r
+ goto OP_SUB;\r
+\r
+ OP(0xd6): // SUB A,n\r
+OP_SUB_imm:\r
+ val = READ_ARG();\r
+ USE_CYCLES(3)\r
+ goto OP_SUB;\r
+\r
+ OP(0x90): // SUB B\r
+ OP(0x91): // SUB C\r
+ OP(0x92): // SUB D\r
+ OP(0x93): // SUB E\r
+ OP(0x94): // SUB H\r
+ OP(0x95): // SUB L\r
+ OP(0x97): // SUB A\r
+OP_SUB_R:\r
+ val = zR8(Opcode & 7);\r
+\r
+OP_SUB:\r
+#if CZ80_BIG_FLAGS_ARRAY\r
+ {\r
+ UINT8 A = zA;\r
+ res = (UINT8)(A - val);\r
+ zF = SZHVC_sub[(A << 8) | res];\r
+ zA = res;\r
+ }\r
+#else\r
+ res = zA - val;\r
+ zF = SZ[res & 0xff] | ((res >> 8) & CF) | NF |\r
+ ((zA ^ res ^ val) & HF) |\r
+ (((val ^ zA) & (zA ^ res) & 0x80) >> 5);\r
+ zA = res;\r
+#endif\r
+ RET(4)\r
+\r
+/*-----------------------------------------\r
+ SBC r8\r
+-----------------------------------------*/\r
+\r
+ OP(0x9e): // SBC A,(HL)\r
+ val = READ_MEM8(zHL);\r
+ USE_CYCLES(3)\r
+ goto OP_SBC;\r
+\r
+ OP(0xde): // SBC A,n\r
+OP_SBC_imm:\r
+ val = READ_ARG();\r
+ USE_CYCLES(3)\r
+ goto OP_SBC;\r
+\r
+ OP(0x98): // SBC A,B\r
+ OP(0x99): // SBC A,C\r
+ OP(0x9a): // SBC A,D\r
+ OP(0x9b): // SBC A,E\r
+ OP(0x9c): // SBC A,H\r
+ OP(0x9d): // SBC A,L\r
+ OP(0x9f): // SBC A,A\r
+OP_SBC_R:\r
+ val = zR8(Opcode & 7);\r
+\r
+OP_SBC:\r
+#if CZ80_BIG_FLAGS_ARRAY\r
+ {\r
+ UINT8 A = zA;\r
+ UINT8 c = zF & CF;\r
+ res = (UINT8)(A - val - c);\r
+ zF = SZHVC_sub[(c << 16) | (A << 8) | res];\r
+ zA = res;\r
+ }\r
+#else\r
+ res = zA - val - (zF & CF);\r
+ zF = SZ[res & 0xff] | ((res >> 8) & CF) | NF |\r
+ ((zA ^ res ^ val) & HF) |\r
+ (((val ^ zA) & (zA ^ res) & 0x80) >> 5);\r
+ zA = res;\r
+#endif\r
+ RET(4)\r
+\r
+/*-----------------------------------------\r
+ CP r8\r
+-----------------------------------------*/\r
+\r
+ OP(0xbe): // CP (HL)\r
+ val = READ_MEM8(zHL);\r
+ USE_CYCLES(3)\r
+ goto OP_CP;\r
+\r
+ OP(0xfe): // CP n\r
+OP_CP_imm:\r
+ val = READ_ARG();\r
+ USE_CYCLES(3)\r
+ goto OP_CP;\r
+\r
+ OP(0xb8): // CP B\r
+ OP(0xb9): // CP C\r
+ OP(0xba): // CP D\r
+ OP(0xbb): // CP E\r
+ OP(0xbc): // CP H\r
+ OP(0xbd): // CP L\r
+ OP(0xbf): // CP A\r
+OP_CP_R:\r
+ val = zR8(Opcode & 7);\r
+\r
+OP_CP:\r
+#if CZ80_BIG_FLAGS_ARRAY\r
+ {\r
+ UINT8 A = zA;\r
+ res = (UINT8)(A - val);\r
+ zF = (SZHVC_sub[(A << 8) | res] & ~(YF | XF)) |\r
+ (val & (YF | XF));\r
+ }\r
+#else\r
+ res = zA - val;\r
+ zF = (SZ[res & 0xff] & (SF | ZF)) |\r
+ (val & (YF | XF)) | ((res >> 8) & CF) | NF |\r
+ ((zA ^ res ^ val) & HF) |\r
+ (((val ^ zA) & (zA ^ res) >> 5) & VF);\r
+#endif\r
+ RET(4)\r
+\r
+/*-----------------------------------------\r
+ AND r8\r
+-----------------------------------------*/\r
+\r
+ OP(0xa6): // AND (HL)\r
+ val = READ_MEM8(zHL);\r
+ USE_CYCLES(3)\r
+ goto OP_AND;\r
+\r
+ OP(0xe6): // AND A,n\r
+OP_AND_imm:\r
+ val = READ_ARG();\r
+ USE_CYCLES(3)\r
+ goto OP_AND;\r
+\r
+ OP(0xa0): // AND B\r
+ OP(0xa1): // AND C\r
+ OP(0xa2): // AND D\r
+ OP(0xa3): // AND E\r
+ OP(0xa4): // AND H\r
+ OP(0xa5): // AND L\r
+ OP(0xa7): // AND A\r
+OP_AND_R:\r
+ val = zR8(Opcode & 7);\r
+\r
+OP_AND:\r
+ zA &= val;\r
+ zF = SZP[zA] | HF;\r
+ RET(4)\r
+\r
+/*-----------------------------------------\r
+ XOR r8\r
+-----------------------------------------*/\r
+\r
+ OP(0xae): // XOR (HL)\r
+ val = READ_MEM8(zHL);\r
+ USE_CYCLES(3)\r
+ goto OP_XOR;\r
+\r
+ OP(0xee): // XOR A,n\r
+OP_XOR_imm:\r
+ val = READ_ARG();\r
+ USE_CYCLES(3)\r
+ goto OP_XOR;\r
+\r
+ OP(0xa8): // XOR B\r
+ OP(0xa9): // XOR C\r
+ OP(0xaa): // XOR D\r
+ OP(0xab): // XOR E\r
+ OP(0xac): // XOR H\r
+ OP(0xad): // XOR L\r
+ OP(0xaf): // XOR A\r
+OP_XOR_R:\r
+ val = zR8(Opcode & 7);\r
+\r
+OP_XOR:\r
+ zA ^= val;\r
+ zF = SZP[zA];\r
+ RET(4)\r
+\r
+/*-----------------------------------------\r
+ OR r8\r
+-----------------------------------------*/\r
+\r
+ OP(0xb6): // OR (HL)\r
+ val = READ_MEM8(zHL);\r
+ USE_CYCLES(3)\r
+ goto OP_OR;\r
+\r
+ OP(0xf6): // OR A,n\r
+OP_OR_imm:\r
+ val = READ_ARG();\r
+ USE_CYCLES(3)\r
+ goto OP_OR;\r
+\r
+ OP(0xb0): // OR B\r
+ OP(0xb1): // OR C\r
+ OP(0xb2): // OR D\r
+ OP(0xb3): // OR E\r
+ OP(0xb4): // OR H\r
+ OP(0xb5): // OR L\r
+ OP(0xb7): // OR A\r
+OP_OR_R:\r
+ val = zR8(Opcode & 7);\r
+\r
+OP_OR:\r
+ zA |= val;\r
+ zF = SZP[zA];\r
+ RET(4)\r
+\r
+/*-----------------------------------------\r
+ MISC ARITHMETIC & CPU CONTROL\r
+-----------------------------------------*/\r
+\r
+ OP(0x27): // DAA\r
+OP_DAA:\r
+ {\r
+ UINT8 F;\r
+ UINT8 cf, nf, hf, lo, hi, diff;\r
+\r
+ F = zF;\r
+ cf = F & CF;\r
+ nf = F & NF;\r
+ hf = F & HF;\r
+ lo = zA & 0x0f;\r
+ hi = zA >> 4;\r
+\r
+ if (cf)\r
+ {\r
+ diff = (lo <= 9 && !hf) ? 0x60 : 0x66;\r
+ }\r
+ else\r
+ {\r
+ if (lo >= 10)\r
+ {\r
+ diff = hi <= 8 ? 0x06 : 0x66;\r
+ }\r
+ else\r
+ {\r
+ if (hi >= 10)\r
+ {\r
+ diff = hf ? 0x66 : 0x60;\r
+ }\r
+ else\r
+ {\r
+ diff = hf ? 0x06 : 0x00;\r
+ }\r
+ }\r
+ }\r
+ if (nf) zA -= diff;\r
+ else zA += diff;\r
+\r
+ F = SZP[zA] | (F & NF);\r
+ if (cf || (lo <= 9 ? hi >= 10 : hi >= 9)) F |= CF;\r
+ if (nf ? hf && lo <= 5 : lo >= 10) F |= HF;\r
+ zF = F;\r
+ RET(4)\r
+ }\r
+\r
+ OP(0x2f): // CPL\r
+OP_CPL:\r
+ zA ^= 0xff;\r
+ zF = (zF & (SF | ZF | PF | CF)) | HF | NF | (zA & (YF | XF));\r
+ RET(4)\r
+\r
+ OP(0x37): // SCF\r
+OP_SCF:\r
+ zF = (zF & (SF | ZF | PF)) | CF | (zA & (YF | XF));\r
+ RET(4)\r
+\r
+ OP(0x3f): // CCF\r
+OP_CCF:\r
+ zF = ((zF & (SF | ZF | PF | CF)) | ((zF & CF) << 4) | (zA & (YF | XF))) ^ CF;\r
+ RET(4)\r
+\r
+ OP(0x76): // HALT\r
+OP_HALT:\r
+ CPU->HaltState = 1;\r
+ CPU->ICount = 0;\r
+ goto Cz80_Check_Interrupt;\r
+\r
+ OP(0xf3): // DI\r
+OP_DI:\r
+ zIFF = 0;\r
+ RET(4)\r
+\r
+ OP(0xfb): // EI\r
+OP_EI:\r
+ USE_CYCLES(4)\r
+ if (!zIFF1)\r
+ {\r
+ zIFF1 = zIFF2 = (1 << 2);\r
+ while (GET_OP() == 0xfb)\r
+ {\r
+ USE_CYCLES(4)\r
+ PC++;\r
+#if CZ80_EMULATE_R_EXACTLY\r
+ zR++;\r
+#endif\r
+ }\r
+ if (CPU->IRQState)\r
+ {\r
+ afterEI = 1;\r
+ }\r
+ if (CPU->ICount <= 0)\r
+ {\r
+ CPU->ICount = 1;\r
+ }\r
+ }\r
+ else zIFF2 = (1 << 2);\r
+ goto Cz80_Exec;\r
+\r
+/*-----------------------------------------\r
+ INC r16\r
+-----------------------------------------*/\r
+\r
+ OP(0x03): // INC BC\r
+OP_INC_BC:\r
+ zBC++;\r
+ RET(6)\r
+\r
+ OP(0x13): // INC DE\r
+OP_INC_DE:\r
+ zDE++;\r
+ RET(6)\r
+\r
+ OP(0x23): // INC HL\r
+OP_INC_xx:\r
+ data->W++;\r
+ RET(6)\r
+\r
+ OP(0x33): // INC SP\r
+OP_INC_SP:\r
+ zSP++;\r
+ RET(6)\r
+\r
+/*-----------------------------------------\r
+ DEC r16\r
+-----------------------------------------*/\r
+\r
+ OP(0x0b): // DEC BC\r
+OP_DEC_BC:\r
+ zBC--;\r
+ RET(6)\r
+\r
+ OP(0x1b): // DEC DE\r
+OP_DEC_DE:\r
+ zDE--;\r
+ RET(6)\r
+\r
+ OP(0x2b): // DEC HL\r
+OP_DEC_xx:\r
+ data->W--;\r
+ RET(6)\r
+\r
+ OP(0x3b): // DEC SP\r
+OP_DEC_SP:\r
+ zSP--;\r
+ RET(6)\r
+\r
+/*-----------------------------------------\r
+ ADD r16\r
+-----------------------------------------*/\r
+\r
+ OP(0x39): // ADD xx,SP\r
+OP_ADD16_xx_SP:\r
+ val = zSP;\r
+ goto OP_ADD16;\r
+\r
+ OP(0x29): // ADD xx,xx\r
+OP_ADD16_xx_xx:\r
+ val = data->W;\r
+ goto OP_ADD16;\r
+\r
+ OP(0x09): // ADD xx,BC\r
+OP_ADD16_xx_BC:\r
+ val = zBC;\r
+ goto OP_ADD16;\r
+\r
+ OP(0x19): // ADD xx,DE\r
+OP_ADD16_xx_DE:\r
+ val = zDE;\r
+\r
+OP_ADD16:\r
+ res = data->W + val;\r
+ zF = (zF & (SF | ZF | VF)) |\r
+ (((data->W ^ res ^ val) >> 8) & HF) |\r
+ ((res >> 16) & CF) | ((res >> 8) & (YF | XF));\r
+ data->W = (UINT16)res;\r
+ RET(11)\r
+\r
+/*-----------------------------------------\r
+ ROTATE\r
+-----------------------------------------*/\r
+\r
+ {\r
+ UINT8 A;\r
+ UINT8 F;\r
+\r
+ OP(0x07): // RLCA\r
+OP_RLCA:\r
+ A = zA;\r
+ zA = (A << 1) | (A >> 7);\r
+ zF = (zF & (SF | ZF | PF)) | (zA & (YF | XF | CF));\r
+ RET(4)\r
+\r
+ OP(0x0f): // RRCA\r
+OP_RRCA:\r
+ A = zA;\r
+ F = zF;\r
+ F = (F & (SF | ZF | PF)) | (A & CF);\r
+ zA = (A >> 1) | (A << 7);\r
+ zF = F | (zA & (YF | XF));\r
+ RET(4)\r
+\r
+ OP(0x17): // RLA\r
+OP_RLA:\r
+ A = zA;\r
+ F = zF;\r
+ zA = (A << 1) | (F & CF);\r
+ zF = (F & (SF | ZF | PF)) | (A >> 7) | (zA & (YF | XF));\r
+ RET(4)\r
+\r
+ OP(0x1f): // RRA\r
+OP_RRA:\r
+ A = zA;\r
+ F = zF;\r
+ zA = (A >> 1) | (F << 7);\r
+ zF = (F & (SF | ZF | PF)) | (A & CF) | (zA & (YF | XF));\r
+ RET(4)\r
+ }\r
+\r
+/*-----------------------------------------\r
+ JP\r
+-----------------------------------------*/\r
+\r
+ OP(0xc3): // JP nn\r
+OP_JP:\r
+ res = READ_ARG16();\r
+ SET_PC(res);\r
+ RET(10)\r
+\r
+ OP(0xc2): // JP NZ,nn\r
+OP_JP_NZ:\r
+ if (!(zF & ZF)) goto OP_JP;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xca): // JP Z,nn\r
+OP_JP_Z:\r
+ if (zF & ZF) goto OP_JP;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xd2): // JP NC,nn\r
+OP_JP_NC:\r
+ if (!(zF & CF)) goto OP_JP;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xda): // JP C,nn\r
+OP_JP_C:\r
+ if (zF & CF) goto OP_JP;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xe2): // JP PO,nn\r
+OP_JP_PO:\r
+ if (!(zF & VF)) goto OP_JP;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xea): // JP PE,nn\r
+OP_JP_PE:\r
+ if (zF & VF) goto OP_JP;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xf2): // JP P,nn\r
+OP_JP_P:\r
+ if (!(zF & SF)) goto OP_JP;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xfa): // JP M,nn\r
+OP_JP_M:\r
+ if (zF & SF) goto OP_JP;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xe9): // JP (xx)\r
+OP_JP_xx:\r
+ res = data->W;\r
+ SET_PC(res);\r
+ RET(4)\r
+\r
+/*-----------------------------------------\r
+ JR\r
+-----------------------------------------*/\r
+\r
+ OP(0x10): // DJNZ n\r
+OP_DJNZ:\r
+ USE_CYCLES(1)\r
+ if (--zB) goto OP_JR;\r
+ PC++;\r
+ RET(7)\r
+\r
+ OP(0x18): // JR n\r
+OP_JR:\r
+ adr = (INT8)READ_ARG();\r
+ PC += adr;\r
+ RET(12)\r
+\r
+ OP(0x20): // JR NZ,n\r
+OP_JR_NZ:\r
+ if (!(zF & ZF)) goto OP_JR;\r
+ PC++;\r
+ RET(7)\r
+\r
+ OP(0x28): // JR Z,n\r
+OP_JR_Z:\r
+ if (zF & ZF) goto OP_JR;\r
+ PC++;\r
+ RET(7)\r
+\r
+ OP(0x38): // JR C,n\r
+OP_JR_C:\r
+ if (zF & CF) goto OP_JR;\r
+ PC++;\r
+ RET(7)\r
+\r
+ OP(0x30): // JR NC,n\r
+OP_JR_NC:\r
+ if (!(zF & CF)) goto OP_JR;\r
+ PC++;\r
+ RET(7)\r
+\r
+/*-----------------------------------------\r
+ CALL\r
+-----------------------------------------*/\r
+\r
+ OP(0xcd): // CALL nn\r
+OP_CALL:\r
+ res = READ_ARG16();\r
+ val = zRealPC;\r
+ PUSH_16(val);\r
+ SET_PC(res);\r
+ RET(17)\r
+\r
+ OP(0xc4): // CALL NZ,nn\r
+OP_CALL_NZ:\r
+ if (!(zF & ZF)) goto OP_CALL;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xcc): // CALL Z,nn\r
+OP_CALL_Z:\r
+ if (zF & ZF) goto OP_CALL;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xd4): // CALL NC,nn\r
+OP_CALL_NC:\r
+ if (!(zF & CF)) goto OP_CALL;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xdc): // CALL C,nn\r
+OP_CALL_C:\r
+ if (zF & CF) goto OP_CALL;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xe4): // CALL PO,nn\r
+OP_CALL_PO:\r
+ if (!(zF & VF)) goto OP_CALL;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xec): // CALL PE,nn\r
+OP_CALL_PE:\r
+ if (zF & VF) goto OP_CALL;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xf4): // CALL P,nn\r
+OP_CALL_P:\r
+ if (!(zF & SF)) goto OP_CALL;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+ OP(0xfc): // CALL M,nn\r
+OP_CALL_M:\r
+ if (zF & SF) goto OP_CALL;\r
+ PC += 2;\r
+ RET(10)\r
+\r
+/*-----------------------------------------\r
+ RET\r
+-----------------------------------------*/\r
+\r
+OP_RET_COND:\r
+ USE_CYCLES(1)\r
+\r
+ OP(0xc9): // RET\r
+OP_RET:\r
+ POP_16(res);\r
+ SET_PC(res);\r
+ RET(10)\r
+\r
+ OP(0xc0): // RET NZ\r
+OP_RET_NZ:\r
+ if (!(zF & ZF)) goto OP_RET_COND;\r
+ RET(5)\r
+\r
+ OP(0xc8): // RET Z\r
+OP_RET_Z:\r
+ if (zF & ZF) goto OP_RET_COND;\r
+ RET(5)\r
+\r
+ OP(0xd0): // RET NC\r
+OP_RET_NC:\r
+ if (!(zF & CF)) goto OP_RET_COND;\r
+ RET(5)\r
+\r
+ OP(0xd8): // RET C\r
+OP_RET_C:\r
+ if (zF & CF) goto OP_RET_COND;\r
+ RET(5)\r
+\r
+ OP(0xe0): // RET PO\r
+OP_RET_PO:\r
+ if (!(zF & VF)) goto OP_RET_COND;\r
+ RET(5)\r
+\r
+ OP(0xe8): // RET PE\r
+OP_RET_PE:\r
+ if (zF & VF) goto OP_RET_COND;\r
+ RET(5)\r
+\r
+ OP(0xf0): // RET P\r
+OP_RET_P:\r
+ if (!(zF & SF)) goto OP_RET_COND;\r
+ RET(5)\r
+\r
+ OP(0xf8): // RET M\r
+OP_RET_M:\r
+ if (zF & SF) goto OP_RET_COND;\r
+ RET(5)\r
+\r
+/*-----------------------------------------\r
+ RST\r
+-----------------------------------------*/\r
+\r
+ OP(0xc7): // RST 0\r
+ OP(0xcf): // RST 1\r
+ OP(0xd7): // RST 2\r
+ OP(0xdf): // RST 3\r
+ OP(0xe7): // RST 4\r
+ OP(0xef): // RST 5\r
+ OP(0xf7): // RST 6\r
+ OP(0xff): // RST 7\r
+OP_RST:\r
+ res = zRealPC;\r
+ PUSH_16(res);\r
+ res = Opcode & 0x38;\r
+ SET_PC(res);\r
+ RET(11)\r
+\r
+/*-----------------------------------------\r
+ OUT\r
+-----------------------------------------*/\r
+\r
+ OP(0xd3): // OUT (n),A\r
+OP_OUT_mN_A:\r
+ adr = (zA << 8) | READ_ARG();\r
+ OUT(adr, zA);\r
+ RET(11)\r
+\r
+/*-----------------------------------------\r
+ IN\r
+-----------------------------------------*/\r
+\r
+ OP(0xdb): // IN A,(n)\r
+OP_IN_A_mN:\r
+ adr = (zA << 8) | READ_ARG();\r
+ zA = IN(adr);\r
+ RET(11)\r
+\r
+/*-----------------------------------------\r
+ PREFIX\r
+-----------------------------------------*/\r
+\r
+ OP(0xcb): // CB prefix (BIT & SHIFT INSTRUCTIONS)\r
+ {\r
+ UINT8 src;\r
+ UINT8 res;\r
+\r
+ Opcode = READ_OP();\r
+#if CZ80_EMULATE_R_EXACTLY\r
+ zR++;\r
+#endif\r
+ #include "cz80_opCB.c"\r
+ }\r
+\r
+ OP(0xed): // ED prefix\r
+ED_PREFIX:\r
+ USE_CYCLES(4)\r
+ Opcode = READ_OP();\r
+#if CZ80_EMULATE_R_EXACTLY\r
+ zR++;\r
+#endif\r
+ #include "cz80_opED.c"\r
+\r
+ OP(0xdd): // DD prefix (IX)\r
+DD_PREFIX:\r
+ data = pzIX;\r
+ goto XY_PREFIX;\r
+\r
+ OP(0xfd): // FD prefix (IY)\r
+FD_PREFIX:\r
+ data = pzIY;\r
+\r
+XY_PREFIX:\r
+ USE_CYCLES(4)\r
+ Opcode = READ_OP();\r
+#if CZ80_EMULATE_R_EXACTLY\r
+ zR++;\r
+#endif\r
+ #include "cz80_opXY.c"\r
+\r
+#if !CZ80_USE_JUMPTABLE\r
+}\r
+#endif\r