L’AS DES AS

L’assembleur.

Voilà un mot qui en fait fuir plus d’un. Votre courrier a été tellement dense à ce sujet que nous ne pouvons pas passer à côté d’un tel trésor. Je vous préviens, cela sera peut-être dur pour certains, mais dans tous les cas, nous sommes là. Nous ne vous laisserons jamais tomber (sauf si vous n’achetez plus le canard) et vous ferons profiter de notre savoir.

Allez, c’est parti. Accrochez-vous à votre Z80 et en avant la programmation.

 

COMMENÇONS PAR LE COMMENCEMENT
Avant toute chose, ce cours sera, au départ, plus orienté vers les novices. Mais les autres. les bidouil-leurs, peuvent aussi le lire car, de toute manière, on n’en sait jamais assez. Si un détail choque, un seul remède : papier + crayon + timbre = réponse dans Cent Pour Cent Compris ? C’est parti.

UN ASSEMBLEUR, C’EST QUOI AU JUSTE ?
Voici que se pose à moi le problème de savoir comment commencer. En effet le sujet à traiter est vaste. Nous allons donc essayer de parler, pour cette première fois, des différents points à connaître pour pouvoir approcher la programmation en assembleur.

La première chose à savoir est que pour pouvoir programmer en assembleur, il faut en avoir un. On appelle ainsi un programme qui transforme des mnémoniques en codes machines interprétables directement par le microprocesseur. Alors soit vous fouillez dans le fond de vos tiroirs, soit vous foncez chez votre marchand préféré. Si vous voulez un petit conseil d’achat je vous conseillerais

Dams, de Micro Application, Pyra-dev, de Pyramid software, ou encore Devpac de Hisoft. Voilà. Moi. j’utilise les trois, car ils ont chacun des points sympathiques. Allez, nous entrons maintenant dans le vif du sujet.

DIS SINED, DESSINE-MOI UN CPC
Dans le CPC. il y a plein de petits composants. Certains ont des fonctions précises, telles que la mémoire, sans quoi un ordinateur ne serait pas un ordinateur. l’AY3 W891Z qui est le processeur sonore, le CRT 6845. qui s’occupe de la vidéo, le PPI 8255, qui gère les entrées-sorties, et enfin le Z80. qui est le cerveau calculateur et qui commande tout le monde. Pour l’instant, nous allons nous occuper tout particulièrement du Z80. Les autres composants seront décortiqués plus tard, dans les leçons suivantes.

 

DES BASES EN TOUT GENRE
Le Z80 est un microprocesseur créé par Zilog sur la base d’un 8080. Il contient des registres qui lui servent à gérer la mémoire et les différents périphériques. Dans le cas du Z80, les registres sont de 8 bits (non, je ne suis pas malpoli).

Le bit est une unité de mesure informatique, qui signifie Binary Digit et qui se traduit en français par élément binaire (eb). Chaque bit représente l’état de 2 élevé à la puissance de la position du bit dans le registre, ceci en partant de sa droite. Un croquis vaut mieux que mille phrases.

Vous avez vu le croquis ? Il est explicite, non ? Si vous voulez vous entraîner, il vous suffit de faire le calcul, puis de vérifier sous Basic grâce aux instructions :

PRINT BIN$(204.8) Ou encore : PRINT &X11001100

Pour bien comprendre le système, il faut faire des calculs jusqu’à ce qu’ils soient tous justes. Une fois cela au point, nous pouvons passer à la leçon suivante. Bien que la base 10 soit agréable pour compter sur ses doigts, elle ne se révèle pas très conviviale en informatique, du moins en assembleur.

En effet, tout fonctionne en base X donc en binaire. Mais essayez de retenir une adresse du genre 1111000100101001 sans faire d’erreur et vous verrez qu’arrivé à 10 adresses différentes, on commence à ne plus savoir où donner de la tête. C’est pour cela qu’un intellectuel pas bête a dit : « Nous utiliserons l’hexadécimal ! » C’est pas insensé du tout son truc car.

