CODINGAMSTAR ★ INITIATION A L'ASSEMBLEUR - PARTIE 1 ★

PROGRAMMATION EN ASSEMBLEUR Z-80

Cette série d'articles à pour but de vous faire comprendre le langage assembleur, sans pour autant vous inonder de cours fastidieux souvent inutiles car décourageants. Certes, il y aura une partie apprentissage, mais aussi et surtout une grosse partie concernant la pratique de l'assembleur en commençant par des routines assez simples utilisant les routines système, puis en poursuivant avec des routines plus difficiles, mais non moins intéressantes dont je vous laisse pour l'instant la surprise.

POUR BIEN DEBUTER

Commencez par oublier votre bon vieux locomotive Basic, nous n'y ferons que très rarement allusion. Ces deux langages n'ont rien à voir ! Le Basic a. de plus, beau être simple et pratique d'emploi, vous verrez qu'au bout d'un peu de temps l'assembleur est beaucoup plus concret, ce qui ne semble pas si évident au premier coup d'oeil.

Ensuite, armez-vous de patience et pratiquez énormément, sans toutefois abuser, en trafiquant, modifiant les exemples qui vous seront proposés.

Oui mais, ce n'est pas tout ! Pour bien débuter. Il faut aussi de quoi pratiquer l'assembleur. Vous aurez donc besoin d'un assembleur. Je vous conseille ZEN , peu convivial de par sa présentation, mais assez fourni en options, Bien sûr, Il y a aussi DAMS, DEVPAC qui sont aussi bons. Je vous conseille aussi les « Clefs pour AMSTRAD » de chez P.S.I. qui est un très bon outil et qui contient de précieux renseignements, et toutes les routines système de l'Amstrad largement commentées et détaillées.

COMMENÇONS PAR LE COMMENCEMENT

Lorsque vous saisissez un programme Basic, vous ne vous souciez pas de sa place en mémoire, car c'est l'ordinateur qui s'en occupe, et qui vous indique lorsque vous dépassez la place disponible. Ici, en assembleur, c'est â vous de dire où le programme commence, et c'est aussi à vous de faire attention à ne pas dépasser la place disponible, sans quoi l'Amstrad partirait dans un délire souvent irrécupérable autrement que par son extinction. Mon but n'étant pas de vous faire un cours sur la structure de la mémoire de l'Amstrad, je rappellerai brièvement les choses â savoir :

Voici un schéma récapitulatif.

En ce qui concerne la mémoire programme, on se limitera entre les adresses &1000 et &A000, à la fols par sécurité pour les routines système, et pour avoir de quoi taper un petit lanceur sous Basic.
Maintenant, on va programmer. L'instruction permettant donc d'Implanter un programme assembleur à une adresse précise et qui est la première Instruction d'un programme est ORG.
Syntaxe : ORG adresse Exemple ; ORG 8000H implante le programme à partir de l'adresse hexa &8000
Remarquez le fait que J'ai écrit 8000H. Sous ZEN, c'est ainsi que l'on désigne une adresse, ou une valeur hexadécimale : on tape la valeur, suivie de H. Certains assembleurs conservent la syntaxe Basic (Ici cela donnerait &8000), et d'autres ne comprennent que l'hexadécimal et ne demandent donc pas de symbole spécial (ici, on aurait donc 8000, tout simplement).

Une seconde Instruction suit cette première, et sert â Indiquer le point d'entrée du programme, c'est-à-dire l'adresse à partir de laquelle on le lance. Cette Instruction sert dans le cas où on lance le programme à partir de l'éditeur, pour qu'il sache à quelle adresse partir. Généralement adresse d'Implantation et point d'entrée sont confondus. Sous ZEN, cette instruction est LOAD ; sous d'autres assembleur, on trouve ENT.

Syntaxe :

LOAD   | adresse
ou ENT |


Ce qui nous donne pour l'Instant :

ORG    8000H
LOAD   8000H


