            SECTION         text,CODE


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


            XREF            TabDDCB
            XREF            Z80
            XREF            _SendDebug
            XREF            _IntZ80


GETNNIX     MACRO
            GETN            \1
            EXT.W           \1
            ADD.W           REG_IX(A4),\1
            ENDM


FIX0_B:     ;   LD  B,(IX+nn)
            GETNNIX         D0
            PEEK8           REG_B(A4)
            JMP             (A6)


FIX0_C:     ;   LD  C,(IX+nn)
            GETNNIX         D0
            PEEK8           REG_C(A4)
            JMP             (A6)


FIX0_D:     ;   LD  D,(IX+nn)
            GETNNIX         D0
            PEEK8           REG_D(A4)
            JMP             (A6)


FIX0_E:     ;   LD  E,(IX+nn)
            GETNNIX         D0
            PEEK8           REG_E(A4)
            JMP             (A6)


FIX0_H:     ;   LD  H,(IX+nn)
            GETNNIX         D0
            PEEK8           REG_H(A4)
            JMP             (A6)


FIX0_L:     ;   LD  L,(IX+nn)
            GETNNIX         D0
            PEEK8           REG_L(A4)
            JMP             (A6)


FIX0_A:     ;   LD  A,(IX+nn)
            GETNNIX         D0
            PEEK8           (A4)
            JMP             (A6)


FIX1_B:     ;   LD  (IX+nn),B
            GETNNIX         D0
            POKE8           REG_B(A4)
            JMP             (A6)


FIX1_C:     ;   LD  (IX+nn),C
            GETNNIX         D0
            POKE8           REG_C(A4)
            JMP             (A6)


FIX1_D:     ;   LD  (IX+nn),D
            GETNNIX         D0
            POKE8           REG_D(A4)
            JMP             (A6)


FIX1_E:     ;   LD  (IX+nn),E
            GETNNIX         D0
            POKE8           REG_E(A4)
            JMP             (A6)


FIX1_H:     ;   LD  (IX+nn),H
            GETNNIX         D0
            POKE8           REG_H(A4)
            JMP             (A6)


FIX1_L:     ;   LD  (IX+nn),L
            GETNNIX         D0
            POKE8           REG_L(A4)
            JMP             (A6)


FIX1_A:     ;   LD  (IX+nn),A
            GETNNIX         D0
            POKE8           (A4)
            JMP             (A6)


FIX2:       ;   LD  (IX+nn),nn
            GETNNIX         D3
            GETN            D1
            MOVE.W          D3,D0
            POKE8           D1
            JMP             (A6)


FIX3:       ;   LD  IX,nnnn
            GETNN           D3
            MOVE.W          D3,REG_IX(A4)
            JMP             (A6)


FIX4:       ;   LD  IX, (nnnn)
            GETNN           D3
            PEEK16          D3,D0
            MOVE.W          D0,REG_IX(A4)
            JMP             (A6)


FIX5:       ;   LD  (nnnn),IX
            GETNN           D3
            MOVE.W          D3,D0
            POKE8           REG_IXL(A4)
            MOVE.W          D3,D0
            ADDQ.W          #1,D0
            POKE8           REG_IX(A4)
            JMP             (A6)


FIX6:       ;   LD  SP,IX
            MOVE.W          REG_IX(A4),D6
            JMP             (A6)


FIX7:      ;   PUSH IX
            SUBQ.W          #1,D6
            MOVE.W          D6,D0
            POKE8           REG_IX(A4)
            SUBQ.W          #1,D6
            MOVE.W          D6,D0
            POKE8           REG_IXL(A4)
            JMP             (A6)


FIX8:       ;   POP IX
            MOVE.W          D6,D0
            ADDQ.W          #2,D6
            PEEK16          D0,D3
            MOVE.W          D3,REG_IX(A4)
            JMP             (A6)


FIX9:       ;   EX  (SP), IX
            MOVE.W          D6,D0
            PEEK16          D0,D3
            MOVE.W          REG_IX(A4),D0
            MOVE.W          D3,REG_IX(A4)
            MOVE.W          D0,D3
            MOVE.W          D6,D0
            POKE8           D3
            MOVE.W          D6,D0
            ADDQ.W          #1,D0
            LSR.W           #8,D3
            POKE8           D3
            JMP             (A6)


