********************
* 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.