--- /dev/null
+/******************************************************************************\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