FIX10:      ;   ADD A,(IX+nn)
            GETNNIX         D0
            PEEK8           D1
            ADD_R8
            JMP             (A6)


FIX11:      ;   ADC A,(IX+nn)
            GETNNIX         D0
            PEEK8           D1
            ADC_R8
            JMP             (A6)

    
FIX12:      ;   SUB   (IX+nn)
            GETNNIX         D0
            PEEK8           D1
            SUB_R8
            JMP             (A6)


FIX13:      ;   SBC A,(IX+nn)
            GETNNIX         D0
            PEEK8           D1
            SBC_R8
            JMP             (A6)


FIX14:      ;   AND (IX+nn)
            GETNNIX         D0
            PEEK8           D0
            AND.B           D0,(A4)
            FLAG_LOG
            OR.B            #FLAG_H,(A3)
            JMP             (A6)


FIX15:      ;   XOR (IX+nn)
            GETNNIX         D0
            PEEK8           D0
            EOR.B           D0,(A4)
            FLAG_LOG
            JMP             (A6)


FIX16:      ;   OR  (IX+nn)
            GETNNIX         D0
            PEEK8           D0
            OR.B            D0,(A4)
            FLAG_LOG
            JMP             (A6)


FIX17:      ;   CP  (IX+nn)
            GETNNIX         D0
            PEEK8           D1
            CP_R8
            JMP             (A6)


FIX18:      ;   INC  (IX+nn)
            GETNNIX         D0
            PEEKA
            ADDQ.B          #1,D2
            MOVE            CCR,D3
            POKEA
            FLAG_INC        D2
            JMP             (A6)


FIX19:      ;   DEC  (IX+nn)
            GETNNIX         D0
            PEEKA
            SUBQ.B          #1,D2
            MOVE            CCR,D3
            POKEA
            FLAG_DEC        D2
            JMP             (A6)


FIX20_BC:   ;   ADD IX,BC
            AND.B           #N_FLAG_N&N_FLAG_C,(A3)
            MOVE.W          REG_B(A4),D1
            ADD.W           D1,REG_IX(A4)
            C_CARRY
            JMP             (A6)



FIX20_DE:   ;   ADD IX,DE
            AND.B           #N_FLAG_N&N_FLAG_C,(A3)
            MOVE.W          REG_D(A4),D1
            ADD.W           D1,REG_IX(A4)
            C_CARRY
            JMP             (A6)



FIX20_IX:   ;   ADD IX,IX
            AND.B           #N_FLAG_N&N_FLAG_C,(A3)
            MOVE.W          REG_IX(A4),D1
            ADD.W           D1,REG_IX(A4)
            C_CARRY
            JMP             (A6)



FIX20_SP:   ;   ADD IX,SP
            AND.B           #N_FLAG_N&N_FLAG_C,(A3)
            ADD.W           D6,REG_IX(A4)
            C_CARRY
            JMP             (A6)


FIX21:      ;   INC IX
            ADDQ.W          #1,REG_IX(A4)
            JMP             (A6)


FIX22:      ;   DEC IX
            SUBQ.W          #1,REG_IX(A4)
            JMP             (A6)


FIX23:      ;   JP  (IX)
            MOVE.W          REG_IX(A4),D7
            JMP             (A6)


FIXCB:      ;   Special code DD CB
            GETNNIX         D2
            GETN            D3
            MOVE.W          D2,D0
            PEEKA
            AND.W           #$FF,D3
            ADDQ.B          #1,REG_R(A4)
            LEA             TabDDCB,A0
            JMP             ([A0,D3.W*4])


;
; Instructions non documentées
;
FIX24:      ;   LD  IXh,nn
            GETN            REG_IX(A4)
            JMP             (A6)


FIX25:      ;   LD  IXl,nn
            GETN            REG_IXL(A4)
            JMP             (A6)


FIX26:      ;   INC IXh
            ADDQ.B          #1,REG_IX(A4)
            FLAG_INC        REG_IX(A4)
            JMP             (A6)


FIX27:      ;   INC IXl
            ADDQ.B          #1,REG_IXL(A4)
            FLAG_INC        REG_IXL(A4)
            JMP             (A6)


FIX28:      ;   DEC IXh
            SUBQ.B          #1,REG_IX(A4)
            FLAG_DEC        REG_IX(A4)
            JMP             (A6)


