CODINGSOURCES ★ DÉTECTION CRTC: RETOUR AU SOURCE ★

AMSLIVE n°19 - Crtc Detection - Retour Au SourceTest CRTC v2.3|MADRAM, amslive n19)
 

; Détection type CRTC,


; Madram pour Amslive    Juin 2002
; v2.3

org     #9001
R2              equ    46       ; Valeur initiale registre 2.
R12             equ    #30     ; Valeur arbitraire non nulle.
;
; Dès lors qu'on manipule le hard, le système pourrait
; saboter les tests. Donc, on commence par couper les
; interruptions. Cela s'avère également nécessaire
; à la bonne tenue des synchros.
;
di                     ; Tiens, qu'est-ce que je disais !
;
; Maintenant, si vous le voulez bien, on s'assure du  paramétrage CRTC :
; -  les tests 3 et 6 s'appuient sur la connaissance de la valeur du registre 12.
; -  le test 5 présuppose un écran à 50 Hz et une largeur h-syncde 14.
; Au besoin, vous placerez ici et avec profit votre propre initialisation
; CRTC, en prenant garde au point suivant : pour r2=50, il faut fixer
; r3 à 13, et modifier le test 5 de façon à provoquer le bug en remettant r3 à 14.
;
ld      hl,crtclist+12
ld     bc,#bc0c
setcrtc    out    (c) ,a
inc    b
inc    b
outd
dec    b
dec    c
jp     p,setcrtc
; 5 bits à 1, pour chaque type en lice :
ld       d,#1f
; départage (1 ou 2) / autres types :
call   test3
; départage (3) / reste du monde ;
call   test4
; Note : à ce point, si le type (1) est éliminé,
; on pourrait sauter l'ignoble test5.
; départage (2) / autres types :
call   test5
;  départage (3 ou 4) / autres types :
call   test6
call   conclut
; Fini !  Le registre A contient le type (5 = émulateur),
; qu'on s'empresse d'afficher.
or  #30
jp   #BB5A
test3
; Lit registre 12 :
; 0, 3 & 4   renvoient la valeur.
; 1 & 2              renvoient 0.
ld       bc,#bc0o
out      (C),C
ld       b,#bf
in       a,(c)
; Si 0, ce n'est pas (0, 3 ou 4)
ld       e,%00110
jr       z,t3_ok
cp       r12
; On sait que ce n'est pas (1 ou 2)
ld       e,%11001
jr       z,t3_ok
; Ni 0 ni valeur de départ => émulateur :
ld       a,%00000
t3_ok        ld     a, a
and    d
ld     d,a
ret
test4
; Vérifie si PPi buggé (= CPC+) :
ld       bc,#f602
out        (c) ,c
; Pourquoi sortir 2 ?
; Il faut une valeur non nulle,
; sans grandes conséquences cependant,
; et compatible avec l'astuce inutile qui suit :
inc     b
set     7,C
; Difficile à prononcer avec un doigt dans la bouche.
out      (c), c
dec b
; On touche au registre de commande, ce qui impliquera un reset des ports :
in       a,(c)
ld     a,%0l000 ; Port C non nul = CPC+
jr      nz,t4_ok
cpl
t4_ok        and    d
ld      d,a
ret
test5
; Vérifie si Reg3 + Reg2 = Reg0 + 1 annihile la VBL
; (= CRTC2) :
call  wait_vs
; On sort de VSync
; pour être certain de la choper au début ;
djnz $
djns  $
call  wait_vs
; On attend 311 lignes:
Id       bc,#l45b
t5__tmp      dec     c
jr        nz,t5_tmp
djnz   t5_tmp
; On provoque le bug CRTC2 :
ld       bc,#bc22
out      (c) , C
inc     b
set     4,c
out      (c), c
; On va vérifier une ligne plus bas s'il y a bien VSync
ld       c,#10
dec      c
jr       nz,$-l
ld       a, #f 5
in        a,(#db)
; On remet un peu les choses en ordre :
ld       c,r2
out      (c) , C
and    1     ; Si Vsync, pas CRTC 2.
dec     a
xor     %11011
and     d
ld       d,a
ret
test6
; Lit registre 4 (quasi identique à test3)
; 3 & 4 renvoient la valeur registre 12.
; 0 1 & 2 renvoient 0.
ld       bc,#bc04
out      (c) rc
ld       b,#bf
in       a,(c)
ld       e,%00111 ; Si 0, ce n'est pas (3 ou 4)
jr       z,t6_ok
cp       r12
ld       e,%11000
; On sait que ce n'est pas (0, 1 ou 2)
jr       z , t6_ok
ld       e,%00000
; Ni 0 ni valeur de départ => émulateur
t6_ok    ld       a,e
and      d
ld       d,a
ret
conclut
; On espère bien trouver un et un seul bit à 1 :
xor     a
dec     a
con_lp  inc    a
srl     d
jr      c,con_fin
jr      nz,conlp
ina     c             ; Si aucun bit à 1, émulateur.
con__fin   ret     z
; Venant de la boucle, nz si autre bit à 1.
ld      a,5
ret
wait_vs
        ld  b,#f5
wvs     in  a, (c)
rra
jr      ne,wvs
ret
crtclist
defb   #3f, 40, r2, #3e
defb   38, 0, 25, 30
defb   0, 7, 0, 0
defb   R12

 

★ LICENCE: ???
★ ANNÉES: 2002
★ AUTEUR: MADRAM

CPCrulez[Content Management System] v8.75-desktop/c
Page créée en 053 millisecondes et consultée 685 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.