LE LANGAGE MACHINE & L'ASSEMBLEUR

Ce chapitre constitue une étape importante, car c'est le premier qui traite du langage. Il décrit le plus rudimentaire des langages informatiques, le langage machine, ainsi que son alter ego humain, l’assembleur.

RECAPITULONS
En fait, à la manière de Monsieur Jourdain, nous avons déjà utilisé ces deux langages, sans le savoir : le langage machine et l'assembleur. Si nous reprenons le tableau indiquant le contenu de la ROM1 dans le sous-chapitre Optimisation de la ROM / 2 ROM du chapitre précédent, le lien entre langage machine et l'assembleur est le suivant : Langage machine 00h 01h 02h 03h 04h 05h Assembleur NOP ADD Acc,M MOV Acc,D MOV D, Acc AND Acc,H etc…

Nota : NOP signifie No OPeration (pas d'opération). Cette instruction n'exécute aucune tâche, si ce n'est de passer à la suivante en réalisant uniquement le cycle fetch. L'expression en langage machine d'une instruction en assembleur est la valeur à inscrire en RAM pour exécuter l'opération (c'est-à-dire le Code Opération), suivie éventuellement de ses opérandes aux adresses suivantes. Le microprocesseur que nous avons construit présentait l’intérêt d’être simple, donc pédagogique. Pour aborder l’apprentissage du langage dans un monde plus réel, nous allons maintenant utiliser le microprocesseur réel Z80, dont les principes de fonctionnement sont les mêmes que pour notre microprocesseur fantôme, mais qui présente cependant quelques différences, certaines de pure convention (comme le nom donné aux registres), d’autres de fonctionnement (comme le fait que certains résultats d’opérations aillent directement dans un registre déterminé sans passer par Acc), mais dans ce dernier cas, il s’agit souvent de fonctions élaborées qui n’ont pas leur place dans un ouvrage dédié à une initiation.

LE Z80

Sa structure

Le langage machine, l’assembleur

Page 1

Ses registres
Les registres du Z80 sont les suivants : • accumulateur : a. • registres de données 8 bits : b, c, d, e, h, l. • registres de fonctionnement 8 bits : - f : drapeaux. Le contenu de ses 8 bits est SZXHXPNC où, suivant le résultat de l’opération précédente : > S : est à 1 pour un résultat négatif, à 0 sinon. Peu utilisé. > Z : est à 1 pour un résultat nul, à 0 sinon. Très utilisé. Attention à l’inversion apparente de logique (on aurait pu croire que Z soit à 0 pour un résultat à 0) : Z prend la valeur booléenne de l’assertion « le résultat est à Zéro », c’est-à-dire 1 si c’est vrai, 0 sinon. > X : inutilisés. > H : demi-retenue. Utilisé pour le codage BCD (Binaire Codé Décimal), que nous ne développerons pas. > P : appelé en réalité P/V (Parity / oVerflow = parité / débordement), modifié notamment suivant le nombre (pair ou impair) de bits à 1 du résultat. Très peu utilisé. > N : indique si la dernière opération était une addition ou une soustraction. Utilisé pour le codage BCD (Binaire Codé Décimal), que nous ne développerons pas. > C : est à 1 pour un résultat ayant généré une retenue, à 0 sinon. Très utilisé. - i : gestion des interruptions. Nous ne détaillerons pas son fonctionnement ici. - r : rafraîchissement de la mémoire. Nous ne détaillerons pas son fonctionnement ici. • registres de données 16 bits : - bc, de, hl : registres issus du jumelage des registres 8 bits. Par exemple, si B=9Dh et C=A3h, alors BC=9DA3h. Inversement, si BC=9DA3h, alors B=9Dh et C=A3h. - ix et iy : purs registres 16 bits, dont le nom est propre et ne signifie en rien un jumelage des registres i et x d’une part, et i et y d’autre part. ix est utilisé via le préfixe DDh, précédant les opérations sur hl et permet de remplacer ce dernier par ix+n. Par exemple, le code assembleur AEh réalise l’opération XOR (hl). Le code assembleur DDh AEh A3h réalise l’opération XOR (ix+A3h). iy est utilisé de même que ix, mais avec le préfixe FDh au lieu de DDh. • registres de fonctionnement 16 bits : - sp : Stack Pointer - pc : Program Counter - af : registre issu du jumelage des registres 8 bits a et f, que l’on retrouve dans quelques instructions sous cette forme. Ce n’est pas un registre ayant une valeur de donnée 16 bits, mais ce jumelage permet de manipuler en une fois tout ce qui touche à un résultat : sa valeur (dans a) et son effet sur les drapeaux (dans f). Le langage machine, l’assembleur Page 2

d. h’. qui reprend les mêmes instructions que le précédent. en permettant un adressage indexé dans les instructions utilisant l’opérande « hl ». on remarque par exemple que les Codes Opération de 40h à 7Fh (c’est-à-dire sur une liste de 40h – qui est un chiffre rond en hexadécimal – Codes Opération) ne tombent pas du ciel tout cuits. • colonne « Après EDh » de l’annexe 1 : instruction exécutées lorsque le Code Opération est précédé de EDh en RAM. Avec ce préfixe. • colonne « Après CBh » de l’annexe 1 : instruction exécutées lorsque le Code Opération est précédé de CBh en RAM. puis pour chacun d’eux la deuxième opérande aussi. l. d’. e’. mais celles présentées en annexe 1. il ne s’agit pas strictement d’un jeu supplémentaire. (hl) et a. car il n’apporte pas de nouvelles instructions : il ne fait que modifier l’une des opérandes d’instructions déjà vues. La liste des instructions peut paraître complètement désordonnée. comprenant notamment les préfixes CBh. arbitraire. une analyse plus fine de l’écriture binaire des Codes Opération du jeu de base révèle la structure suivante : Le langage machine. l’. l’opérande « hl » du premier jeu d’instruction est remplacé par « ix ».Tous les registres 8 bits (sauf r et i qui sont peu utiles au programmeur) ont un registre-doublon (portant le même nom. EDh et FDh qui ouvrent les autres jeux. b’. h. DDh. ou « ix+n » suivant le cas. mais semblent provenir d’une construction volontaire : la première opérande passe en revue les valeurs b. Il existe cinq « jeux » (pour reprendre le vocabulaire du chapitre « Le microprocesseur ») d’instructions : • colonne « Seul » de l’annexe 1 : jeu de base. néanmoins très voisines. mais utilise le registre d’indexation iy au lieu de ix. e. c’. En effet. A ce titre. Le préfixe DDh peut être cumulé avec le préfixe CBh (colonne « Après DDh CBh » de l’annexe 1). La fonction des diverses instructions est décrite en annexe 2. l’assembleur Page 3 . Cela est réalisé en utilisant le préfixe FDh au lieu de DDh. f’). A y regarder de plus près. mais avec une apostrophe : a’. Ses instructions Avec le Z80. auxquels on accède par le biais d’instructions d’échange entre le registre et son doublon. c. les instructions (notamment leurs codes assembleur associés) ne sont plus celles que nous avons élaborées dans le précédent chapitre. • colonne « Après DDh » de l’annexe 1 : ce pseudo-jeu qui reprend en fait le 1er jeu d’instructions. • Un 5ème pseudo-jeu.

a IN a.yyy où xxx = b c d e h l (hl) a yyy = b c d e h l (hl) a HALT CCC a.. l’assembleur Page 4 . On distingue bien par exemple que les bits 3 à 5 du Code Opération peuvent être traités via un multiplexeur.a (nn).d.n b c d e h l (hl) a Rotations RLCA RRCA RLA RRA Divers DAA CPL SCF CCF LD xxx. en gras : chiffres changeant d’une ligne à la suivante) 00…… 00…000 000.0001 00.0001 00. ou par une logique combinatoire sur les autres bits du Code Opération..hl Interruptions DI EI CALL … nn nz z nc c po pe p m PUSH .0011 00..001 00. » ou de « ...Code Opération (binaire) (un point signifie : 0 ou 1.1011 000.000 00…001 00…010 00…011 00…100 00…101 00…110 00…111 01…… 01xxxyyy sauf 01110110 01110110 10…… 10cccxxx 11…… 11…000 11…001 11…010 11…011 001.1010 00..111 00. le Code Opération 11011010 signifie JP c nn... bc..a LD . selon la valeur de « … »....011 0011.af’ JR .. mais directement sur les bits du Code Opération.. bc de hl af Divers RET EXX JP (hl) LD sp..1101 sauf 00001101 00001101 CALL nn CCC a..1001 00000011 00001011 0001.hl (nn)..n où CCC = RST … Opérateur Opérateur et/ou opérande(s).bc a. On peut supposer que ce multiplexeur est par contre activé par un bit du microprogramme.a de.... de « . Le langage machine.0101 00....011 0010. le Code Opération 10100010 signifie AND a. situé non pas sur les bits de données du microprogramme.nn bc de hl sp ADD hl. bc de hl sp DEC .011 11…100 11…101 11…110 11…111 00.hl de. (sp).n EX .xxx où CCC = ADD ADC SUB SBC AND XOR OR CP xxx = b c d e h l (hl) a RET … nz z nc c po pe p m POP . a.111 001.(nn) a.(nn) INC . bc de hl af Préfixes DDh EDh FDh ADD 00h ADC 08h SUB 10h SBC 18h AND 20h XOR 28h OR 30h CP 38h Par exemple. bc de hl sp LD .1001 00..0010 00.. » (points = 000 001 010 011 100 101 110 111 opérateur et / 00 01 10 11 ou opérande) 0 1 Divers NOP EX DJNZ n JR n af. bc de hl sp INC … b c d e h l (hl) a DEC … b c d e h l (hl) a LD ….hl JP … nn nz z nc c po pe p m JP nn Préfixe CBh IN / OUT OUT n..de hl. n nz z nc c LD .

#Schéma ? MISE EN JAMBES Premier exemple Nous allons écrire un petit programme qui additionne 26h et 1Eh. Le Code Opération 82h signifie : additionner a et d. ce qui est logique puisqu’il s’agit de la copier dans a. et met le résultat dans d. Celui-ci se décompose en une opération. Reste à inscrire la valeur de n (l'opérande) dans l'adresse immédiatement supérieure à celle qui contient le Code Opération 3Eh (puisque c’est là que le microprogramme de l’instruction l’attend) : c'est ce que nous avons fait à l'adresse 0101h. Pour bien la comprendre. mais la prochaine instruction. Si cet octet contient 26h. L’humain pense ses programmes en assembleur. le programme doit nécessairement être traduit en langage machine. Nous plaçons notre programme à partir de l'adresse 0100h de la RAM. le mnémonique spécifique à ce cas-ci devient LD a. mais très peu parlante pour l'humain moyen : il ne saute pas aux yeux que la suite hexadécimale 3E / 26 / 16 / 1E / 82 / 57 / C9 réalise une addition. Pour qu'un programme en langage machine devienne présentable. puis. qui tient sur 1 octet).n (n signifie : « valeur numérique sur 1 octet. suite ayant certes une signification précise pour le microprocesseur. Le mnémonique associé est LD a. Ainsi. Ce qu'il y a dans la machine Adresse Code (hexa) (hexa) 0100 3E 0101 26 0102 16 0103 1E 0104 82 0105 57 0106 C9 Ce que l'humain peut raisonnablement comprendre Mnémonique Commentaire LD a.26h LD d. précisée en opérande en adressage immédiat ». une fois écrit. Cette opération s’appelle l’« assemblage » (l’opération inverse étant le « désassemblage »). L'adresse suivante en RAM contient donc non pas une opérande. que nous avons déjà vu. Le mnémonique associé est ADD a. nous la réalisons ici à la main (grâce aux correspondances Code Opération / mnémonique indiquées dans l’annexe 1). car l'opérande est implicitement comprise dans le Code Opération. et éventuellement une ou des opérandes. Le langage machine est ce qui est directement utilisable par la machine : c'est une suite de nombres dans la RAM (celle de la deuxième colonne).26h.1Eh ADD a. l’assembleur Page 5 .d LD d.d. Ce Code Opération se suffit à lui-même.a RET Octet du Code Opération Octet de l'opérande Octet du Code Opération Octet de l'opérande Octet du Code Opération (pas d'opérande à expliciter) Octet du Code Opération (pas d'opérande à expliciter) Octet du Code Opération (pas d'opérande) La dernière opération spécifie que c'est la fin du programme. mais c’est une opération aujourd’hui complètement automatisée. Le tableau ci-dessus est plus souvent représenté de la manière suivante : Le langage machine. puis mettre le résultat dans a. l’humain associe à chacun des Codes Opération un court texte qui résume sa fonction et remplace avantageusement l’hermétique Code Opération hexadécimal : c'est le mnémonique. Nous y reviendrons plus tard. La prochaine instruction doit donc prendre place à l'adresse 0102h. le Code Opération 3Eh signifie : prendre l'octet suivant dans la RAM et l'écrire dans a.

Les boucles sont très souvent utilisées dans tous les langages de programmation. c’est-à-dire si b=0). c’est-à-dire si Z est faux. réalisons maintenant la multiplication de 1Dh par 05h. Le registre b est utilisé comme compteur de la boucle. La construction typique d’une boucle est la suivante : Le langage machine.a RET Commentaire Deuxième exemple Par de simples additions successives. Il faut donc répéter l'opération d'addition. c’est-à-dire si b ≠ 0. L'ensemble des instructions des adresses 0106h à 010Ah est appelé boucle (représentée par la flèche) : un compteur (ici le registre b) détermine le nombre de fois où cet ensemble d'instructions doit être exécuté. Comme pour toute valeur 16 bits.00h LD d. l’assembleur Page 6 . ce qui répète le cycle d'addition / décrémentation / saut éventuel. ici 06h à l’adresse 0109h. mais est mis à 1 si b atteint 0 après la décrémentation. DJNZ dis réalise les opérations suivantes : • DEC b • Si Z=1 (c’est-à-dire si DEC b a donné un résultat nul. additionner 1Dh à a. Enregistrement du résultat dans d Fin 010B 010C 57 C9 LD d. alors JR dis. avec modification des drapeaux : notamment. le programme continue à l’instruction suivante. • d contient la multiplicande (la valeur à additionner à a) • b contient le multiplicateur. Sinon. Il est censé être initialisé à la valeur voulue en amont de la boucle. qui nous resservira certainement plus tard. Tellement même que le Z80 est doté d’une instruction assembleur spécifique : DJNZ dis (dis étant l’opérande). Après l'avoir au préalable initialisé à 0. on transfère le résultat final de a vers d.1Dh LD b. • Si l'opération est terminée. Saut à l'adresse 0106h si NZ est vrai. on passe à l’instruction suivante dans la RAM.1Eh ADD a. ce qui clôt le cycle.d DEC b JP nz 0106h Commentaire Initialisation de a à 0 Multiplicande dans d Multiplicateur dans b Calcul du résultat partiel Décrémentation du multiplicateur. à 05h reprises. cela signifie que nous n'avons pas additionné d à a suffisamment de fois. Si alors b>0. on réalise un saut à l'adresse 0106h. C'est le rôle tenu par l'instruction JP nz 0106h : si le résultat de la décrémentation de b n'est pas nul.26h LD d. on va. L'adresse de l'instruction JP nz détermine où la boucle se termine.Adresse (hexa) 0100 0102 0104 0105 0106 Code (hexa) 3E 26 16 1E 82 57 C9 Mnémonique LD a. et 10h à l’adresse 010Ah. z est mis à 0 si b reste différent de 0. pour libérer a. on décrémente b. Notez que le saut est relatif (JR et non JP).a RET Voici le principe de ce petit programme : • a est destiné à contenir le résultat intermédiaire. l’adresse de saut est inscrite en RAM en mettant l’octet de poids faible avant l’octet de poids fort.05h ADD a. vu comme un compteur (combien de fois a-t-on additionné 1Dh à a ?) • Après avoir additionné d à a.d LD d. c’est-à-dire si le résultat de la dernière opération n’est pas 0. Adresse (hexa) 0100 0102 0104 0106 0107 0108 Code (hexa) 3E 00 16 1D 06 05 82 05 C2 06 10 Mnémonique LD a. L'adresse indiquée par l'instruction JP nz détermine où la boucle commence. Sinon.

a RET Commentaire Supposons que ce programme soit exécuté non pas par CALL 0100h.Adresse Prog Code (hexa) Mnémonique Diverses opérations… LD b. réalisent donc le programme suivant. Les mêmes codes opération. En l’occurrence.n. et. Début de la boucle.compteur Commentaire Comprend notamment les opérations préparatoires à la boucle. 26h est alors interprété comme LD h. saut relatif de –3d car : 0109h (adresse de l’instruction suivante) -3d = 0106h. compteur est le nombre de fois où la boucle doit être parcourue.a RET Préparations Initialisation du compteur Opération à répéter Décrémentation de b.n.82h. Le n est pris sur l’adresse suivante (0102h). • La prochaine instruction est donc à l’adresse 0105h : 57h réalise l’opération LD d.a.00h LD d.26h LD d. PC a donc pour valeur Fin+2. Or.1Dh LD b. Reste du Sortie de la boucle. • Le contenu de l’adresse 0101h est alors interprété comme une instruction. DJNZ dis occupant 2 octets en RAM. l’assembleur Page 7 . programme… Dans l’exemple précédent (multiplication de 1Dh par 05h). le Z80 réalise LD e. vus à partir d’une adresse légèrement décalée. • La prochaine instruction est donc à l’adresse 0106h : C9h réalise l’opération RET. mais par CALL 0101h. 06 compteur Boucle Fin 10 Boucle-Fin-2 Fin+2 Première opération à répéter Autres opérations à répéter… DJNZ Boucle Le « -2 » provient du fait qu’il s’agit d’un décalage par rapport à PC qui a déjà été mis à jour. l’instruction suivante se situe à l’adresse Fin+2. puisque 0104h contient 82h.1Eh ADD a.05h ADD a. qui contient 16h. et -3d = FDh. Sortie de la boucle Fin Commentaire Importance de l'adresse de départ Reprenons le premier programme de ce chapitre : Adresse (hexa) 0100 0102 0104 0105 0106 Code (hexa) 3E 26 16 1E 82 57 C9 Mnémonique LD a.d LD d. qui n’a rien à voir avec le précédent et ne sert d’ailleurs à rien : Le langage machine. si b≠0. le programme serait : Adresse (hexa) 0100 0102 0104 0106 0107 0109 010A Code (hexa) 3E 00 16 1D 06 05 82 C2 FD 57 C9 Mnémonique LD a. • La prochaine instruction est donc à l’adresse 0103h : 1Eh réalise l’opération LD e. par le microprogramme de DJNZ. d’où le « -2 » pour compenser cette anticipation. Le Z80 réalise alors LD h. pour pointer sur l’instruction suivante.d DJNZ –3d LD d.16h.

• le "plan" de l'écran se situe directement en RAM. comment éclairer sur l'écran un pixel donné.16h LD e. la couleur 0d soit le noir (chaque composante RGB à 0). donc 1 pixel = 1 adresse) en fonction de sa position sur l’écran (imaginez que ce tableau soit posé sur l’écran) : Le langage machine. à partir de l'adresse 1000h (par exemple).Adresse (hexa) 0101 0103 0105 0106 Code (hexa) 26 16 1E 82 57 C9 Mnémonique LD h.82h LD d. Voici un exemple de palette (ici stockée à une adresse que nous appelons PALETTE) : Code couleur (hexa) 00 01 02 03 04 05 06 07 08 09 0A … FF Composante rouge (décimal) PALETTE 0 255 PALETTE + 01h×3 64 PALETTE + 02h×3 127 PALETTE + 03h×3 192 PALETTE + 04h×3 255 PALETTE + 05h×3 255 PALETTE + 06h×3 127 PALETTE + 07h×3 255 PALETTE + 08h×3 0 PALETTE + 09h×3 255 PALETTE + 0Ah×3 … … 114 PALETTE + FFh×3 Adresse Composante vert (décimal) 0 255 64 127 192 0 0 0 255 255 127 … 73 Composante bleu (décimal) 0 255 64 127 192 0 255 127 0 255 0 … 10 Couleur obtenue noir blanc gris foncé gris gris clair rouge rose violet jaune bleu ciel orange … brun Le tableau suivant récapitule l’adresse hexadécimale de chaque pixel (en 256 couleurs. de manière simplifiée. Supposons que nous ayons une carte graphique ayant les caractéristiques suivantes : • définition graphique = 256 pixels horizontaux × 192 pixels verticaux en 256 couleurs. dans cette palette. DESSINONS Affichage d'un pixel sur l'écran Voyons maintenant. nous supposerons que. « programme » ou « donnée ». la couleur 1d soit le blanc (chaque composante RGB à 255d). • Le décalage d’un seul octet fait perdre toute signification à un programme. Il commence en haut à gauche de l’écran. l’assembleur Page 8 . Ce n’est que l’adresse à partir de laquelle un programme est appelé qui détermine l’état « opérateur » ou « opérande » des octets qui suivent. 1 pixel = 1 octet.a RET Commentaire On voit donc deux choses : • Un octet lambda en RAM n’est pas a priori « opérateur » ou « opérande ». le contenu de chaque adresse spécifie la couleur à afficher. Par convention. chacune des 256 couleurs possibles étant définie au sein d’une palette (qui précise les 3 composantes RGB associées à chaque code couleur). • Dans cette plage de la RAM.

