;
; Test CRTC version 2.0
; (03/01/1997) par OffseT 
;
        Nolist
;
; Con\u @ partir des tests
; suivants ;
;
; - Test CRTC version 1.1
;   (23.02.1992) par Longshot
; - Test CRTC version 1.2
;   (18/06/1996) par OffseT
; - Test Asic version 1.0
;   (02.08.1993) par OffseT
; - Test Emulateur version 1.1
;   (03/01/1997) par OffseT
;
;
; Signification de la valeur de E en sortie ;
; (type de CRTC)
;
; 0 ; UM6845 ou Japonais  ; sur la plupart des CPC6128
;                         ; sortis entre 85 et 87
;
; 1 ; UM6845R             ; sur la plupart des CPC6128
;                         ; sortis entre 88 et 90
;
; 2 ; UM6845S             ; sur la plupart des CPC464
;                         ;             et des CPC664
;
; 3 ; Emul{ (ASIC)        ; sur les 464 plus
;                         ;     et 6128 plus
;
; 4 ; Emul{ (ERSATZ PLUS) ; sur la plupart des CPC6128
;                         ; sortis (en 90)
;
;
; Signification de la valeur D en sortie ;
;
; 0   ; CPC ou CPC+
; 255 ; Emulateur de CPC ou CPC+ sur PC ou Amiga
;     ; (CPE, CPE2, CPC-EMU, PC-CPC, A-CPC)


        Org &9f00
        Limit &a0a0

        di                ; Reconfiguration des
        ld hl,(&38)       ; interruptions...
        ld (inter+1),hl   ; On remplace le Call
        ld hl,&c9fb       ; syst}me par un simple
        ld (&38),hl       ; EI RET

        ld hl,tabcrtc     ; Initialisation du CRTC
        ld bc,&bd0c       ; On met les registres
Loop    outi              ; requis du CRTC @ des
        inc b             ; valeurs saines...
        inc b
        outi
        dec c
        jr nz,loop

        call testcrtc     ; Test du CRTC

        ld e,a            ; E contient le type de CRTC
        ld d,0            ; Si on a un type 2 alors
        cp 2              ; on a pas de test @ faire
        jp z,suite        ; (c'est forc{ment un CPC)
        cp 1              ; Si on a un type 1 on lance
        jp nz,type034     ; le test anti-{mulation
        call testemu      ; sans correction puis on
        jp suite          ; continue...
Type034 ld a,6            ; Sinon, on r{sout le bug
        ld (poke+1),a     ; du mode entrelac{ et on
        call testemu      ; teste si il y a tentative
                          ; de tromperie ou pas.

Suite   ld bc,&bc06       ; Remise en place de
        out (c),c         ; l'{cran
        ld bc,&bd00+25
        out (c),c

        di                ; Remise en place des
Inter   ld hl,0           ; interruptions
        ld (&38),hl       ; syst}me...
        ei
                          ; Ici E=Type de CRTC
                          ;  et D=Type de CPC

Affiche ld a,2
        push de
        call &bc0e
        pop de
        ld a,e            ; Affichage du type de CRTC
        add a,48          ; On mixe D (r{sultat du
        or d              ; test d'{mulation) avec E
        call &bb5a        ; (r{sultat du test CRTC)
                          ; et on affiche le type
                          ; de CRTC finalement obtenu...
        ret               ; Retour

TestCRTC
        ld hl,&a200       ; Configuration du mode IM 2
        ld (hl),&a0       ; @ l'adresse &A0A1 pour les
        inc hl            ; CPC classiques et @
        ld (hl),&a1       ; l'adresse &A1A0 pour les
        ld e,l            ; 6128 plus et 464 plus
        ld d,h
        inc de
        dec hl
        ld bc,&ff
        ldir
        ld a,&a2
        ld i,a
        im 2              ; Et hop, on passe en IM 2
        ei
        halt              ; On attend une interruption
        di                ; pour voir...
        im 1              ; On retourne en IM 1
        or a              ; On teste le r{sultat de
                          ; l'interruption...
        ret nz            ; Si pas nul (A=3) on a un
                          ; CRTC type 3 puisque le
                          ; saut s'est fait en &A1A0

NoType3 ld b,&f5          ; Boucle d'attente de la VBL
VS      in a,(c)
        rra
        jr nc,vs
VS1     in a,(c)          ; Pre-Synchronisation
        rra               ; Attente de la fin de la VBL
        jr c,vs1
VS2     in a,(c)          ; Deuxi}me boucle d'attente de la VBL
        rra
        jr nc,vs2

        ei                ; Attente d'un 300}me de seconde
        halt              ; (on est exactement en haut de l'{cran)

        ld hl,75          ; Boucle d'attente de 528 micro-secondes
Wait    dec hl
        ld a,h
        or l
        jr nz,wait
        in a,(c)          ; Test de la VBL
        rra               ; Si elle est encore en cours
        jr c,types12      ; on a un UM6845 R ou S...
                          ; Sinon on a un type 0 ou 4

        ld bc,&bc00+12    ; Envoi d'une valeur dans le
        out (c),c         ; reg12 du CRTC...
        ld a,&29
        inc b
        out (c),e
        inc b             ; Tentative de lecture du reg12
        in a,(C)          ; par le port &BE00...
        cp e              ; Si non {gal alors le port &BE00
        jr nz,type0       ; ne fonctionne pas en lecture,
                          ; on a un type 0...
        ld a,4            ; Sinon on a un CRTC type 4
        ret
Type0   xor a             ; Retour si type 0
        ret

Types12 halt              ; On attend un peu pour etre
        halt              ; sur etre sorti de la VBL...
        halt
        di
VS3     in a,(c)          ; Attente de la VBL
        rra
        jr nc,vs3

        ld bc,&bc00+2     ; Chargement de la  valeur 50
        out (c),c         ; dans le reg2 du CRTC
        ld bc,&bd00+50
        out (c),c

        ei

        halt              ; Attente de la VBL suivante
        halt              ; 6 300}me de seconde plus loin...
        halt
        halt
        halt
        halt
        halt

        ld b,&f5          ; Lecture de l'{tat de la synchro
        in a,(c)
        rra

        ld bc,&bd00+46    ; Remise @ 46 du reg2
        out (c),c
        jr nc,type2       ; Si on a pas de VBL alors on est
                          ; en overflow, c'est un type 2...
        ld a,1            ; Sinon on a un CRTC type 1
        ret

Type2   ld a,2            ; Retour si type 2
        ret

; Test pour voir si on a un vrai CPC ou un {mulateur (v1.0)

TestEmu ei
        ld b,&f5          ; On attend une premi}re 
VS4     in a,(c)          ; synchro verticale
        rra               ; pour se placer en
        jr nc,vs4         ; haut de l'{cran

VS5     in a,(c)          ; On attend la fin de
        rra               ; cette VBL...
        jr c,vs5

        halt              ; On se place en
        halt              ; fin d'{cran...
        halt
        halt
        halt

        ld bc,&bc08       ; On commute en mode
        out (c),c         ; entrelac{ (reg8=3)
        ld bc,&bd03       ; avec {ventuellement
        out (c),c         ; une remise @ jour
        ld bc,&bc09       ; du registre 9 pour
        out (c),c         ; les CRTC 0, 3 et 4
Poke    ld bc,&bd07       ; pour lesquel ce mode
        out (c),c         ; en bugg{.

        ld b,&f5          ; On attend le d{but
VS6     in a,(c)          ; de la VBL suivante
        rra               ; ...
        jr nc,vs6

VS7     in a,(c)          ; On se place encore
        rra               ; une fois @ la fin
        jr c,vs7          ; de cette VBL.

        halt              ; On attend le milieu
        halt              ; de l'{cran...
        halt

        ld d,&ff          ; En on v{rifie que l'on
        in a,(c)          ; a bien une VBL qui
        rra               ; confirme le passage en
        jr nc,pascpc      ; mode entrelac{... d=0
        ld d,0            ; c'est OK, d=255 c'est
                          ; un imposteur

PasCPC  ld bc,&bc08       ; On remet les registres
        out (c),c         ; 8 et 9 dans leur {tat
        ld bc,&bd00       ; normal...
        out (c),c
        ld bc,&bc09
        out (c),c
        ld bc,&bd07
        out (c),c

        ret               ; Retour au programme
                          ; principal

; Initialisation du CRTC

TabCRTC db 0,63,1,40,2,46,3,142,4,38,5,0,6,0,7,30,8,0,9,7,12,&30,13,0

; Adresse d'interruption dans le cas d'un CPC. -> On met A @ 0.

        Org &A0A1
        Limit &a19f
        xor a
        ei
        ret

; Adresse d'interruption dans le cas d'un CPC+. -> On met A @ 3.

        Org &A1A0
        Limit &a1ff
        ld a,3
        ei
        ret

ants ;
;
; - T