            SECTION         text,CODE


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


            XREF            ReadPort
            XREF            WritePort
            XREF            F12
            XREF            F13
            XREF            _SendDebug
            XREF            _IntZ80


;
;           HL = HL + \1 + FLAG.C
;
ADC_R16     MACRO
            MOVE.W          REG_H(A4),D0
            MOVE.B          (A3),D3
            AND.W           #1,D3
            LSR.B           #1,D3
            ADDX.W          \1,D0
            MOVE            CCR,D3
            MOVE.B          FLAGS(A4,D3.W),(A3)
            MOVE.W          D0,REG_H(A4)
            ENDM


;
;           HL = HL - \1 - Flag.C
;
SBC_R16     MACRO
            MOVE.W          REG_H(A4),D0
            MOVE.B          (A3),D3
            AND.W           #1,D3
            LSR.B           #1,D3
            SUBX.W          \1,D0
            MOVE            CCR,D3
            MOVE.B          N_FLAGS(A4,D3.W),(A3)
            MOVE.W          D0,REG_H(A4)
            ENDM


;
;           Execute un IN (r),C
;
IN_R_C      MACRO
            MOVE.W          REG_B(A4),D0
            BSR.W           ReadPort
            MOVE.B          D0,\1
            MOVE.B          (A3),D2
            AND.B           #FLAG_C,D2
            AND.W           #$FF,D0
            OR.B            PARITE(A4,D0.W),D2
            MOVE.B          D0,D1
            AND.B           #FLAG_S,D1
            OR.B            D1,D2
            TST.B           D0
            BNE.S           .FIN\@
            OR.B            #FLAG_Z,D2
.FIN\@:     MOVE.B          D2,(A3)
            ENDM


FED0:       ;   LD  A,I
            MOVE.B          REG_I(A4),(A4)
            MOVE.B          (A3),D0
            MOVE.B          (A4),D1
            AND.B           #FLAG_C,D0
            AND.B           #FLAG_S,D1
            OR.B            D1,D0
            OR.B            REG_IFF1(A4),D0
            TST.B           (A4)
            BNE.S           FED0_1
            OR.B            #FLAG_Z,D0
FED0_1      MOVE.B          D0,(A3)
            JMP             (A6)


FED1:       ;   LD  A,R
            MOVE.B          REG_R(A4),(A4)
            MOVE.B          (A3),D0
            MOVE.B          (A4),D1
            AND.B           #FLAG_C,D0
            AND.B           #FLAG_S,D1
            OR.B            D1,D0
            OR.B            REG_IFF1(A4),D0
            TST.B           (A4)
            BNE.S           FED1_1
            OR.B            #FLAG_Z,D0
FED1_1      MOVE.B          D0,(A3)
            JMP             (A6)


FED2:       ;   LD  I,A
            MOVE.B          (A4),REG_I(A4)
            JMP             (A6)


FED3:       ;   LD  R,A
            MOVE.B          (A4),REG_R(A4)
            JMP             (A6)


FED4_BC:    ;   LD  BC,(nnnn)
            GETNN           D3
            PEEK16          D3,D0
            MOVE.W          D0,REG_B(A4)
            JMP             (A6)


FED4_DE:    ;   LD  DE,(nnnn)
            GETNN           D3
            PEEK16          D3,D0
            MOVE.W          D0,REG_D(A4)
            JMP             (A6)


FED4_SP:    ;   LD  SP,(nnnn)
            GETNN           D3
            PEEK16          D3,D6
            JMP             (A6)


FED5_BC:    ;   LD  (nnnn), BC
            GETNN           D3
            MOVE.W          D3,D0
            POKE8           REG_C(A4)
            MOVE.W          D3,D0
            ADDQ.W          #1,D0
            POKE8           REG_B(A4)
            JMP             (A6)


FED5_DE:    ;   LD  (nnnn), DE
            GETNN           D3
            MOVE.W          D3,D0
            POKE8           REG_E(A4)
            MOVE.W          D3,D0
            ADDQ.W          #1,D0
            POKE8           REG_D(A4)
            JMP             (A6)


FED5_SP:    ;   LD  (nnnn), SP
            GETNN           D3
            MOVE.W          D3,D0
            POKE8           D6
            MOVE.W          D3,D0
            ADDQ.W          #1,D0
            MOVE.W          D6,D1
            LSR.W           #8,D1
            POKE8           D1
            JMP             (A6)


FED6:       ;   LDI
            MOVE.W          REG_H(A4),D0
            ADDQ.W          #1,REG_H(A4)
            MOVE.W          REG_D(A4),D1
            ADDQ.W          #1,REG_D(A4)
            LD_D0_D1
            AND.B           #N_FLAG_H&N_FLAG_V&N_FLAG_N,(A3)
            SUBQ.W          #1,REG_B(A4)
            BEQ.S           FED6_1
            OR.B            #FLAG_V,(A3)
