            SECTION         text,CODE


            include         'regs.i'
            include         'vga.i'


            XREF            _SendDebug
            XREF            _IntZ80


BIT_0       EQU             $01
BIT_1       EQU             $02
BIT_2       EQU             $04
BIT_3       EQU             $08
BIT_4       EQU             $10
BIT_5       EQU             $20
BIT_6       EQU             $40
BIT_7       EQU             $80

N_BIT_0     EQU             $FE
N_BIT_1     EQU             $FD
N_BIT_2     EQU             $FB
N_BIT_3     EQU             $F7
N_BIT_4     EQU             $EF
N_BIT_5     EQU             $DF
N_BIT_6     EQU             $BF
N_BIT_7     EQU             $7F



;
;   Execute l'instruction "BIT \1,\2" Z80 
;
TST_BIT     MACRO
            MOVE.B          (A3),D0
            OR.B            #FLAG_H,D0
            AND.B           #N_FLAG_Z&N_FLAG_N&N_FLAG_V,D0
            BTST            \1,\2
            BNE.S           .NBIT\@
            OR.B            #FLAG_Z!FLAG_V,D0
.NBIT\@     MOVE.B          D0,(A3)
            ENDM


BITIX_0:    ;   BIT 0,(IX+nn)
            TST_BIT         #0,D2
            JMP             (A6)


BITIX_1:    ;   BIT 1,(IX+nn)
            TST_BIT         #1,D2
            JMP             (A6)


BITIX_2:    ;   BIT 2,(IX+nn)
            TST_BIT         #2,D2
            JMP             (A6)


BITIX_3:    ;   BIT 3,(IX+nn)
            TST_BIT         #3,D2
            JMP             (A6)


BITIX_4:    ;   BIT 4,(IX+nn)
            TST_BIT         #4,D2
            JMP             (A6)


BITIX_5:    ;   BIT 5,(IX+nn)
            TST_BIT         #5,D2
            JMP             (A6)


BITIX_6:    ;   BIT 6,(IX+nn)
            TST_BIT         #6,D2
            JMP             (A6)


BITIX_7:    ;   BIT 7,(IX+nn)
            TST_BIT         #7,D2
            JMP             (A6)


RESIX_0:    ;   RES 0,(IX+nn)
            AND.B           #N_BIT_0,D2
            POKEA
            JMP             (A6)


RESIX_1:    ;   RES 1,(IX+nn)
            AND.B           #N_BIT_1,D2
            POKEA
            JMP             (A6)


RESIX_2:    ;   RES 2,(IX+nn)
            AND.B           #N_BIT_2,D2
            POKEA
            JMP             (A6)


RESIX_3:    ;   RES 3,(IX+nn)
            AND.B           #N_BIT_3,D2
            POKEA
            JMP             (A6)


RESIX_4:    ;   RES 4,(IX+nn)
            AND.B           #N_BIT_4,D2
            POKEA
            JMP             (A6)


RESIX_5:    ;   RES 5,(IX+nn)
            AND.B           #N_BIT_5,D2
            POKEA
            JMP             (A6)


RESIX_6:    ;   RES 6,(IX+nn)
            AND.B           #N_BIT_6,D2
            POKEA
            JMP             (A6)


RESIX_7:    ;   RES 7,(IX+nn)
            AND.B           #N_BIT_7,D2
            POKEA
            JMP             (A6)


SETIX_0:    ;   SET 0,(IX+nn)
            OR.B            #BIT_0,D2
            POKEA
            JMP             (A6)


SETIX_1:    ;   SET 1,(IX+nn)
            OR.B            #BIT_1,D2
            POKEA
            JMP             (A6)


SETIX_2:    ;   SET 2,(IX+nn)
            OR.B            #BIT_2,D2
            POKEA
            JMP             (A6)


SETIX_3:    ;   SET 3,(IX+nn)
            OR.B            #BIT_3,D2
            POKEA
            JMP             (A6)


SETIX_4:    ;   SET 4,(IX+nn)
            OR.B            #BIT_4,D2
            POKEA
            JMP             (A6)


