Stockage du code en RAM et Auto-modification.
Avant de faire votre premier scroll texte, il nous reste à voir les auto-modifications.
Pour cela, il vous faudra comprendre comment votre code est stocké en RAM.
1 - Stockage en RAM:
Reprenons notre code précédent:
ORG #8000 LD HL,LETEXTE LD A,(HL) SUB 32 LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD DE,#4000 ADD HL,DE RET LETEXTE DEFM "HELLO WORLD"
Assemblons notre code et allons voir en RAM en #8000 ce qu'on y trouve:

On trouve donc à partir de #8000 plusieurs octets.
Le premier est un #21
#21 correspond en fait à l'instruction LD HL,val16
Les deux octets qui suivent, correspondent à val16, soit, l'adresse de LETEXTE en inversé, soit #8014
Ensuite nous avons #7E. #7E correspond au LD A,(HL).
Et ainsi de suite.
Les instructions sont donc stockées les unes à la suite des autres, à partir de l'adresse de notre ORG.
Cela signifie donc que chaque instruction a une adresse !!! Et que notre code prends aussi de la place...
Mais réfléchissez. Si on connait l'adresse d'une instruction en RAM on peut aussi la modifier !!!
2 - Auto-modification:
L'auto-modification c'est justement modifier le code que l'on a en RAM. L'utilisation peut par exemple d'être de gérer un compteur.
Imaginons un compteur sur A.
ORG #8000 COMPTEUR LD A,#15
Si nous regardons en RAM, LD A,val est stocké comme: #3E,#15 où #3E signifie: LD A, et #15 est notre valeur.
Le label "COMPTEUR" correspond à l'adresse en RAM ou est stockée l'instruction LD A,#15
Si nous voulons modifier la valeur de A, nous pouvons donc faire un:
LD A,#16 LD (Compteur+1),A
+1 car nous voulons modifier l'octet après le #3E !!!
Exemple de compteur avec décrémentation de A:
Decrémenter c'est faire -1 sur une valeur. Ici en l'occurence la valeur contenue dans le registre A.
LD A,12 DEC A
A vaudra 11. Simple non ?
Maintenant, nous pouvons modifier la valeur de A:
COMPTEUR LD A,12 DEC A LD (COMPTEUR+1),A ;compteur+1 est bien une adresse puisque c'est entre parenthèse
On peut alors ajouter une condition pour faire boucler notre compteur...
COMPTEUR LD A,12 DEC A LD (COMPTEUR+1),A CP 0 JP NZ,machin LD A,12 LD (COMPTEUR+1),A
Voyons en détail:
-Nous mettons 12 dans A.
-On le décrémente
-On auto-modifie A
-CP val c'est une instruction de ComParaison: on compare le contenu de A avec la valeur que l'on donne: ici 0.
Les flags sont alors mis à jour. Si A est égal à la valeur donnée, alors le flag Z est mis.
-JP NZ,machin: on saute à l'adresse "machin" si le flag Zéro n'est pas mis... En gros si A n'est pas egal à 0, alors on saute à l'adresse machin.
-Si le flag Z a été mis on ne saute donc pas... A=0... Et on continue avec ce qui est marqué à la suite.
-Puisque A=0, on va le remettre à sa valeur d'origine, à savoir: 12, ce qu'on fait avec le LD A,12.
-On auto-modifie le compteur pour le remettre à 12.
Vous voyez l'intéret ?
Notez en revanche que cela prend pas mal de temps machine de faire des auto-modifications.
Un LD (ADR),a prend quand même 4 NOPs.