CODING ★ DOSSIER PARADOX ★

Dossier CRTC par GOZEUR/Paradox

Ce dossier est strictement réservé aux membres de PARADOX, Ne pas le diffuser a des personnes étrangères au groupe S.V.P.

I) LE CRTC. CATHODE RAY TUBE CONTROLLER.

1) Les registres.

Les registres du  CRTC sont au nombre de 18, mais pour les ruptures, seuls 10 registres sont utiles (les registres 0,1,2,3,4,6,7,9,12 et 13). Vous connaissez très bien les registres 1,2,6,7,12 et 13. mais les registres 0,3,4 et 9 méritent quelques explications.

a) Le registre 4.

Ce registre de-fini le  nombre de ligne de caractère que doit balayer le canon a électrons. Cette valeur est diminuée de 1 par rapport au  nombre réel de ligne de caractère a l'écran. Par exemple, quand vous allumez le CPC, le registre 4 est a  38, et le nombre de ligne de caractère a l'écran est de 39. on a donc ! Reg 4=nb de ligne de caractère  - 1
Là valeur du reg 4 peut varier de 0 a 127. A 128, le CRTC boucle, c'est a dire qu'il revient a 0. Par exemple, si vous mettez 138 dans le reg 4, le CRTC considérera le 123 comme un 0. Si vous mettez 138, il considérera le 138  comme un 10, etc..

b) Le registre 9.

Ce registre défini le  nombre de ligne de pixel qu'il y a dans un caractère. Il est également diminué de 1 par rapport au  nombre réel de ligne par caractère. Reg 9=nb ligne  par caractère - 1.
La valeur normale est de 7 (conc 3 lignes par caractère (7+1)) cette valeur peut varier de 0 a 31. A 32, le CRTC boucle.

c) Le registre 3.

Il défini la largeur de la HBL (Horizontal Blanking), c'est la bande noire qu'il y  a tout a gauche de l'écran (on ne peut  pas la voir, car elle est trop a gauche) Cette largeur est définie en MOT (1 MOT=2 OCTETs ) elle varie de  0 (donc 0 octets) a 15 donc 30 octets). A 16, es boucle. La valeur normale est 14. La HBL sert au canon a électrons a se synchroniser. Lorsque  la valeur du R3 est trop basse, le canon  se synchronise mal et l'écran est décelé (ce bug est utilisé pour faire des scrolls hards a l'octet, mais le résultat n'est pas très propre, car le scroll vibre un peu car le canon n'est pas bien  synchronisé: Si la valeur est inférieure a 4, le  canon est si mal synchronise que l'écran n'est plus stable.

d) Le registre C.

Ah, le registre 0. Il est utilisé depuis peu de temps par les  demomaker , en effet, son fonctionnement et surtout son utilité était assez vague.

Ce registre correspond en fait au reg 4, mais en horizontal. Il défini le nombre  de MOT qu'il y a sur une ligne. Sa  valeur normale est 63. Il est lui aussi décrémenté par rapport au nombre réel de MOT par ligne. Donc, si le R0 est a 63, il y a 64 MOTs sur une ligne, ce qui fait 123 octets. Sa valeur varie de 0 a 255.

2) Le fonctionnement  des registres.

a) Les registres 12 et 13.

Ces registres définissant l'offset de d'écart de la mémoire écran . Cette adresse est codée sur 10 Bits, de 0 à 9 . Les bits 10 et 11 sont utilisés pour la taille de l'écran ( 16 ou 32 ko) , et les bits 12 et 13 gèrent la zone vidéo utilisée . Ces 2 registres sont les seuls a pouvoir être bufférisé . C'est a dire que vous pouvez les charger avant que l'écran ne commence a être affiché. Si vous faites une rupture sur 2 écrans, vous pouvez changer l'offset du deuxième écran, pendant que le premier est affiché. Le changement des reg 12 et 13 ne sera prit en compte que lorsque le deuxième écran commencera

b) Les registres compteurs.

Les registres 0, 3, 4 et 9 sont compteurs. Lorsque le CRTC affiche un écran , il fait quelque part dans ses petits circuits, la valeur de chacun de ces registres. Il possede pour chacun de ces registres , un sorte de variable . Lorsque l'on change la valeur d'un reg, on change le maximum de la variable correspondante . Par exemple, le reg 4 est a 38 ( sa valeur normale ) , quand le CRTC commence a afficher l'écran , la variable est a 0, et a chaque fois qu'il a fini d'afficher une ligne de caractère, il incrémente la variable , jusqu'à ce qu'elle atteigne son maximum , qui  est ici 38. A 38 , l'écran a fini d'être affiché , et il commence un nouvel écran . Idem pour le registre 9, quand le CRTC commence un caractère , la variable est a 0, et a chaque fin de ligne , il incrémente le compteur,. Jusqu'à 7. A 7 , le compteur recommence a 0.

