            SECTION         text,CODE


            include         'regs.i'
            include         'tools.i'
            include         'vgacst.i'


            XREF            _Interruption
            XREF            @BeginIO
            XREF            TabInstr
            XREF            _finProc
            XREF            _VBL
            XREF            tabAdrMemEcrCPC
            XREF            DecodeurAdresse
            XREF            ChangeROM
            XREF            ChangeRAM
            XREF            _EtatLigneClav
            XREF            InitTab
            XREF            _ROMINF
            XREF            _ROMSUP
            XREF            _ROMDISC
            XREF            _RAM_00
            XREF            _RAM_01
            XREF            _RAM_02
            XREF            _RAM_03
            XREF            TabPOKE
            XREF            TabPOKE4
            XREF            TabPOKE8
            XREF            TabPOKEC
            XREF            TabPEEK000
            XREF            TabPEEK0004
            XREF            TabPEEK0008
            XREF            TabPEEK000C
            XREF            TabPEEK001
            XREF            TabPEEK0014
            XREF            TabPEEK0018
            XREF            TabPEEK001C
            XREF            TabPEEK010
            XREF            TabPEEK0104
            XREF            TabPEEK0108
            XREF            TabPEEK010C
            XREF            TabPEEK011
            XREF            TabPEEK0114
            XREF            TabPEEK0118
            XREF            TabPEEK011C
            XREF            TabPEEK110
            XREF            TabPEEK1104
            XREF            TabPEEK1108
            XREF            TabPEEK110C
            XREF            TabPEEK111
            XREF            TabPEEK1114
            XREF            TabPEEK1118
            XREF            TabPEEK111C


@ExecZ80:   MOVEM.L         D1-D7/A0-A6,-(A7)
            CLR.B           _finProc

            LEA             _RAM_00,A0
            MOVE.L          #TabPOKE,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK000,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK010,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK110,D0
            BSR.W           InitTab

            LEA             _ROMINF,A0
            MOVE.L          #TabPEEK001,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK011,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK111,D0
            BSR.W           InitTab

            LEA             _RAM_01,A0
            MOVE.L          #TabPOKE4,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK0004,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK0014,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK0104,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK0114,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK1104,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK1114,D0
            BSR.W           InitTab

            LEA             _RAM_02,A0
            MOVE.L          #TabPOKE8,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK0008,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK0018,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK0108,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK0118,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK1108,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK1118,D0
            BSR.W           InitTab

            LEA             _RAM_03,A0
            MOVE.L          #TabPOKEC,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK000C,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK001C,D0
            BSR.W           InitTab

            LEA             _ROMSUP,A0
            MOVE.L          #TabPEEK010C,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK011C,D0
            BSR.W           InitTab

            LEA             _ROMDISC,A0
            MOVE.L          #TabPEEK110C,D0
            BSR.W           InitTab
            MOVE.L          #TabPEEK111C,D0
            BSR.W           InitTab

;
; Toutes les lignes du clavier à 0xFF
;
            LEA             _EtatLigneClav,A0
            MOVE.L          #-1,(A0)+
            MOVE.L          #-1,(A0)+
            MOVE.L          #-1,(A0)+
            MOVE.L          #-1,(A0)+

            LEA             tabAdrMemEcrCPC,A2
            LEA             TabPEEK000,A3
            LEA             DONNEES,A4 ; (A4) = Acc
            CLR.L           (A4)       ; AF,  BC  = 0
            CLR.L           4(A4)      ; DE,  HL  = 0
            CLR.L           8(A4)      ; AF', BC' = 0
            CLR.L           12(A4)     ; DE', HL' = 0
            CLR.L           16(A4)     ; IX,  IY  = 0
            CLR.L           20(A4)     ; IR, IFFn = 0
            LEA             TabInstr,A5
            LEA             Z80,A6

            MOVE.B          #ROMINF_SEL,DecodeurAdresse
            BSR.W           ChangeROM
            CLR.L           D0
            BSR.W           ChangeRAM

            MOVE.W          #$000E,D4 ; Mombre de décalagés à droite pour
                                      ; récupérer le n° de bank de 16K ROM/RAM
            MOVE.W          #$3FFF,D5 ; Masque pour rester dans une bank de 16K
            CLR.L           D6        ; SP = 0
            CLR.L           D7        ; PC = 0

