COURS203.TXT/fr: Difference between revisions

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

Revision as of 12:41, 24 November 2023

   ******************************************************************
   *                                                                *
   *             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