Maintenant, Il reste à taper le programme, Mais avant, il faut parler de ce qu'est un registre et de la façon de le charger. Vous n'avez strictement rien compris à cette dernière phrase, mais ne vous Inquiétez pas, tout s'éclaircira par la suite.

QU'EST-CE QU'UN REGISTRE ?

Vous savez tous ce qu'est un octet et qu'il est composé de 8 bits. Vous savez aussi que chacun de ces bits peut prendre deux valeurs, 1 ou 0. Dans un octet, chacun des huit bits est numéroté de 0 â 7. A chacun de ces rangs n est affecté la valeur 2n, soit en partant de 0, on obtient les valeurs 1 (2^0), 2 (2^1), 4 (2^2), 8 (2^3), 16 (2^4), 32 (2^5). 64 (2^6), 128 (2^7). Ainsi suivant la valeur de chacun des bits, on pourra calculer la valeur de l'octet. Voici un exemple explicatif.

On prend comme valeur binaire 11010011

On obtient la valeur de l'octet en multipliant le bit correspondant par la valeur affectée à son rang, ce qui nous donne :
Valeur = 1x2^7 + 1x2^6 + 0x2^5 + 1x2^4 + 0x2^3 + 0x2^2 + 1x2^1 + 1x2^0

d'où Valeur = 128 + 64 + 0 + 16 + 0 + 0 + 2 + 1

donc Valeur = 211

En mettant tous les bits à 1, on obtient la valeur maximale d'un octet qui est 255, et évidemment la valeur minimale est 0, tous les bits étant à 0. Ah, à propos, retenez le fait que lorsqu'un bit esta 1. on dit qu'il est mis. On s'en resservira.

Revenons-en aux registres. On peut considérer un registre comme étant une mémoire. Sur l'Amstrad, les principaux registres sont désignés par une lettre: A, B, C , D, E, H, L

On les appelle registres simples, et chacun d'eux peut séparément contenir une valeur sur 8 bits, donc comprise entre 0 et 255. Pourquoi al-Je écrit séparément, vous demandez-vous ? Tout simplement parce que ces registres peuvent être couplés entre eux pour faire des registres 16 bits, donc comprenant des valeurs situées entre 0 et 65535, sur 2 octets donc. Seulement, on ne peut pas les coupler de n'Importe quelle façon, seuls sont acceptés les assemblages suivants :

B + C = BC
D + E = DE
H + L = HL

Le registre A peut aussi être couplé à un registre appelé F. mais son utilisation est assez spéciale, on y viendra prochainement.

Adressage des registres :

Adresser, charger un registre, c'est lui donner une valeur, tout simplement. Il y a plusieurs modes d'adressage, mais ceux-ci utilisent la même Instruction : LD (abréviation de LOAD).

Adressage Immédiat : cela consiste à charger purement et simplement un registre avec une valeur.
Syntaxe : LD registre, valeur
Exemple : LD H, 19
charge le registre H avec la valeur 19

Je profite d'être arrivé a ce stade pour vous proposer un premier programme. Nous allons en effet écrire un mot à l'écran. Pour cela il nous faut appeler la routine système &BB5A qui sert à afficher à l'écran le caractère correspondant au code ASCII contenu dans l'accumulateur (c'est ainsi que l'on appelle le registre A).

L'instruction pour appeler une routine système, ou une routine utilisateur, est la même qu'en BASIC, à savoir CALL. La syntaxe est aussi semblable : CALL adresse.

Ici, on aura donc CALL 0BB5AH (le 0 et le H sont Indispensable sous ZEN) Voici donc un premier petit programme :

ORG    8000H
LOAD   8000H

LD A, 65 : 65 est le code ASCII de la lettre «A»
CALL 0BB5AH : affichage de la lettre «A» sur l'écran
RET : Instruction Indispensable à chaque programme car elle sert à Indiquer que c'est la fin et qu'il ne faut pas aller plus loin... Indispensable sans quoi le pauvre Amstrad se plante en beauté I
END : END sert à dire à l'assembleur qu'il ne faut pas aller plus loin dons l'assemblage.

