/********************************************************************************/
/*                                                                              */
/* CZ80 XYCB opcode include source file                                         */
/* C Z80 emulator version 0.91                                                  */
/* Copyright 2004-2005 Stephane Dallongeville                                   */
/*                                                                              */
/********************************************************************************/

#if CZ80_USE_JUMPTABLE
    goto *JumpTableXYCB[Opcode];
#else
switch (Opcode)
{
#endif

    OPXYCB(0x00):   // RLC  (Ix+d), B
    OPXYCB(0x01):   // RLC  (Ix+d), C
    OPXYCB(0x02):   // RLC  (Ix+d), D
    OPXYCB(0x03):   // RLC  (Ix+d), E
    OPXYCB(0x04):   // RLC  (Ix+d), H
    OPXYCB(0x05):   // RLC  (Ix+d), L
    OPXYCB(0x07):   // RLC  (Ix+d), A
#if CZ80_EXACT
        PRE_IO
        READ_BYTE(adr, src)
        res = ((src << 1) | (src >> 7)) & 0xFF;
        zR8(Opcode) = res;
        zF = SZXYP[res] | (src >> 7);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)
#endif

    OPXYCB(0x06):   // RLC  (Ix+d)
        PRE_IO
        READ_BYTE(adr, src)
        res = ((src << 1) | (src >> 7)) & 0xFF;
        zF = SZXYP[res] | (src >> 7);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)


    OPXYCB(0x08):   // RRC  (Ix+d), B
    OPXYCB(0x09):   // RRC  (Ix+d), C
    OPXYCB(0x0a):   // RRC  (Ix+d), D
    OPXYCB(0x0b):   // RRC  (Ix+d), E
    OPXYCB(0x0c):   // RRC  (Ix+d), H
    OPXYCB(0x0d):   // RRC  (Ix+d), L
    OPXYCB(0x0f):   // RRC  (Ix+d), A
#if CZ80_EXACT
        PRE_IO
        READ_BYTE(adr, src)
        res = ((src >> 1) | (src << 7)) & 0xFF;
        zR8(Opcode & 7) = res;
        zF = SZXYP[res] | (src & CZ80_CF);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)
#endif

    OPXYCB(0x0e):   // RRC  (Ix+d)
        PRE_IO
        READ_BYTE(adr, src)
        res = ((src >> 1) | (src << 7)) & 0xFF;
        zF = SZXYP[res] | (src & CZ80_CF);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)


    OPXYCB(0x10):   // RL   (Ix+d), B
    OPXYCB(0x11):   // RL   (Ix+d), C
    OPXYCB(0x12):   // RL   (Ix+d), D
    OPXYCB(0x13):   // RL   (Ix+d), E
    OPXYCB(0x14):   // RL   (Ix+d), H
    OPXYCB(0x15):   // RL   (Ix+d), L
    OPXYCB(0x17):   // RL   (Ix+d), A
#if CZ80_EXACT
        PRE_IO
        READ_BYTE(adr, src)
        res = ((src << 1) | (zF & CZ80_CF)) & 0xFF;
        zR8(Opcode & 7) = res;
        zF = SZXYP[res] | (src >> 7);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)
#endif

    OPXYCB(0x16):   // RL   (Ix+d)
        PRE_IO
        READ_BYTE(adr, src)
        res = ((src << 1) | (zF & CZ80_CF)) & 0xFF;
        zF = SZXYP[res] | (src >> 7);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)


    OPXYCB(0x18):   // RR   (Ix+d), B
    OPXYCB(0x19):   // RR   (Ix+d), C
    OPXYCB(0x1a):   // RR   (Ix+d), D
    OPXYCB(0x1b):   // RR   (Ix+d), E
    OPXYCB(0x1c):   // RR   (Ix+d), H
    OPXYCB(0x1d):   // RR   (Ix+d), L
    OPXYCB(0x1f):   // RR   (Ix+d), A