En fait, cela permet de noter un octet sur 2 caractères. En fait quatre bits sont représentés par un chiffre qui varie de 1 à F. Si le quartet vaut de 1 à 9. nous ne distinguons aucun changement spécial. Pour dire 10. soit en binaire. 1010, on utilise le A. pour 11 (1011) le B, pour 12 (1100) le C, pour 13 (1101) le D, pour 14 (1110) le E et pour 15 (1111) le F. L’adresse citée ci-dessus en binaire peut maintenant s’écrire F129. C’est sans nul doute plus facile à retenir que des tapées de zéros et de 1, non ? Ici encore, il est simple de passer d’une base à l’autre car, par exemple, pour traduire la valeur hexadécimale ABCD.

PAGE 1

Il faut procéder de la manière suivante :

C’est donc très simple à réaliser. Dans l’autre sens, pour convertir un nombre décimal en hexa, cela se révèle moins simple mais tout aussi logique : il faut faire des divisions successives par 16 du nombre à traiter et garder les restes intermédiaires. Le résultat de l’opération sera donné par les restes pris dans l’ordre inverse de leur sortie. Exemple SVP :

12345 / 16 = 771 reste 9
771 / 16 = 48 reste 3
48 / 16 = 3 reste 0
reste 3

Le résultat de cette traduction est 3039 hexadécimal. Amusez-vous avec ces calculs et vous verrez qu’au bout de quelque temps, cela devient automatique. Le Basic est toujours là pour nous aider, s’il le faut grâce aux instructions : PRINT HEXS( 12345) Ou encore :

PRTNT&ABCD

Une petite note à ce sujet : si vous demandez au Basic de vous donner en décimal une valeur hexa supérieure à &8000. il vous répondra par un nombre négatif. La raison en sera donnée plus loin dans ce cours et pour remédier à ce problème, il suffit d’ajouter 65536 au nombre renvoyé par le Basic. Ne paniquez pas, tout vous sera dit Voilà, les bases ayant été abordées, passons aux choses sérieuses. C’est reparti pour un tour.


LES REGISTRES ET LEURS FONCTIONS
Revenons-en aux registres et à leurs fonctions. Il existe, sur le Z80. quatre grands types de registres :

– Les registres généraux (A. B, C. D, E, H, L)
– Les registres secondaires (A, B’, C, D’. E’, H’. V)
– Les registres d’index (IX, IY)
– Les registres systèmes (I. R SP, PC, F, F »)

Ils ont chacun des capacités et des rôles bien précis que nous abordons extemporanément (voilà un mot qui va faire ouvrir pas mal de dictionnaires). Les registres généraux

Ce sont tous des registres 8 bits dont voici les particularités :

– A, dit accumulateur, est le registre sur lequel sont effectuées toutes les comparaisons, les additions et soustractions 8 bits, ainsi que toutes les opérations logiques et les entrées-sorties. C’est le maître à bord, celui qui décide.
– B est le registre qui sert aux boucles et aux entrées-sorties.
– C compte lors des instructions de transferts de blocs et est aussi spécialisé dans les entrées-sorties.
– D et E servent de pointeurs de destination pour les instructions de transferts de blocs mémoire.
– H et L servent de pointeurs source lors des transferts de blocs et peuvent être considérés comme des accumulateurs 16 bits.

La dernière phrase peut vous paraître étrange mais elle est en fait significative de la puissance du Z80. En effet ce microprocesseur est un pseudo 16 bits car ses registres 8 bits peuvent être associés 2 à 2, ceci seulement de la manière suivante : B et C forment BC (B poids fort et C poids faible) D et E forment DE (D poids fort et E poids faible) H et L forment HL (H poids fort et L poids faible) Ce qui nous fait 3 registres 16 bits dont les particularités sont citées ci-dessus. Mais nous verrons plus en détail leurs utilisations exactes lors de l’étude du jeu d’instructions.

 

Les registres secondaires
Us sont en fait les clones parfaits des registres généraux. Des instructions permettent d’interchanger les registres normaux avec les registres secondaires qui deviennent alors les registres principaux et inversement le contraire. Il n’est malheureusement pas possible de travailler sur les deux familles en même temps. Eh faut pas pousser, il est quand même déjà pas mal musclé notre petit Z80. Les registres d’index.