c) L'overflow

L'overflow est un comportement anormal du CRTC du au fait que l'on envoie une valeur incorrect dans un registre . L'overflow le plus connu est celui du reg 7 a 235, qui est une valeur overflow, et de ce fait , le CRTC ne produit plus de VBL ( qui est la bande noire tout en haut de l'écran, on peut la voir mettant le border a une autre valeur que 0, et en tournant doucement le bouton qu'il y a derrière le moniteur . Cette bande permet au canon de se resynchroniser en début d'affichage d'un écran. )

Mais il y a d'autre overflow. Lorsque vous modifier la valeur d'un registre compteur , il peut se produire un overflow. Vous mettez le reg 4 a 20, mais au moment ou vous mettez cette valeur, la variable du reg 4 en est 25. Dans ce cas il se produit un overflow. En effet vous fixer le maximum du reg 4 a 20, mais le compteur en est a 25, donc , avant d'arriver a 20, il va aller jusqu'à son maximum ( qui est 127) vous allez donc avoir un écran qui défile, ou qui scintille .

Ceci est valable pour tous les registres compteurs. Vous avez peut-être constaté un overflow en faisant de la rupture par ligne . Si vous avez en début de rupture ligne a ligen , 4 lignes de caracteres identiques, cela est du a un overflow. Vous mettez le reg 9 a 0 alors que le compteur en est par exemple a 2. Dans le cas , le reg 9 va a son maximum, qui est 31 ( 2 ligne de pixels, ca fait bien 4 ligne de caracteres)

3) Les types

Les CRTCs sont classés en 5 types. Les types 0, 1 et 2 sont pour les CPCs vielle génération. LE crtc 2 plus difficile a maîtriser , en effet sa structure est beaucoup moins souple que les autres CRTCs. Pour le programmer en rupture normale, il faut respecter de nombreuses règles.

En rupture modernes ( ligne a ligne , verticales, etc…) il est preque impossible d'y parvenir , car il plante lorsqu'on lui démande des choses trop poussés ( Si l'on fait par exemple R4=0 et R9=9 ; ca plante.)
Bref , c'est un CRTC de merde, si vous en avez un, il ne vous reste plus qu'une solution : LE SUICIDE.

Le CRTC 3 est celui du CPC+, et le  est un type quasiment inexistant ; Depuis peu de temps, LONGSHOT et OVERFLOW ont créé un nouveau type de classement. En Effet , l'ancien system n'était pas trs fiable , car tous les CRTC u ne réagissaient pas de la même façon, idem pour les autres types. Donc une nouvelle classification s'imposait. Maintenant, il n'y a plus que 2 types, type A et type B.Ces 2 types regroupes tous les anciens types, sauf les types 2 ( en-fin, les vrais types 2, car certain CRTC répondent type 2 au test de LONGSHOT, mais sont en réalité des types 1 ou 0. ) Voici a quoi on reconnaît un type A d'un type B :

Type A :

  • scroll transparent par REG 6
  • RVI non buggée
  • RVMB non buggée

Type B :

  • scroll transparent par REG S
  • RVI buggée
  • RVMB buggée

Pour la signification de RVI et RVMB, voir plus loin. Si vous voulez savoir si vous ave: un CRTC A ou B, lancer la démo NEW AGE 1. Si le message : PRESS A apparaît, vous avez un CRTC type B, si le message- FRESS B apparaît, vous avez un CRTC type A. C'est logique tout ca !

4) Les règles.

Lorsque l'on commence a modifier les registres CRTC de -façon assez barbare, il faut respecter certaines règles, si l'on ne veut pas se retrouver avec un plantage.

Tout d'abord il faut que le  registre 7 soit inférieur ou égal au registre A. Mais cette  règle n'est qu'a appliquée lorsque le canon se trouve en bas d'un écran, et qu'il va générer une  VBL. En effet, lorsque dans  une rupture vous mettez le reg 7 a  225, il n'y a pas plantage  car en fin de balayage, vous remettez le 7 a une  valeur normale.

Il faut également que le reg 2 soit inférieur ou égal au registre 0. cette  règle doit être observée dans  tous les cas.

Sur les CRTC  2, il faut que la somme des registres 2 et 3  soit inférieure ou égale au registre 0.

