; Routine die klokje op beeld zet (screen 0)
; Originele listing door Jan Wilmans
; Aangepast door FCS (JT)

; Het klokje wordt onder het gewone screen 0-scherm gezet. Geef om dit onderste
;  stuk ook op het scherm te krijgen in BASIC het commando VDP(10)=vdp(10)or128

        ORG   0D301H

VDPADD: EQU   1920            ; Het begin VRAM adres van het klokje

BEGIN:  DI
        LD    HL,0FD9FH
        LD    DE,HOOK
        LD    BC,5
        LDIR
        LD    A,0C3H
        LD    (0FD9FH),A
        LD    HL,KLOK
        LD    (0FDA0H),HL
        EI
        RET

; Dit gedeelte tot aan hook staat onder interrupt!
KLOK:   DI
        PUSH  AF
        LD    A,(TIMER)
        DEC   A
        JR    Z,KLOK2
        LD    (TIMER),A
        POP   AF
        RET
KLOK2:  PUSH  BC
        PUSH  DE
        PUSH  HL
        LD    A,50
        LD    (TIMER),A
        LD    HL,VDPADD
        CALL  SETWRT
        LD    A,5
        CALL  REDCLK
        ADD   A,48
        OUT   (98H),A
        LD    A,4
        CALL  REDCLK
        ADD   A,48
        OUT   (98H),A
        NOP                   ; Wacht 2 cycles extra anders kan de VDP het niet
;                             ; aan! Want op screen nul moet tussen iedere
;                             ; nog extra cycles gewacht worden!!!
        NOP                   ; DUS!!! op R800 mode moet dit aangepast worden!!!
        LD    A,":"
        OUT   (98H),A
        LD    A,3
        CALL  REDCLK
        ADD   A,48
        OUT   (98H),A
        LD    A,2
        CALL  REDCLK
        ADD   A,48
        OUT   (98H),A
        NOP                   ; Idem
        NOP
        LD    A,":"
        OUT   (98H),A
        LD    A,1
        CALL  REDCLK
        ADD   A,48
        OUT   (98H),A
        XOR   A
        CALL  REDCLK
        ADD   A,48
        OUT   (98H),A
        POP   HL
        POP   DE
        POP   BC
        POP   AF
HOOK:   DEFS  5               ; Oude adres

; Roep deze routine aan om de klok weer te stoppen
STOP:   DI
        LD    HL,HOOK
        LD    DE,0FD9FH
        LD    BC,5
        LDIR
        EI
        RET

TIMER:  DEFB  1


; Naam     : SETWRT
; Fucktie  : Zet de VDP op schrijven
; Invoer   : HL = VRAM-adres
; Uitvoer  : -
; Verandert: AF
; Opmerking: Kan allen de eerste 64Kb van het VRAM aan
SETWRT: LD    A,H
        AND   11000000B
        RLCA
        RLCA
        OUT   (99H),A
        LD    A,14 OR 128
        OUT   (99H),A
        LD    A,L
        OUT   (99H),A
        LD    A,H
        AND   00111111B
        OR    01000000B
        OUT   (99H),A
        RET


; Naam     : REDCLK
; Functie  : Leest de klok-data
; Invoer   : A = Klok RAM-adres
; Uitvoer  : A = Gelezen data (laagste 4 bits)
; Verandert: AF,B
REDCLK: PUSH  AF
        AND   00110000B
        RRCA
        RRCA
        RRCA
        RRCA
        LD    B,A
        LD    A,13
        OUT   (0B4H),A
        INC   A
        IN    A,(0B5H)
        AND   00001100B
        OR    B
        OUT   (0B5H),A
        POP   AF
        AND   00001111B
        OUT   (0B4H),A
        IN    A,(0B5H)
        AND   0FH
        RET


        POP   AF
        AND   00001111B
        OUT   (0B4H),A
        IN    A,(0B5H)
        AND 