********************

                          *      LA PILE     *

                          * par wonderCOCOHP *

                          ********************

 

 

OU SUIS JE:

  Ici est repertori‚ comment mettre un objet dans la pile, l'enlever, le

modifier....en fait tout ce que vous avez toujours revez de faire avec la

pile(bande d'obsedes).

 

 

OU C QU'ELLE EST LA PILE?

   Quand le programme demarre, il sauve les registre du systeme. Il faut

savoir cependant qu'il ne les modifie pas. Quand le programme ASM demarre il y

a donc dans les registres les valeurs du systeme.

   Dans ces registres il y a toujours la meme chose:

-dans D la memoire libre(en quartets)

-dans D1 le pointeur de pile

-dans D0 le pointeur de programme

 

 

 

LE POINTEUR DE "PROGRAMME"

   Qu'est ce que le pointeur de programme? Et bien dans D0 il y a une adresse

a laquelle se trouve sur 5 cases l'addresse du programme a executer. Par

exemple si D0= 70B00

alors on lit 5 cases (A=DAT0 A) par exemple on peut avoir dans A:70CD0

ce chiffre etant l'adresse du programme en cours. Pour l'executer c'est

simple il faut faire un GOTO 70CD0. Ici il faudrait faire un GOTO A car la

valeur est dans A. Cependant cette instruction n'existe pas, on est donc

oblig‚ d'utiliser PC=(A) ce qui revient exactement a la meme chose (le

pointeur d'instruction(le PC) qui contient l'addresse de la prochaine

instruction a executer est soudaint egal a l'addresse contenue dans A)

   Avec l'instruction PC il y a donc saut(comme un GOTO). Rappelez vous

maintenant comment se fini chaque programme:

GOSBVL 067D2 (reload les valeur du systeme pour les registres)

A=DAT0 A

D0=D0+ 5

PC=(A)

 

le D0=D0+ 5 est la pour indiquer au systeme que l'on passe au "programme"

suivant. On lit 5 cases dans A qui contiennent l'addresse ou est

l'addresse du prochain programme. Quand un prog ASM se termine, il relance le

programme du systeme par ces instructions. Bon mise a part toutes ces banalit‚s

je dis ca a titre d'information. Personellement je ne m'en suis absoluement

jamais pr‚ocup‚.

 

 

 

LE POINTEUR DE PILE:

   Pour la pile c'est beaucoups plus simple. Dans D1 se trouve une adresse. A

cette adresse se trouve l'adresse du niveau 1 de la pile. Si on augmente D1 de

cinq et que l'on lit 5 cases on obtient l'adresse du niveau 2 de la pile. Si

on augmente encore D1 de 5 et que l'on lit 5 cases on a l'adresse du niveau 3

de la pile. Exemple: si au depart D1= 70700

(valeur qu'il y a au d‚but, quand le prog ASM commence).

 

 

adresse  on y lit 5 cases dans A avec un A=DAT1 A(a chaque foi)

dans D1         contenu de A(apres le A=DAT1 A

70700           exemple:70BCD(adresse de l'objet au niveau 1)

70705           exemple:70CD1(adresse de l'objet au niveau 2)

7070A           exemple:00000(pas d'objet niveau 3)

70710           exemple:00000(toujours rien) etc...

             

c‚ ti pas simple

   DŠs que vous rencontrez 00000 vous etes en haut de la pile. Apres il y aura

encore une dizaine de niveau avec des zeros(pour pas avoir a augmenter la

taille de la pile tout le temps) et ensuite c'est la m‚moire. La pile s'‚ttend

bien sur automatiquement quand on rajoute des ‚lements.

   Il y a une dizaine de niveaux vides en haut de la pile mais aussi en

dessous: aux addresse 706FA(70200-5) ainsi qu'en 706F5 et 706F0 etc... il y a

de la place de libre pour ‚crire(si on ecris on efface pas de truc important).

 

 

RAJOUTER UN OBJET dans la PILE:

   Donc pour rajouter un objet c'est tres simple. D'apres l'exemple pr‚cedent

quand le programme ASM d‚marre on a D1= 70700. Si on fait D1=D1- 5 et

DAT1=addresse d'un objet, alors l'objet apparait dans la pile. La pile

commence alors en 706FA(=70700-5) et on a

706FA           addresse d'un objet(celle qu'on a mis)

70700           nivo2:addresse objet nivo 2

...

 

exemple:

vous pouvez le taper tel qu'il est

 

"D1=D1- 5            rajoute un nivo a la pile

GOSBVL 0679B         sauvegarde registre(‚quivalent a 'PRO)

 

%reserve une chaine

%de 8 caractere

LC 00010             C=10h(soit 16 en d‚cimal=2*8caracteres)

GOSBVL 05B7D         reserve une chaine de C quartets(=C/2 caracteres)

C=R0 A               C=addresse de cette chaine(voir voyage page 355)

DAT1=C A             Ecris cette addresse dans D1(le mˆme qu'au d‚pard)

 

 

GOSBVL 067D2         S‚quance de retour au systeme(‚quivalent a 'ENDE)

A=DAT0 A

D0=D0+ 5

PC=(A)

@"

 

   Vous avez remarqu‚ que je d‚cr‚mente D1 juste avant de sauver les

registres. En effet si je le fait apres, ca va faire pareil sauf que quand je

vais restaurer les registres, il va me mettre une mauvaise valeur. Il va me

remettre celle de d‚pard et ca sera comme si j'avais rien fait.

 

   Faites attention quand vous tapez a ne pas vous tromper(sinon m‚mory clear)

et,(c'est un mec qui vous parle en connaissance de cause) pensez a protŠger

vos cartes(il m'est arriver souvent de perdre des heures de boulo parce que

j'avais fait une minuscule merde

exemple: si je me trompe et que je met A=R0 A,DAT1=C A(dans le source du dessus)

je suis sur que ca va faire un m‚gabug(pour une erreur minuscule)

ca m'est arriv‚ il y a une semaine(toute une carte et la m‚moire ras‚e et non

r‚cup‚rable, des dizaines de petits sources in‚dits et non sauv‚s, SNIF)

 

   Si vous voulez ecrire quelques chose dans la chaine, on voit(page 355) que

l'addresse de son contenu est dans D0. En fait

add chaine =R0

add contenu=R0+10=D0(on saute le prologue et la taille)

Pour mettre un truc dans la chaine tapez apres DAT1=C A:

 

$3F

(C barr‚(fleche bleu+4))*COCOHP*    (ou votre pseudo)

DAT0=C W

 

   Normalement il faudrait faire LC *COCOHP* mais c'est impossible(domage). On

est oblig‚ de d‚composer a la main pour le faire(3F veut dire charge moi les 16

quartets suivant dans C, voir page 366). J'aurais pu faire aussi

LC A234F434F48405A2

DAT0=C W

c'est pareil sauf que je met les codes ASCII directement dans C(je suis oblig‚

de les traduire).

DAT0=C W:veut dire, ‚cris moi les 16 cases de C a l'addresse point‚e par D0

         (ici D0= addresse du contenu de la chaine)

 

 

LIRE DANS LA PILE:

   La plupard des utils prennent des arguments dans la pile, il est donc bon de

savoir comment lire dans la pile leur contenu.

   Pour cela c'est tres simple. Si on fait A=DAT1 A au d‚but, on obtient, comme

ca a ‚t‚ expliqu‚ au d‚but A=addresse objet niveau 1. Pour obtenir l'adresse

de l'objet au niveau n, il suffit de faire:

 

D1=D1+ (n-1)*5   (n-1 comme ca pour le nivo 1:D1=D1)

A=DAT1 A         (on lit 5 cases= addresse objet nivo n)

 

maintenant supposons que nous voulions lire le contenu d'un binaire dans la

pile,(et faire une boucle avec):

 

tapez:

"GOSBVL 0679B

 

A=DAT1 A     lit adresse objet nivo 1(le binaire)

D0=A

D0=D0+ 10    On saute le prologue et la taille(10 cases)

C=DAT0 A     On lit 5 cases

*wait        Label pour la boucle

C=C-1  A     On d‚cremente C

GONC wait    Si le champs A de C n'est pas d‚pass‚(cela arrive quand C=0 A

             et que l'on fait C=C-1 A)

 

GOSBVL 0672D

A=DAT0 A

D0=D0+ 5

PC=(A)

@"

 

maintenant assemblez le et sauvez le.

mettez un binaire dans la pile(ex: # 30000h) et lancez le.

pas plus de # FFFFFh pour le binaire(car on fait la boucle sur le champs A

(vous verez ainsi la puissance de l'asm

FFFFFh=+de 1 million en d‚cimal et cela dure a peu pres 14 secondes, la boucle

est donc parcourue 75000 fois par seconde(comparez avec le RPN))

 

 

LIRE N'IMPORTE QUEL OBJET:

   Il est ainsi possible, si on connait la taille du prologue de l'objet de le

sauter et d'acceder au contenu de l'objet.(page 121, tous les objets)

   Mais grace a ce prologue et a cette taille, on peu determiner le type d'un

objet. Il suffit de lire les 5 premiere cases, et de les comparer a la table

donne‚ page 121

 

ex:

"!PC         Notation PC

GOSBVL 0679B

 

A=DAT1 A     A=add objet pile nivo 1

D0=A         recopi A dans D0 sur 5 cases

A=DAT0 A     On lit 5 cases a l'addresse de l'objet

 

LC 02933     On charge le prologue d'un r‚el dans C

?A#C A       On le compare … A sur 5 cases

GOYES fin    Si different alors quitte

 

LC 00700     Sinon un petit BEEP

D=C A        (D=fr‚quence, C=dur‚e en milisecondes, voir page 356)

LC 00050

GOSBVL 017A6

 

fin:

GOSBVL 0672D

A=DAT0 A

D0=D0+ 5

PC=(A)

@"

 

Si vous mettez un reel dans la pile avant de lancer le prog vous aurez un petit

BEEP tout mignon. Sinon que dalle.

 

   Souvent ce que l'on fait au d‚but c'est que l'on met des graphs dans la pile

pour les recopier a l'‚cran ou autre. C'est un m‚thode comme une autre mais je

vous expliqurais plutot comment les mettre directement dans les codes avec des

GOINA etc... C'est plus propre.

 

 

REMPLACER un objet dans la PILE:

   C'est simple il suffit de mettre l'addresse de votre objet a la place de

celle de l'ancien objet(pas de probleme, l'objet qui n'est plus dans la pile

est ‚limin‚ par le systeme). Pour l'exemple vous avez qu'a mettre un objet

quelquonque dans la pile, vous prennez le source pour mettre un objet dans la

pile auquel vous enlevez D1=D1- 5 au d‚but. Vous le lancez et l'objet au nivo 1

sera remplac‚ par la chaine r‚serv‚e.

 

 

CONCLUSION:

   La pile c'est sympas. Il faut savoir l'utiliser mais ca ne sert pas beaucoup

dans les demos ou les jeux. Elle sert juste a faire passer des donn‚es a l'ASM,

mais elle a rarement un autre role. Personellement je n'y ai jamais sauv‚ de

truc temporairement, c'est trop galŠre parce qu'apres faut la remetre comme

avant sinon arret systeme. Mais je me souviens d'un vieux labyrinthe ou j'avais

stock‚ a peu pres 50(il y avais toutes les vues) graph dans la pile, et a

chaque foi je les y lisait.