Maintenant sélectionnez l'option «assemblage», et au bout de quelques Infants vous devriez voir apparaître chacune de vos lignes de programme précédées d'une série de codes hexadécimal. Ces codes sont les codes que comprendra la machine, c'est ça le langage machine, c'est ça aussi les datas que vous trouvez chaque mois dans AMSTRAD & CPC. Ah. j'oubliais ! Pour sortir de l'édition d'un programme sous ZEN. Il faut taper @ (arrobas) suivi de ENTER. Ensuite sélectionnez l'assemblage.
Maintenant revenez sous Baslc, soit quittez l'Interpréteur assembleur. Maintenant tapez (en Basic bien sûr) : CALL &8000 puis ENTER. Miracle, un A vient de s'afficher I Splendide I Hallucinant I Mirobolant I Vous venez de réussir votre premier programme assembleur ! Bon alors maintenant, tapez le listing suivant, après avoir effacé celui-ci. assemblez-le et lancez-le, vous ne serez pas déçu :

ORG    8000H
LOAD   8000H
LD     A,65
CALL   0BB5AH
LD     A, 77
CALL   0BB5AH
LD     A,83
CALL   0BB5AH
LD     A,84
CALL   0BB5AH
LD     A,65
CALL   0BB5AH
LD     A,82
CALL   0BB5AH
LD     A,38
CALL   0BB5AH
LD     A,67
CALL    0BB5AH
LD     A,80
CALL   0BB5AH
LD     A,67
CALL   0BB5AH
RET
END

Assemblez-moi ça. revenez sous BASIC, et faites un CALL &8000 et respirez un grand coup... Fabulon, neux !
Bien, maintenant, aidez-vous de votre manuel sur l'Amstrad et débrouillez-vous avec les codes ASCII pour écrire votre nom et tout ce que vous voulez à l'écran.

On va à présent rajouter quelques effets au programme par l'utilisation de nouvelles routines système. Le principe reste le même : on charge les registres requis avec les valeurs requises, puis on appelle la routine. Simple non ?

Voici quelques routines ;
. 0BB75H : positionnement du curseur écran (LOCATE X, Y)
Syntaxe : LD    H, X (remplacer X par votre valeur)

LD      L,Y
CALL    0BB75H


Bien sûr comme en BASIC, cette routine est à placer avant l'affichage de votre mot.

. 0BCDEH : choix du mode écran.
Le registre A est chargé avec le numéro du mode.

. 0BC32H : choix des couleurs de chaque encre
A : numéro d& l'encre (0 à 15)
B : numéro de la première couleur (0 à 26)
C : numéro de la seconde couleur (0 à 26)

. 0BC38H : choix des couleurs du BORDER
B : numéro de la première couleur (0 à 26)
C : numéro de la seconde couleur (0à26)
Remarque : pour ces deux routines, pour éviter le clignotement des couleurs, on chargera B et C à la même valeur.

. 0BB90H  : choix de la couleur d'écriture (PEN)
A : numéro de l'encre (0 à 15)

. 0BB96H : choix de la couleur de fond (PAPER)
A : numéro de l'encre (0 à 15)

Voilà de quoi bien vous amuser. Si jusqu'ici vous avez tout compris, vous ne devriez pas avoir trop de problème pour utiliser ces routines. Mais attention, nous n'allons pas donner un catalogue des routines système, « Clefs pour AMSTRAD » le fait très bien...

Bien sûr le mode d'adressage Immédiat que nous venons de voir s'applique aussi pour les registres doubles, à la différence que cette fois il est possible d'entrer des valeurs supérieures à 255, ce qui est utile par exemple dans le cas de coordonnées graphiques :

.  routine 0BBEAH   : affichage d'un point en coordonnées absolues
DE : coordonnée en X
HL : coordonnée en Y

. 0BBEDH : affichage d'un point en coordonnées relatives
. 0BBF6H : traçage d'une ligne en coordonnées absolues
. 0BBF9H : traçage d'une ligne en coordonnées relatives

Même syntaxe que ci-dessus. Les lignes sont tracées depuis l'ancienne position du curseur graphique.