;
;   Emuler interruption ?
;
Z80:        TST.W           _IntZ80
            BEQ.W           TraiteInstr
;
;   Fermeture par le CLOSE-GADGET 
;
            TST.B           _finProc
            BNE.W           fini
;
;   Passage en mode DEBUG ?
;
            TST.W           _EtatDebug
            BNE.W           Z80Dbg
;
;   "Emulation" interruption
;
            CLR.W           _IntZ80
            CLR.B           _VBL
            SUBQ.B          #1,CptInt
            BNE.S           TraiteInt
            MOVE.B          #1,_VBL
            MOVE.B          #6,CptInt
;
;       EI ? (Enable Interrupt)
;
TraiteInt:  TST.B           REG_IFF1(A4)
            BEQ.W           TraiteInstr

            PUSHPC
            MOVE.W          #$38,D7

TraiteInstr:
            ADDQ.B          #1,REG_R(A4)
            MOVEQ           #0,D0
            GETN            D0
            JMP             ([A5,D0.W*4])

fini:       CLR.L           D0
            MOVEM.L         (A7)+,D1-D7/A0-A6
            CMP.B           #1,_finProc
            BEQ.W           @ExecZ80
            RTS


Z80Dbg:     MOVEM.L         D7/A1,-(A7)
            LEA             Z80Dbg,A6
            LEA             _InfosRegistres,A1
            MOVE.W          (A4),(A1)+          ; AF
            MOVE.W          REG_B(A4),(A1)+     ; BC
            MOVE.W          REG_D(A4),(A1)+     ; DE
            MOVE.W          REG_H(A4),(A1)+     ; HL
            MOVE.W          REG_A_(A4),(A1)+    ; AF'
            MOVE.W          REG_B_(A4),(A1)+    ; BC'
            MOVE.W          REG_D_(A4),(A1)+    ; DE'
            MOVE.W          REG_H_(A4),(A1)+    ; HL'
            MOVE.W          REG_IX(A4),(A1)+    ; IX
            MOVE.W          REG_IY(A4),(A1)+    ; IY
            MOVE.W          REG_I(A4),(A1)+     ; IR
            MOVE.W          D6,(A1)+            ; SP
            MOVE.W          D7,(A1)+            ; PC
            GETN            D0
            MOVE.B          D0,(A1)+
            GETN            D0
            MOVE.B          D0,(A1)+
            GETN            D0
            MOVE.B          D0,(A1)+
            GETN            D0
            MOVE.B          D0,(A1)+
            MOVEM.L         (A7)+,D7/A1

            MOVE.W          #1,_EtatDebug
WaitDbg:    TST.B           _finProc
            BNE.W           fini
            CMP.W           #1,_EtatDebug
            BEQ.S           WaitDbg
            TST.W           _EtatDebug
            BNE.W           TraiteInstr
            LEA             Z80,A6
            JMP             (A6)

;
;   Fonction appelée par l'interruption du Timer.device
;   -> *** A cet instant, A6 pointe sur l'exec.library ***
;
@tsoftcode:
            TST.B           _Interruption+4
            BNE.S           SetInt
            MOVE.B          #2,_Interruption+4
            RTS

SetInt:     MOVE.L          _Interruption,A0
            JSR             -372(A6)             ; GetMsg
            MOVE.L          D0,A1
            MOVE.B          #1,_IntZ80
            MOVE.L          _FreqInt,$24(A1)
            MOVE.L          A6,-(A7)
            MOVE.L          $14(A1),A6
            JSR             -30(A6)
            MOVE.L          (A7)+,A6
            RTS


            SECTION         data,DATA


_InfosRegistres:
            DS.B            32

_FreqInt:   DC.L            4729            ; f = (1/p) = 150 Hz (p en µsec)
_IntZ80:    DC.B            0,0,0,0
CptInt:     DC.B            6,0,0,0
_EtatDebug: DC.W            0
_vers:      DC.B            0,"$VER: AMI-CPC V0.46t - par L.DEPLANQUE",0

            XDEF            @ExecZ80
            XDEF            @tsoftcode
            XDEF            Z80
            XDEF            _InfosRegistres
            XDEF            _FreqInt
            XDEF            _EtatDebug
            XDEF            _vers
            XDEF            _IntZ80


            END
