COURS203.TXT/fr: Difference between revisions
Jump to navigation
Jump to search
(Created page with "<pre> ****************************************************************** * * * COURS D'ASSEMBL...") Â |
No edit summary |
||
Line 4: | Line 4: | ||
* COURS D'ASSEMBLEUR 68000 SUR ATARI ST * |
* COURS D'ASSEMBLEUR 68000 SUR ATARI ST * |
||
* * |
* * |
||
− | * par Le |
+ | * par Le F�roce Lapin (from 44E) * |
* * |
* * |
||
− | * Seconde |
+ | * Seconde s�rie * |
* * |
* * |
||
− | * Cours |
+ | * Cours num�ro 3 * |
***************************************************************** |
***************************************************************** |
||
− | Avant de continuer |
+ | Avant de continuer � �tudier ces cours, je pense qu'il est grand |
− | temps pour vous d' |
+ | 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 |
+ | 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 |
+ | quis, et faites le tour de toutes les instructions avec cette m�- |
− | thode. Observez bien les |
+ | thode. Observez bien les r�sultats des op�rations de d�calages |
− | (ASL, ASR etc..) Il ne s'agit pas ici de les |
+ | (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 |
+ | mais chacune d'elle r�alise une op�ration bien pr�cise qu'il |
− | convient de |
+ | convient de conna�tre dans ses moindres d�tails. Il ne suffit pas |
− | de savoir que ROR |
+ | 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 |
+ | et, qu'en plus, il est recopi� dans le bit C du SR. Il faut re- |
− | marquer aussi que ROR #4,D0 est |
+ | 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 |
+ | n'avez pas pass� quelques heures � les d�cortiquer! |
LES INCLUSIONS DE FICHIERS |
LES INCLUSIONS DE FICHIERS |
||
− | L'un des plus gros |
+ | 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 |
+ | PASCAL se d�brouille � faire une traduction 'qui marche' et qui |
− | n'est donc pas |
+ | 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 |
+ | En contre partie, nos sources ASSEMBLEUR font tr�s rapidement des |
− | pages et des pages |
+ | pages et des pages l�, o� 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 |
+ | cependant quelques m�thodes permettant non pas d'�viter ces |
− | multiples pages, mais de |
+ | 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 |
+ | 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- |
+ | 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 |
+ | une image. (listing 1 s�rie 2) |
− | Tout d'abord nous |
+ | Tout d'abord nous transf�rons l'adresse de l'image en A6, nous |
− | sautons l'en- |
+ | 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 |
+ | 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 |
+ | 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' |
+ | 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 |
+ | Petit exercice �ducatif. Une fois ce programme assembl�, suivez le |
− | sous MONST. Lorsque Xbios(3) aura |
+ | 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' |
+ | 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 |
+ | Autre petit exercice: Le ST poss�de la particularit� d'avoir en |
− | quelque sorte 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 |
+ | 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 |
+ | 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) |
+ | changer un peu le listing et de mettre MOVE.W #2,-(SP) � la |
− | place de 3 pour la recherche de l' |
+ | place de 3 pour la recherche de l'�cran. D�buggez le programme et |
constatez! |
constatez! |
||
− | Mais ceci nous |
+ | 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 |
+ | 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 |
+ | Petit exercice: faire un programme qui tourne en moyenne r�so- |
− | lution, passe en basse, affiche une image basse |
+ | 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 |
+ | 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 |
+ | Il est tout � fait possible d'inclure ainsi des fichiers tr�s |
− | divers. Il existe pourtant plusieurs |
+ | divers. Il existe pourtant plusieurs probl�mes. Tout d'abord la |
− | taille du programme |
+ | taille du programme r�sultant. En effet, notre image DEGAS, de |
− | part sa taille, a grossi notre programme de 32Ko! Bien |
+ | part sa taille, a grossi notre programme de 32Ko! Bien s�r il y a |
− | maintenant l'avantage de pouvoir |
+ | 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 |
+ | 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 |
+ | plus rapide du fait qu'il n'y a pas � aller chercher l'image sur |
− | la disquette puisque cette image est |
+ | la disquette puisque cette image est d�j� en m�moire avec le |
− | programme, c'est |
+ | programme, c'est � l'assemblage que �a p�dale!!! Il faut donc pas- |
− | ser par des |
+ | ser par des m�canismes de travail bien ordonn�s. Mettre en place |
− | un disque virtuel (de |
+ | un disque virtuel (de pr�f�rence r�sistant au Reset) recopier les |
− | images dedans et ensuite commencer |
+ | images dedans et ensuite commencer � travailler. Vous comprendrez |
− | bien vite pourquoi les possesseurs de 520 ont tout |
+ | bien vite pourquoi les possesseurs de 520 ont tout int�r�t � les |
− | faire gonfler |
+ | 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 |
+ | 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. L… 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 |
+ | 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, |
+ | de temps, possibilit� d'erreur de frappe et allongement bien |
− | inutile du listing. Lorsque vous commencerez |
+ | inutile du listing. Lorsque vous commencerez � circuler dans 10 |
− | ou 20 pages de sources |
+ | 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) |
+ | 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 |
+ | 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) |
+ | 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 |
+ | 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 |
+ | 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 |
+ | explique aussi la sauvegarde sur la pile au d�but des deux |
− | routines. La |
+ | 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 |
+ | 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 |
+ | 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 |
+ | pas de place sur la disquette. Cependant nous avons r�alis� ces |
− | routines avec 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 |
+ | 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 |
+ | exemple serait fatal mais nous sommes assez s�rieux pour ne pas le |
− | faire, donc pas de |
+ | 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 |
+ | 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' |
+ | 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 |
+ | 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 |
+ | 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 |
+ | et pourtant ce sont 24 lignes qui sont ajout�es!!! |
− | Nous sommes donc en train de nous |
+ | 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 |
+ | garde de la palette, passage en basse r�solution et passage en Su- |
− | perviseur, restitution en faisant l'inverse, |
+ | 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 |
+ | partie de notre biblioth�que. Jusqu'� pr�sent nous avons tap� pas |
− | mal de petits programmes, sans nous soucier de la place |
+ | mal de petits programmes, sans nous soucier de la place m�moire. |
− | Il est temps d'y penser afin de commencer |
+ | 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 |
+ | programme soit en m�moire mais qu'en m�me temps il y ait d'autres |
− | programmes dans cette |
+ | programmes dans cette m�moire. Il est bien �vident que chacun ne |
− | doit s'approprier que la place |
+ | 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 |
+ | 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 |
+ | 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 |
+ | pelle la page de base. En voici un descriptif. Si vous d�sirez |
− | obtenir un maximum de renseignements sur les en- |
+ | 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 |
+ | 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 |
+ | $00 Adresse de d�but de cette page de base |
− | $04 Adresse de fin de la |
+ | $04 Adresse de fin de la m�moire libre |
− | $08 Adresse du |
+ | $08 Adresse du d�but de la section TEXTE |
$0C Taille de la section TEXTE |
$0C Taille de la section TEXTE |
||
− | $10 Adresse de |
+ | $10 Adresse de d�but de la section DATA |
$14 Taille de la section DATA |
$14 Taille de la section DATA |
||
− | $18 Adresse de |
+ | $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 |
+ | 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 |
+ | 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 |
+ | a pris toute la place disponible, nous devons donc la r�tr�cir. |
− | Notre programme a |
+ | Notre programme a �galement besoin d'une pile. Au lieu de prendre |
− | celle qui est |
+ | celle qui est d�j� en place, nous allons lui substituer la notre, |
− | dont nous pourrons |
+ | dont nous pourrons r�gler la taille � loisir. |
* ROUTINE DE DEMARRAGE DES PROGRAMMES |
* ROUTINE DE DEMARRAGE DES PROGRAMMES |
||
− | MOVE.L A7,A5 |
+ | MOVE.L A7,A5 pr�l�ve ptn de pile pour |
prendre |
prendre |
||
− | * les |
+ | * 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 |
+ | J'en vois qui sont surpris par cette r�servation!!! Dans les |
− | exemples fournis avec DEVPACK il est |
+ | 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 |
+ | veux tu ..." Un peu de s�rieux. Nous avons vu que l'utilisation de |
− | la pile se faisait en |
+ | 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 |
+ | Il faut donc r�server de la place AVANT l'�tiquette. Pour cette |
− | raison nous notons le label et, au-dessus, la taille |
+ | 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 |
+ | 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 |
+ | les registres � chaque fois, il faut pr�voir assez gros. |
− | Tapez le programme suivant. Il est |
+ | 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 |
+ | peu plus haut dans ce cours. Elle est ici incluse au d�but. Pas de |
− | branchement |
+ | branchement � y faire. Si, une fois assembl�, vous d�buggez ce |
− | programme, vous verrez au |
+ | programme, vous verrez au d�but la routine de start. Dor�navant, |
− | cette routine sera toujours |
+ | cette routine sera toujours pr�sente au d�but de nos programmes |
− | mais ne sera jamais |
+ | mais ne sera jamais int�gralement recopi�e, un INCLUDE est bien |
− | plus commode! Note: Il semble que DEVAPCK se |
+ | 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 |
+ | 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 |
+ | 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' |
+ | Ce programme est bien sur bidon. J'esp�re cependant que vous |
− | l'avez scrupuleusement |
+ | l'avez scrupuleusement tap�. Lancez le... paf 4 bombes!!!!! |
− | Observons le |
+ | Observons le � la loupe afin de comprendre pourquoi... Le start |
− | est bien mis en place et lorsque nous |
+ | 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 |
+ | 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). |
+ | ici BIDULE). Avan�ons pas � pas, nous voyons bien BIDULE |
− | recevoir AAAA. Continuons |
+ | 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 |
+ | ce propos vous pouvez faire pointer la fen�tre 3 sur PILE et |
− | regarder au dessus l'empilage des |
+ | regarder au dessus l'empilage des donn�es). Ensuite nous allons |
− | sauter dans MACHIN mais |
+ | sauter dans MACHIN mais l�, stop!!!!!!! Suivez attentivement les |
− | explications. Juste avant d' |
+ | 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 |
+ | 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 |
+ | a dans le tube. Or � cette endroit il y a 0 dans le tube et cela |
− | correspond |
+ | correspond � ORI.B #0,d0; ce qui explique ces instructions. Mais |
− | ces ORI.B correspondent |
+ | ces ORI.B correspondent � quoi ? o� sont-ils situ�s? eh bien, il |
− | sont dans notre pile puisque celle-ci est |
+ | sont dans notre pile puisque celle-ci est constitu�e d'un bloc de |
− | 124 octets entre BIDULE et PILE. Alors maintenant scrutez |
+ | 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. |
+ | maintenant sur la ligne MOVEM.L de la subroutine MACHIN. Ex�cutons |
cette ligne... |
cette ligne... |
||
− | Stupeur, BIDULE est |
+ | 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, |
+ | continuons, apr�s le second MOVEM le 68000 ne va pas tomber sur |
− | le RTS puisque celui-ci vient d' |
+ | le RTS puisque celui-ci vient d'�tre �cras�, et notre programme va |
− | planter! Pourquoi ? eh bien, parce que nous avons |
+ | 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 |
+ | que nous n'avions pr�vu qu'une pile de 124 octets. |
− | Pour que ce programme marche sans |
+ | Pour que ce programme marche sans probl�me, il faut donc mettre au |
− | minimum une pile de 128 octets. Faites |
+ | 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 |
+ | serait pas plant� car il n'y aurait pas eu �crasement du RTS mais |
− | il y aurait eu |
+ | 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 |
+ | un moment o�, justement, on n'utilise pas BIDULE!!! |
− | Gardez donc toujours |
+ | 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' |
+ | de variables et que rien n'emp�che de les �craser! |
− | Encore une petite remarque sur le Start. Il est tout |
+ | 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 |
+ | 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' |
+ | Sinon, il s'agit plus d'emb�tements qu'autre chose!!!! M�me si |
− | certains puristes |
+ | 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�! |
|
− | Fin du cours sur les inclusions! Commencez |
+ | 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> |
Revision as of 15:08, 23 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