Le registre 3 doit être supérieur ou égal a 4 , car sinon, le canon n'a pas le temps de se synchroniser, et l'écran n'est plus stable.
Il faut également que lors d'un rupture , il ai un total, un nombre proche de 312 lignes de pixels par écran . Avec les CRTC 2 , il faut être très très proche  de 312, les autres accepte une marge plus grande d'erreur. Le nombre de ligne est donné  par les registres 4, 5 et 9.

Bon, voici un resumé en formules des conditions, avec en plus, 2  ou 3 autre conditions :

reg  7 >= reg 4
reg 2 < = reg 0 ( CRTC 2 : reg 2*reg 3 <=reg 0)
reg 3 >=4

(1) (reg 4+1)*(reg 9+1)+reg 5=312 ( avec marge + ou – grande suivante CRTC.)
reg 6 <=reg 7
reg 1 <= reg 2

rupture 1
rupture 2
rupture X
(reg4+1)*(reg9+1) + reg5 +
reg 4+1)*(reg9+1) + reg5 +
... +
(reg4+1)*(reg9+1) + (reg5)
=312

Pour la formule (1), dans une rupture, il faut faire la somme de toutes les lignes  pour chaque rupture, et cette somme doit être égale  a 312. Si vous avez une rupture a X écrans, voici ce que ca donne :

Oui, je sais, ca parrait peut être un  peu compliqué, mais en fait ; il est tout simple. Il faut toujours garder a l'esprit que l'on doit avoir un nombre de ligne proche de 312.

II) La temporisation.

Dans les ruptures, la temporisation est très importante. Dans une rupture classique, la  tempo n'est pas très difficile  a gérer car elle se fait en général a l'aide des HALTs. Mais  dans une rupture ligne a ligne, il faut être sychro a  la ligne près, et dans les ruptures  verticales, il faut être synchro au NOP pres : Il est donc fondamental de savoir calculer le temps machine.