FIX29:      ;   DEC IXl
            SUBQ.B          #1,REG_IXL(A4)
            FLAG_DEC        REG_IXL(A4)
            JMP             (A6)


FIX32:      ;   LD  IXh,IXl
            MOVE.B          REG_IXL(A4),REG_IX(A4)
            JMP             (A6)


FIX34:      ;   LD  IXh,A
            MOVE.B          (A4),REG_IX(A4)
            JMP             (A6)


FIX35:      ;   LD  IXl,A
            MOVE.B          (A4),REG_IXL(A4)
            JMP             (A6)


FIX36:      ;   LD  IXl,IXh
            MOVE.B          REG_IX(A4),REG_IXL(A4)
            JMP             (A6)


FIX37:      ;   LD  A,IXh
            MOVE.B          REG_IX(A4),(A4)
            JMP             (A6)


FIX38:      ;   LD  A,IXl
            MOVE.B          REG_IXL(A4),(A4)
            JMP             (A6)


FIX21_H:    ;   ADD A,IXh
            MOVE.B          REG_IX(A4),D1
            ADD_R8
            JMP             (A6)


FIX21_L:    ;   ADD A,IXl
            MOVE.B          REG_IXL(A4),D1
            ADD_R8
            JMP             (A6)


FIX24_H:    ;   ADC A,IXh
            MOVE.B          REG_IX(A4),D1
            ADC_R8
            JMP             (A6)


FIX24_L:    ;   ADC A,IXl
            MOVE.B          REG_IXL(A4),D1
            ADC_R8
            JMP             (A6)


FIX25_H:    ;   SUB   IXh
            MOVE.B          REG_IX(A4),D1
            SUB_R8
            JMP             (A6)


FIX25_L:    ;   SUB   IXl
            MOVE.B          REG_IXL(A4),D1
            SUB_R8
            JMP             (A6)


FIX26_H:    ;   SBC A,IXh
            MOVE.B          REG_IX(A4),D1
            SBC_R8
            JMP             (A6)


FIX26_L:    ;   SBC A,IXl
            MOVE.B          REG_IXL(A4),D1
            SBC_R8
            JMP             (A6)


FIX27_H:    ;   AND IXh
            MOVE.B          REG_IX(A4),D0
            AND.B           D0,(A4)
            FLAG_LOG
            OR.B            #FLAG_H,(A3)
            JMP             (A6)


FIX27_L:    ;   AND IXl
            MOVE.B          REG_IXL(A4),D0
            AND.B           D0,(A4)
            FLAG_LOG
            OR.B            #FLAG_H,(A3)
            JMP             (A6)


FIX28_H:    ;   XOR IXh
            MOVE.B          REG_IX(A4),D0
            EOR.B           D0,(A4)
            FLAG_LOG
            JMP             (A6)


FIX28_L:    ;   XOR IXl
            MOVE.B          REG_IXL(A4),D0
            EOR.B           D0,(A4)
            FLAG_LOG
            JMP             (A6)


FIX29_H:    ;   OR  IXh
            MOVE.B          REG_IX(A4),D0
            OR.B            D0,(A4)
            FLAG_LOG
            JMP             (A6)


FIX29_L:    ;   OR  IXl
            MOVE.B          REG_IXL(A4),D0
            OR.B            D0,(A4)
            FLAG_LOG
            JMP             (A6)


FIX30_H:    ;   CP    IXh
            MOVE.B          REG_IX(A4),D1
            CP_R8
            JMP             (A6)


FIX30_L:    ;   CP    IXl
            MOVE.B          REG_IXL(A4),D1
            CP_R8
            JMP             (A6)


FIX_BH:     ;   LD  B,H
            MOVE.B         REG_IX(A4),REG_B(A4)  
            JMP             (A6)             


FIX_BL:     ;   LD  B,L
            MOVE.B         REG_IXL(A4),REG_B(A4)           
            JMP             (A6)             


FIX_CH:     ;   LD  C,H
            MOVE.B         REG_IX(A4),REG_C(A4)           
            JMP             (A6)             


FIX_CL:     ;   LD  C,L
            MOVE.B         REG_IXL(A4),REG_C(A4)        
            JMP             (A6)             


FIX_DH:     ;   LD  D,H
            MOVE.B         REG_IX(A4),REG_D(A4)  
            JMP             (A6)             


