CODING ★ AS : SOSCIE - La mémoire écran ★

Assembleur ACPC n°15 - La mémoire écran

C'est reparti pour une petite initiation à l'assembleur bien de chez nous. Cette fois-ci, on attaque le gros morceau. C'est le petit train et tout ce qui s'en suit, c'est-à-dire les wagonnets. Mais encore faut-il aussi savoir le prénom et l'âge de la femme du chef de gare.

Quelle relation existe-t-il entre l'âge et le prénom de la femme du chef de gare et notre initiation à l'assembleur ? La même que celle qui lie notre petit train à la mémoire écran du CPC. Elles sont toutes totalement indépendantes et pourtant réellement indissociables l'une de l'autre, surtout dans le cas qui nous préoccupe (je ne suis pas là pour vous raconter la vie du chef de gare). Avant tout, il nous faut connaître la mémoire écran et savoir exactement comment elle est organisée. Il n'est pas concevable de travailler sur un terrain inconnu. Alors, avant de programmer notre petit train, nous allons apprendre comment travaille le processeur vidéo de notre CPC. Et c'est parti. La mémoire écran n'est ni plus ni moins que de la mémoire vive, comme les quarante-huit autres Ko qui forment la mémoire centrale du CPC. Une seule chose distingue les seize Ko vidéo des quarante-huit autres : ils sont visibles sur le moniteur. Passons donc à la suite de notre programme.

LA MÉMOIRE DES GRANDS

La mémoire écran réagit exactement de la même manière que la mémoire centrale, ce qui s'explique par le fait qu'elle fait pleinement partie de cette zone de stockage. Ainsi, vous la pilotez exactement comme sa consoeur, c'est-à-dire en la nourissant de valeurs de 0 à 255. Voici un petit programme Basic qui vous permettra de mieux comprendre le fonctionnement de notre vidéo si chérie et choyée.

10 MODE 2:ECRAN=&CO00
20 FOR I=1 TO 8:READ A
30 POKE ECRAN,A:ECRAN = ECRAN+2048
40 NEXT:CALL &BB06
50 DATA 24,60,102,102,126,102,102,0

Et la même en assembleur :

ORG#9000
ENT $
DEB LD B,8 ; 8 fois
LD HL.DATA ; HL pointe sur les données
LD DE,#C000 ; DE sur l'écran
BOUC LD A,(HL) ; la donnée est dans A
INC HL ; HL pointe sur la suivante
LD (DE)A ; la donnée dans l'écran
LD AD ; A contient D
ADD A.8 ; plus 8
LD DA ; DE-DE+2048 (&800)
DJNZ BOUC ; 8 fois dis-je
RET
DATA
DEFB 24,60,102,102
DEFB 126,102,102,0

Et voilà le travail. Tout l'art d'afficher des caractères sans passer par les routines normales. Ce petit programme Basic sert simplement à poker dans l'écran la configuration binaire du caractère A (les valeurs utilisées par l'instruction SYMBOL). Comme vous le voyez, pour descendre d'une ligne, il faut ajouter, non pas sa longueur (80 octets) mais 2048. Tapez le petit programme suivant et vous verrez réellement comment le CRTC 6845 affiche la mémoire.

10 MODE 2
20 FOR I=&C000 to &FFFF
30 POKE I,255
40 NEXT

Et à Cent Pour Cent, on cause aussi l'assembleur : ORG #9000 ENTS DEB

LD HL,#C000 ; HL pointe sur l'écran
LD DE,#C001 ; DE est une case plus loin
LD BC,#3FFE ; BC contient 16 Ko moins 2
LD (HL),255 ; le contenu de HL
LDIR ; passe dans le contenu de DE
RET

Pour récapituler, nous voyons que pour passer d'une ligne à la suivante, il faut ajouter 2048. Eh bien, ce n'est pas toujours le cas. En fait, voici la vraie formule, qui lave plus blanc que blanc. Pour ne pas s'embrouiller le curseur, nous ne parlerons pas encore du décalage engendré par le processeur vidéo. La mémoire écran se situe en &CO00 en mode normal. Nous allons donc constituer un tableau des adresses des débuts de lignes écran. La première adresse sera donc &C000 et les 7 suivantes coulent de source (&C800, &D000, &D800, &E00O, &E800, &FO00. &F800). Si on ajoute 2048 (&800) à &F800, on se retrouve avec l'adresse 0. Pas cool Abdoul ! Pour revenir dans l'écran, il faut réaliser une petite opération. Déjà, il faut se repositionner dans la dernière banque mémoire (&C000-&FFFF) en additionnant &C000 à notre valeur. Ensuite, il faut corriger l'erreur engendrée par le débordement en ajoutant 80 à notre pointeur d'adresse, ce qui nous donne l'adresse finale de &C050 pour la neuvième ligne. Les sept suivantes coulent encore de source (de &C85O à &F850) et la dix-septième ligne se calcule comme précédemment et commence à l'adresse &C0A0. Vous avez compris le truc ? Tant qu'il n'y a pas de débordement, on ajoute 2048, et lorsqu'il y en a un, on corrige en ajoutant &C050. Facile, non ? Voici encore un programme ô combien démonstratif de la toute puissance du 6845. grand sorcier de la vidéo. Il vous montre et vous donne la formule mathématique permettant de calculer les adresses en fonction du numéro de ligne écran.