Tout d'abord, il est utile de « avoir que les HALTs interviennent toutes les 52 lignes. Il y a 6  HALTs par balayage, donc cela -fait bien 312 lignes au total ( 6*52 ). Si on modifie la longueur d'une ligne ( avec le registre  0 ) les HALTs ne seront plus toutes les 32 lignes. Si vous mettezle R0 a 31 ( onc, a la moitié de sa valeur vous aurez des HALTs toutes les 26 lignes. En effet, sur  une ligne réelle d'écran, on aura 2 lignes pour le CTRC. Si vous ne comprenne: pas très  bien, ce n'est pas grave, je reviendrais sur ce sujet a propos  des ruptures verticales. Maintenant, venons en au calcul de temps machine. Si vous regarde: les tables de temps  machine qu'il y a sur certain livres, vous vers: ces temps en micro secondes, ou  en cycles d'horloge. Tout cela  n'est pas pratique. Je vous donnerais  plus loin un tableau avec les temps en NOPs Le NOP étant une des instructions les plus rapides, je me  suis basé sur le NOP pour calculer le temps machine des autres instructions. Sur une ligne d'écran, il y a l'équivalent de 64 NOPs ( lorsque R0=63 ). Si vous faites un rester, il -Faut que votre routine qui boucle  ait une longueur d'exécution de  64 NOPs, sinon le rester sera décalé. Je me suis rendu compte que les tables de temps machine de la plupart des  livres étaient foireuses. En effet, les temps donnés étaient complètement faux. Certain livres allaient même jusqu'à donner des temps machines a virgules !

En effet, voici un exemple : LD A,n 7 micro seconde, ce qui fait 1,75 NOPs. Ceci est totalement débil car le Z80 fonctionne  en tranches de 4 cycles (donc 1 NOP), il ne peut pas exécuter la fin d'une instruction! et le début d'une autre sur la même tranche de cycles.
Bon, voici une table de temps machine que j'ai calculée moi-même ( grâce a un raster.)

R = Registre 8 BITs ( A, B , C, D, E, H, L)
DD = REGISTE 16 BITs ( BC , DE,  HL)
n=nombre 8 BITs
nn=nombre 16 BITs
cc=condition ( Z, NZ, C, NC , etc)
XY=REGISTRE IX ou IY
Les durées sont exprimée en NOP.
 
LD R,R
LD R,n
LD R,(HL)
1
2
2
LD R,(XY+n)
LD (HL),R
LD (XY+n),R
5
2
5
LD (HL),n
LD (XY+n),n
LD A,(DD)
3
6
2
LD A,(nn)
LD (DD),A
LD (nn),A
4
2
4
LD A,I
LD A,R
LD I,A
3
3
3
LD R,A
LD DD,nn
LD XY,nn
3
3
4
LD HL,(nn)
LD DD,(nn)
LD XY,(nn)
5
6
6
LD (nn),HL
LD (nn),DD
LD (nn),XY
5
6
6
LD SP,HL
LD SP,XY
PUSH DD
2
3
4
PUSH XY
POP DD
POP XY
5
3
4
EX DE,HL
EX AF,AF'
EXX
1
1
1
EX (SF),HL
EX (SP),XY
LDI
?
7
5
LDIR
LDD
CPI
5+6*(BC-1)
5
4
LDDR
CPIR
CPD
5+6*(BC-1)
4+6*(BC-1)
4
CPDR
ADD A,R
ADD A,n
4+6*(BC-1)
1
2
ADD A,(HL)
ADD A,(XT+nn)
INC R
2
5
1
INC (HL)
INC (XY+n)
DAA
3
6
1
CPL
NEG
CCF
1
2
1
SCF
NOP
HALT
1
1
1 ?
DI
EI
IM
1
1
2
ADD HL,DD
ADD HL,XY
ADD HL,DD
3
4
4
ADC HL,DD
ADD XY,DD
INC DD
4
4
2
INC XY
RLCS
RLA
3
1
1
RRCA
RRA
RLC R
1
1
2
RLC (HL)
RLC (XY+n)
RLD
4
7
6
RRD
BIT n,R
BIT n,(HL)
5
2
4
BIT n,(XY+n)
SET n,R
SET n,(HL)
6
2
3
SET n,(XY+n)
JP nn
JP zz,nn
7
????
2 ????
JR n
JR CC,n
3
3 si cc vraie
2 si cc fausse
JP (HL)
JP (XY)
CALL nn
1
2 ?
5
RET
DJNZ n
3
3 si b different de 1
2 sinon
RETI
CALL cc,nn
4
3 si cc vraie et 
2 sinon.
RETN
IN A,(n)
INC R,(C)
4
3
4
INI
IND
OU (n),A
5
5
3
OUT (C),R
OUTI
OUTD
4
5
5
ADC A,R
ADC A,n
ADC A,(HL)
1
2
2
ADC A,(XY+n)
SUB R
SUB n
5
1
2
SUB (HL)
SUB (XY+n)
2
5
SBC A,R1
SBC A,n2
SBC A,(HL)2
SBC A,(XY+n)5
AND/OR/XOR R1
AND/OR/XOR n2
AND/OR/XOR (HL)2
AND/OR/XOR (XY+n)5
CP R1
CP n2
CP (HL)2
CP (XY+n)5
DEC R1
DEC (XY+n)5
RL/RR R2
RL/RR (HL)4
RL/RR (XY+n)7
SLA/SRA R2
SLA/SRA (HL)4
SLA/SRA (XY+n)7
RRC/SRL R2
RRC/SRL (HL)4
RRC/SRL (XY+n)7
RES n,R2
RES n,(HL)4
RES n,(XY+n)7

Ouf ! Voila, vous pouvez vous fiez a cette table a 100%, elle est tout a fait correcte (a moins d'avoir fait une erreur de frappe.) Allez, on fait un petit exercice de calcul de temps machine : 

BOUC  LD A,(HL) 2
      INC A 1
      ADD A, 5 2
      SLA A 2
     LD (HL),A 2
      OUT (c),A 4
      INC HL 2
      DJNZ BOUC 3 et 2 quand B sera a 1 (en fin de boucle)

total: 15 et 17 en fin de boucle. 

Je ne sais pas du tout g. quoi peut servir cette boucle, je l'ai tapée sans réfléchir, c'est juste; un exemple.

III) La rupture classique.

1) Le format.

Lorsque l'on veut faire une rupture , il faut tout d'abord définir son format, c'est a dire le nombre d'écrans et leur hauteur. Il faut ensuite transformer ces hauteurs en valeurs a envoyer au CRTC (il suffit de diminuer la hauteur de 1.) Prenons par exemple une rupture avec 4 écrans.
La somme des hauteurs (en caractère) des écrans doit être 39.

Sur le moniteur nous voyons a peut près 32 lignes caractères. Il y a encore 2 lignes caractères en dessous, et 5 lignes caractères au dessus (ceci n'est valable que dans la structure que je vous propose. Cette structure est la plus simple pour réussir n'importe quelle rupture.)

Bon, dans notre rupture, on veut qu'il y ai en bas, un scroll hard de 5 lignes de caractères. Ceci nous fait un écran de 5 lignes de haut, tout en bas, mais étant donnée qu'il y a encore 2 lignes caractères en dessous on va ajouter 2 lignes a cet écran, pour avoir ainsi un écran en bas de 7 lignes (5 seront vues, et les 2 dernières seront trop basses.) en veut mettre tout en haut un logo sur un écran de 7 lignes de haut. Il faut ajouter 5 lignes car il y en a 5 qui ne sont pas visibles au dessus, ceci nous fait donc un total de 7+5=12 lignes caractères en haut.