FED6_1:     JMP             (A6)


FED7:       ;   LDIR
            MOVE.W          REG_H(A4),D0
            ADDQ.W          #1,REG_H(A4)
            MOVE.W          REG_D(A4),D1
            ADDQ.W          #1,REG_D(A4)
            LD_D0_D1
            ADDQ.B          #1,REG_R(A4)
            SUBQ.W          #1,REG_B(A4)
            BNE.S           FED7
            AND.B           #N_FLAG_H&N_FLAG_V&N_FLAG_N,(A3)
            SUBQ.B          #1,REG_R(A4)
            JMP             (A6)            


FED8:       ;   LDD
            MOVE.W          REG_H(A4),D0
            SUBQ.W          #1,REG_H(A4)
            MOVE.W          REG_D(A4),D1
            SUBQ.W          #1,REG_D(A4)
            LD_D0_D1
            AND.B           #N_FLAG_H&N_FLAG_V&N_FLAG_N,(A3)
            SUBQ.W          #1,REG_B(A4)
            BEQ.S           FED8_1
            OR.B            #FLAG_V,(A3)
FED8_1:     JMP             (A6)


FED9:       ;   LDDR
            MOVE.W          REG_H(A4),D0
            SUBQ.W          #1,REG_H(A4)
            MOVE.W          REG_D(A4),D1
            SUBQ.W          #1,REG_D(A4)
            LD_D0_D1
            ADDQ.B          #1,REG_R(A4)
            SUBQ.W          #1,REG_B(A4)
            BNE.S           FED9
            AND.B           #N_FLAG_H&N_FLAG_V&N_FLAG_N,(A3)
            SUBQ.B          #1,REG_R(A4)
            JMP             (A6)            

FED10:      ;   CPI
            MOVE.W          REG_H(A4),D0
            ADDQ.W          #1,REG_H(A4)
            PEEK8           D1
            MOVE.B          (A3),D0
            AND.B           #FLAG_C,D0
            CP_R8
            MOVE.B          (A3),D3
            AND.B           #N_FLAG_C&N_FLAG_V,D3
            OR.B            D0,D3
            SUBQ.W          #1,REG_B(A4)
            BEQ.S           FED10_1
            OR.B            #FLAG_V,D3
FED10_1:    MOVE.B          D3,(A3)
            JMP             (A6)


FED11:      ;   CPIR
            MOVE.B          (A4),D2
FED11_1:    MOVE.W          REG_H(A4),D0
            ADDQ.W          #1,REG_H(A4)
            SUBQ.W          #1,REG_B(A4)
            PEEK8           D1
            CMP.B           D1,D2
            MOVE            CCR,D3
            BEQ.S           FED11_2
            MOVE.W          REG_B(A4),D0
            BNE.S           FED11_1

FED11_2:    MOVE.B          N_FLAGS(A4,D3.W),D3
            AND.B           #N_FLAG_C,D3
            MOVE.B          (A3),D2
            AND.B           #FLAG_C,D2
            OR.B            D2,D3
            MOVE.W          REG_B(A4),D0
            BNE.S           FED11_3
            OR.B            #FLAG_V,D3
FED11_3:    MOVE.B          D3,(A3)
            JMP             (A6)


FED12:      ;   CPD
            MOVE.W          REG_H(A4),D0
            SUBQ.W          #1,REG_H(A4)
            PEEK8           D1
            MOVE.B          (A3),D0
            AND.B           #FLAG_C,D0
            CP_R8
            MOVE.B          (A3),D3
            AND.B           #N_FLAG_C&N_FLAG_V,D3
            OR.B            D0,D3
            SUBQ.W          #1,REG_B(A4)
            BEQ.S           FED12_1
            OR.B            #FLAG_V,D3
FED12_1:    MOVE.B          D3,(A3)
            JMP             (A6)


FED13:      ;   CPDR
            MOVE.B          (A4),D2
FED13_1:    MOVE.W          REG_H(A4),D0
            ADDQ.W          #1,REG_H(A4)
            SUBQ.W          #1,REG_B(A4)
            PEEK8           D1
            CMP.B           D1,D2
            MOVE            CCR,D3
            BEQ.S           FED13_2
            MOVE.W          REG_B(A4),D0
            BNE.S           FED13_1

FED13_2:    MOVE.B          N_FLAGS(A4,D3.W),D3
            AND.B           #N_FLAG_C,D3
            MOVE.B          (A3),D2
            AND.B           #FLAG_C,D2
            OR.B            D2,D3
            MOVE.W          REG_B(A4),D0
            BNE.S           FED13_3
            OR.B            #FLAG_V,D3