Le troisième (D002h) est destiné à contenir la valeur Y. et y inscrit C. un sous-programme calcule l’adresse correspondant à cet octet (1000h+X+256d×Y).Haut de l’écran Gauche de l’écran 1000 1100 … CE00 CF00 1001 1101 … CE01 CF01 … … … … … 10FE 11FE … CEFE CFFE Droite de l’écran 10FF 11FF … CEFF CFFF Bas de l’écran Sur un pixel donné Pour colorer un pixel. • A partir du quatrième octet. si ! -. l’assembleur Page 9 .Le second (D001h) est destiné à contenir la valeur X . les « codes opération » ne sont plus affichés) : Adresse (hexa) 0000 0003 0005 Mnémonique LD HL. Voici le sous-programme : Le langage machine. pour mettre en blanc le 3ème pixel en partant de la gauche de la 2ème ligne en partant du haut (leur principe étant désormais bien compris – si.1102h LD (HL). il suffit d’inscrire la valeur de la couleur désirée dans son adresse en RAM. il suffit de lui donner la même couleur que celle de ses voisins. Il serait plus pratique d’écrire un sous-programme allant inscrire le code couleur donné C à l’adresse correspondant au Xème pixel en partant de la gauche de la Yème ligne (X pouvant être choisi entre 0 et 255 compris. Y entre 0 et 191 compris). Voici comment faire : • On fixe à trois octets de la RAM la fonction suivante : .1102h LD (HL). 1d RET Commentaire Met l’adresse du pixel à modifier dans HL Inscrit le code couleur du blanc dans la case mémoire d’adresse HL Pour « éteindre » ce pixel. juste après la RAM vidéo) est destiné à contenir le code couleur C . En supposant qu’ils soient noirs : Adresse (hexa) 0000 0003 0005 Mnémonique LD HL. 0d RET Commentaire Met l’adresse du pixel à modifier dans HL Inscrit le code couleur du noir dans la case mémoire d’adresse HL Sur un pixel quelconque Les sous-programmes précédents ne seront pas souvent utiles : seulement quand on veut blanchir ou noircir le 3ème pixel en partant de la gauche de la 2ème ligne.Le premier (choisissons l’octet d’adresse D000h. Par exemple.

Charge Y dans a Ajoute 10h à a Charge a (c’est-à-dire Y+10h) dans h. on le sauvegarde dans la pile.a LD a. Ainsi. c’est-à-dire C en X-Y. il faudra comprendre D000h.a LD a. Affichage d’un motif Le langage machine. Grâce au PUSH hl / POP hl du sousprogramme. l’assembleur Page 10 . Ainsi.a LD a. car le PUSH/POP est réalisé dans le même sous-programme. h ayant un poids de 256d. il faudra comprendre D003h.(D000h) LD (hl). Il s’agit d’une simple convention entre nous : lorsque nous verrons l’adresse PIXEL. C’est le fait que l’adresse d’appel soit D003h (et non D000h) qui fait que les octets D000h à D002h sont des données.(D002h) ADD a. De même. la valeur de hl n’a pas changé (peutêtre l’utilise-t-il).Adresse (hexa) D000 D001 D002 D003 Mnémonique NOP NOP NOP PUSH hl Commentaire Cet octet est réservé à la donnée C Cet octet est réservé à la donnée X Cet octet est réservé à la donnée Y Ce sous-programme allant utiliser le registre hl et ne sachant pas si le programme appelant l’utilise.a LD a. mais de permettre de paramétrer entièrement quel pixel on souhaite colorer. hl contient bien 1000h+X+256d×Y Charge C dans a Inscrit a dans l’octet d’adresse hl. lorsque nous verrons l’adresse PIXEL-3. la valeur de hl est conservée. hl contient bien (10h+Y)×100h = 1000h+256d×Y Charge X dans a Charge a (c’est-à-dire X) dans l.a POP hl D013 RET En maintenant ce sous-programme en mémoire.1d LD (D000h). le travail consistant à blanchir le 3ème pixel en partant de la gauche de la 2ème ligne consisterait en : Adresse (hexa) 0000 0002 0005 0007 000A 000C 000F Mnémonique LD a. Il n’y a pas d’incidence sur la commande RET suivante. pour ce dernier.(D001h) LD l. D004 D007 D009 D00A D00D D00E D011 D012 LD a. etc… Les programmes d’assemblage gèrent très bien ce type de convention. On récupère la valeur qu’avait hl lors de l’appel par le programme appelant. Pour des raisons mnémotechniques. nous appellerons désormais PIXEL l’adresse D003h. Ainsi.a CALL D003h Commentaire Charge la couleur dans a L’inscrit en D000h Charge X dans a (X part de 0 pour le 1er pixel) L’inscrit en D000h Charge Y dans a (Y part de 0 pour la 1ère ligne) L’inscrit en D000h Appelle le sous-programme. pour le récupérer avant le retour au programme appelant.10h LD h. ce que nous allons utiliser à outrance. et en quelle couleur. 0012 RET Cette méthode n’a pas le mérite d’être plus courte.2d LD (D001h). ce qui serait obligatoire si le présent programme l’utilisait. et non du programme : CALL D000h n’a aucun sens.1d LD (D002h).

La mémoire contiendra donc les données suivantes : Adresse VOITURE VOITURE + 1 VOITURE + 2 VOITURE + 3 VOITURE + 4 Libellé du contenu Nombre de points à traiter Décalage horizontal du point 1 Décalage vertical du point 1 Couleur du point 1 Décalage horizontal du point 2 Contenu 23 3 0 0 4 Le langage machine.Supposons que nous voulions afficher une petite voiture en X-Y. Récapitulons la position de chaque pixel à traiter à partir de l’origine définie qui sera la coordonnée X-Y de la voiture (le gris clair correspondant au code couleur 4d dans notre palette) : N° pixel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Décalage horizontal 3 4 5 2 3 4 5 0 1 2 3 4 5 6 0 1 2 3 4 5 6 1 5 Décalage vertical 0 0 0 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 Couleur 0 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 L’idée est de • lire les décalages horizontal et vertical du point 1 • les ajouter respectivement à X et Y • lire sa couleur • appeler PIXEL • recommencer avec le point suivant • et ainsi de suite jusqu’au dernier… Il faut savoir combien de point il faut traiter. on reconnaît presque une affreuse limousine américaine…) : Origine Colonne Colonne Colonne Colonne Colonne Colonne +1 +2 +3 +4 +5 +6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Origine Ligne+1 Ligne+2 Ligne+3 Ligne+4 Chaque pixel est arbitrairement identifié par un numéro. de la même manière que nous avions défini PIXEL. nous allons inscrire ces données à partir d’une adresse (choisissons D020h) que nous appellerons VOITURE. l’assembleur Page 11 . Voici la voiture (il suffit d’y croire : en regardant le schéma à 10 mètres de distance. Pour cela.

et il n’existe pas d’instruction PUSH b : qui peut le plus peut le moins) Idem pour de Inscrit dans hl l’adresse VOITURE du motif à dessiner Inscrit dans a le contenu de l’adresse VOITURE. le petit programme suivant va afficher n’importe quel motif enregistré sous cette forme. à n’importe quel endroit (de même que précédemment. il sauvegarde hl pour le programme appelant Idem pour bc (le registre bc n’est pas utilisé en tant que tel. nous nommerons l’adresse de départ MOTIF) : Adresse (hexa) MOTIF-4 MOTIF-3 MOTIF-2 MOTIF-1 MOTIF Mnémonique NOP NOP NOP NOP PUSH hl PUSH bc Commentaire Sert à inscrire la valeur de X où il faut dessiner le motif Sert à inscrire la valeur de Y où il faut dessiner le motif Sert à inscrire l’octet de poids fort de l’adresse du motif à dessiner (ici.VOITURE + 5 VOITURE + 6 VOITURE + 7 VOITURE + 8 VOITURE + 9 VOITURE + 10 VOITURE + 11 VOITURE + 12 VOITURE + 13 VOITURE + 14 VOITURE + 15 … VOITURE + 67 VOITURE + 68 VOITURE + 69 Décalage vertical du point 2 Couleur du point 2 Décalage horizontal du point 3 Décalage vertical du point 3 Couleur du point 3 Décalage horizontal du point 4 Décalage vertical du point 4 Couleur du point 4 Décalage horizontal du point 5 Décalage vertical du point 5 Couleur du point 5 … Décalage horizontal du point 23 Décalage vertical du point 1 Couleur du point 1 0 0 5 0 0 2 1 0 3 1 4 … 5 4 0 Ainsi. l’assembleur Page 12 .(MOTIF-2) LD a.(hl) LD b.a Détermination du nombre de points Le langage machine. le programme appelant inscrira l’octet de poids fort de VOITURE) Sert à inscrire l’octet de poids faible de l’adresse du motif à dessiner Ce sous-programme utilisant hl. c’est-à-dire nombre de points à traiter L’enregistre dans b (compteur de DJNZ) Données Sauvegarde des registres PUSH de LD hl. mais b est utilisé.

68d LD (MOTIF-3). puis X=43d Y=68d. pour passer à l’adresse (couleur) Inscrit la couleur dans a Inscrit la couleur dans le C de PIXEL Dessine le point en cours Passe au point suivant.a INC hl LD a.(hl) LD (PIXEL-1). même moche.(MOTIF-4) LD d.a LD a. puis X=42d Y=68d. jusqu’au (déterminé par la valeur de b) suivante Détermination de l’abscisse du point en cours dans le motif suivante Détermination de l’ordonnée du point en cours dans le motif suivante Détermination de la couleur du point en cours dans le motif dernier Prochain pixel Restaure les registres pour le programme appelant Le programme suivant permet d’exploiter ce sous-programme. pour passer à l’adresse (décalage vertical) Inscrit Y dans a Enregistre dans d Inscrit le décalage dans a Somme Y et le décalage Inscrit le résultat dans le Y de PIXEL Incrémente hl. puis X=40d Y=68d.(MOTIF-3) LD d. car une telle opération présenterait le résultat suivant (détail de l’écran) : Dessin en X=45d Y=68d : Le langage machine.a INC hl LD a. etc… Ceci n’est qu’une approximation. Y=68d : Adresse (hexa) 0000 0002 0005 0007 000A 000D 0010 0013 Mnémonique LD a. Pour dessiner la voiture en X=45d. nous allons appliquer le principe du cinéma : afficher successivement des images décalées de la voiture.VOITURE LD (MOTIF-2). mais la faire avancer c’est mieux ! Pour cela.hl CALL MOTIF RET Commentaire Vise l’adresse MOTIF-4 Pour y inscrire l’abscisse du motif Vise l’adresse MOTIF-3 Pour y inscrire l’ordonnée du motif Vise l’adresse MOTIF-2 Pour y inscrire l’adresse du motif Dessine le motif Fin Animation Essai Dessiner une voiture. pour passer à l’adresse (décalage horizontal) Inscrit X dans a Enregistre dans d Inscrit le décalage dans a Somme X et le décalage Inscrit le résultat dans le X de PIXEL Incrémente hl.(hl) ADD a.a LD a. puis X=44d Y=68d. puis X=41d Y=68d.d LD (PIXEL-1). l’assembleur Page 13 .a LD a.a LD hl.(hl) ADD a. afin de donner l’illusion de mouvement… Il s’agit de la dessiner à des endroits successifs et voisins.d LD (PIXEL-2). c’est bien. par exemple : X=45d Y=68d.a CALL PIXEL DJNZ BOUCLE1 POP de POP bc POP hl RET Commentaire Incrémente hl.Adresse (hexa) BOUCLE1 Mnémonique INC hl LD a. 45d LD (MOTIF-4).

Pour illustration. Première solution Une première solution consiste à inclure des bords blancs à la voiture : Origine Colonne Colonne Colonne Colonne Colonne Colonne Colonne Colonne +1 +2 +3 +4 +5 +6 +7 +8 24 25 26 42 1 2 3 27 40 41 4 5 6 7 28 39 8 9 10 11 12 13 14 29 38 15 16 17 18 19 20 21 30 37 22 35 34 33 23 31 36 32 Origine Ligne+1 Ligne+2 Ligne+3 Ligne+4 Ligne+5 Ligne+6 Cela se réalise en complétant le tableau VOITURE : Le langage machine. jusqu’en X=40d Y=68d par exemple : Valeur de X Y=68d Y=68d Y=68d Y=68d Y=68d 40d 41d 42d 4 10 17 43d 1 5 11 18 44d 2 6 12 19 45d 3 7 13 20 23 46d 47d 48d 49d 50d 51d 8 15 9 16 22 14 21 En effet. mais n’a pas été reblanchi dans la présente opération. il n’a aucune raison de se réaliser tout seul (l’octet correspondant en mémoire contient toujours le même code couleur).Valeur de X Y=68d Y=68d Y=68d Y=68d Y=68d 40d 41d 42d 43d 44d 45d 46d 47d 4 10 17 8 15 9 16 22 48d 1 5 11 18 49d 2 6 12 19 50d 3 7 13 20 23 51d 14 21 Puis dessin en X=44d Y=68d : Valeur de X 40d 41d Y=68d Y=68d Y=68d Y=68d Y=68d 42d 43d 44d 45d 46d 4 10 17 8 15 9 16 22 47d 1 5 11 18 48d 2 6 12 19 49d 3 7 13 20 23 50d 51d 14 21 On constate que le dessin laisse une trace : en effet. nous n’avons pas effacé l’arrière de la voiture avant chaque affichage de la nouvelle position. le pixel (par exemple) X=50d Y=68d a été noirci lors de l’opération précédente. Si on ne provoque pas ce « reblanchiement ». l’assembleur Page 14 . Nous allons présenter ici deux possibilités pour le faire. la suite des opérations serait la suivante : Dessin en X=43d Y=68d : Valeur de X Y=68d Y=68d Y=68d Y=68d Y=68d 40d 41d 42d 43d 44d 45d 4 10 17 46d 1 5 11 18 47d 2 6 12 19 48d 3 7 13 20 23 49d 50d 51d 8 15 9 16 22 14 21 Etc….

Son inconvénient est qu’elle suppose que l’objet se déplace sur un fond blanc (ou tout au moins uni. Nous appellerons cette structure FOND. ce qui est rarement le cas. aux endroits où nous allons modifier les pixels en dessinant notre voiture. dans une structure du même type que VOITURE que l’on utilisera par la suite dans le programme MOTIF pour « recoller » le fond originel à la place de la voiture. haut. droite. afin d’effacer la traînée. comme « en haut à droite »). les points 27 à 31 et 35 auraient permis d’empêcher la traînée en « reblanchissant » les pixels du dessin précédent. si on change la couleur blanche du bord pour la couleur de fond). mais au lieu de copier le code couleur dans le pixel correspondant de l’écran.Adresse VOITURE VOITURE + 1 à VOITURE + 69 VOITURE + 70 VOITURE + 71 VOITURE + 72 VOITURE + 124 VOITURE + 125 VOITURE + 126 Libellé du contenu Contenu Nombre de points à traiter 42 Idem précédemment. il s’agit de lire le pixel sur l’écran pour l’enregistrer en mémoire vive. l’assembleur Page 15 . Le langage machine. ENR_FOND (pour « ENREGISTRER_FOND »). en tenant compte du changement d’origine (+1 pour chaque décalage horizontal et chaque décalage vertical) Décalage horizontal du point 24 4 Décalage vertical du point 24 0 Couleur du point 24 1 Etc… Décalage horizontal du point 42 3 Décalage vertical du point 42 1 Couleur du point 42 1 Cet exemple ajoute des bords blancs dans les quatre directions (gauche. Dans le cas du déplacement précédent (de droite à gauche). Il s’agit donc de faire le travail inverse du programme MOTIF : passer chaque position pointée par le tableau VOITURE. il est nécessaire d’enregistrer celui-ci. Si on prévoit des déplacements dans huit directions (les quatre précédentes plus leurs combinaisons. bas). et le programme inverse de MOTIF. en prévision de déplacements dans les directions opposées. il faut ajouter des bords de coin (43 à 53) : Origine Colonne Colonne Colonne Colonne Colonne Colonne Colonne Colonne +1 +2 +3 +4 +5 +6 +7 +8 43 24 25 26 44 53 42 1 2 3 27 52 40 41 4 5 6 7 28 45 39 8 9 10 11 12 13 14 29 38 15 16 17 18 19 20 21 30 51 37 22 35 34 33 23 31 46 50 36 49 48 32 47 Origine Ligne+1 Ligne+2 Ligne+3 Ligne+4 Ligne+5 Ligne+6 L’avantage de la méthode est sa simplicité. Deuxième solution Reprenons la première « voiture » : Origine Colonne Colonne Colonne Colonne Colonne Colonne +1 +2 +3 +4 +5 +6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Origine Ligne+1 Ligne+2 Ligne+3 Ligne+4 Pour permettre une animation sur un fond quelconque (notamment pas nécessairement uni).

en indiquant VOITURE comme adresse de motif • attendre « un certain temps » • appeler MOTIF. Nous devons d’abord créer la structure FOND. ou bien « naturellement » par d’autres calculs que le programme doit réaliser de toutes manières pour d’autres fonctions (gestion d’autres animations. détection des touches utilisées du clavier. Cela peut être constitué par un réel programme d’attente. nous n’en modifierons que les codes couleurs). rétablissant ainsi l’affichage initial. nous appelons le « tableau VOITURE »). Ici. lit le code couleur sur l’écran et l’enregistre comme code couleur dans FOND.Situation initiale. Cette étape sera articulée autour d’une instruction LDIR (copie de blocs mémoire). L’animation consiste. grâce à un programme CREE_FOND. l’assembleur Page 16 . le programme appelant inscrira l’octet de poids fort de FOND) 1ère image : Le langage machine. lectures / écritures sur le disque dur ou en mémoire. Voici une solution possible du programme CREE_FOND : Adresse (hexa) -4 -3 -2 Mnémonique NOP NOP NOP Commentaire Sert à inscrire l’octet de poids fort de l’adresse du motif à copier (ici. par simplicité de vocabulaire. les pixels de la mémoire vidéo que l’on prévoit d’écraser par le programme MOTIF affichant VOITURE. le programme appelant inscrira l’octet de poids fort de VOITURE) Sert à inscrire l’octet de poids faible de l’adresse du motif à copier Sert à inscrire l’octet de poids fort de l’adresse FOND où le MOTIF sera copié (ici. etc…). en : • appeler ENR_FOND • appeler MOTIF. la RAM contient la définition d’un dessin à partir de l’adresse VOITURE (ce que. Nous devons donc créer deux programmes : • CREE_FOND : copie VOITURE vers FOND. à l’adresse FOND. après avoir utilisé CREE_FOND et pour chaque position successive à donner à la voiture dans l’animation. Pour chacune d’entre elles. L’écran (c’est-à-dire la mémoire vidéo située en RAM) contient une image. le dessin est volontairement grossi. en indiquant FOND comme adresse de motif • incrémenter la position à traiter le coup suivant L’attente a pour but de laisser la voiture affichée un temps suffisant pour que la rétine la voie. 2ème image : ENR_FOND enregistre. 4ème image : MOTIF affiche FOND. afin de bénéficier de sa structure et des données que nous conserverons (en fait. 3ème image : MOTIF affiche VOITURE. • ENR_FOND : passe en revue chaque position indiquée par FOND. par soucis de lisibilité.

détaillé après) : Adresse (hexa) -4 Mnémonique NOP Commentaire Sert à inscrire la valeur de X où il est prévu de Données dessiner le motif -3 NOP Sert à inscrire la valeur de Y où il est prévu de dessiner le motif -2 NOP Sert à inscrire l’octet de poids fort de l’adresse où le fond sera enregistré (ici.0 Ainsi. en octets.a L’enregistre dans b (compteur de DJNZ) Le langage machine. c’est-à-dire nombre de points à traiter LD b. bc contient le nombre d’octets du tableau VOITURE LD hl.bc Réalise hl = 2×bc ADD hl.l Ainsi. VOITURE depuis hl (VOITURE) vers de (FOND) POP de Restaure les registres POP bc pour le programme appelant POP hl RET Voici une solution possible du programme ENR_FOND (avec un sous-programme LIT_PIXEL qui retourne le code couleur du point X. sauvegarde hl Sauvegarde des registres pour le programme appelant PUSH bc Idem pour bc PUSH de Idem pour de LD hl.bc LD h.Adresse (hexa) -1 CREE_FOND Mnémonique NOP Commentaire Sert à inscrire l’octet de poids faible de l’adresse FOND où le MOTIF sera copié PUSH hl Ce sous-programme utilisant hl. bc contient (hl) bc pour l’instruction LDIR) LD l.(CREE_FOND de pointe sur FOND.bc Réalise hl = 3×bc INC hl Réalise hl = 3×bc + 1 LD b. sauvegarde hl Sauvegarde des registres pour le programme appelant PUSH bc Idem pour bc PUSH de Idem pour de LD hl.0 ADD hl. réalise LD bc. le programme appelant inscrira l’octet de poids fort de FOND) -1 NOP Sert à inscrire l’octet de poids faible de l’adresse où le fond sera enregistré ENR_FOND PUSH hl Ce sous-programme utilisant hl.(ENR_FOND .c Avec l’instruction suivante.(CREE_FOND hl pointe sur VOITURE. l’assembleur Page 17 .h Avec l’instruction suivante. d’octets à copier.(hl) Inscrit le nombre de points enregistrés par Calcule la taille.(CREE_FOND hl pointe sur VOITURE -4) LD c.(hl) Inscrit dans a le contenu de l’adresse FOND. à inscrire dans LD b. LDIR Réalise la copie de bc octets depuis VOITURE Copie les bc octets de vers FOND.hl LD c. destination de la copie à Adresse destination de la copie -2) réaliser. réalise LD hl. LD de. du VOITURE (signification du premier octet du tableau VOITURE (nombre tableau VOITURE) dans c.Inscrit dans hl l’adresse FOND Détermination du nombre de 2) points LD a. source de la copie à Adresse source de la copie -4) réaliser.Y de la mémoire vidéo.

pour passer à l’adresse suivante Détermination de l’abscisse du (décalage horizontal) point en cours dans le motif LD a. nous avons tous les outils pour réaliser notre animation : Causer du temps de chaque instruction################ CREE_FOND (VOITURE.Inscrit X dans a 4) LD d.a Inscrit le résultat dans le Y de LIT_PIXEL INC hl Incrémente hl.a Enregistre X dans d LD a.a Enregistre Y dans d LD a.d Somme Y et le décalage LD (LIT_PIXEL-1).FOND) MOTIF (VOITURE) Attente MOTIF (FOND) X <.Y. pour passer à l’adresse suivante Détermination de l’ordonnée du (décalage vertical) point en cours dans le motif LD a. pour passer à l’adresse suivante Enregistrement de la couleur du (couleur) point en cours dans le motif CALL LIT_PIXEL Inscrit le code couleur du pixel pointé dans a (voir ci-dessous) LD (hl).a L’inscrit alors dans le tableau FOND.a LD a.(hl) Inscrit le décalage dans a ADD a.X+1 Retour boucle Le langage machine.Adresse (hexa) BOUCLE2 Mnémonique INC hl Commentaire Incrémente hl.(hl) POP hl RET Commentaire Cet octet est réservé à la donnée X Cet octet est réservé à la donnée Y Idem PIXEL Inscrit le code couleur du pixel pointé dans a Idem PIXEL Désormais. jusqu’au dernier Pixel suivant (déterminé par la valeur de b) POP de Restaure les registres POP bc pour le programme appelant POP hl RET Comment modifier légèrement PIXEL pour qu’il réalise la fonction LIT_PIXEL qu’on attend de lui ? Voici la réponse : Adresse (hexa) -2 -1 LIT_PIXEL Mnémonique NOP NOP PUSH hl LD a.(LIT_PIXEL-2) LD l. l’assembleur Page 18 .(LIT_PIXEL-1) ADD a.(hl) Inscrit le décalage dans a ADD a.a Inscrit le résultat dans le X de LIT_PIXEL INC hl Incrémente hl.Inscrit Y dans a 3) LD d.d Somme X et le décalage LD (LIT_PIXEL-2).(ENR_FOND . DJNZ BOUCLE2 Passe au point suivant.10h LD h.FOND) Initialise X Début de boucle : ENR_FOND (X.a LD a.(ENR_FOND .

L’adresse de FOND est copiée comme donnée 2).Recharge le Xd de début dans a Initialise la première position 6) de X = Xd Le langage machine.Charge le Xf de fin dans a 5) SUB a. car b est le registre de contrôle de la future boucle DJNZ. sauvegarde hl Sauvegarde des registres N pour le programme appelant PUSH bc Idem pour bc PUSH de Idem pour de LD hl contient l’adresse du tableau FOND Initialisation des données pour hl.hl du sous-programme CREE_FOND LD (ENR_FOND.b Inscrit Xf .a Transfère le résultat dans b.hl du sous-programme ENR_FOND LD hl contient l’adresse du tableau VOITURE hl.(ANIMATION.a Qu’on inscrit en donnée fixe de ENR_FOND… LD (MOTIF-3).(ANIMATION.Charge le Xd de début dans a Calcule le nombre de fois où la 6) boucle d’animation devra être LD b.Adresse (hexa) -6 Mnémonique NOP Commentaire Sert à inscrire la valeur de Xd de départ pour Données l’animation -5 NOP Sert à inscrire la valeur de Xf de fin pour l’animation -4 NOP Sert à inscrire l’octet de poids fort de l’adresse VOITURE -3 NOP Sert à inscrire l’octet de poids faible de l’adresse VOITURE -2 NOP Sert à inscrire l’octet de poids fort de l’adresse FOND -1 NOP Sert à inscrire l’octet de poids faible de l’adresse FOND ANIMATIO PUSH hl Ce sous-programme utilisant hl.hl donnée du sous-programme CREE_FOND LD (MOTIF-2).100d On fixe arbitrairement la valeur de Y à 100d LD (ENR_FOND-3).Xd LD a.L’adresse de VOITURE est copiée comme 2). l’assembleur Page 19 .Xd dans a LD b. LD a.hl L’adresse de VOITURE est copiée comme donnée du sous-programme MOTIF LD a.L’adresse de FOND est copiée comme donnée 2).a exécutée = Xf .a …et de MOTIF CALL CREE_FOND Crée la structure FOND LD a.(ANIMATION-4) LD (CREE_FOND.(ANIMATION-2) l’ensemble des sousprogrammes LD (CREE_FOND.(ANIMATION.

suivant jusqu’au dernier (déterminé par la valeur de b). Dessine la voiture Inscrit l’adresse FOND dans hl Inscrit l’adresse FOND à l’adresse MOTIF-2 Réaffiche le fond à la position X en cours. JR NZ BOUCLE4 LD hl. et en tous cas bien plus important que le temps entre son effacement et son affichage à la position suivante. Z = 0 sinon. Genre : Ca serait pas mal si la voiture se déplaçait en fonction des touches qu’on presse (flèches gauche ou droite). LD hl. et retourne en BOUCLE3 si b Passe au traitement du pixel est non nul. permettant d’avoir un temps d’affichage de la voiture suffisant pour qu’elle soit vue par la rétine. l’assembleur Page 20 . • LD hl. l’ensemble de la boucle utilise 10 + 5555 × (6+12) – (12-7) ≈ 100 000 cycles d’horloge.hl CALL MOTIF INC a DJNZ BOUCLE3 POP de POP bc POP hl RET Retourne en BOUCLE4 si Z = 0. Restaure les registres pour le programme appelant Retourne à l’appelant. LECTURE DES TOUCHES DU CLAVIER ########### Commander le déplacement de la voiture en fonction de la touche enfoncée. Avec un Z80 travaillant à 1 MHz.nn utilise 10 cycles d’horloge • DEC hl utilise 6 cycles d’horloge • JR NZ n utilise 12 cycles d’horloge quand le branchement a lieu. Le drapeau Z est à 1 si le résultat est nul.5555d Initialise hl à 5555d DEC hl Décrémente hl.FOND LD (MOTIF-2).Adresse (hexa) BOUCLE3 Mnémonique Commentaire Enregistre le fond. on force ici une attente de 0.hl Inscrit l’adresse VOITURE à l’adresse MOTIF-2 CALL MOTIF Dessine la voiture à la position X en cours. Ainsi. BOUCLE4 LD (ENR_FOND-4).VOITURE Inscrit l’adresse VOITURE dans hl LD (MOTIF-2). Incrémente a Donne à X la valeur suivante Décrémente b. Cette boucle ne fait rien d’autre que d’être exécutée 5555d fois Réaffiche le fond Boucle d’attente : dans le Z80.1 seconde.a Transmets la valeur en cours de X au sousprogramme ENR_FOND CALL ENR_FOND Enregistre le fond d’écran à la position X en cours LD hl. Boucle d’attente… Pour laisser le temps à la voiture d’être affichée assez longtemps pour être vue. Afficher la voiture Attendre qu’une touche soit pressée (attente pour rendre la voiture visible) Effacer la voiture Afficher la nouvelle voiture Attendre que la touche ne soit plus pressée ECRIVONS Affichage d'un caractère Le code ASCII Affichage d'un texte CALCUL DU TEMPS DE TRAITEMENT# Le langage machine. 7 sinon.

l’assembleur Page 21 .Sous-programmes #RAM = programme parler de SP# La pile MACRO-ASSEMBLAGE Le langage machine.

Sign up to vote on this title
UsefulNot useful