Hein ? Kwa ? Vous ne comprenez rien  ? Attendes, je ferais un dessin plus loin pour que vous compreniez mieux. Bon, on a donc un écran en bas de 7 lignes, et un en haut de 12 lignes. On veut mettre en dessous du logo un scroll vertical de 11 lignes de haut, on a donc un écran de 11 lignes. Et enfin en dessous du scroll vertical, un écran fixe, pour mettre des vumètres par exemple. Cet écran sera ce 9 lignes de haut. Voila, vérifions que le total fait 39 : 12+11+9+7=39, pas de problème. Les valeurs a envoyer au CRTC son : 11 (12-1), 10 (11-1), 8 (9-1), et 6 (7-1).

Voici un petit dessin qui résume le tout.

Début écran CRTC -----------------
5 lignes                           
Début écran visible ----------------> 12 lignes
Logo (7 lignes)                    /
----------------------------------<
                                   
Scroll vertical (11 lignes)         > 11 lignes
                                   /
----------------------------------<
                                   
Vu metres (9 lignes)                > 9 lignes
                                   /
----------------------+-----------<
    Scroll hard       | 5 lignes   
- fin écran visible --+-------------> 7 lignes
 fin écran crtc       | 2 lignes   /
----------------------+-----------+

2) La synchronisation.

Pour effectuer les changement des reg 4 , il faut bien synchro, pour cela utilisera les HALTs. Pour que tout cela soit clair, on fait un petit dessins, sur lequel on représente l'écran. Chaque case correspond a une ligne de caractère. On place les HALTs ( toutes les 52 lignes de pixels, donc, toutes les 6,5 lignes de caractère ( 52/6=6,5).) On dessine nos écrans en fonction de leur taille, et on obtient ainsi la position des changements d'écran par rapport aux HALTs. Regarder plus loin , il y a ce dessin et aussi des dessins d'autres exemples. (Feuille quadrillée 1)

3) Changement des registres.

Tout d'abord, pour que nos écrans soit collés ;, on met au début du balayage , le reg 7 a 255, ce registre est en overflow, donc les écrans seront collés. Apres le BD19, on met une petite boucle pour être certain que le CRTC ait commencer d'afficher l'écran. Maintenant , on peut commencer a faire nos ruptures. Apres la boucle, on fixe le maximum du reg 4 a 11, pour lui indiquer la dimension de notre premier écran. Apres le 1er HALT, nous seront toujours sur le premier écran. Apres le 2eme HALTs, nous seront sur le 2eme écran, donc, on peut changer le reg 4 pour cet écran et on le met a 10, ainsi on défini la taille du 2eme écran. Apres le 3eme HALT nous seront toujours sur le 2eme écran. Apres le 4eme HALT, nous seront sur le 3eme écran, on change donc le R4 pour définir notre 3eme écran. On met le R4 a 8. Apres le 5eme HALT, nous seront sur le dernier écran, on change le R4, et on le met a 6. Mais attention, nous sommes dans le cas particulier ou le début de l'écran se situe a moins de 1 caractère avant le HALT, et dans ce cas, il faut une petite tempo avant de changer le reg 4 et le reg 7. Voilà , notre rupture est faite, ce n'est pas plus difficile que ça. Il reste juste une dernière chose a faire , c'est mettre le reg 7 a une valeur non OVERFLOW, car sinon l'écran ne sera pas stable. Donc après le dernier HALT, on met le reg 7 a 0. Je vous conseille de toujours mettre le Reg a 0 et pas une autre valeur, en fin de balayage, cela permet d'appliquer ce que je viens de vous exposer. Si vous mettez un autre valeur, votre schéma de l'écran sera différent.

4) Attention a l'OVERFLOW

Dans l'exemple que j'ai pris, j'ai fait attention qu'il n'y ai pas de problème d'OVERFLOW lors du changement de registre 4, mais lorsque vous ferez vos ruptures, il faudra faire attention a ce problème. Pour éviter ce problème, il faut que lorsque vous modifiez le registre 4, il se soit écoulé un nombre de ligne intérieur ou égal au nombre de ligne de l'écran procèdent. Voici des exemples concrets.

 
    __
0 |__ R4=4 (donc , 5 lignes)
1 |__
2 |__
3 |__
4 |__
0 |__ R3=6 OK
1 |__ ok
2 |__ ok
3 |__ ok 
4 |__ trop
   |__ tard
    __