Bon pour vous aider. Je vous propose de saisir le listing commenté qui suit. Ce sera tout pour ce premier article. Avouez que la difficulté n'est pas énorme pour le moment. Il faut dire que nous avons vu peu de choses, très peu de choses. L'article du mois prochain, bien qu'assez bref, traitera de points très Importants pour la suite. Ne vous découragez cependant pas, ce n'est qu'à partir du troisième article que vous serez réellement emballé. Je ne vous en dis pas plus. Il n'y aurait plus de surprise. A bientôt !

ORG  7000H             ; Implantation du programme
LOAD 7000H             ; à l'adresse &7000
LD   A, 1
CALL 0BC0EH            ; Mode 1
LD   A,0               ; on met toutes les
LD   BC,0              ; encres en noir
CALL 0BC32H            ; INK 0,0,0
LD   A, 1              ;
LD   BC,0              ;
CALL 0BC32H            ; INK 1,0,0
LD   A, 2
LD   BC,0
CALL 0BC32H            ; INK 2.0.0
LD   A,3               ;
LD   BC,0              ;
CALL 0BC32H            ; INK 3.0,0
LD   BC,0              ; Idem pour le
CALL 0BC38H            ; Border
LD   A,1               ; ou choisir ta couleur
CALL BBDEH             ; graphique (n° de l'encre : 1 à 15)
LD   DE,208            ; Maintenant on dessine
LD   HL,236            ; un peu.,.
CALL 0BBEAH
LD   DE,400
LD   HL,236
CALL 0BBF6H
LD   A,2
CALL 0BBDEH
LD   DE,400
LD   HL,196
CALL 0BBF6H
LD   A,1
CALL 0BBDEH
LD   DE,208
LD   HL, 196
CALL 0BBF6H
LD   A,3
CALL 0BBDEH
LD   DE,208
LD   HL,236
CALL 0BBF6H
LD   H,15               ; Maintenant
LD   L,12               ; on va
CALL 0BB75H             ; écrire un peu
LD   A,1
CALL 0BB90H
LD   A, 65
CALL 0BB5AH
LD   A,2
CALL 0BB90H
LD   A,77
CALL 0BB5AH
LD   A,3
CALL 0BB90H
LD   A, 83
CALL 0BB5AH
LD   A,1
CALL 0BB90H
LD   A, 84
CALL 0BB5AH
LD   A,2
CALL 0BB90H
LD   A, 65
CALL 0BB5AH
LD   A,3
CALL 0BB90H
LD   A, 82
CALL 08B5AH
LD   A, 1
CALL 0BB90H
LD   A, 38
CALL 0BB5AH
LD   A,2
CALL 0BB90H
LD   A, 67
CALL 0BB5AH
LD   A,3
CALL 0BB90H
LD   A, 80
CALL 0BB5AH
LD   A, 1
CALL 0BB90H
LD   A, 67
CALL 0BB5AH
LD   A, 1                    : Voilà. Maintenant
LD   B, 2                    ; on va mettre un
LD   C,2                     ; un peu de couleurs...
CALL 0BC32H
LD   A,2                     ; pour faire Joli
LD   B,6
LD   C, 6
CALL 0BC32H
LD   A,3
LD   B,25
LD   C,25
CALL 0BC32H
CALL 0BB00H             ; Puis on vide le buffer clavier
CALL 0BB06H             ; pour attendre l'appuyer sur une touche, et...
RET                     ; c'est fini … Emotion !
END

Suivre ta procédure habituelle, à savoir :
- Assemblage
- Retour au Basic .
Call &7000

Emmanuel GUILLARD , AMSTAR & CPC n°37

» Download ZEN - assembler package
» Download Amsoft Devpac
» Download DAMS ( 17 ko )

 

★ ANNÉE: ???
★ AUTEUR: Emmanuel GUILLARD

Page précédente : Initiation à L'Assembleur Amstar&CPC 30:- Header Analysons les Fichiers

CPCrulez[Content Management System] v8.75-desktop
Page créée en 341 millisecondes et consultée 1378 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.