FED13_3:    MOVE.B          D3,(A3)
            JMP             (A6)


FED14:      ;   NEG
;            MOVE.B          (A4),D0
;            MOVEQ           #0,D2
;            MOVE.B          D0,D1
;            AND.B           #$0F,D1
;            BEQ.S           FED14_1
;            MOVE.B          #FLAG_H,D2
;FED14_1     NEG.B           D0
;            MOVE            CCR,D1
;            MOVE.B          N_FLAGS(A4,D1.W),(A3)
;            OR.B            D2,(A3)
;            MOVE.B          D0,(A4)

            NEG.B           (A4)
            MOVE            CCR,D1
            MOVE.B          N_FLAGS(A4,D1.W),(A3)
            JMP             (A6)


FED15:      ;   IM  0
            BRA.W           FED255


FED16:      ;   IM  1
            JMP             (A6)


FED17:      ;   IM  2
            BRA.W           FED255


FED18_BC:   ;   ADC HL,BC
            MOVE.W          REG_B(A4),D1
            ADC_R16         D1
            JMP             (A6)


FED18_DE:   ;   ADC HL,DE
            MOVE.W          REG_D(A4),D1
            ADC_R16         D1
            JMP             (A6)


FED18_HL:   ;   ADC HL,HL
            MOVE.W          REG_H(A4),D1
            ADC_R16         D1
            JMP             (A6)


FED18_SP:   ;   ADC HL,SP
            ADC_R16         D6
            JMP             (A6)


FED19_BC:   ;   SBC HL,BC
            MOVE.W          REG_B(A4),D1
            SBC_R16         D1
            JMP             (A6)


FED19_DE:   ;   SBC HL,DE
            MOVE.W          REG_D(A4),D1
            SBC_R16         D1
            JMP             (A6)


FED19_HL:   ;   SBC HL,HL
            MOVE.W          REG_H(A4),D1
            SBC_R16         D1
            JMP             (A6)


FED19_SP:   ;   SBC HL,SP
            SBC_R16         D6
            JMP             (A6)


FED20:      ;   RLD
            MOVE.W          REG_H(A4),D0
            PEEK8           D0
            MOVE.B          (A4),D1
            MOVE.B          D1,D2
            AND.B           #$F0,D2
            MOVE.B          D0,D3
            LSR.B           #4,D3
            OR.B            D2,D3
            MOVE.B          D3,(A4)
            LSL.B           #4,D0
            AND.B           #$0F,D1
            OR.B            D0,D1
            MOVE.W          REG_H(A4),D0
            POKE8           D1
            AND.B           #FLAG_C,(A3)            ; garder flag C
            MOVEQ           #0,D0
            MOVE.B          (A4),D0
            BNE.S           FED20_1
            OR.B            #FLAG_Z,(A3)            ; positionne flag Z
FED20_1:    MOVE.B          D0,D1
            AND.B           #FLAG_S,D1              ; positionne flag S
            OR.B            PARITE(A4,D0.W),D1
            OR.B            D1,(A3)
            JMP             (A6)


FED21:      ;   RRD
            MOVE.W          REG_H(A4),D0
            PEEK8           D0
            MOVE.B          (A4),D1
            MOVE.B          D1,D2
            AND.B           #$F0,D2
            MOVE.B          D0,D3
            AND.B           #$0F,D3
            OR.B            D2,D3
            MOVE.B          D3,(A4)
            LSR.B           #4,D0
            LSL.B           #4,D1
            OR.B            D0,D1
            MOVE.W          REG_H(A4),D0
            POKE8           D1
            AND.B           #FLAG_C,(A3)            ; garder flag C
            MOVEQ           #0,D0
            MOVE.B          (A4),D0
            BNE.S           FED21_1
            OR.B            #FLAG_Z,(A3)            ; positionne flag Z
FED21_1:    MOVE.B          D0,D1
            AND.B           #FLAG_S,D1              ; positionne flag S
            OR.B            PARITE(A4,D0.W),D1
            OR.B            D1,(A3)
            JMP             (A6)


FED22:      ;   RETI
            POPPC
            JMP             (A6)


FED23:      ;   RETN
            POPPC
            MOVE.B          REG_IFF1(A4),REG_IFF2(A4)
            JMP             (A6)


FED24_B:    ;   IN  B,(C)
            IN_R_C          REG_B(A4)
            JMP             (A6)


FED24_C:    ;   IN  C,(C)
            IN_R_C          REG_C(A4)
            JMP             (A6)


FED24_D:    ;   IN  D,(C)
            IN_R_C          REG_D(A4)
            JMP             (A6)


