Cette partie explique comment utiliser la pile, un espace mémoire où l'on peut sauvegarder des valeurs. Celles-ci peuvent être entre autre des paramètres destinées à des fonctions de bibliothèques, des registres de façon à les retrouver intactes après plusieurs instructions, une adresse (pointeur) lors d'un saut à un sous-programme pour revenir au programme principal...
Les modes d'adressages utilisés sont -(An) et (An)+, dans le cas de la pile il faudra écrire par la suite -(A7) et (A7)+ ou encore -(SP) et (SP)+.
Pour comprendre le fonctionnement de la pile, prenons un exemple facile :
Nous avons dix assiettes numérotées de 1 à 10, nous les empilons dans l'ordre croissant : 1,2,3,4,5,6,7,8,9 et 10.
Maintenant nous constatons que c'est l'assiette déposée en dernière qui doit être reprise en première (méthode LIFO : Last In, First Out) et ainsi de suite : 10,9,8,7,6,5,4,3,2 et 1.
C'est exactement la même chose pour la pile sauf que au lieu d'empiler les valeurs vers le haut, nous les empilerons vers le bas (simplement pour avoir des adresses croissantes pour pouvoir retirer des double mots de la pile). Par conséquent pour déposer une valeur sur la pile nous décrémenterons celle-ci avec le mode d'adressage -(An), puis pour sortir cette valeur nous incrémenterons la pile avec le mode d'adressage (An)+.
Pour accéder aux données déposées sur la pile il faut un pointeur (adresse) qui pointe sur la dernière valeur déposée, sachez aussi que lorsque la pile est vide ce pointeur pointe juste avant la pile.
Dans l'absolu, nous pourrions utiliser n'importe quel registre d'adresse (An) comme pile mais le pointeur de pile utilisé par les fonctions en ROM est A7 (appelé aussi SP) et il serait catastrophique de vouloir en changer.
Tous les exemples seront écrits avec A7 et non SP, ensuite faites comme bon vous semble car cela n'a pas d'importance.
Voici un bref exemple avec une pile de 100 octets (ce qui est faux dans la réalité), supposons que celle-ci est vide :
A7 | 100 | |
| 98 | vide |
| 96 | vide |
| 94 | vide |
| 92 | vide |
| 90 | vide |
| ... | vide |
| 0 | vide |
Puis supposons que nous déposons un double mot puis un mot sur la pile. Le pointeur de pile A7 pointe sur la dernière valeur car pour désempiler une valeur on utilise la post-incrémentation (la valeur est sortie puis le pointeur de pile A7 est incrémenté) :
| 100 | |
| 98 | Première valeur déposée (double mot) |
| 96 |
A7 | 94 | Deuxième valeur déposée (mot) |
| 92 | vide |
| 90 | vide |
| ... | vide |
| 0 | vide |
Enfin, supposons que nous désempilons la dernière valeur déposée. Le pointeur de pile A7 pointe toujours sur la dernière valeur et vous remarquez que la valeur désempilée n'a pas été initialisée (ce qui est inutile car celle-ci sera écrasée lorsque nous déposerons à nouveau des valeurs) :
| 100 | |
| 98 | Première valeur déposée (double mot) |
A7 | 96 |
| 94 | Deuxième valeur déposée (mot) |
| 92 | vide |
| 90 | vide |
| ... | vide |
| 0 | vide |
Lors de la création de vos programmes, je vous conseille de vous faire un tableau de ce type en notant précisemment quelles valeurs sont actuellement dans la pile, c'est à dire les votres et celles par certaines instructions :
| 100 | |
| 98 | Registre PC déposé automatiquement par l'instruction BSR (double mot) |
| 96 |
A7 | 94 | Registre D3 (premier mot) |
| 92 | vide |
| 90 | vide |
| ... | vide |
| 0 | vide |
Attention, l'adresse de la pile (donc du registre A7 ou SP) sera toujours paire, par conséquent si vous déposez sur la pile un octet, celle-ci sera décrémentée d'un mot (2 octets).
Ceci est particulier au registre de pile, évidemment si vous avez décidé d'outre passer ce standard il vous faudra faire face a cette éventualité par vous même...
La raison est simple : l'adresse d'un mot ou d'un double mot doit être toujours paire, au cas où vous déposeriez un octet puis un mot (ou un double mot), le résultat serait un plantage (ADDRESS ERROR).
Enfin, je vous déconseille de modifier les valeurs contenues dans la pile si vous n'êtes pas sûr de ce qu'elles contiennent, en effet si vous modifiez une adresse importante vous risquez tout simplement de provoquer un plantage (ADDRESS ERROR si l'adresse est impaire ou ILLEGAL INSTRUCTION si l'adresse est bonne mais le code lut est erroné...).