basic psp snd + cz80
[picodrive.git] / cpu / cz80 / cz80_opED.c
diff --git a/cpu/cz80/cz80_opED.c b/cpu/cz80/cz80_opED.c
new file mode 100644 (file)
index 0000000..c3b7ec6
--- /dev/null
@@ -0,0 +1,731 @@
+/******************************************************************************\r
+ *\r
+ * CZ80 ED 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 *JumpTableED[Opcode];\r
+#else\r
+switch (Opcode)\r
+{\r
+#endif\r
+\r
+/*-----------------------------------------\r
+ ILLEGAL\r
+-----------------------------------------*/\r
+\r
+       OPED(0x00):\r
+       OPED(0x01):\r
+       OPED(0x02):\r
+       OPED(0x03):\r
+       OPED(0x04):\r
+       OPED(0x05):\r
+       OPED(0x06):\r
+       OPED(0x07):\r
+       OPED(0x08):\r
+       OPED(0x09):\r
+       OPED(0x0a):\r
+       OPED(0x0b):\r
+       OPED(0x0c):\r
+       OPED(0x0d):\r
+       OPED(0x0e):\r
+       OPED(0x0f):\r
+\r
+       OPED(0x10):\r
+       OPED(0x11):\r
+       OPED(0x12):\r
+       OPED(0x13):\r
+       OPED(0x14):\r
+       OPED(0x15):\r
+       OPED(0x16):\r
+       OPED(0x17):\r
+       OPED(0x18):\r
+       OPED(0x19):\r
+       OPED(0x1a):\r
+       OPED(0x1b):\r
+       OPED(0x1c):\r
+       OPED(0x1d):\r
+       OPED(0x1e):\r
+       OPED(0x1f):\r
+\r
+       OPED(0x20):\r
+       OPED(0x21):\r
+       OPED(0x22):\r
+       OPED(0x23):\r
+       OPED(0x24):\r
+       OPED(0x25):\r
+       OPED(0x26):\r
+       OPED(0x27):\r
+       OPED(0x28):\r
+       OPED(0x29):\r
+       OPED(0x2a):\r
+       OPED(0x2b):\r
+       OPED(0x2c):\r
+       OPED(0x2d):\r
+       OPED(0x2e):\r
+       OPED(0x2f):\r
+\r
+       OPED(0x30):\r
+       OPED(0x31):\r
+       OPED(0x32):\r
+       OPED(0x33):\r
+       OPED(0x34):\r
+       OPED(0x35):\r
+       OPED(0x36):\r
+       OPED(0x37):\r
+       OPED(0x38):\r
+       OPED(0x39):\r
+       OPED(0x3a):\r
+       OPED(0x3b):\r
+       OPED(0x3c):\r
+       OPED(0x3d):\r
+       OPED(0x3e):\r
+       OPED(0x3f):\r
+\r
+       OPED(0x77):\r
+       OPED(0x7f):\r
+\r
+       OPED(0x80):\r
+       OPED(0x81):\r
+       OPED(0x82):\r
+       OPED(0x83):\r
+       OPED(0x84):\r
+       OPED(0x85):\r
+       OPED(0x86):\r
+       OPED(0x87):\r
+       OPED(0x88):\r
+       OPED(0x89):\r
+       OPED(0x8a):\r
+       OPED(0x8b):\r
+       OPED(0x8c):\r
+       OPED(0x8d):\r
+       OPED(0x8e):\r
+       OPED(0x8f):\r
+\r
+       OPED(0x90):\r
+       OPED(0x91):\r
+       OPED(0x92):\r
+       OPED(0x93):\r
+       OPED(0x94):\r
+       OPED(0x95):\r
+       OPED(0x96):\r
+       OPED(0x97):\r
+       OPED(0x98):\r
+       OPED(0x99):\r
+       OPED(0x9a):\r
+       OPED(0x9b):\r
+       OPED(0x9c):\r
+       OPED(0x9d):\r
+       OPED(0x9e):\r
+       OPED(0x9f):\r
+\r
+       OPED(0xa4):\r
+       OPED(0xa5):\r
+       OPED(0xa6):\r
+       OPED(0xa7):\r
+\r
+       OPED(0xac):\r
+       OPED(0xad):\r
+       OPED(0xae):\r
+       OPED(0xaf):\r
+\r
+       OPED(0xb4):\r
+       OPED(0xb5):\r
+       OPED(0xb6):\r
+       OPED(0xb7):\r
+\r
+       OPED(0xbc):\r
+       OPED(0xbd):\r
+       OPED(0xbe):\r
+       OPED(0xbf):\r
+\r
+       OPED(0xc0):\r
+       OPED(0xc1):\r
+       OPED(0xc2):\r
+       OPED(0xc3):\r
+       OPED(0xc4):\r
+       OPED(0xc5):\r
+       OPED(0xc6):\r
+       OPED(0xc7):\r
+       OPED(0xc8):\r
+       OPED(0xc9):\r
+       OPED(0xca):\r
+       OPED(0xcb):\r
+       OPED(0xcc):\r
+       OPED(0xcd):\r
+       OPED(0xce):\r
+       OPED(0xcf):\r
+\r
+       OPED(0xd0):\r
+       OPED(0xd1):\r
+       OPED(0xd2):\r
+       OPED(0xd3):\r
+       OPED(0xd4):\r
+       OPED(0xd5):\r
+       OPED(0xd6):\r
+       OPED(0xd7):\r
+       OPED(0xd8):\r
+       OPED(0xd9):\r
+       OPED(0xda):\r
+       OPED(0xdb):\r
+       OPED(0xdc):\r
+       OPED(0xdd):\r
+       OPED(0xde):\r
+       OPED(0xdf):\r
+\r
+       OPED(0xe0):\r
+       OPED(0xe1):\r
+       OPED(0xe2):\r
+       OPED(0xe3):\r
+       OPED(0xe4):\r
+       OPED(0xe5):\r
+       OPED(0xe6):\r
+       OPED(0xe7):\r
+       OPED(0xe8):\r
+       OPED(0xe9):\r
+       OPED(0xea):\r
+       OPED(0xeb):\r
+       OPED(0xec):\r
+       OPED(0xed):\r
+       OPED(0xee):\r
+       OPED(0xef):\r
+\r
+       OPED(0xf0):\r
+       OPED(0xf1):\r
+       OPED(0xf2):\r
+       OPED(0xf3):\r
+       OPED(0xf4):\r
+       OPED(0xf5):\r
+       OPED(0xf6):\r
+       OPED(0xf7):\r
+       OPED(0xf8):\r
+       OPED(0xf9):\r
+       OPED(0xfa):\r
+       OPED(0xfb):\r
+       OPED(0xfc):\r
+       OPED(0xfd):\r
+       OPED(0xfe):\r
+       OPED(0xff):\r
+               RET(4)\r
+\r
+/*-----------------------------------------\r
+ LD r8\r
+-----------------------------------------*/\r
+\r
+       OPED(0x47): // LD   I,A\r
+               zI = zA;\r
+               RET(5)\r
+\r
+       OPED(0x4f): // LD   R,A\r
+#if CZ80_EMULATE_R_EXACTLY\r
+               zR = zA;\r
+#else\r
+               zR = zA - ((cycles - CPU->ICount) >> 2);\r
+#endif\r
+               zR2 = zA & 0x80;\r
+               RET(5)\r
+\r
+       OPED(0x57): // LD   A,I\r
+               zA = zI;\r
+               zF = (zF & CF) | SZ[zA] | zIFF2;\r
+               RET(5)\r
+\r
+       OPED(0x5f): // LD   A,R\r
+#if CZ80_EMULATE_R_EXACTLY\r
+               zA = (zR & 0x7f) | zR2;\r
+#else\r
+               zA = ((zR + ((cycles - CPU->ICount) >> 2)) & 0x7f) | zR2;\r
+#endif\r
+               zF = (zF & CF) | SZ[zA] | zIFF2;\r
+               RET(5)\r
+\r
+/*-----------------------------------------\r
+ LD r16\r
+-----------------------------------------*/\r
+\r
+       OPED(0x43): // LD   (w),BC\r
+               data = pzBC;\r
+               goto OP_LD_mNN_xx;\r
+\r
+       OPED(0x53): // LD   (w),DE\r
+               data = pzDE;\r
+               goto OP_LD_mNN_xx;\r
+\r
+       OPED(0x63): // LD   (w),HL\r
+               data = pzHL;\r
+               goto OP_LD_mNN_xx;\r
+\r
+       OPED(0x73): // LD   (w),SP\r
+               data = pzSP;\r
+               goto OP_LD_mNN_xx;\r
+\r
+       OPED(0x4b): // LD   BC,(w)\r
+               data = pzBC;\r
+               goto OP_LD_xx_mNN;\r
+\r
+       OPED(0x5b): // LD   DE,(w)\r
+               data = pzDE;\r
+               goto OP_LD_xx_mNN;\r
+\r
+       OPED(0x6b): // LD   HL,(w)\r
+               data = pzHL;\r
+               goto OP_LD_xx_mNN;\r
+\r
+       OPED(0x7b): // LD   SP,(w)\r
+               data = pzSP;\r
+               goto OP_LD_xx_mNN;\r
+\r
+/*-----------------------------------------\r
+ NEG\r
+-----------------------------------------*/\r
+\r
+       OPED(0x44): // NEG\r
+       OPED(0x4c): // NEG\r
+       OPED(0x54): // NEG\r
+       OPED(0x5c): // NEG\r
+       OPED(0x64): // NEG\r
+       OPED(0x6c): // NEG\r
+       OPED(0x74): // NEG\r
+       OPED(0x7c): // NEG\r
+               val = zA;\r
+               zA = 0;\r
+               goto OP_SUB;\r
+\r
+/*-----------------------------------------\r
+ RRD\r
+-----------------------------------------*/\r
+\r
+       OPED(0x67): // RRD  (HL)\r
+               adr = zHL;\r
+               val = READ_MEM8(adr);\r
+               WRITE_MEM8(adr, (val >> 4) | (zA << 4));\r
+               zA = (zA & 0xf0) | (val & 0x0f);\r
+               zF = (zF & CF) | SZP[zA];\r
+               RET(14)\r
+\r
+/*-----------------------------------------\r
+ RLD\r
+-----------------------------------------*/\r
+\r
+       OPED(0x6f): // RLD  (HL)\r
+               adr = zHL;\r
+               val = READ_MEM8(adr);\r
+               WRITE_MEM8(adr, (val << 4) | (zA & 0x0f));\r
+               zA = (zA & 0xf0) | (val >> 4);\r
+               zF = (zF & CF) | SZP[zA];\r
+               RET(14)\r
+\r
+/*-----------------------------------------\r
+ ADC 16\r
+-----------------------------------------*/\r
+\r
+       OPED(0x7a): // ADC  HL,SP\r
+               val = zSP;\r
+               goto OP_ADC16;\r
+\r
+       OPED(0x4a): // ADC  HL,BC\r
+       OPED(0x5a): // ADC  HL,DE\r
+       OPED(0x6a): // ADC  HL,HL\r
+               val = zR16((Opcode >> 4) & 3);\r
+\r
+OP_ADC16:\r
+               res = zHL + val + (zF & CF);\r
+               zF = (((zHL ^ res ^ val) >> 8) & HF) |\r
+                       ((res >> 16) & CF) |\r
+                       ((res >> 8) & (SF | YF | XF)) |\r
+                       ((res & 0xffff) ? 0 : ZF) |\r
+                       (((val ^ zHL ^ 0x8000) & (val ^ res) & 0x8000) >> 13);\r
+               zHL = (UINT16)res;\r
+               RET(11)\r
+\r
+/*-----------------------------------------\r
+ SBC 16\r
+-----------------------------------------*/\r
+\r
+       OPED(0x72): // SBC  HL,SP\r
+               val = zSP;\r
+               goto OP_SBC16;\r
+\r
+       OPED(0x42): // SBC  HL,BC\r
+       OPED(0x52): // SBC  HL,DE\r
+       OPED(0x62): // SBC  HL,HL\r
+               val = zR16((Opcode >> 4) & 3);\r
+\r
+OP_SBC16:\r
+               res = zHL - val - (zF & CF);\r
+               zF = (((zHL ^ res ^ val) >> 8) & HF) | NF |\r
+                       ((res >> 16) & CF) |\r
+                       ((res >> 8) & (SF | YF | XF)) |\r
+                       ((res & 0xffff) ? 0 : ZF) |\r
+                       (((val ^ zHL) & (zHL ^ res) & 0x8000) >> 13);\r
+               zHL = (UINT16)res;\r
+               RET(11)\r
+\r
+/*-----------------------------------------\r
+ IN\r
+-----------------------------------------*/\r
+\r
+       OPED(0x40): // IN   B,(C)\r
+       OPED(0x48): // IN   C,(C)\r
+       OPED(0x50): // IN   D,(C)\r
+       OPED(0x58): // IN   E,(C)\r
+       OPED(0x60): // IN   H,(C)\r
+       OPED(0x68): // IN   L,(C)\r
+       OPED(0x78): // IN   E,(C)\r
+               res = IN(zBC);\r
+               zR8((Opcode >> 3) & 7) = res;\r
+               zF = (zF & CF) | SZP[res];\r
+               RET(8)\r
+\r
+       OPED(0x70): // IN   0,(C)\r
+               res = IN(zBC);\r
+               zF = (zF & CF) | SZP[res];\r
+               RET(8)\r
+\r
+/*-----------------------------------------\r
+ OUT\r
+-----------------------------------------*/\r
+\r
+       OPED(0x51): // OUT  (C),D\r
+       OPED(0x41): // OUT  (C),B\r
+       OPED(0x49): // OUT  (C),C\r
+       OPED(0x59): // OUT  (C),E\r
+       OPED(0x61): // OUT  (C),H\r
+       OPED(0x69): // OUT  (C),L\r
+       OPED(0x79): // OUT  (C),E\r
+               res = zR8((Opcode >> 3) & 7);\r
+               OUT(zBC, res);\r
+               RET(8)\r
+\r
+       OPED(0x71): // OUT  (C),0\r
+               OUT(zBC, 0);\r
+               RET(8)\r
+\r
+/*-----------------------------------------\r
+ RETN\r
+-----------------------------------------*/\r
+\r
+       OPED(0x45): // RETN;\r
+       OPED(0x55): // RETN;\r
+       OPED(0x65): // RETN;\r
+       OPED(0x75): // RETN;\r
+               POP_16(res);\r
+               SET_PC(res);\r
+               if (!zIFF1 && zIFF2)\r
+               {\r
+                       zIFF1 = (1 << 2);\r
+                       if (CPU->IRQState)\r
+                       {\r
+                               USE_CYCLES(10)\r
+                               goto Cz80_Check_Interrupt;\r
+                       }\r
+               }\r
+               else zIFF1 = zIFF2;\r
+               RET(10)\r
+\r
+/*-----------------------------------------\r
+ RETI\r
+-----------------------------------------*/\r
+\r
+       OPED(0x4d): // RETI\r
+       OPED(0x5d): // RETI\r
+       OPED(0x6d): // RETI\r
+       OPED(0x7d): // RETI\r
+               POP_16(res);\r
+               SET_PC(res);\r
+               RET(10)\r
+\r
+/*-----------------------------------------\r
+ IM\r
+-----------------------------------------*/\r
+\r
+       OPED(0x46): // IM   0\r
+       OPED(0x4e): // IM   0\r
+       OPED(0x66): // IM   0\r
+       OPED(0x6e): // IM   0\r
+               zIM = 0;\r
+               RET(4)\r
+\r
+       OPED(0x56): // IM   1\r
+       OPED(0x76): // IM   1\r
+               zIM = 1;\r
+               RET(4)\r
+\r
+       OPED(0x5e): // IM   2\r
+       OPED(0x7e): // IM   2\r
+               zIM = 2;\r
+               RET(4)\r
+\r
+       {\r
+               UINT8 val;\r
+               UINT8 res;\r
+               UINT8 F;\r
+\r
+/*-----------------------------------------\r
+ LDI/LDD\r
+-----------------------------------------*/\r
+\r
+       OPED(0xa0): // LDI\r
+               val = READ_MEM8(zHL++);\r
+               WRITE_MEM8(zDE++, val);\r
+               goto OP_LDX;\r
+\r
+       OPED(0xa8): // LDD\r
+               val = READ_MEM8(zHL--);\r
+               WRITE_MEM8(zDE--, val);\r
+\r
+OP_LDX:\r
+               F = zF & (SF | ZF | CF);\r
+               if ((zA + val) & 0x02) F |= YF;\r
+               if ((zA + val) & 0x08) F |= XF;\r
+               if (--zBC) F |= VF;\r
+               zF = F;\r
+               RET(12)\r
+\r
+/*-----------------------------------------\r
+ LDIR/LDDR\r
+-----------------------------------------*/\r
+\r
+       OPED(0xb0): // LDIR\r
+               do\r
+               {\r
+                       val = READ_MEM8(zHL++);\r
+                       WRITE_MEM8(zDE++, val);\r
+                       zBC--;\r
+                       USE_CYCLES(17)\r
+               } while (zBC && (CPU->ICount > 0));\r
+               goto OP_LDXR;\r
+\r
+       OPED(0xb8): // LDDR\r
+               do\r
+               {\r
+                       val = READ_MEM8(zHL--);\r
+                       WRITE_MEM8(zDE--, val);\r
+                       zBC--;\r
+                       USE_CYCLES(17)\r
+               } while (zBC && (CPU->ICount > 0));\r
+\r
+OP_LDXR:\r
+               F = zF & (SF | ZF | CF);\r
+               if ((zA + val) & 0x02) F |= YF;\r
+               if ((zA + val) & 0x08) F |= XF;\r
+               if (zBC)\r
+               {\r
+                       zF = F | VF;\r
+                       PC -= 2;\r
+#if CZ80_EMULATE_R_EXACTLY\r
+                       zR--;\r
+#endif\r
+                       goto Cz80_Exec_End;\r
+               }\r
+               zF = F;\r
+               ADD_CYCLES(5)\r
+               goto Cz80_Exec;\r
+\r
+/*-----------------------------------------\r
+ CPI/CPD\r
+-----------------------------------------*/\r
+\r
+       OPED(0xa1): // CPI\r
+               val = READ_MEM8(zHL++);\r
+               goto OP_CPX;\r
+\r
+       OPED(0xa9): // CPD\r
+               val = READ_MEM8(zHL--);\r
+\r
+OP_CPX:\r
+               res = zA - val;\r
+               F = (zF & CF) | (SZ[res] & ~(YF | XF)) | ((zA ^ val ^ res) & HF) | NF;\r
+               if (F & HF) res--;\r
+               if (res & 0x02) F |= YF;\r
+               if (res & 0x08) F |= XF;\r
+               if (--zBC) F |= VF;\r
+               zF = F;\r
+               RET(12)\r
+\r
+/*-----------------------------------------\r
+ CPIR/CPDR\r
+-----------------------------------------*/\r
+\r
+       OPED(0xb1): // CPIR\r
+               do\r
+               {\r
+                       val = READ_MEM8(zHL++);\r
+                       res = zA - val;\r
+                       zBC--;\r
+                       F = (zF & CF) | (SZ[res] & ~(YF | XF)) | ((zA ^ val ^ res) & HF) | NF;\r
+                       if (F & HF) res--;\r
+                       if (res & 0x02) F |= YF;\r
+                       if (res & 0x08) F |= XF;\r
+                       if (zBC) F |= VF;\r
+                       zF = F;\r
+                       USE_CYCLES(17)\r
+               } while (zBC && !(F & ZF) && (CPU->ICount > 0));\r
+               goto OP_CPXR;\r
+\r
+       OPED(0xb9): // CPDR\r
+               do\r
+               {\r
+                       val = READ_MEM8(zHL--);\r
+                       res = zA - val;\r
+                       zBC--;\r
+                       F = (zF & CF) | (SZ[res] & ~(YF | XF)) | ((zA ^ val ^ res) & HF) | NF;\r
+                       if (F & HF) res--;\r
+                       if (res & 0x02) F |= YF;\r
+                       if (res & 0x08) F |= XF;\r
+                       if (zBC) F |= VF;\r
+                       zF = F;\r
+                       USE_CYCLES(17)\r
+               } while (zBC && !(F & ZF) && (CPU->ICount > 0));\r
+\r
+OP_CPXR:\r
+               if (zBC && !(F & ZF))\r
+               {\r
+                       PC -= 2;\r
+#if CZ80_EMULATE_R_EXACTLY\r
+                       zR--;\r
+#endif\r
+                       goto Cz80_Exec_End;\r
+               }\r
+               ADD_CYCLES(5)\r
+               goto Cz80_Exec;\r
+\r
+/*-----------------------------------------\r
+ INI/IND\r
+-----------------------------------------*/\r
+\r
+       OPED(0xa2): // INI\r
+               val = IN(zBC);\r
+               zB--;\r
+               WRITE_MEM8(zHL++, val);\r
+               goto OP_INX;\r
+\r
+       OPED(0xaa): // IND\r
+               val = IN(zBC);\r
+               zB--;\r
+               WRITE_MEM8(zHL--, val);\r
+\r
+OP_INX:\r
+               F = SZ[zB];\r
+               res = ((UINT32)(zC - 1) & 0xff) + (UINT32)val;\r
+               if (val & SF) F |= NF;\r
+               if (res & 0x100) F |= HF | CF;\r
+               F |= SZP[(UINT8)(res & 0x07) ^ zB] & PF;\r
+               zF = F;\r
+               RET(12)\r
+\r
+/*-----------------------------------------\r
+ INIR/INDR\r
+-----------------------------------------*/\r
+\r
+       OPED(0xb2): // INIR\r
+               do\r
+               {\r
+                       val = IN(zBC);\r
+                       zB--;\r
+                       WRITE_MEM8(zHL++, val);\r
+                       USE_CYCLES(17)\r
+               } while (zB && (CPU->ICount > 0));\r
+               goto OP_INXR;\r
+\r
+       OPED(0xba): // INDR\r
+               do\r
+               {\r
+                       val = IN(zBC);\r
+                       zB--;\r
+                       WRITE_MEM8(zHL--, val);\r
+                       USE_CYCLES(17)\r
+               } while (zB && (CPU->ICount > 0));\r
+\r
+OP_INXR:\r
+               F = SZ[zB];\r
+               res = ((UINT32)(zC - 1) & 0xff) + (UINT32)val;\r
+               if (val & SF) F |= NF;\r
+               if (res & 0x100) F |= HF | CF;\r
+               F |= SZP[(UINT8)(res & 0x07) ^ zB] & PF;\r
+               zF = F;\r
+               if (zB)\r
+               {\r
+                       PC -= 2;\r
+#if CZ80_EMULATE_R_EXACTLY\r
+                       zR--;\r
+#endif\r
+                       goto Cz80_Exec_End;\r
+               }\r
+               ADD_CYCLES(5);\r
+               goto Cz80_Exec;\r
+\r
+/*-----------------------------------------\r
+ OUTI/OUTD\r
+-----------------------------------------*/\r
+\r
+       OPED(0xa3): // OUTI\r
+               val = READ_MEM8(zHL++);\r
+               zB--;\r
+               OUT(zBC, val);\r
+               goto OP_OUTX;\r
+\r
+       OPED(0xab): // OUTD\r
+               val = READ_MEM8(zHL--);\r
+               zB--;\r
+               OUT(zBC, val);\r
+\r
+OP_OUTX:\r
+               F = SZ[zB];\r
+               res = (UINT32)zL + (UINT32)val;\r
+               if (val & SF) F |= NF;\r
+               if (res & 0x100) F |= HF | CF;\r
+               F |= SZP[(UINT8)(res & 0x07) - zB] & PF;\r
+               zF = F;\r
+               RET(12)\r
+\r
+/*-----------------------------------------\r
+ OTIR/OTDR\r
+-----------------------------------------*/\r
+\r
+       OPED(0xb3): // OTIR\r
+               do\r
+               {\r
+                       val = READ_MEM8(zHL++);\r
+                       zB--;\r
+                       OUT(zBC, val);\r
+                       USE_CYCLES(17)\r
+               } while (zB && (CPU->ICount > 0));\r
+               goto OP_OTXR;\r
+\r
+       OPED(0xbb): // OTDR\r
+               do\r
+               {\r
+                       val = READ_MEM8(zHL--);\r
+                       zB--;\r
+                       OUT(zBC, val);\r
+                       USE_CYCLES(17)\r
+               } while (zB && (CPU->ICount > 0));\r
+\r
+OP_OTXR:\r
+               F = SZ[zB];\r
+               res = (UINT32)zL + (UINT32)val;\r
+               if (val & SF) F |= NF;\r
+               if (res & 0x100) F |= HF | CF;\r
+               F |= SZP[(UINT8)(res & 0x07) - zB] & PF;\r
+               zF = F;\r
+               if (zB)\r
+               {\r
+                       PC -= 2;\r
+#if CZ80_EMULATE_R_EXACTLY\r
+                       zR--;\r
+#endif\r
+                       goto Cz80_Exec_End;\r
+               }\r
+               ADD_CYCLES(5)\r
+               goto Cz80_Exec;\r
+       }\r
+\r
+#if !CZ80_USE_JUMPTABLE\r
+}\r
+#endif\r