0 |__ R4=3
1 |__
2 |__
3 |_____
0 |__ R4=6 ok
1 |__ ok
2 |__ ok
3 |__ ok
   |__ trop
   |__ tard
   |__ 
   ___
0 |__ R4=4
1 |__
2 |__
3 |__
4 |________
0 |__ R4=2 ok
1 |__ ok
2 |__ ok
3 |__ trop tard car la 
4 |__compteur depace
  |__la valeur 2

Il faut également faire attention lorsqu'un écran commence très près d'un HALT (exemple, les ruptures 1 et 5 de la feuille quadrillée. Le dernier écran de ces ruptures commence très près du 5eme HALT.) Dans ce cas il est préférable de mettre une petite tempo avant de changer le registre4. Ceci pour éviter les problèmes de compatibilité. En effet, d'un CRTC a l'autre, il y a de petites variations quand a l'arrivé des HALTs, donc , lorsqu'un écran commence a moins d'une ligne de caractere d'un HALT , mettez une tempo (voyez dans les exemples sur le disk.)

Il y a donc sur le disk , 6 exemples de ruptures, pour illustrer cette partie. Ces ruptures sont détaillées sur la feuille quadrillée.

Apres ces explications, vous êtes normalement capable de réaliser n'importe quelle rupture classique.

IV) La rupture ligne a ligne.

1) Le principe.

Le principe de la rupture ligne a ligne est très simple. Il suffit ce mettre les registres 4 et 9 a 0, et mettre le R7 a 0 ou 255, suivant les cas. On met le R7 a 0, si on commence la rupture ligne a ligne aussitôt après le FRAME. Si après cette rupture par ligne, on met d'autres écrans, il faut mettre le R7 a 255, car on retourne dans le cas ce ruptures classiques. Si vous faites une rupture ligne a ligne après un écran, il faut mettre le R7 a 255, comme pour une rupture classique. En résumé, juste après le FRAME : R7=0. Apres un écran : R7=255.

Pour le CRTC , chaque ligne représentera un écran. En effet, le registre 4 represente la taille en hauteur d'un écran, celui-ci étant a 0 l'ecran fait pour le CRTC 1 caractère  de haut. Le registre 9 est a 0 , donc chaque caractère fait 1 ligne de haut, donc chaque écran fait 1 ligne de haut ! Une fois que vous avez modifié Ies registres 4 , 9 et 7 , et s il n'y a pas d'overflow, la rupture ligne a ligne commence, et elle se fait toute seule , vous n'avez plus besoin ce modifier les registres 4,7 et 9, vous n'avez qu'a changer les registres 12 et 13.

2) Ah, l 'overflow !

Eh oui, pour la rupture ligne a ligne, il faut respecter 2 overflows , celui du registre 4 et celui du registre 9. Pour éviter tout problème, on peut faire les modifications en tout début de balayage, ainsi le registre 4 en est encore a 0, donc il n'y a pas d'overfiow de ce registre. Par contre le registre 9 ne sera certainement pas a 0 donc il y aura overfiow. Mais cela n'est pas un problème car l'overfiow au registre 9 produit un caractere de 32 lignes avant de faire des caractères de 1 ligne, et avant d'arriver au debut de l'écran visible, le canon parcour 5 lignes de caractères (ce qui fait 40 lignes de pixels) donc, en arrivant au debut de l'écran visible, l'overfiow sera termine, et le reg 9 aura un comportement normal. Voici un petit dessin pour vous eclairsir les idées.

 
    __
   |__  R4=0 R9=4 R1=0
   |__
   |__ overflow R9
   |__ fin de l'overflow du r9 début de la rupture par 2
   |______ début ércan visible
   |
   | rupture ligne à ligne
   |
   |
   |
   |

Si vous voulez faire votre rupture ligne a ligne au milieu de l'écran, vous ne pouvez pas utiliser cette méthode, puisque vous devrez mettre les reg 4 et 9 a zéro en milieu d'écran, et dans ce cas on verra  l'overfiow de registre 9. Il faut donc bien synchroniser le changement des reg 4 et 9. Cette synchronisation se fait a la ligne près ! Il faut encore travailler sur papier pour bien voir ce que l'on fait (voir feuille quadrillée numéro 2.) Le seul moyen est tout d'abord de repérer en gros ou se situe le changement des reg 4 et 9 , et de faire votre routine en fonction de cette approximation. Avec cette approximation vous avez 7 chances sur 8 d'avoir un overfiow du reg 9, donc pour le supprimer, vous travaillez par tâtonnement, en ajoutant ou en supprimant 64 NOPs (64 NOPs représentent le temps que met le canon a parcourir une ligne.)