#if CZ80_EXACT
        PRE_IO
        READ_BYTE(adr, src)
        res = ((src >> 1) | (zF << 7)) & 0xFF;
        zR8(Opcode & 7) = res;
        zF = SZXYP[res] | (src & CZ80_CF);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)
#endif

    OPXYCB(0x1e):   // RR   (Ix+d)
        PRE_IO
        READ_BYTE(adr, src)
        res = ((src >> 1) | (zF << 7)) & 0xFF;
        zF = SZXYP[res] | (src & CZ80_CF);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)


    OPXYCB(0x20):   // SLA  (Ix+d), B
    OPXYCB(0x21):   // SLA  (Ix+d), C
    OPXYCB(0x22):   // SLA  (Ix+d), D
    OPXYCB(0x23):   // SLA  (Ix+d), E
    OPXYCB(0x24):   // SLA  (Ix+d), H
    OPXYCB(0x25):   // SLA  (Ix+d), L
    OPXYCB(0x27):   // SLA  (Ix+d), A
#if CZ80_EXACT
        PRE_IO
        READ_BYTE(adr, src)
        res = (src << 1) & 0xFF;
        zR8(Opcode & 7) = res;
        zF = SZXYP[res] | (src >> 7);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)
#endif

    OPXYCB(0x26):   // SLA  (Ix+d)
        PRE_IO
        READ_BYTE(adr, src)
        res = (src << 1) & 0xFF;
        zF = SZXYP[res] | (src >> 7);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)


    OPXYCB(0x28):   // SRA  (Ix+d), B
    OPXYCB(0x29):   // SRA  (Ix+d), C
    OPXYCB(0x2a):   // SRA  (Ix+d), D
    OPXYCB(0x2b):   // SRA  (Ix+d), E
    OPXYCB(0x2c):   // SRA  (Ix+d), H
    OPXYCB(0x2d):   // SRA  (Ix+d), L
    OPXYCB(0x2f):   // SRA  (Ix+d), A
#if CZ80_EXACT
        PRE_IO
        READ_BYTE(adr, src)
        res = (uint8_t)(((int8_t)(src)) >> 1);
        zR8(Opcode & 7) = res;
        zF = SZXYP[res] | (src & CZ80_CF);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)
#endif

    OPXYCB(0x2e):   // SRA  (Ix+d)
        PRE_IO
        READ_BYTE(adr, src)
        res = (uint8_t)(((int8_t)(src)) >> 1);
        zF = SZXYP[res] | (src & CZ80_CF);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)


    OPXYCB(0x30):   // SLL  (Ix+d), B
    OPXYCB(0x31):   // SLL  (Ix+d), C
    OPXYCB(0x32):   // SLL  (Ix+d), D
    OPXYCB(0x33):   // SLL  (Ix+d), E
    OPXYCB(0x34):   // SLL  (Ix+d), H
    OPXYCB(0x35):   // SLL  (Ix+d), L
    OPXYCB(0x37):   // SLL  (Ix+d), A
#if CZ80_EXACT
        PRE_IO
        READ_BYTE(adr, src)
        res = ((src << 1) | 1) & 0xFF;
        zR8(Opcode & 7) = res;
        zF = SZXYP[res] | (src >> 7);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)
#endif

    OPXYCB(0x36):   // SLL  (Ix+d)
        PRE_IO
        READ_BYTE(adr, src)
        res = ((src << 1) | 1) & 0xFF;
        zF = SZXYP[res] | (src >> 7);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)


    OPXYCB(0x38):   // SRL  (Ix+d), B
    OPXYCB(0x39):   // SRL  (Ix+d), C
    OPXYCB(0x3a):   // SRL  (Ix+d), D
    OPXYCB(0x3b):   // SRL  (Ix+d), E
    OPXYCB(0x3c):   // SRL  (Ix+d), H
    OPXYCB(0x3d):   // SRL  (Ix+d), L
    OPXYCB(0x3f):   // SRL  (Ix+d), A
