            SECTION         text,CODE


            include         'vgacst.i'


            XREF            DecodeurAdresse
            XREF            ChangeROM
            XREF            _ReadPPI
            XREF            _ReadUPD
            XREF            _WritePPI
            XREF            _WriteVGA
            XREF            _WriteUPD
            XREF            _WriteCRTC


;
; Adressage des ports E/S du CPC :
;
; Normalement, 1 seul des bits compris entre A15 et A10 peut se trouver à 0
; (les autres bits sont à l'état 1 )
; 
; A15 A14 A13 A12 A11 A10 .... A0
;
;  0   1   1   1   1   1   XXXXXXXX -> 7C00 à 7FFF : VGA
;  1   0   1   1   1   1   XXXXXXXX -> BC00 à BFFF : CRTC
;  1   1   0   1   1   1   XXXXXXXX -> DC00 à DFFF : ROM d'extension
;  1   1   1   0   1   1   XXXXXXXX -> EC00 à EFFF : Imprimante
;  1   1   1   1   0   1   XXXXXXXX -> F400 à F7FF : PPI et PSG
;  1   1   1   1   1   0   XXXXXXXX -> F800 à FBFF : Extension bus
;
; Si A10 est à 0 (Extension bus), les bits A7 à A0 définissent quelle
; extension est adressée :
; 
; A7 A6 A5 A4 A3 A2 A1 A0
;
;  0  1  1  1  1  1  X  X -> F87C à FB7F : Contrôleur disc
;  1  0  1  1  1  1  X  X -> F8BC à FBBF : ? Extension future
;  1  1  0  1  1  1  X  X -> F8DC à FBDF : Interface série
;  1  1  1  0  1  1  X  X -> F8EC à FBEF : ? Extension future
;  1  1  1  1  0  1  X  X -> F8F4 à FBF7 : ? Extension future
;  1  1  1  1  1  0  X  X -> F8F8 à FBFB : ? Extension future
;  1  1  1  1  1  1  X  X -> F8FC à F8FF : Réservé utilisateur
;

ReadPort:   BTST            #11,D0
            BNE.S           ReadPort1
            BRA.W           _ReadPPI

ReadPort1:  BTST            #10,D0
            BNE.S           ReadPort2
            ;
            ; Pour l'instant, seul le µPD est émulé en extension
            ;
            MOVEM.L         D1/A1,-(A7)
            BSR.W           _ReadUPD
            MOVE.B          D0,D1
            MOVEQ           #0,D0
            MOVE.B          D1,D0
            MOVEM.L         (A7)+,D1/A1
            RTS

ReadPort2:  MOVE.B          #$FF,D0
            RTS


WritePort:  BTST            #15,D0
            BNE.S           WritePort1
            BRA.W           _WriteVGA
            
WritePort1: BTST            #14,D0
            BNE.S           WritePort2
            BRA.W           _WriteCRTC

WritePort2: BTST            #13,D0
            BNE.S           WritePort4
            AND.B           #N_ROMDISC_SEL,DecodeurAdresse
            CMP.B           #7,D1
            BNE.S           WritePort3
            OR.B            #ROMDISC_SEL,DecodeurAdresse

WritePort3: BRA.W           ChangeROM

WritePort4: BTST            #11,D0
            BNE.S           WritePort5
            BRA.W           _WritePPI

            ;
            ; Pour l'instant, seul le µPD est émulé en extension
            ;
WritePort5: AND.W           #$F8FF,D0       ; ### TEST ###
            CMP.W           #$F87F,D0       ; au lieu de FB7F
            BNE.S           WritePort6
            MOVEM.L         D0-D1/A1,-(A7)
            BSR.W           _WriteUPD
            MOVEM.L         (A7)+,D0-D1/A1

WritePort6: RTS


            XDEF            ReadPort
            XDEF            WritePort


            END
