basic psp snd + cz80
[picodrive.git] / cpu / cz80 / cz80_op.c
diff --git a/cpu/cz80/cz80_op.c b/cpu/cz80/cz80_op.c
new file mode 100644 (file)
index 0000000..ed13c9e
--- /dev/null
@@ -0,0 +1,1145 @@
+/******************************************************************************\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