#if CZ80_EXACT
        PRE_IO
        READ_BYTE(adr, src)
        res = src >> 1;
        zR8(Opcode & 7) = res;
        zF = SZXYP[res] | (src & CZ80_CF);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)
#endif

    OPXYCB(0x3e):   // SRL  (Ix+d)
        PRE_IO
        READ_BYTE(adr, src)
        res = src >> 1;
        zF = SZXYP[res] | (src & CZ80_CF);
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)


    OPXYCB(0x40):   // BIT  0,(Ix+d)
    OPXYCB(0x41):   // BIT  0,(Ix+d)
    OPXYCB(0x42):   // BIT  0,(Ix+d)
    OPXYCB(0x43):   // BIT  0,(Ix+d)
    OPXYCB(0x44):   // BIT  0,(Ix+d)
    OPXYCB(0x45):   // BIT  0,(Ix+d)
    OPXYCB(0x47):   // BIT  0,(Ix+d)

    OPXYCB(0x48):   // BIT  1,(Ix+d)
    OPXYCB(0x49):   // BIT  1,(Ix+d)
    OPXYCB(0x4a):   // BIT  1,(Ix+d)
    OPXYCB(0x4b):   // BIT  1,(Ix+d)
    OPXYCB(0x4c):   // BIT  1,(Ix+d)
    OPXYCB(0x4d):   // BIT  1,(Ix+d)
    OPXYCB(0x4f):   // BIT  1,(Ix+d)

    OPXYCB(0x50):   // BIT  2,(Ix+d)
    OPXYCB(0x51):   // BIT  2,(Ix+d)
    OPXYCB(0x52):   // BIT  2,(Ix+d)
    OPXYCB(0x53):   // BIT  2,(Ix+d)
    OPXYCB(0x54):   // BIT  2,(Ix+d)
    OPXYCB(0x55):   // BIT  2,(Ix+d)
    OPXYCB(0x57):   // BIT  2,(Ix+d)

    OPXYCB(0x58):   // BIT  3,(Ix+d)
    OPXYCB(0x59):   // BIT  3,(Ix+d)
    OPXYCB(0x5a):   // BIT  3,(Ix+d)
    OPXYCB(0x5b):   // BIT  3,(Ix+d)
    OPXYCB(0x5c):   // BIT  3,(Ix+d)
    OPXYCB(0x5d):   // BIT  3,(Ix+d)
    OPXYCB(0x5f):   // BIT  3,(Ix+d)

    OPXYCB(0x60):   // BIT  4,(Ix+d)
    OPXYCB(0x61):   // BIT  4,(Ix+d)
    OPXYCB(0x62):   // BIT  4,(Ix+d)
    OPXYCB(0x63):   // BIT  4,(Ix+d)
    OPXYCB(0x64):   // BIT  4,(Ix+d)
    OPXYCB(0x65):   // BIT  4,(Ix+d)
    OPXYCB(0x67):   // BIT  4,(Ix+d)

    OPXYCB(0x68):   // BIT  5,(Ix+d)
    OPXYCB(0x69):   // BIT  5,(Ix+d)
    OPXYCB(0x6a):   // BIT  5,(Ix+d)
    OPXYCB(0x6b):   // BIT  5,(Ix+d)
    OPXYCB(0x6c):   // BIT  5,(Ix+d)
    OPXYCB(0x6d):   // BIT  5,(Ix+d)
    OPXYCB(0x6f):   // BIT  5,(Ix+d)

    OPXYCB(0x70):   // BIT  6,(Ix+d)
    OPXYCB(0x71):   // BIT  6,(Ix+d)
    OPXYCB(0x72):   // BIT  6,(Ix+d)
    OPXYCB(0x73):   // BIT  6,(Ix+d)
    OPXYCB(0x74):   // BIT  6,(Ix+d)
    OPXYCB(0x75):   // BIT  6,(Ix+d)
    OPXYCB(0x77):   // BIT  6,(Ix+d)

    OPXYCB(0x78):   // BIT  7,(Ix+d)
    OPXYCB(0x79):   // BIT  7,(Ix+d)
    OPXYCB(0x7a):   // BIT  7,(Ix+d)
    OPXYCB(0x7b):   // BIT  7,(Ix+d)
    OPXYCB(0x7c):   // BIT  7,(Ix+d)
    OPXYCB(0x7d):   // BIT  7,(Ix+d)
    OPXYCB(0x7f):   // BIT  7,(Ix+d)

    OPXYCB(0x46):   // BIT  0,(Ix+d)
    OPXYCB(0x4e):   // BIT  1,(Ix+d)
    OPXYCB(0x56):   // BIT  2,(Ix+d)
    OPXYCB(0x5e):   // BIT  3,(Ix+d)
    OPXYCB(0x66):   // BIT  4,(Ix+d)
    OPXYCB(0x6e):   // BIT  5,(Ix+d)
    OPXYCB(0x76):   // BIT  6,(Ix+d)
    OPXYCB(0x7e):   // BIT  7,(Ix+d)
    {
        uint8_t bitm;
        
        PRE_IO
        bitm = 1 << ((Opcode >> 3) & 7);
        READ_BYTE(adr, src)
        zF = (zF & CZ80_CF) | CZ80_HF |                         // C/H flag
             (SZXY_BIT[src & bitm] & ~(CZ80_XF | CZ80_YF)) |    // Z/V/N flag
             ((adr >> 8) & (CZ80_XF | CZ80_YF));                // X/Y flag
        POST_IO
        RET(12 + 4)
    }

    OPXYCB(0x80):   // RES  0,(Ix+d),B
    OPXYCB(0x81):   // RES  0,(Ix+d),C
    OPXYCB(0x82):   // RES  0,(Ix+d),D
    OPXYCB(0x83):   // RES  0,(Ix+d),E
    OPXYCB(0x84):   // RES  0,(Ix+d),H
    OPXYCB(0x85):   // RES  0,(Ix+d),L
    OPXYCB(0x87):   // RES  0,(Ix+d),A

    OPXYCB(0x88):   // RES  1,(Ix+d),B
    OPXYCB(0x89):   // RES  1,(Ix+d),C
    OPXYCB(0x8a):   // RES  1,(Ix+d),D
    OPXYCB(0x8b):   // RES  1,(Ix+d),E
    OPXYCB(0x8c):   // RES  1,(Ix+d),H
    OPXYCB(0x8d):   // RES  1,(Ix+d),L
    OPXYCB(0x8f):   // RES  1,(Ix+d),A

    OPXYCB(0x90):   // RES  2,(Ix+d),B
    OPXYCB(0x91):   // RES  2,(Ix+d),C
    OPXYCB(0x92):   // RES  2,(Ix+d),D
    OPXYCB(0x93):   // RES  2,(Ix+d),E
    OPXYCB(0x94):   // RES  2,(Ix+d),H
    OPXYCB(0x95):   // RES  2,(Ix+d),L
    OPXYCB(0x97):   // RES  2,(Ix+d),A

    OPXYCB(0x98):   // RES  3,(Ix+d),B
    OPXYCB(0x99):   // RES  3,(Ix+d),C
    OPXYCB(0x9a):   // RES  3,(Ix+d),D
    OPXYCB(0x9b):   // RES  3,(Ix+d),E
    OPXYCB(0x9c):   // RES  3,(Ix+d),H
    OPXYCB(0x9d):   // RES  3,(Ix+d),L
    OPXYCB(0x9f):   // RES  3,(Ix+d),A

    OPXYCB(0xa0):   // RES  4,(Ix+d),B
    OPXYCB(0xa1):   // RES  4,(Ix+d),C
    OPXYCB(0xa2):   // RES  4,(Ix+d),D
    OPXYCB(0xa3):   // RES  4,(Ix+d),E
    OPXYCB(0xa4):   // RES  4,(Ix+d),H
    OPXYCB(0xa5):   // RES  4,(Ix+d),L
    OPXYCB(0xa7):   // RES  4,(Ix+d),A

    OPXYCB(0xa8):   // RES  5,(Ix+d),B
    OPXYCB(0xa9):   // RES  5,(Ix+d),C
    OPXYCB(0xaa):   // RES  5,(Ix+d),D
    OPXYCB(0xab):   // RES  5,(Ix+d),E
    OPXYCB(0xac):   // RES  5,(Ix+d),H
    OPXYCB(0xad):   // RES  5,(Ix+d),L
    OPXYCB(0xaf):   // RES  5,(Ix+d),A

    OPXYCB(0xb0):   // RES  6,(Ix+d),B
    OPXYCB(0xb1):   // RES  6,(Ix+d),C
    OPXYCB(0xb2):   // RES  6,(Ix+d),D
    OPXYCB(0xb3):   // RES  6,(Ix+d),E
    OPXYCB(0xb4):   // RES  6,(Ix+d),H
    OPXYCB(0xb5):   // RES  6,(Ix+d),L
    OPXYCB(0xb7):   // RES  6,(Ix+d),A

    OPXYCB(0xb8):   // RES  7,(Ix+d),B
    OPXYCB(0xb9):   // RES  7,(Ix+d),C
    OPXYCB(0xba):   // RES  7,(Ix+d),D
    OPXYCB(0xbb):   // RES  7,(Ix+d),E
    OPXYCB(0xbc):   // RES  7,(Ix+d),H
    OPXYCB(0xbd):   // RES  7,(Ix+d),L
    OPXYCB(0xbf):   // RES  7,(Ix+d),A