3) La gestion et l'affichage d'une rupture par ligne.

Eh oui, maintenant que vous savez couper l'écran toutes les lignes, il faut savoir modifier l'adresse toutes les lignes. Pour cela, on utilise toujours les registres 12 et 13. Comme je l'ai dit précédemment, vous n'avez plus a modifier les registres 4, 7 et 9, il suffit de chancer les 12 et 13, mais pas n'importe comment, il faut une bonne synchro, et il faut savoir gerer les adresses de chaque ligne. Pour la gestion des adresses, je vous conseille de faire un tableau des adresses de chaque ligne, et vous changez ce tableau a tous les balayages. Ensuite, lors de l'affichage, vous allez chercher l'adresse, et l'envoyer dans les reg 12 et 13. Ensuite, il faut attendre d'être sur la ligne suivants, il faut bien synchroniser votre routine, pour changer les 12 et 13 toujours au même moment sur les lignes, il faut faire comme si c'était un raster. La routine peut ressembler a cela par exemple :

; HL points sur la table des adresses (valeur R12 puis R13)
; A = nombre de lignes
; BC = #BC0C

BOUC    OUT (C),C   ; On selectionne le reg 12
        LD D,(HL)   ; On prend la valeur du R12
        INC HL      ; On augmente la position de lecture dans la table
        INC B       ; B=#BD
        OUT (C),D   ; On envoie la valeur du R12
        INC C       ; On augmente C, qui contient maintenant 13
        DEC B       ; B=#BC
        OUT (C),C   ; Selectionne le reg 13
        LD D,(HL)   ; Prend la valeur du R13
        INC HL
        INC B       ; B=#BD
        OUT (C),D   ; Envoie la valeur du R13
        DEC C       ; Remet C a 12
        DEC B       ; B=#BD
        DEFS 30,0   ; correspond a 30 NOPS, pour la synchronisation
        DEC A
        JR NZ,BOUC

La boucle fait 64 NOPs de temps machine, donc la synchronisation est parfaite , les registres 12 et 13 seront changés toujours au même moment sur chaque ligne. Pour modifier les registres 12 et 13, vous pouvez allez plus vite en utilisant l'instruction OUTI , mais ici, ce n'est pas utile. Attention, l'instruction OUTI est un peu spéciale , je vous en parlerai plus loin.

4) Les avantages, les inconvenients

Le principal avantage de la rupture ligne a ligne, est de pouvoir changez l'offset de l'écran a chaque ligne (c'est d' ailleurs  pour pour cela que la rupture ligne a ligne a été inventée.) Cela permet par exemple de faire se déformer un logo en donnant l'impression qu'il tourne autour d'un axe (dans la partie de PICT dans THE DEMO, et également dans la PHENIX PART de LONGSHOT toujours dans THE DEMO.) Cela permet également de faire rebondir plusieurs scrolls texts identiques en meme temps (dans la partie de SLASH dans FUCKING EXAM) Il y a encore plein d'autre choses que l'on peut faire avec une rupture par ligne.

Mais le principal inconvénient de ce genre de rupture est qu'elle est gourmande en place mémoire vidéo, pour des effets peu spectaculaires.

En effet, une ligne représentant un écran, et étant donné que par les reg 12 et 13 vous ne pouvez adresser que le début d'une zone mémoire (Vous ne pouvez adresser que les zones #0000-#07FF , #4000-#47FF, #8000-#87FF et #C000-#C7FF) vous avez sur un espace de #4000 octets, seulement #800 octets de mémoire video, ce qui représente 23 lignes de pixel (peur des lignes de 80 octets.) Cela est du au -fait que vous ne pouvez pas mettre comme offset de début d'écran des valeurs telles que #C800, #D000. .. Si vous utilisez toute la mémoire, vous n'aurez que 200 lignes de pixels, et vous ne pourrez plus faire d'autres écrans, ou scrolls hards, car une zone utilisée par une rupture par ligne ne peut plus être utilisée pour un autre type de rupture, sinon, vous auriez en début de chaque ligne de caractère, ce qu'il y a dans votre rupture par ligne. Par centre, vous pouvez dans cette zone, mettre des DATAs, des musiques, du prog , a condition de le mettre en dehors de la mémoire adressable par les reg 12 et 13, c'est a dire, entre #0800 et #3FFF, #4800 et #7FFF, #8800 et #BFFF et entre #C800 et #FFFF. En résumé, si dans la zone #4000-#7FFF (par exemple) veux faire une rupture par ligne, vous aurez entre #4000 et #47FF le contenu de la rupture par ligne, et vous pourrez mettre autre chose entre #4800 et #7FFFF (dates, musiques , prog ,etc. . . ) mais vous ne pourrez plus faire autre chose de cette zone (comme par exemple un scroll hard , ou un écran fixe.)

