CODING ★ AS : SI MA TANTE EN AVAIT... ★

Assembleur ACPC n°16: Organisation des pixels à l'écran

OK, pas de problème, je suis conscient que ce titre n'est pas le meilleur de la série. Que voulez-vous, il faut parfois savoir ménager sa monture dans le but d'aller le plus loin possible. Cours assembleur numéro... (je ne sais plus), nous voilà !

Après avoir travaillé sur le Z80 en particulier, nous avons commencé le mois dernier une étude de la mémoire écran. Nous avons abordé la disposition des lignes ainsi que l'organisation des pixels à l'écran, selon les octets en mémoire et les modes utilisés. Pour ne pas nous perdre, nous allons poursuivre nos investigations à l'endroit où nous avons été brutalement arrêté le mois dernier, par un manque imprévisible de place. Jetais donc en train de dire que la formule permettant de calculer la position et la couleur d'un point en mode 0 était assez complexe. Heureusement qu'en assembleur, il y a des façons de passer à côté de ce genre d'équations, sans quoi il serait très difficile de bidouiller. La complexité de la configuration binaire en fonction de la couleur commence à me donner des migraines, mais nous savons qu'en assembleur, il existe des ruses permettant de ne pas trop s'ennuyer. Sans plus attendre, en voici une.

INDEX MAJEUR, FAUT PAS POUSSER

Quand nous parlons d'index, il faut entendre non pas les registres d'index, mais le mode d'adressage qui consiste à se promener sur une table d'objets en se servant d'un pointeur. Celui-ci est alors appelé index car il sert à adresser directement un objet à partir d'une valeur désirée. Un exemple simple de ce genre de stockage : ranger dans une table les octets contenant les masques de couleur en mode 0, et les récupérer en indexant simplement le début de la table avec le numéro de la couleur désirée pour obtenir l'octet à mettre en mémoire. Voici le genre de routine permettant de recevoir une encre dans l'accumulateur : Les valeurs contenues dans la table sont les masques du point gauche d'un octet. Elles ont été obtenues simplement à l'aide d'un petit programme Basic contenant un pauvre PLOT et un petit PEEK, dans une boucle FOR-NEXT toute bête. Certains diront : "Pourquoi utiliser une table alors qu'il serait facile de faire un petit calcul tout bête ?" A ceux-ci je répondrai que cette routine ne prend pas beaucoup plus de place, table incluse, que la routine de calcul, et est, sûrement, dix mille fois plus rapide. Attention tout de même, si votre table se trouve en fin de page, il vous faudra aussi modifier H car dans notre exemple, seul L subit l'addition avec A, ce qui suffit à modifier HL. Il vous faudra donc toujours faire attention à ce que le poids faible de l'adresse de la table (représentée par le registre L) n'excède jamais #F0, soit 240. Sans quoi, cette routine ne serait plus bonne et donc inutilisable. Comme dit ci-dessus, tes masques de la table sont ceux du point gauche dans l'octet. Pour obtenir le masque du point droit, il suffit de décaler les valeurs à droite d'un bit et le tour est joué. Pour être sûr d'être clair, le masque est, en l'occurrence, la valeur à mettre dans un octet pour obtenir un point dans une couleur désirée à l'écran. A titre de démo, voici un petit listing du genre sympa.

LISTING STYLE : LISEZ

Avant tout voici le petit source assembleur, les explications viendront ensuite.
Comment marche cette routine qui n'appelle aucun vecteur système ? C'est très simple, et je m'en vais vous l'expliquer. Ciao ! Oh excusez-moi encore un peu de travail. Si vous n'avez pas séché le mois dernier, vous devez avoir vu un petit listing Basic permettant de calculer l'adresse de dé-" but d'une ligne écran, en fonction de son numéro. Revoici la ligne intéressante juste histoire de savoir de quoi on parle :

ADRESSE - &C000+2048* (Y MOD8)+80*(Y 8)

La routine assembleur ci-dessus reprend exactement le même principe de fonctionnement que cette ligne. En assembleur, détailler c'est gagner, alors allons-y.

Du label DEB au label PLUS800, nous initîalisons les registres de manière que HL pointe sur le début de la mémoire écran, DE contienne 2048 et C le numéro de ligne. Si B contient trois, c'est pour préciser que trois décalages seront effectués. Entre le label PLUS800 et son DJNZ, tout le travail représenté par Y MOD 8 dans la ligne ci-dessus est effectué. C est décalé à gauche une première fois, si 1 tombe dans le Carry, alors il faut additionner 2048 à HL. Ensuite DE est multiplié par 2 pour être prêt à recommencer l'opération. Comme nous allons encore décaler C à droite, le bit qui tombera vaudra non pas 1 mais 2, car un décalage a déjà été effectué. De ce fait, ce n'est pas 2048 qu'il faudra ajouter à HL, mais bien 4096 pour le deuxième décalage et 8192 pour le troisième. Cela explique
donc les décalages successifs de DE relativement à ceux de C. HL contiendra à ce moment &C000+2048*Y MOD 8.

De PLUS80 à son DJNZ, nous faisons l'opération représentée par 80* (Y 8), de la même manière que ci-dessus. L'adresse du début de la ligne écran est alors complète dans HL. Les cinq lignes suivantes permettent simplement de récupérer le masque à poker en fonction de la couleur du point à afficher, pomme la première routine de cet article. Vient ensuite le moment d'additionner le déplacement sur la ligne à HL pour obtenir l'adresse finale. DE est donc chargé avec l'abscisse et est décalé, car deux points sont contenus par un octet. Si l'abscisse est paire, c'est le point de gauche qu'il faut afficher, donc ne pas toucher au masque. Dans le cas contraire, soit quand la retenue passe à 1 lors du décalage de E, il faut décaler A à droite pour que le masque influence bien le point de droite de l'octet visé. DE contient alors le déplacement réel sur la ligne, il est additionné à HL qui contient l'adresse finale. Le contenu de l'écran est pris en compte par le OR et le tout est enfin affecté. Sympathique, non ?

ALLEZ, AU DODO

Il est maintenant l'heure pour moi de vous quitter car je suis un peu dans le plotage. En ce qui me concerne, je prends la grande. Clod, tu m'abonnes à Syntax Error, STP ?

Sineê le Touriste (youpie !!!) , Juin 1989 , A100% n°16

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

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

Lien(s):
» Coding » Assembleur ACPC n°29 - On assemble ensemble
» Coding » Assembleur ACPC n°24
» Coding » Bidouilles ACPC n°03 - Catalogue décorés
» Coding » Assembleur ACPC n°14 - AS: ÇA C'EST COOL
» Coding » Assembleur ACPC n 05 - Initiation
» Coding » Bidouilles ACPC n°20 - Déviation du Ctrl Shift Esc.....
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 281 millisecondes et consultée 1727 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.