CODINGHEBDOGICIEL ★ FORMATION A L'ASSEMBLEUR PRATIQUE LANGAGE MACHINE SUR AMSTRAD ★

La page pédagogique d'hebdogiciel 155: AdressageCoding Hebdogiciel

N'HABITE PAS A L'ADRESSE INDIQUEE

Après la parution, dans les deux dernières leçons, du listing complet du programme 'flèche', nous voici prêts à étudier en détails le fonctionnement de ses routines. Vous avez, bien entendu, rentré tout le listing assembleur, vous avez assemblé, vous avez rentré tout le listing basic et.... ça ne marchait pas I Seulement, comme vous êtes un crac en langage machine, vous avez tout de suite constaté que le basic indiquait de mauvaises adresses. Vous les avez corrigées et maintenant... ça marche ! ! ! Pour ceux qui sont encore un peu trop nuls pour découvrir par eux-mêmes une différence d'adresse entre l'assembleur et le basic, voici les corrections à apporter au listing 2 du mois dernier :

Adresse de la coordonnée X   = &A4CE &A4CF
Adresse de la coordonnée Y   = &A4CC
Adresse de test de 'COPY'    = &A4D1

Avec les nouvelles adresses des variables 'COX', 'COY' et 'FEU', vous devez être en mesure de corriger les valeurs des ' PEEK' et votre flèche DOIT fonctionner.

PRINCIPE GENERAL

Considérons, à partir de maintenant, que notre programme 'tourne'. Vous possédez donc un fichier assembleur source, un fichier binaire et un fichier basic. Pour analyser en détails les différentes routines qui composent le logiciel, commençons par tenter de comprendre le principe de fonctionnement de celui-ci. Le logiciel comporte 3 routines principales qui sont appelées à partir du basic :

IMFLE (Implantation de la flèche) ; s'occupe d'afficher la flèche à un endroit précis de l'écran, après avoir sauvegardé en mémoire la partie que va cacher la flèche.

DEPLE (Déplacement de la flèche) : routine la plus complète qui s'occupe de tester les touches du clavier, d'effacer la flèche en remettant â l'écran la partie préalablement sauvegardée et de l'afficher à sa nouvelle position.

EFFLE (Effacement de la flèche) : la plus simple des routines, puisqu'elle replace à l'écran la partie sauvegardée précédemment et c'est tout !

Le principe est donc simple :

1 - Sauvegarder la zone de l'écran où se trouvera la flèche.
2 - Afficher ladite flèche.
3 - Remettre à l'écran ta partie sauvegardée.
4 - Changer les coordonnées de la flèche.
5 - Recommencer le total.

LE DESSIN DE LA FLÈCHE

Nous allons commencer par analyser la partie la plus complexe de la routine principale. Il s'agit de l'affichage de la flèche à l'écran. Avant tout, voyons comment nous l'avons codée en mémoire :

La flèche fait 8 pixels de large et? de haut. Chaque pixel est codé sur deux bits et peut prendre l'une des trois valeurs suivantes :
00 = Pixel invisible, la couleur du pixel présent à l'écran ne sera pas changée.
01 = Le pixel prendra la couleur zéro (couleur du fond).
10 = Le pixel prendra la couleur définie dans la variable 'COULEU'.

Pourquoi la flèche est-elle de deux couleurs ? Pour une raison bien simple : si le dessous est de couleur zéro, on verra la couleur de la flèche, mais pas son contour. Par contre, si la flèche va à un endroit de sa propre couleur, on ne verra plus son centre mais son contour, qui est de couleur zéro. Compris ? Non ? Alors essayez et vous verrez. Une flèche qui bouge étant bien mieux qu'un long discours.

MÉTHODE DE TRAVAIL

Vous vous demandez peut-être, pourquoi ne pas prendre le programme par son début et le suivre dans le sens de son exécution ? SI c'est le cas, je m'empresse de satisfaire votre légitime curiosité : parce qu'il n'a pas été construit de cette manière. En assembleur, il est bien plus commode de commencer par les routines du niveau le plus bas. Par exemple, pour écrire à l'écran l'éternel 'BONJOUR', il vaut mieux commencer par étudier comment écrire un pixel, puis une lettre et enfin le mot. Voyons donc comment afficher cette fameuse flèche. Pour ce faire, nous allons exécuter pas à pas les instructions à partir de la ligne numéro 360.

360   LD    A,(COULEU)  ; A = %11110000 ( facile )
370   AND   C           ;; Voyons l'effet de cette nouvelle instruction

INITIALISATION DES REGISTRES

Pour appeler la routine 'AFFLE', il faut lui passer un certain nombre de paramètres : deux dans les registres et un dans une variable. Le double registre 'HL' doit d'abord contenir l'adresse écran. Pour notre essai, mettons-y la première : '&C000'. Le registre 'C doit contenir le masque du pixel dans cette adresse. Pour comprendre l'utilité de ce masque, il faut se reporter à la leçon 5 du numéro 127 : codage des pixels. Le masque sert à isoler le pixel utile et à 'MASQUER' les trois autres (en mode 1, un octet contient 4 pixels). Supposons que le premier pixel soit celui tout à gauche dans la première adresse, la valeur de 'C sera %10001000, La variable 'COULEU', pour terminer, doit contenir le codage de la couleur pour les 4 pixels de l'adresse :

Couleur 1 = %11110000
Couleur 2 = %00001111
Couleur 3 = %11111111
HL = &HC000
C  = %10001000
COULEU = %11110000

Commençons notre exécution pas à pas :

AND registre = 'ET' logique d'un registre avec l'accumulateur. Le résultat va dans l'accumulateur. Pour comprendre l'effet de cette opération logique, pensez ceci :

POUR QUE LE RESULTAT D'UN BIT SOIT '1', IL FAUT QUE LES DEUX BITS DE L'OPERANDE ET DE L'ACCUMULATEUR SOIT A '1 '. SINON, LE RESULTAT DU BIT SERA '0',

Soit notre exemple :

A = %11110000
C = %10001000
Résultat: A = %10000000

Compris ?..

CPL   =   Complémentation   de l'accumulateur.

380  LD      D,A    ; A   =  %10000000      D   =   %10000000
390  LD      A,C    ; A   =  %10001000
400  CPL           ; ; Instruction nouvelle !

LA COMPLEMENTATION INVERSE TOUS LES BITS DE L'ACCUMULATEUR.

Soit notre exemple :

A = %10001000
Résultat: A = %01110111

Compris?..

410   LD     E, A ; %0110111

Avant de poursuivre, il faut comprendre ce que nous venons de faire : nous avons préparé les registres pour la suite. 'E' = Masque pour mettre à zéro le pixel concerné. Effectivement, les deux bits à zéro sont bien ceux qui codent le pixel de gauche de l'adresse écran. D = Masque de la couleur du pixel concerné.

Je ne saurais trop vous conseiller de suivre cette exécution pas à pas â l'aide d'un moniteur. Ainsi, à chaque Instruction, vous voyez directement son effet dans la modification des registres. Prenez même de l'avance d'ici au mois prochain. Quand vous aurez compris le principe des instructions Z80, tout ira très, très vite !..

Hebdogiciel n°155 , Patrick DUBLANCHET

★ ANNÉES: 1985
★ AUTEUR: Patrick Dublanchet

Page précédente : La page pédagogique d'hebdogiciel 146: Creation d'Une Routine

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