10 MODE 2
20 FOR LIGNE=0 TO 199 30 ADRESSE=&C000+ 2048*(LIGNE MOD 8)+80* (LIGNE 8)
40 POKE ADRESSE.&FF
50 NEXT

Pour les novices, le w x signifie INT(w/x). La routine ci-dessus ne fonctionne que pour les adresses des débuts de lignes, mais dans tous les modes. Pour adresser les octets suivants de la ligne, il suffit d'incrémen-ter l'adresse calculée en sachant qu'une ligne fait 80 octets de long. Maintenant que nous savons comment adresser les octets dans les lignes, voyons comment adresser les pixels. Nous allons nous heurter à un
petit problème. En effet, cel adressage n'est pas le même selon les modes. d'où petite galère (c'est normal, on bosse en Ram).

MODES ALITES :
LA FIEVRE DU PIXEL

Comme nous vous l'avons dit, tout change selon les modes utilisés. Commençons par le plus facile, soit le mode 2. Dans ce cas. un pixel correspond à un bit (à un eb pour parler français). Pour ploter un pixel au début de la première ligne, à l'adresse &C000. nous pokerons &80 (&X10000000). Pour ploter un pixel aux côtés du premier, nous ferons un OR &40 (&X01000000). Cela signifie que, pour placer un pixel à l'écran
sans effacer ceux qui sont sur le même octet que lui. nous devrons préalablement charger l'octet, puis faire un OR avec le bit désiré, et enfin sauvegarder le même octet en mémoire écran. Comme vous avez le petit programme permettant de calculer l'adresse écran en fonction de la ligne, soit en fonction de l'ordonnée, voici le même programme pour l'absyce. Et puis non. je vous donne le programme entier vous permettant de faire un plot en mode 2 :

10 MODE 2
20 X= 100:Y= 100
30 ADRESSE=&C000+2048* (Y MOD 8)+80*(Y 8)+X 8
40 POKE ADRESSE,2((7-X) MOD 8)+PEEK(ADRESSE)

Dans ce cas , X peut varier entre 0 et 639. et Y entre 0 et 199. qui sont les réelles capacités du mode 2. Comme ceci est une initiation, nous vous laissons un mois, le temps pour vous d'essayer de traduire cette routine en assembleur.

Pour le mode 1, cela se corse. Dans ce mode, deux bits d'un octet sont utilisés pour l'affichage d'un pixel. En plus, et pour faire ch... le monde (j'ai personnellement adhéré au CACA, mais tout de même), ces bits sont foutus dans n'importe quel sens. Voyez plutôt ce sens insensé :

  • Pixel 0 de l'octet : bits 3 et 7
  • Pixel 1 de l'octet : bits 2 et 6
  • Pixel 2 de l'octet : bits 1 et 5
  • Pixel 3 de l'octet : bits 0 et 4

Si vous désirez mettre l'encre 2 dans le troisième pixel de l'octet visé, il vous faudra mettre son bit 1 à 1 et son bit 5 à 0. car c'est la valeur binaire mise dans les bits correspondants qui définit l'encre utilisée.

10 MODE 2
20 X = 100:Y= 100:ENCRE = 1
30 ADRESSE=&C000+2048* (Y MOD 8)+80*(Y 8)+X 4
40 VALEUR-ENCRE MOD 2+16*(ENCRE 2)
50 POKE ADRESSE,(2^(3-X MOD 4))*VALEUR+PEEK(ADRESSE)

Ne vous inquiétez pas, le petit train viendra bientôt et, le mois prochain, vous aurez droit au source du petit programme tant convoité.

Sined le Baltttreaker , ACPC n°15 , p72-73

Page précédente : Bidouilles ACPC n°14 - Les secrets du GATE ARRAY (1/2)

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Bidouilles ACPC n°41 - L'art de la compression
» Coding » Assembleur ACPC n°25
» Coding » Bidouilles ACPC n°20 - Déviation du Ctrl Shift Esc.....
» Coding » Bidouilles ACPC n°08 - RSX editeur de secteurs
» Coding » Bidouilles ACPC n°37 - FDC en mode direct
» Coding » Assembleur ACPC n°46 - La multiplication et la division
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

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