;
; 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