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