FED24_E:    ;   IN  E,(C)
            IN_R_C          REG_E(A4)
            JMP             (A6)


FED24_H:    ;   IN  H,(C)
            IN_R_C          REG_H(A4)
            JMP             (A6)


FED24_L:    ;   IN  L,(C)
            IN_R_C          REG_L(A4)
            JMP             (A6)


FED24_A:    ;   IN  A,(C)
            IN_R_C          (A4)
            JMP             (A6)


FED25:      ;   INI
            BRA.W           FED255


FED26:      ;   INIR
            BRA.W           FED255


FED27:      ;   IND
            BRA.W           FED255


FED28:      ;   INDR
            BRA.W           FED255


FED29_B:    ;   OUT (C),B
            MOVE.W          REG_B(A4),D0
            MOVE.B          REG_B(A4),D1
            BSR.W           WritePort
            JMP             (A6)


FED29_C:    ;   OUT (C),C
            MOVE.W          REG_B(A4),D0
            MOVE.B          D0,D1
            BSR.W           WritePort
            JMP             (A6)


FED29_D:    ;   OUT (C),D
            MOVE.W          REG_B(A4),D0
            MOVE.B          REG_D(A4),D1
            BSR.W           WritePort
            JMP             (A6)


FED29_E:    ;   OUT (C),E
            MOVE.W          REG_B(A4),D0
            MOVE.B          REG_E(A4),D1
            BSR.W           WritePort
            JMP             (A6)


FED29_H:    ;   OUT (C),H
            MOVE.W          REG_B(A4),D0
            MOVE.B          REG_H(A4),D1
            BSR.W           WritePort
            JMP             (A6)


FED29_L:    ;   OUT (C),L

            MOVE.W          REG_B(A4),D0
            MOVE.B          REG_L(A4),D1
            BSR.W           WritePort
            JMP             (A6)


FED29_A:    ;   OUT (C),A
            MOVE.W          REG_B(A4),D0
            MOVE.B          (A4),D1
            BSR.W           WritePort
            JMP             (A6)


FED30:      ;   OUTI
            AND.B           #N_FLAG_Z,(A3)
            OR.B            #FLAG_N,(A3)
            SUBQ.B          #1,REG_B(A4)        ; d'abord décrémenter B
            MOVE.W          REG_H(A4),D0
            ADDQ.W          #1,REG_H(A4)
            PEEK8           D1
            MOVE.W          REG_B(A4),D0        ; avant opération d'E/S
            BSR.W           WritePort
;
; Mettre le flag Z si B==0
;            
            JMP             (A6)


FED31:      ;   OTIR
            BRA.W           FED255


FED32:      ;   OUTD
            AND.B           #N_FLAG_Z,(A3)
            OR.B            #FLAG_N,(A3)
            SUBQ.B          #1,REG_B(A4)        ; d'abord décrémenter B
            MOVE.W          REG_H(A4),D0
            SUBQ.W          #1,REG_H(A4)
            PEEK8           D1
            MOVE.W          REG_B(A4),D0        ; avant opération d'E/S
            BSR.W           WritePort
;
; Mettre le flag Z si B==0
;            
            JMP             (A6)


FED33:      ;   OTDR
            BRA.W           FED255


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


TabED:
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED24_B,FED29_B,FED19_BC,FED5_BC,FED14,FED23,FED15,FED2
            DC.L            FED24_C,FED29_C,FED18_BC,FED4_BC,FED255,FED22,FED255,FED3
            DC.L            FED24_D,FED29_D,FED19_DE,FED5_DE,FED255,FED255,FED16,FED0
            DC.L            FED24_E,FED29_E,FED18_DE,FED4_DE,FED255,FED255,FED17,FED1
            DC.L            FED24_H,FED29_H,FED19_HL,F13,FED255,FED255,FED255,FED21
            DC.L            FED24_L,FED29_L,FED18_HL,F12,FED255,FED255,FED255,FED20
            DC.L            FED255,FED255,FED19_SP,FED5_SP,FED255,FED255,FED255,FED255
            DC.L            FED24_A,FED29_A,FED18_SP,FED4_SP,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED6,FED10,FED25,FED30,FED255,FED255,FED255,FED255
            DC.L            FED8,FED12,FED27,FED32,FED255,FED255,FED255,FED255
            DC.L            FED7,FED11,FED26,FED31,FED255,FED255,FED255,FED255
            DC.L            FED9,FED13,FED28,FED33,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255
            DC.L            FED255,FED255,FED255,FED255,FED255,FED255,FED255,FED255


_ErreurED:  DC.W            $FFFF


            XDEF            TabED
            XDEF            _ErreurED


            END