#if CZ80_EXACT
        PRE_IO
        READ_BYTE(adr, res)
        res &= ~(1 << ((Opcode >> 3) & 7));
        zR8(Opcode & 7) = res;
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)
#endif

    OPXYCB(0x86):   // RES  0,(Ix+d)
    OPXYCB(0x8e):   // RES  1,(Ix+d)
    OPXYCB(0x96):   // RES  2,(Ix+d)
    OPXYCB(0x9e):   // RES  3,(Ix+d)
    OPXYCB(0xa6):   // RES  4,(Ix+d)
    OPXYCB(0xae):   // RES  5,(Ix+d)
    OPXYCB(0xb6):   // RES  6,(Ix+d)
    OPXYCB(0xbe):   // RES  7,(Ix+d)
    {
        uint8_t bitm;

        PRE_IO
        bitm = ~(1 << ((Opcode >> 3) & 7));
        READ_BYTE(adr, res)
        res &= bitm;
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)
    }


    OPXYCB(0xc0):   // SET  0,(Ix+d),B
    OPXYCB(0xc1):   // SET  0,(Ix+d),C
    OPXYCB(0xc2):   // SET  0,(Ix+d),D
    OPXYCB(0xc3):   // SET  0,(Ix+d),E
    OPXYCB(0xc4):   // SET  0,(Ix+d),H
    OPXYCB(0xc5):   // SET  0,(Ix+d),L
    OPXYCB(0xc7):   // SET  0,(Ix+d),A

    OPXYCB(0xc8):   // SET  1,(Ix+d),B
    OPXYCB(0xc9):   // SET  1,(Ix+d),C
    OPXYCB(0xca):   // SET  1,(Ix+d),D
    OPXYCB(0xcb):   // SET  1,(Ix+d),E
    OPXYCB(0xcc):   // SET  1,(Ix+d),H
    OPXYCB(0xcd):   // SET  1,(Ix+d),L
    OPXYCB(0xcf):   // SET  1,(Ix+d),A

    OPXYCB(0xd0):   // SET  2,(Ix+d),B
    OPXYCB(0xd1):   // SET  2,(Ix+d),C
    OPXYCB(0xd2):   // SET  2,(Ix+d),D
    OPXYCB(0xd3):   // SET  2,(Ix+d),E
    OPXYCB(0xd4):   // SET  2,(Ix+d),H
    OPXYCB(0xd5):   // SET  2,(Ix+d),L
    OPXYCB(0xd7):   // SET  2,(Ix+d),A

    OPXYCB(0xd8):   // SET  3,(Ix+d),B
    OPXYCB(0xd9):   // SET  3,(Ix+d),C
    OPXYCB(0xda):   // SET  3,(Ix+d),D
    OPXYCB(0xdb):   // SET  3,(Ix+d),E
    OPXYCB(0xdc):   // SET  3,(Ix+d),H
    OPXYCB(0xdd):   // SET  3,(Ix+d),L
    OPXYCB(0xdf):   // SET  3,(Ix+d),A

    OPXYCB(0xe0):   // SET  4,(Ix+d),B
    OPXYCB(0xe1):   // SET  4,(Ix+d),C
    OPXYCB(0xe2):   // SET  4,(Ix+d),D
    OPXYCB(0xe3):   // SET  4,(Ix+d),E
    OPXYCB(0xe4):   // SET  4,(Ix+d),H
    OPXYCB(0xe5):   // SET  4,(Ix+d),L
    OPXYCB(0xe7):   // SET  4,(Ix+d),A

    OPXYCB(0xe8):   // SET  5,(Ix+d),B
    OPXYCB(0xe9):   // SET  5,(Ix+d),C
    OPXYCB(0xea):   // SET  5,(Ix+d),D
    OPXYCB(0xeb):   // SET  5,(Ix+d),E
    OPXYCB(0xec):   // SET  5,(Ix+d),H
    OPXYCB(0xed):   // SET  5,(Ix+d),L
    OPXYCB(0xef):   // SET  5,(Ix+d),A

    OPXYCB(0xf0):   // SET  6,(Ix+d),B
    OPXYCB(0xf1):   // SET  6,(Ix+d),C
    OPXYCB(0xf2):   // SET  6,(Ix+d),D
    OPXYCB(0xf3):   // SET  6,(Ix+d),E
    OPXYCB(0xf4):   // SET  6,(Ix+d),H
    OPXYCB(0xf5):   // SET  6,(Ix+d),L
    OPXYCB(0xf7):   // SET  6,(Ix+d),A

    OPXYCB(0xf8):   // SET  7,(Ix+d),B
    OPXYCB(0xf9):   // SET  7,(Ix+d),C
    OPXYCB(0xfa):   // SET  7,(Ix+d),D
    OPXYCB(0xfb):   // SET  7,(Ix+d),E
    OPXYCB(0xfc):   // SET  7,(Ix+d),H
    OPXYCB(0xfd):   // SET  7,(Ix+d),L
    OPXYCB(0xff):   // SET  7,(Ix+d),A
#if CZ80_EXACT
        PRE_IO
        READ_BYTE(adr, res)
        res |= 1 << ((Opcode >> 3) & 7);
        zR8(Opcode & 7) = res;
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)
#endif

    OPXYCB(0xc6):   // SET  0,(Ix+d)
    OPXYCB(0xce):   // SET  1,(Ix+d)
    OPXYCB(0xd6):   // SET  2,(Ix+d)
    OPXYCB(0xde):   // SET  3,(Ix+d)
    OPXYCB(0xe6):   // SET  4,(Ix+d)
    OPXYCB(0xee):   // SET  5,(Ix+d)
    OPXYCB(0xf6):   // SET  6,(Ix+d)
    OPXYCB(0xfe):   // SET  7,(Ix+d)
    {
        uint8_t bitm;

        PRE_IO
        bitm = 1 << ((Opcode >> 3) & 7);
        READ_BYTE(adr, res)
        res |= bitm;
        WRITE_BYTE(adr, res)
        POST_IO
        RET(15 + 4)
    }

#if CZ80_USE_JUMPTABLE
#else
}
#endif