Pour remedier au fait que l'on ne peut pas adresser toute la mémoire  a travers les reg 12 et 13, OVERLOW , a inventé la RVI, et ce que j'ai baptisé la RVMB , mais je vous en parlerais plus loin.

V) La rupture verticale.

1) Le principe.

La rupture verticale a été inventée par LONGSHOT, mais sa technique n'était pas très intéressante , c'est OVERFLOW qui a réellement fait la première rupture verticale UTILISABLE.

La rupture verticale n'est rien d'autre d'une extension de la rupture par ligne. Nous savons maintenant couper l'écran toutes les lignes, Mais s si on rétrécissait la longueur d'une ligne ? Comment me direr-vous ? Eh bien avec le reg 0. Le registre 0 defini la longueur d'une ligne mot (1 mot = 2 octets.) Sa valeur normale est 63 (donc 64 MOTs, ce qui fait 125 octets.) si on mettait le reg 0 à 31 (donc 32 MOTs , soit 64 octets.) la ligne serait coupée en 2. Aie, en plein milieu d'une ligne il y a une grosse HBL, beurk, que c'est laid. Pour la supprimer, il fait mettre le registre 3 a 0. Voila, il n'y a plus de HLB, mais la rupture n'est pas très droite. Nous avons maintenant une rupture verticale telle que LONGSHOT l'a découverte il y a quelques temps (décembre 1990 exactement.) mais la rupture n'étant pas droite, on ne peut pas l'utiliser. Pourquoi la rupture n'est pas droite ? Eh bien car le registre 3 est a 0, donc, en début de ligne, le canon n'a pas le temps de se synchroniser, et l'écran n'est pas stable. Il a fallu attendre décembre 1991 , pour que OVERFLOW (encore lui !) ai l'idée de changer le R3 pendant l'affichage de la ligne afin que le canon puisse se synchroniser. Donc , son idée est de mettre le R3 a 0 en début de ligne, afin de ne pas avoir de HBL entre les morceaux d'écrans sur une ligne, et de mettre le R3 a 14 (ou une valeur comprise entre 4 et 15) en  fin de ligne pour que le canon se synchronise, Bon , petit dessin s'impose. Voici :

R0 = 31
R4 = 0
R2 = 255 ou 0
R9 =0 au début

Et voila une rupture verticale parfaite ! Cool non ?

2) D'autres Ruptures Verticales.

Nous ne somme pas limité a 2 écrans par ligne (eh oui, car maintenant, chaque écran ne fait plus 1 ligne, mais une demi ligne, ou même moins !) nous pouvons en mettre 4,8,16,32, etc... Mais disons que au dessus de 4, écrans par ligne, il devient difficile de gérer correctement la rupture. Pour avoir 4 écrans par ligne, il faut des lignes 4 fois plus petite, donc, 128/4=32. 32 octets font 16 mots. Il faut donc mettre dans le reg 0 la valeur 15 (16-1). Si vous voulez 8 écrans par ligne, il faut mettre la valeur 7 (8-1) dans le reg 0. Vous pouvez également faire 3,5 eu 6 écrans mais pour cela, il faut changer le registre 0 a chaque ligne. Imaginons que l'on veut avoir 3 écrans sur une ligne, le premier de 40 octets, le suivant de 5D octets, et le dernier de 38 octets (40+50+38=128 , il faut absolument que le total ces longueurs fasse 128 octets.) Pour cela, il faut procéder comme pour une rupture normale, mais cette fois, en changeant le registre 0, 3 fois par ligne. En début de ligne, on met dans R0 la valeur 19 (20 octets font 20 mots, donc on met 19=20-1) Ensuite , il faut changer une deuxième fois le R0 , pour le 2 eme écran. Mais attention a l'overflow , il faut attendre que le 2eme écran ai commencé d'être affiché, avant de changer le R0. Idem pour le 3 eme écran de la ligne. Ensuite, on recommence a la ligne suivante. Allez, encore un petit dessin:

Si vous voulez faire une rupture verticale a 5 écrans, vous pouvez le faire de la même maniéré. Voici un petit exemple :

A suivre ...

Par GOZEUR / PARADOX
OCR par hERMOL
dernière maj : le 1/06/2019

★ GROUPE: PARADOX
★ ANNÉE: ???
★ AUTEUR: GOZEUR

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