SETIX_5:    ;   SET 5,(IX+nn)
            OR.B            #BIT_5,D2
            POKEA
            JMP             (A6)


SETIX_6:    ;   SET 6,(IX+nn)
            OR.B            #BIT_6,D2
            POKEA
            JMP             (A6)


SETIX_7:    ;   SET 7,(IX+nn)
            OR.B            #BIT_7,D2
            POKEA
            JMP             (A6)


RLCIX:      ;   RLC (IX+nn)
            ROL.B           #1,D2
            MOVE            CCR,D3
            MOVE.B          R_FLAGS(A4,D3.W),(A3)
            POKEA
            MOVE.B          PARITE(A4,D2.W),D1
            OR.B            D1,(A3)
            JMP             (A6)


RRCIX:      ;   RRC (IX+nn)
            ROR.B           #1,D2
            MOVE            CCR,D3
            MOVE.B          R_FLAGS(A4,D3.W),(A3)
            POKEA
            MOVE.B          PARITE(A4,D2.W),D1
            OR.B            D1,(A3)
            JMP             (A6)


RLIX:       ;   RL (IX+nn)
            MOVE.B          (A3),D3
            ROXR.B          #1,D3
            ROXL.B          #1,D2
            MOVE            CCR,D3
            MOVE.B          R_FLAGS(A4,D3.W),(A3)
            POKEA
            MOVE.B          PARITE(A4,D2.W),D1
            OR.B            D1,(A3)
            JMP             (A6)


RRIX:       ;   RR (IX+nn)
            MOVE.B          (A3),D3
            ROXR.B          #1,D3
            ROXR.B          #1,D2
            MOVE            CCR,D3
            MOVE.B          R_FLAGS(A4,D3.W),(A3)
            POKEA
            MOVE.B          PARITE(A4,D2.W),D1
            OR.B            D1,(A3)
            JMP             (A6)


SLAIX:      ;   SLA (IX+nn)
            ADD.B           D2,D2
            MOVE            CCR,D3
            MOVE.B          R_FLAGS(A4,D3.W),(A3)
            POKEA
            MOVE.B          PARITE(A4,D2.W),D1
            OR.B            D1,(A3)
            JMP             (A6)


SRAIX:      ;   SRA (IX+nn)
            ASR.B           #1,D2
            MOVE            CCR,D3
            MOVE.B          R_FLAGS(A4,D3.W),(A3)
            POKEA
            MOVE.B          PARITE(A4,D2.W),D1
            OR.B            D1,(A3)
            JMP             (A6)


SRLIX:      ;   SRL (IX+nn)
            LSR.B           #1,D2
            MOVE            CCR,D3
            MOVE.B          R_FLAGS(A4,D3.W),(A3)
            POKEA
            MOVE.B          PARITE(A4,D2.W),D1
            OR.B            D1,(A3)
            JMP             (A6)


DDCBXX:     ;   INTERDIT !
            CLR.W           _ErreurCBIX
            MOVE.B          D3,_ErreurCBIX+1
            MOVEM.L         D1-D7/A0-A6,-(A7)
            BSR.W           _SendDebug
            MOVE.B          #1,_IntZ80
            MOVEM.L         (A7)+,D1-D7/A0-A6
            JMP             (A6)


            SECTION         data,DATA


TabDDCB:
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,RLCIX,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,RRCIX,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,RLIX,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,RRIX,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,SLAIX,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,SRAIX,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,SLAIX,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,SRLIX,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,BITIX_0,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,BITIX_1,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,BITIX_2,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,BITIX_3,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,BITIX_4,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,BITIX_5,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,BITIX_6,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,BITIX_7,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,RESIX_0,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,RESIX_1,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,RESIX_2,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,RESIX_3,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,RESIX_4,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,RESIX_5,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,RESIX_6,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,RESIX_7,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,SETIX_0,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,SETIX_1,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,SETIX_2,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,SETIX_3,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,SETIX_4,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,SETIX_5,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,SETIX_6,DDCBXX
            DC.L            DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,DDCBXX,SETIX_7,DDCBXX


_ErreurCBIX:
            DC.W            $FFFF

            XDEF            TabDDCB
            XDEF            _ErreurCBIX


            END
