Revenir au plan du site
Utiliser la pile pour lire des listes chainées
Pour cet usage détourné de la pile, nous allons préférer couper les interruptions.
Cette technique a déjà été expliquée par Targhan du groupe Arkos dans le magazine 64 Nops. L'idée de la liste chainée est d'avoir un temps constant même en cas de rebouclage.
Concrètement, on lit notre liste : La première valeur contient la position suivante et la deuxième valeur contient ce qu'on veut faire. Ainsi, on commence par préparer notre accès suivant, puis on exécute ce qu'on doit faire (ou on récupère la donnée qu'on doit récupérer).
lireListChainee
ld sp,monTableau : nextCell equ $-2
pop hl
ld (nextCell),hl ; met à jour l'opcode LD SP,nn pour le prochain accès
ret ; dépile la valeur suivante et saute à l'adresse indiquée
|
Admettons que nous voulons lancer routine1, routine2, routine3, puis revenir à routine1, notre table sera de la sorte:
monTableau
defw $+4,routine1 ; prochaine adresse 4 octets plus loin + routine 1
defw $+4,routine2
defw monTableau,routine3 ; prochaine adresse revient au début + routine 3
|
Ce qui peut s'écrire de façon plus formelle.
monTableau
.exec1 defw .exec2,routine1
.exec2 defw .exec3,routine2
.exec3 defw .exec1,routine3
|
Utiliser la pile comme un compteur
Nous voulons exécuter 200 fois une routine puis nous arrêter. Nous manquons de registres ou de temps, que faire?
Le RET reste notre meilleure option si la pile est libre car nous aurons "empilé" dans une table nos 200 appels ainsi qu'un dernier appel vers la suite de notre code, symbolisant la sortie de boucle.
Notre routine à appeler 200 fois se termine donc par...
...un RET!
lancer200routines
ld sp,mes200routines
routine
; blabla du code
ret
mes200routines
repeat 199 : defw routine : rend ; car on a déjà un premier appel hors liste
defw sortieRoutine
programmePrincipal
jp lancer200routines
sortieRoutine
...
|