5 - CRTC

Introduction:

Moniteur: Objet sur lequel s'affiche une image.

Écran: ce qui est envoyé au moniteur.

Imaginez un monde qui ne dépende que de compteurs.

Ou chaque chose commence à 0 puis s'incrémente jusqu'à atteindre une valeur avant de retourner à 0...

Le CRTC c'est ça.

Rions un peu:

Pendant des 10aines d'années nous avons eu sur CPC nombre de codeurs qui ne comprenaient rien au CRTC (et il y en a encore). Les démos tournaient plus ou moins à 50Hz (fréquence normale du moniteur) et certains utilisaient les ruptures des autres sans rien y comprendre (la classique rupture au milieu de l'écran d'Epsilon par exemple qu'on retrouve dans toutes les démos d'un démomaker normand... Avec le test de touche du même auteur aussi... De la à dire que ce sont des démos d'Epsilon il n'y a qu'un pas... Heureusement il sait aussi faire des dots; des rasters et afficher un sprite. ).

Le prétexte invoqué était la plupart du temps: le CRTC c'est trop compliqué !!! Hors justement c'est loin d'être le cas. Pour en revenir à l'exemple précédent, un test de touche est certainement moins logique (sauf si vous considérez normal de devoir passer par le PPI pour accéder au processeur sonore qui lui s'occupe du clavier ???!!!) que le CRTC.

Les premières ruptures ont été utilisées dès le début du CPC dans quelques jeux. C'était plus ou moins bien fait.

C'est surtout sur feu la scène démo que le CRTC a vu son utilisation se démocratiser et sa connaissance améliorée principalement grâce aux codeurs Longshot et Overflow (des Logon System)

Aussi, c'est bien grâce à eux que nous pouvons aujourd'hui nous amuser avec ce composant.

Et c'est donc ici que nous allons voir le fonctionnement de ce composant.

Premiers émois:

A noter aussi que je parlerai ici que du CRTC3 puisque nous parlons ici de CPC+ et de GX4000. Aussi, je ne parlerai pas d'adaptation CRTC ni du comportement des autres CRTC.

Le CRTC dans son utilisation normale a été conçu afin que l'on puisse définir les dimensions de l'écran (eh woai le moniteur on peut pas, l'écran c'est donc bien un point de vue CRTC).

Grosso modo:

Largeur; hauteur; position X et position Y

En plus de cela on peut choisir la hauteur d'un bloc de ligne (un bloc de ligne contient N lignes d'1 pixel de haut).

Pis voila, hormis d'autres bricoles c'est en gros ce qu'un CRTC est censé faire.

Oui mais pas seulement, le CRTC décide aussi de l'adresse de l'écran dans la RAM. Hors des petits malins qui eux avaient compris comment la bête fonctionne ce sont un jour dit que justement vu qu'on peut décider comment changer l'adresse de l'écran, on pouvait peut-être faire plusieurs écrans par frame et changer l'offset (adresse de l'écran) plusieurs fois...

C'est ce qu'on a appelé la rupture (ou splitscreen).

Bref, tout cela pour dire que nous allons dans un premier temps voir comment fonctionne le CRTC (mais pas complètement car on ignorera volontairement certains registres); puis nous irons faire un tour du coté du splitscreen justement à coup de CRTC (Sur CPC+/GX4000 on a aussi un autre type de splitscreen que l'on verra encore après).

R1:

Détermine la position du border sur la ligne. Détermine donc le nombre de caractère affichés visibles. Voir R0.

Valeur par défaut sous BASIC: 40

R2:

Détermine l’envoi du signal HBL et donc indirectement sert à positionner l'écran horizontalement.

Valeur par défaut sous BASIC: 46

R0: (C0)

Le registre 0 détermine le nombre de caractères par ligne. Afin d'avoir une image à 50Hz vous n'aurez pas trop le choix que de le laisser à 63. Vous aurez donc 64 caractères.

-C0 compteur interne de R0 va de 0 à R0 puis boucle.

-C0=R1, du border est envoyé.

-C0=R2, le signal HBL est envoyé.

Valeur par défaut sous BASIC: 63

R6:

Détermine la position du border verticalement. Détermine donc le nombre de caractères affichés verticalement aussi.

Valeur par défaut sous BASIC: 25

R7:

Détermine l’envoi du signal VBL et donc indirectement sert à positionner l'écran verticalement.

Valeur par défaut sous BASIC: 30

R4: (C4)

Détermine le nombre de bloc de lignes verticalement.

-C4 compteur interne de R4 va de 0 à R4 puis boucle.

-C4=R6, du border est envoyé.

-C4=R7, le signal VBL est envoyé.

-Quand C4 boucle à 0, l'offset est pris en compte (vous verrez ça a son importance).

Valeur normale sous BASIC: 38

R9: (C9)

Nombre de ligne (pixel) par caractère.

-C9 compteur interne de R9 va de 0 à R9 puis boucle.

-Quand C9 boucle à 0; C4 est incrémenté.

Valeur normale sous BASIC: 7

R12/R13:

Offset de l'écran. L'offset c'est l'adresse de départ de celui-ci.

Comme vous pouvez le voir, vous pouvez décider ou se trouvera l'écran en RAM CENTRALE (ni dans les banks; ni dans une ROM) ainsi que la taille de la zone mémoire balayée (16 ou 32 Ko). Les 10 bits (1 et 0 de R12+R13) vous permette de choisir un décalage au word (2 octets).

R3:

longueur des signaux HBL et VBL.

Valeur normale sous BASIC: #8E

Voila pour la description des registres principaux. Les autres sont soit inutilisés et inutilisables; soit j'y reviendrais plus tard.

Afin de résumer le comportement des différents compteurs, voici un schéma:

Pour envoyer vos valeurs aux différents registres, vous devez dans un premier temps choisir le registre:

LD BC,#BC00+6:OUT (C),C

Puis envoyez la valeur voulue:

LD BC,#BD00+25:OUT (C),C

Si vous ne comprenez pas pourquoi #BC ou #BD c'est que vous n'avez pas lu l'article 4 - Adresser un périphérique (GA;CRTC...)