COURS203.TXT/fr
******************************************************************
* *
* COURS D'ASSEMBLEUR 68000 SUR ATARI ST *
* *
* par Le F�roce Lapin (from 44E) *
* *
* Seconde s�rie *
* *
* Cours num�ro 3 *
*****************************************************************
Avant de continuer � �tudier ces cours, je pense qu'il est grand
temps pour vous d'�tudier toutes les instructions du 68000. Vous
avez d�j� suffisamment de bases pour r�aliser de petits programmes
et surtout vous devez vous �tre habitu� avec le syst�me qui
consiste � taper seulement 2 ou 3 lignes de programmes puis �
visualiser leur fonction avec MONST.
Prenez donc l'ouvrage sur le 68000 que vous avez normalement ac-
quis, et faites le tour de toutes les instructions avec cette m�-
thode. Observez bien les r�sultats des op�rations de d�calages
(ASL, ASR etc..) Il ne s'agit pas ici de les conna�tre par coeur
mais au moins de savoir qu'elles existent pour pouvoir, le cas
�ch�ant, les retrouver facilement, et surtout d'�tre capable de
comprendre ce qu'elles font. Le nombre d'instructions est faible
mais chacune d'elle r�alise une op�ration bien pr�cise qu'il
convient de conna�tre dans ses moindres d�tails. Il ne suffit pas
de savoir que ROR r�alise une rotation vers la droite, il faut
�galement savoir que le bit �ject� d'un cot� est remis de l'autre
et, qu'en plus, il est recopi� dans le bit C du SR. Il faut re-
marquer aussi que ROR #4,D0 est accept� mais pas ROR #9,D0. Dans
ce cas il faut faire 2 ROR ou MOVE.W #9,D1 puis ROR D1,D0. C'est
ce genre de petits trucs qui vous bloqueront plus tard si vous
n'avez pas pass� quelques heures � les d�cortiquer!
LES INCLUSIONS DE FICHIERS
L'un des plus gros probl�me de l'ASSEMBLEUR se situe au niveau de
la taille des listings. Si en BASIC une ligne suffit pour une
op�ration parfois tr�s complexe, nous avons vu qu'en ASSEMBLEUR ce
n'�tait pas le cas. Par contre nous avons vu �galement que
l'�criture en ASSEMBLEUR consistait � taper le bon nombre d'ins-
truction machine, alors que le compilateur du BASIC, du C ou du
PASCAL se d�brouille � faire une traduction 'qui marche' et qui
n'est donc pas forc�ment la plus �conomique au niveau taille et/ou
au niveau vitesse.
En contre partie, nos sources ASSEMBLEUR font tr�s rapidement des
pages et des pages l�, o� un programmeur travaillant avec un lan-
gage '�volu�' n'aurait que quelques dizaines de lignes. Il existe
cependant quelques m�thodes permettant non pas d'�viter ces
multiples pages, mais de r�duire sensiblement la taille du listing
sur lequel nous travaillons.
Deux directives vont principalement nous servir. Attention, ce ne
sont pas des instructions ASSEMBLEUR, mais des ordres interpr�t�s
par l'ASSEMBLEUR. Ce sont donc, dans notre cas, des instructions
'Devpack' et non pas des instructions '68000'.
La premi�re, INCBIN, permet d'incorporer dans le programme un
fichier binaire. Un fichier binaire cela peut-�tre une image, de
la digit, des sprites etc... ou bien un morceau de programme qui a
�t� assembl� sous forme de fichier binaire. Voici un exemple avec
une image. (listing 1 s�rie 2)
Tout d'abord nous transf�rons l'adresse de l'image en A6, nous
sautons l'en-t�te de celle-ci pour pointer sur les couleurs qui
sont mises en place avec Xbios(6), nous cherchons ensuite l'adres-
se de l'�cran avec la fonction Xbios(3) puis, apr�s avoir saut� la
palette de couleurs de notre image, nous transf�rons cette image
sur l'�cran. Un �cran fait 32000 octets. Si nous transf�rons
long mot par long mot, nous ne devons transf�rer que 32000
divis� par 4 c'est � dire 8000 long mots. Comme nous utilisons
une boucle DBF qui compte jusqu'� 0 compris (la boucle s'arr�te
quand le compteur atteint -1), il faut donc initialiser le
compteur � 7999. Ensuite attente d'appui sur une touche et bye
bye.
Petit exercice �ducatif. Une fois ce programme assembl�, suivez le
sous MONST. Lorsque Xbios(3) aura donn� l'adresse de l'�cran, pla-
cez la fen�tre 3 sur cette adresse puis continuez � faire avancer
pas � pas le programme, pour voir la recopie se faire. De temps en
temps tapez sur la touche V afin de voir l'�cran au lieu de MONST,
vous pourrez ainsi suivre l'affichage 'en direct'!!!
Autre petit exercice: Le ST poss�de la particularit� d'avoir en
quelque sorte 2 �crans: l'�cran sur lequel on travaille (Xbios(2))
et celui que l'on voit (Xbios(3)). Dans la plupart des cas il
s'agit du m�me mais il est tout � fait possible de les placer �
des endroits diff�rents de la m�moire et ainsi de pr�parer un
affichage dans xbios2 tout en montrant Xbios3. Il sera ainsi
possible d'afficher rapidement Xbios2 en le transf�rant dans
Xbios3, et ainsi, de faire des animations rapides. Essayez donc de
changer un peu le listing et de mettre MOVE.W #2,-(SP) � la
place de 3 pour la recherche de l'�cran. D�buggez le programme et
constatez!
Mais ceci nous �loigne un peu du sujet qui �tait l'inclusion. Pour
r�aliser ceci nous avons juste fourni un label de rep�rage qui est
ici IMAGE puis l'instruction INCBIN suivi du chemin pour trouver
cette image. Dans l'exemple c'est une image PI3 mais rien ne vous
emp�che de mettre une image PI2 ou PI1! Nous aurions tr�s bien pu
mettre 2 images l'une � la suite de l'autre, sans mettre de label
pour rep�rer la seconde. Pour pointer dessus, sachant qu'une
image DEGAS fait 32066 octets, nous aurions fait:
LEA IMAGE,A6
ADDA.L #32066,A6
Je rappelle que cela se lit: load effective address IMAGE dans A6
add address long...
Petit exercice: faire un programme qui tourne en moyenne r�so-
lution, passe en basse, affiche une image basse r�solution, attend
un appui sur une touche puis repasse en moyenne. Sachant utiliser
les fonctions Xbios et les boucles, vous devriez �tre capable de
faire une routine de sauvegarde de la palette et une autre de
restitution de celle-ci.
Il est tout � fait possible d'inclure ainsi des fichiers tr�s
divers. Il existe pourtant plusieurs probl�mes. Tout d'abord la
taille du programme r�sultant. En effet, notre image DEGAS, de
part sa taille, a grossi notre programme de 32Ko! Bien s�r il y a
maintenant l'avantage de pouvoir emp�cher les bidouilleurs de
venir y mettre leur pieds! Encore qu'une image DEGAS fait
toujours la m�me taille, mais il est possible d'inclure une image
compact�e (en mettant bien s�r une routine de d�compactage dans
notre programme!).
Autre probl�me, le temps! En effet, si l'affichage lui m�me est
plus rapide du fait qu'il n'y a pas � aller chercher l'image sur
la disquette puisque cette image est d�j� en m�moire avec le
programme, c'est � l'assemblage que �a p�dale!!! Il faut donc pas-
ser par des m�canismes de travail bien ordonn�s. Mettre en place
un disque virtuel (de pr�f�rence r�sistant au Reset) recopier les
images dedans et ensuite commencer � travailler. Vous comprendrez
bien vite pourquoi les possesseurs de 520 ont tout int�r�t � les
faire gonfler � un m�ga minimum et pourquoi un lecteur externe ou
mieux un disque dur devient vite indispensable!!!
Apr�s avoir vu le m�canisme d'inclusion de fichiers, nous allons
nous int�resser maintenant aux inclusions de listings. Il est en
effet possible de prendre un bout de listing, de le sauver sur
disquette et de demander � l'assembleur de l'inclure lors de l'as-
semblage. L� aussi, perte de temps � l'assemblage mais gain de
temps tr�s appr�ciable lors de la cr�ation de programme. Par
exemple votre routine de sauvegarde de palette: faites avec soin,
elle marche bien et en fait vous en avez besoin dans tous vos
programmes. Il faut donc � chaque fois la retaper et surtout
consommer quelques dizaines de lignes avec cette routine. Perte
de temps, possibilit� d'erreur de frappe et allongement bien
inutile du listing. Lorsque vous commencerez � circuler dans 10
ou 20 pages de sources � la recherche d'une variable vous com-
mencerez � comprendre de quoi je parle, en sachant en plus que 20
pages, c'est un tout petit source assembleur...
Voyons concr�tement un exemple, avec la sauvegarde de palette.
SAUVE_PALETTE
MOVEM.L D0-D4/A0-A4,-(SP)
LEA ANC_PAL,A4 ptn sur le lieu de
sauvegarde
MOVE.W #15,D4 16 couleurs
.ICI MOVE.W #-1,-(SP) demande de couleurs
MOVE.W D4,-(SP) num�ro de la couleur
MOVE.W #7,-(SP) Setcolor()
TRAP #14 Xbios
ADDQ.L #6,SP
MOVE.W D0,(A4)+ sauvegarde de la couleur
DBF D4,.ICI et on passe � la suivante
MOVEM.L (SP)+,D0-D4/A0-A4
RTS
ANC_PAL DC.L 0,0,0,0,0,0,0,0
REMET_PALETTE
MOVEM.L D0-D4/A0-A4,-(SP)
LEA ANC_PAL,A4 ptn sur le lieu de
sauvegarde
MOVE.W #15,D4 16 couleurs
.ICI MOVE.W (A4)+,-(SP) demande de couleurs
MOVE.W D4,-(SP) num�ro de la couleur
MOVE.W #7,-(SP) Setcolor()
TRAP #14 Xbios
ADDQ.L #6,SP
DBF D4,.ICI et on passe � la suivante
MOVEM.L (SP)+,D0-D4/A0-A4
RTS
Voici donc 2 routines. Tout d'abord sachant qu'un appel � Xbios
ne sauve pas les registres D0-D3 et A0-A3 nous utilisons D4 et A4
pour le compteur de couleur et l'adresse de sauvegarde, ce qui
explique aussi la sauvegarde sur la pile au d�but des deux
routines. La premi�re sauvegarde la palette et la met � l'adresse
ANC_PAL. Nous constatons que cette adresse se trouve entre les 2
routines. En effet plusieurs solutions s'offrent � nous. D'abord
la plus �conomique en taille c'est de mettre cette r�servation
pour la palette dans la section BSS de notre programme en faisant
ANC_PAL DS.W 16 Nous avons d�j� vu que la section BSS n'occupait
pas de place sur la disquette. Cependant nous avons r�alis� ces
routines avec en t�te l'id�e de les inclure, afin de gagner en
facilit� de programmation. En pla�ant cette r�servation entre les
routines, elle fera partie int�grante du fichier. Il n'est
cependant pas possible de la mettre en DS nous somme donc
contraint de la mettre en DC. Le danger serait que notre
programme essaye de lire cette partie. Faire un BSR ANC_PAL par
exemple serait fatal mais nous sommes assez s�rieux pour ne pas le
faire, donc pas de probl�me...
Une fois tap� ce petit listing, sauvez le par exemple sous le nom
SAUV_PAL.S. Ensuite modifiez le programme du listing 1 (celui que
nous venons de voir avec l'image incluse). Juste apr�s la fin du
programme par MOVE.W #0,-(SP), TRAP #1 (donc juste avant
l'inclusion de l'image), mettez
INCLUDE "A:\SAUV_PAL.S"
Ne mettez pas d'�tiquette sur le bord gauche puisque la premi�re
�tiquette c'est SAUVE_PALETTE et qu'elle est dans notre routine.
Ensuite au tout d�but du programme, mettez BSR SAUVE_PALETTE et �
la fin juste avant de quitter, mettez BSR REMET_PALETTE. Au niveau
taille, votre listing est donc simplement augment� de 3 lignes:
(BSR SAUVE_PALETTE, BSR REMET_PALETTE et INCLUDE "A:\SAUV_PAL.S")
et pourtant ce sont 24 lignes qui sont ajout�es!!!
Nous sommes donc en train de nous cr�er une biblioth�que. C'est
une tr�s grande partie du travail du programmeur en assembleur car
de nombreuses choses reviennent souvent: initialisation par sauve-
garde de la palette, passage en basse r�solution et passage en Su-
perviseur, restitution en faisant l'inverse, d�compactage des
images etc
De m�me, si vous �tes en train de r�aliser un gros programme, en
cours de d�veloppement ce sont des pages enti�res qui peuvent �tre
incluses diminuant d'autant la taille du listing et y permettant
des d�placements nettement plus ais�s.
Voyons tout de suite un autre bloc qui devra maintenant faire
partie de notre biblioth�que. Jusqu'� pr�sent nous avons tap� pas
mal de petits programmes, sans nous soucier de la place m�moire.
Il est temps d'y penser afin de commencer � prendre conscience du
fait qu'il faut programmer proprement. Imaginons que notre
programme soit en m�moire mais qu'en m�me temps il y ait d'autres
programmes dans cette m�moire. Il est bien �vident que chacun ne
doit s'approprier que la place m�moire dont il a besoin, afin
d'en laisser le plus possible pour ces voisins. Pour cela il faut
savoir que lors de l'assemblage sous forme de fichier ex�cutable,
il y a g�n�ration d'une en-t�te. Gr�ce � cette en-t�te, au lan-
cement de notre programme il va y avoir cr�ation de ce qu'on ap-
pelle la page de base. En voici un descriptif. Si vous d�sirez
obtenir un maximum de renseignements sur les en-t�tes de programme
ou les pages de base, reportez vous aux chapitres correspondants
dans la Bible ou le Livre du D�veloppeur. Excellent chapitre sur
ce sujet dans la doc officielle ATARI (document sur la structure
des programmes).
* Page de base
Adresse Description
$00 Adresse de d�but de cette page de base
$04 Adresse de fin de la m�moire libre
$08 Adresse du d�but de la section TEXTE
$0C Taille de la section TEXTE
$10 Adresse de d�but de la section DATA
$14 Taille de la section DATA
$18 Adresse de d�but de la section BSS
$1C Taille de la section BSS
Nous allons donc piocher ces informations, et en d�duire la taille
qui devrait suffire pour notre programme. Connaissant
l'emplacement de la zone d'implantation du programme, nous
utiliserons la fonction 74 du GEMDOS (fonction Mshrink) qui
permet, en donnant la taille d�sir�e et l'adresse de fin, de
r�tr�cir une zone m�moire. En effet, au lancement notre programme
a pris toute la place disponible, nous devons donc la r�tr�cir.
Notre programme a �galement besoin d'une pile. Au lieu de prendre
celle qui est d�j� en place, nous allons lui substituer la notre,
dont nous pourrons r�gler la taille � loisir.
* ROUTINE DE DEMARRAGE DES PROGRAMMES
MOVE.L A7,A5 pr�l�ve ptn de pile pour
prendre
* les param�tres
LEA.L PILE,A7 impose notre pile
MOVE.L 4(A5),A5 adresse de la page de base
de
* l'ancienne pile
MOVE.L 12(A5),D0 taille de la section texte
ADD.L 20(A5),D0 + taille section data
ADD.L 28(A5),D0 + taille section bss
ADD.L #$100,D0 + longueur de la page de
base
*(256 bytes)
* Appel � la fonction MShrink() du GEMDOS (Memory Shrink)
MOVE.L D0,-(SP)
MOVE.L A5,-(SP)
MOVE.W #0,-(SP)
MOVE.W #74,-(SP) M_shrink()
TRAP #1
LEA 12(A7),A7
Voil�, apr�s cette op�ration, notre programme n'utilise plus que
la place m�moire dont il a besoin. Il ne faut pas oublier de
d�finir la pile dans la section BSS par ceci:
DS.L 256
PILE DS.L 1
J'en vois qui sont surpris par cette r�servation!!! Dans les
exemples fournis avec DEVPACK il est marqu� "stack go backwards",
que je traduis librement par "moi j'avance la pile recule, comment
veux tu ..." Un peu de s�rieux. Nous avons vu que l'utilisation de
la pile se faisait en d�cr�mentant celle ci:
(move.w #12,-(sp) par exemple).
Il faut donc r�server de la place AVANT l'�tiquette. Pour cette
raison nous notons le label et, au-dessus, la taille r�ellement
r�serv�e pour la pile.
Quelle taille choisir? Cela d�pend de vous! Si votre programme
est plein de subroutines s'appelant mutuellement et sauvant tous
les registres � chaque fois, il faut pr�voir assez gros.
Tapez le programme suivant. Il est �vident que vous devez avoir
tap� au pr�alable la routine de d�marrage de programmes qui est un
peu plus haut dans ce cours. Elle est ici incluse au d�but. Pas de
branchement � y faire. Si, une fois assembl�, vous d�buggez ce
programme, vous verrez au d�but la routine de start. Dor�navant,
cette routine sera toujours pr�sente au d�but de nos programmes
mais ne sera jamais int�gralement recopi�e, un INCLUDE est bien
plus commode! Note: Il semble que DEVAPCK se m�lange parfois les
pinceaux lorsque les inclusions sont nombreuses et font appel �
des fichiers contenus dans des dossiers. De m�me il existe des
probl�mes avec les inclusions sur disque B lorsque celui-ci est
pris comme lecteur A dans lequel on met le disque B. (je n'ai par
contre pas rencontr� de probl�me avec mon lecteur externe).
INCLUDE "A:\START.S"
MOVE.W #$AAAA,BIDULE
BSR TRUCMUCHE
MOVE.W BIDULE,D6
MOVE.W #0,-(SP)
TRAP #1
*-----------------------------------------------*
TRUCMUCHE MOVEM.L D0-D7/A0-A6,-(SP)
BSR MACHIN
MOVEM.L (SP)+,D0-D7/A0-A6
RTS
MACHIN MOVEM.L D0-D7/A0-A6,-(SP)
MOVE.L #$12345678,D0
MOVEM.L (SP)+,D0-D7/A0-A6
RTS
SECTION BSS
BIDULE DS.W 1
DS.B 124
PILE DS.L 1
END
Ce programme est bien sur bidon. J'esp�re cependant que vous
l'avez scrupuleusement tap�. Lancez le... paf 4 bombes!!!!!
Observons le � la loupe afin de comprendre pourquoi... Le start
est bien mis en place et lorsque nous d�buggons il est effectu�
sans incident. On place ensuite $AAAA dans la variable BIDULE.
Activons la fen�tre 3 et pointons sur BIDULE (il suffit pour cela
de faire Alternate A et de taper le nom du label en majuscule donc
ici BIDULE). Avan�ons pas � pas, nous voyons bien BIDULE
recevoir AAAA. Continuons � avancer: nous sautons dans TRUCMUCHE
avec au passage sauvegarde dans la pile de l'adresse de retour (�
ce propos vous pouvez faire pointer la fen�tre 3 sur PILE et
regarder au dessus l'empilage des donn�es). Ensuite nous allons
sauter dans MACHIN mais l�, stop!!!!!!! Suivez attentivement les
explications. Juste avant d'ex�cuter le BSR MACHIN, faites scrol-
ler la fen�tre 1 avec la touche 'fl�che vers le bas'. En effet
d'apr�s la taille du listing et celle de la fen�tre vous ne devez
pas voir BIDULE. Descendez donc de 7 lignes. Normalement, la
premi�re ligne de la fen�tre doit maintenant �tre BSR MACHIN avec
la petite fl�che en face indiquant que c'est cette instruction qui
va �tre ex�cut�e. En bas de la fen�tre vous devez voir BIDULE
avec en face DC.W $AAAA puisque c'est ce que nous y avons d�pos�.
En dessous des ORI.B#0,D0 . En effet nous sommes dans une
fen�tre qui cherche � nous montrer le d�sassemblage de ce qu'il y
a dans le tube. Or � cette endroit il y a 0 dans le tube et cela
correspond � ORI.B #0,d0; ce qui explique ces instructions. Mais
ces ORI.B correspondent � quoi ? o� sont-ils situ�s? eh bien, il
sont dans notre pile puisque celle-ci est constitu�e d'un bloc de
124 octets entre BIDULE et PILE. Alors maintenant scrutez tr�s
attentivement BIDULE et avancez le programme d'un pas. Nous voici
maintenant sur la ligne MOVEM.L de la subroutine MACHIN. Ex�cutons
cette ligne...
Stupeur, BIDULE est �cras�, de m�me que le RTS de la subroutine
MACHIN qui est juste au dessus!!! Et maintenant, si nous
continuons, apr�s le second MOVEM le 68000 ne va pas tomber sur
le RTS puisque celui-ci vient d'�tre �cras�, et notre programme va
planter! Pourquoi ? eh bien, parce que nous avons essay� d'empiler
128 octets (MOVEM de trucmuche=15 registres donc 15*4=60 octets,
idem pour le MOVEM de machin, auquel il faut ajouter l'adresse de
retour pour trucmuche et celle de machin, total 128 octets!) alors
que nous n'avions pr�vu qu'une pile de 124 octets.
Pour que ce programme marche sans probl�me, il faut donc mettre au
minimum une pile de 128 octets. Faites tr�s attention � �a, car si
nous avions mis une pile de 124 octets, le programme ne se
serait pas plant� car il n'y aurait pas eu �crasement du RTS mais
il y aurait eu �crasement de BIDULE et je suis certain que vous
auriez cherch� bien longtemps en vous disant " mais qu'est ce qui
peut bien �craser BIDULE " surtout que cet �crasement survient �
un moment o�, justement, on n'utilise pas BIDULE!!!
Gardez donc toujours pr�sent � l'esprit le principe du tube
m�moire, sans oublier qu'il est plein d'instructions, de contenus
de variables et que rien n'emp�che de les �craser!
Encore une petite remarque sur le Start. Il est tout � fait
possible de tester D0 en retour du Mshrink(). Si celui-ci est
n�gatif, c'est qu'il y a eu erreur. Si vous savez que syst�mati-
quement vous mettez le label BYE_BYE en face du GEMDOS(0) qui ter-
mine votre programme, vous pouvez rajouter � la fin du start:
TST.W D0
BMI BYE_BYE
Une derni�re pr�cision sur les inclusions. Il existe d'autres
moyens de r�aliser de telles choses, par exemple d'assembler les
morceaux puis de les lier avec un LINKER. Cette solution est
int�ressante lorsque les programmes commencent � prendre des pro-
portions gigantesques.
Sinon, il s'agit plus d'emb�tements qu'autre chose!!!! M�me si
certains puristes pr�f�rent linker:
j'�dite, j'assemble, je quitte, je linke, je lance, �a plante, je
d�bugge, j'�dite etc...)
je pr�f�re, quant � moi, la m�thode de l' "include". Elle permet
�ventuellement d'avoir acc�s directement au source. Par exemple,
si votre routine de sauvegarde palette plante, placer le curseur
de GENST sur la ligne INCLUDE "A:\SAUV_PAL.S" puis choisissez
l'option Insert File dans le menu fichier. Votre routine est
maintenant sous vos yeux. Une fois que ce bloc est au point,
d�limitez le avec F1 et F2 puis sauver le avec F3, hop le tour est
jou�!
Fin du cours sur les inclusions! Commencez � fabriquez votre
biblioth�que et n'h�sitez pas � en faire des copies de s�curit�,
et m�fiez vous des virus! Sur cette disquette il y a IMUN.PRG
Vous le mettez en dossier Auto sur votre disquette de boot, et il
v�rifi� toutes les disquettes que vous introduisez dans le
lecteur!
Back to ASM_Tutorial