Ils servent à indexer (pas mal comme explication non ?). Certains modes d’adressage permettent d’accéder à une case de la mémoire grâce à une base, contenue dans IX ou IY, à laquelle on ajoute un déplacement appelé offset Cela permet de toucher une page mémoire (256 octets) tout en gardant son pointeur intact.

PAGE 2

Les registres systèmes
Je les appelle ainsi car ces registres sont modifiés non pas par vous (quoique…) mais par le fonctionnement normal. Les voici en détail :

– PC (Program Counter) pointe, du haut de ses 16 bits, sur la prochaine instruction à interpréter. D est modifié par les instructions de saut et par le déroulement même du programme.
– SP (Stack pointer), lui aussi constitué de 16 bits, pointe sur la pile et est modifié par les instructions de gestion de pile.
-1 (Interrupt) formé de 8 bits est à lui seul la partie haute de l’adresse contenant l’adresse du sous-programme d’interruption à exécuter. Ce registre n’est pas utilisé d’origine sur CPC car il nécessite l’utilisation du mode d’interruption 2. Si vous tenez à faire du hardware, sachez que la partie basse de l’adresse doit être fournie par le boîtier qui déclenche l’interruption. Mais c’est déjà pour les pros, passons.
– R (Refresh) est le registre de 8 bits contenant le poids faible de l’adresse de la case mémoire à rafraîchir. Il est incrémenté à chaque traitement d’instruction. Le rafraîchissement de la mémoire est dû à l’utilisation de mémoire dynamique qui n’en a que si on le lui demande (dur !).
– F et F (Flag) contiennent, sur 8 bits, l’état général du microprocesseur. F appartient aux registres principaux et F aux registres secondaires. Les bits utiles ont la signification suivante :

Bit 7 : S est le signe du résultat de la dernière opération (l=négauf, 0=positif). Bit 6 : Z est passé à 1 si le dernier résultat est nul. Bit 4 : H permet de savoir si un bit a débordé du quartet faible d’un octet, ce qui compromettrait le résultat d’une opération en DCB (nous en parlerons aussi).
Bit 2 : P/V sert soit de contrôle de parité (somme des bits à 1 de l’octet actuel), soit de test du débordement du bit 6 sur le bit 7 d’un octet, ce qui aurait pour effet de modifier à mauvais escient le signe d’un octet
Bit 1 : N est le témoin de la dernière opération. Il va de pair avec le réajustement décimal en mode DCB.

Bit 0 : C est la retenue et est utilisée pour savoir s’il y a eu dépassement de capacité lors de la dernière opération.

Tous les bits sont modifiés par les instructions du Z80 lors de leur exécution. Il est préférable de les regarder de temps en temps car c’est eux qui décident des opérations et des actions à entreprendre.

PILE. SEKOI, KESKISPAS ???
Nous avons parlé de pile. Un jeune homme de bonne famille m’a d’ailleurs demandé à quoi cela servait. Et bien, cher ami c’est très simple. La pile sert à empiler des données pour qu’elles soient récupérables plus tard. C’est en fait un stockage momentané des données, sans avoir à se soucier de l’adresse de rangement.

En fait, SP pointe sur une zone mémoire. Lorsque l’on demande au microprocesseur d’empiler une donnée, il la range à l’adresse pointée par SP et soustrait 2 à ce registre 16 bits. Dans le cas contraire, si on dépile une donnée, 2 est alors additionné à SP et le contenu de la mémoire visée est transmise au registre précisé. Il est à noter, et c’est important que seules des valeurs 16 bits peuvent être empilées. C’est une contrainte du Z80. La pile sert aussi si un CALL est effectué. Cette instruction empile l’adresse suivante et se branche à celle précisée.

Lors d’un RET, l’adresse précédemment empilée est restituée, et le programme reprend son cours normal. En fait Call équivaut à un Push PC et JMP adresse, et RET à POP PC. Nota : Call et Ret ont la même fonction en assembleur que Gosub et Return en Basic.

 

JMP AU MOIS PROCHAIN
Ok, si un point vous paraît encore obscur, n’hésitez pas à écrire. Le mois prochain, nous commencerons à voir les instructions principales et les différents modes d’utilisation du microprocesseur. En attendant amusez-vous bien.

Lusse

Sined le Barbare

PAGE 3