FIX_DL:     ;   LD  D,L
            MOVE.B         REG_IXL(A4),REG_D(A4)           
            JMP             (A6)             


FIX_EH:     ;   LD  E,H
            MOVE.B         REG_IX(A4),REG_E(A4)           
            JMP             (A6)             


FIX_EL:     ;   LD  E,L
            MOVE.B         REG_IXL(A4),REG_E(A4)        
            JMP             (A6)             


FIX_HB:     ;   LD  H,B
            MOVE.B         REG_B(A4),REG_IX(A4)  
            JMP             (A6)             


FIX_HC:     ;   LD  H,C
            MOVE.B         REG_C(A4),REG_IX(A4)           
            JMP             (A6)             


FIX_HD:     ;   LD  H,D
            MOVE.B         REG_D(A4),REG_IX(A4)  
            JMP             (A6)             


FIX_HE:     ;   LD  H,E
            MOVE.B         REG_E(A4),REG_IX(A4)           
            JMP             (A6)             


FIX_HL:     ;   LD  H,L
            MOVE.B         REG_IXL(A4),REG_IX(A4)           
            JMP             (A6)             


FIX_LB:     ;   LD  L,B
            MOVE.B         REG_B(A4),REG_IXL(A4)           
            JMP             (A6)             


FIX_LC:     ;   LD  L,C
            MOVE.B         REG_C(A4),REG_IXL(A4)        
            JMP             (A6)             


FIX_LD:     ;   LD  L,D
            MOVE.B         REG_D(A4),REG_IXL(A4)           
            JMP             (A6)             


FIX_LE:     ;   LD  L,E
            MOVE.B         REG_E(A4),REG_IXL(A4)        
            JMP             (A6)             


FIX_LH:     ;   LD  L,H
            MOVE.B         REG_IX(A4),REG_IXL(A4)           
            JMP             (A6)             


FIX255:     ;   INTERDIT !
            CLR.W           _ErreurIX
            MOVE.B          D0,_ErreurIX+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


TabIX:
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255
            DC.L            FIX255,FIX20_BC,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255
            DC.L            FIX255,FIX20_DE,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255
            DC.L            FIX255,FIX3,FIX5,FIX21,FIX26,FIX28,FIX24,FIX255
            DC.L            FIX255,FIX20_IX,FIX4,FIX22,FIX27,FIX29,FIX25,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX18,FIX19,FIX2,FIX255
            DC.L            FIX255,FIX20_SP,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255

            DC.L            FIX255,FIX255,FIX255,FIX255,FIX_BH,FIX_BL,FIX0_B,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX_CH,FIX_CL,FIX0_C,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX_DH,FIX_DL,FIX0_D,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX_EH,FIX_EL,FIX0_E,FIX255
            DC.L            FIX_HB,FIX_HC,FIX_HD,FIX_HE,Z80,FIX32,FIX0_H,FIX34
            DC.L            FIX_LB,FIX_LC,FIX_LD,FIX_LE,FIX36,Z80,FIX0_L,FIX35
            DC.L            FIX1_B,FIX1_C,FIX1_D,FIX1_E,FIX1_H,FIX1_L,FIX255,FIX1_A
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX37,FIX38,FIX0_A,FIX255

            DC.L            FIX255,FIX255,FIX255,FIX255,FIX21_H,FIX21_L,FIX10,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX24_H,FIX24_L,FIX11,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX25_H,FIX25_L,FIX12,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX26_H,FIX26_L,FIX13,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX27_H,FIX27_L,FIX14,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX28_H,FIX28_L,FIX15,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX29_H,FIX29_L,FIX16,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX30_H,FIX30_L,FIX17,FIX255

            DC.L            FIX255,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255
            DC.L            FIX255,FIX255,FIX255,FIXCB,FIX255,FIX255,FIX255,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255
            DC.L            FIX255,FIX8,FIX255,FIX9,FIX255,FIX7,FIX255,FIX255
            DC.L            FIX255,FIX23,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255
            DC.L            FIX255,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255
            DC.L            FIX255,FIX6,FIX255,FIX255,FIX255,FIX255,FIX255,FIX255


_ErreurIX:  DC.W            $FFFF


            XDEF            TabIX
            XDEF            _ErreurIX


            END
