CODINGAMSLIVE ★ AMSLIVE n°19 - DÉTECTION CRTC : RETOUR AU SOURCE ★

AMSLIVE n°16 - CRTC DetectionAMSLIVE n°18 - Crtc DetectionAMSLIVE n°19 - Crtc Detection - Retour Au Source

L'autre jour, dans le 18h03, ma voisine SNCF porta à mon appréciation la remarque suivante : « Dans certains milieux, l'honnêteté est superflue, alors que par définition, la netteté n'est pas superfloue », Je la rembarrai aussi sec, arguant que nous n'avions pas gardé les cochons ensemble (et encore moins regardé des films cochons) et qu'elle n'avait aucune raison d'insulter la caste des coiffeurs de si bon matin. Mais in petto, je la remerciais de m'avoir ainsi à son insu fourni le chapô de cette rubrique.

Si vous ne voyez pas le rapport entre cette histoire et le CRTC, je ne peux rien pour vous. Si vous le voyez, c'est encore plus grave que je ne le pensais.

D'APRÈS FRUD, C'EST TOUJOURS UNE QUESTION DE BITS

Oubliez le programme d'Amslive & 10, il a été entièrement retapé (!) pour finalement aboutir à la présente version. Celle-ci s'articule autour de quatre mesures :

- TEST4 : Détection CPC+.
- TEST3 : lecture registre 12. On en tire une des conclusion suivante :
  • C'est un type 1 ou 2.
  • C'est un type 0, 3 ou 4.
  • C'est un émulateur.
- Dans le premier cas, le TEST 5 départagera 1 et 2.
- Dans le deuxième cas, c'est le TEST 6 qui s'avère déterminant, départageant sans aucun parti pris 0 et 4.

Le source, volontairement obombré (*) par naturelle malice du programmeur, peut être vu de diverses façons : à l'envers, sur le dos, en fermant un oeil (sauf pour certains borgnes)... Mais surtout, il gagnera à être considéré comme solution de l'exercice consistant à écrire votre propre test.

LES DIX VIES DU CRTC

Qu'apporte ce test par rapport à ceux qu'offre déjà la littérature CPC, notamment Quasar 11 & 12?

  • Il n'écrit pas en mémoire (sauf dans la pile, évidemment. Quelle idée de m'interrompre pour ça ! Au contraire, un tel excès de pointillisme rend le propos malaisé à suivre, sans pour autant apporter d'information intéressante (surtout qu'une réécriture linéaire du programme met la remarque en défaut). Mieux vaut faire confiance à l'intelligence et l'imagination des gens que vouloir tout préciser, nous ne sommes pas dans un film américain. Quand on aime un verger, on en aime dix).
  • Il est insensible à toute modification de contexte, logicielle ou matérielle (à l'exception des interruptions non masquables et des explosions nucléaires).
  • Il met enjeu des méthodes plutôt originales.
  • Il ne provoque aucune saute d'écran sur CRTC 0 et 1.
  • Il bénéficie d'une homologation de l'Office des Poids et Mesures, consultable sur demande.
  • Sa structure modulaire, d'ailleurs, plaît en haut lieu. Rien n'empêche d'ajouter des tests aux conclusions redondantes (paramétrage Vsync, lecture registre status,...) afin de renforcer la détection des émulateurs.

En revanche, il ne distingue pas les sous-types de CRTC 0, car seules d'obscures routines de Shap et Offset, bizarrement introuvables, ont, paraît-il, mis en évidence des différences de comportement.

LE TYPE S'ILLUSTRE

Tant que nous y oise, rappelions brièvement quelques différences présentes cette fois dans l'exploitation du CRTC. Cela fera plaisir à Jean-Pierre qui raffole de la mise en page de tableaux.

(Note du correcteur-maquettiste : les sarcasmes teintés de sadisme ont provoqué dans le passé plus d'un soulèvement populaire. À bon entendeur !...)

------------------------------------------------------------------------------------------------
CRTC                       ;   ;0             ; 1               ; 2             ;  3 & 4
------------------------------------------------------------------------------------------------
Split Border                  ; Reg8           ;Reg 6           ; Impossible ?    Reg 6
------------------------------------------------------------------------------------------------
Bug Dispiay Enable             ;Oui           ; Non             ; Oui             ;Non
------------------------------------------------------------------------------------------------
Prise en compte offset         ;Nouvel écran   Nouvelle ligne   Nouvel écran    Nouvel écran
                                             ; quand C4=0
------------------------------------------------------------------------------------------------
Prise en compte R9 et R4       Bufférisée     Immédiate        Bufférisée      Bufférisée
------------------------------------------------------------------------------------------------
Ligne à ligne (R9 et R4 = 0)   Ok             ;Ok             ;  Bug             ;Ok
------------------------------------------------------------------------------------------------
Valeur minimale R0             ;1             ; 0               ; 0 avec C4>0     0
------------------------------------------------------------------------------------------------

Après ce régal, et sans augmentation de prix, nous vous offrons un petit listing afin de détecter le type de CRTC, mais ce sera sur une autre page, si vous le voulez bien.

macrtcam
 
MOYENNE, ANNONCE

Empruntant  l'idée d'ATM afin de faire fuctifier , j'aimerais dresser une liste complète des principaux circuits du CPC rencontrés selon les révisions de la reine mère.
Merci donc de m'envoyer les informations suivantes (pour tes composants, bien recopier la référence complète) :

- la date (gravée entre la carte et le lecteur 3")
- Z80
- CRTC (le composant se trouve généralement en bas à gauche , il y a marqué 6845 dessus)
- PPI (normalement au dessus du CRTC, marqué 8255)
- PSG (au dessus du PPL AY-3-9812)
- VGA (encore un composant de 40 pattes, marqué AMSTRAD 40010
- µPD (40 pattes, à droite, 765)
- vos coordonnées si vous acceptez d'e'ffectuer certains tests à là demande de curieux.
- les coodonnées de votre soeur , cas où.

Attention ! Ouvrir le clavier présente aucun risque mais vous fait perdre la garantie.

; 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

Malgré le cruel manque de mécènes , le laboratoire Overlanders poursuit tant bien que mal ses recherches. Parmi les résultats obtenus :

  • la lecture de registres non valides (18 à 31) renvoie généralement 0. Mais sur CRTC 1, la selection du registre 31 amène un état de haute impédance.
  • une nouvelle mise en défaut de l'obtention de &ff en haute impédance, justement,  consite à utiliser l'instruction in a,(n).

(*) Couvert d'ombre, synonyme d'obscurci. L'apprentissage d'un mot par mois fait partie du contrat d'abonnement Amslive. À votre service.

AMSLIVE n°19

★ ANNÉE: 2002
★ AUTEUR: MADRAM

Page précédente : AMSLIVE n°18 - Crtc Detection

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 173 millisecondes et consultée 1438 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.