************************ * ROTATE * * par COCOHP l'ASMman * ************************ Ceci n'est qu'un petit programme hyper simple(dur de faire plus simple). Sans le graph il doit faire 100 octets. Sinon je vais aussi expliquer deux trucs: les GOINA, differrencier une HP48GX d'une HP48SX. LE SECRET DES GOINA: Alors pour connaitre l'addresse d'un graph, en gros il y a 2 m‚thode. Ou plutot 3. Pour ceux qui ont lu la doc sur la pile, on peu mettre le graph dans la pile puis apres lire son addresse avec A=DAT1 A. Il faut ensuite ajouter 20 a A pour que l'on saute le prologue et les indications de taille(voir page 142 de voyage). On met ensuite D0=A et voila, D0 pointe sur le debut du graph. Ensuite il y a la technique du C=RSTK. Pour ceux qui se rapellent le processeur repere le code a executer par le PC(program counter). Le PC contient sur 5 cases l'addresse du code suivant a executer. A chaque fois que le processeur a fini d'executer une instruction, il lit un par un les quartets contenus a l'addresse contenue dans le PC. Il s'arrete quand il voit que le code est complet(exemple 812=CRSC, il ne lit que 3 quartets, R0=A A se code 81AF00 et il va lire un par un les quartets qui composent ce code avant de s'arreter quand il s'appercoit que celui ci est complet). Il incr‚mente ensuite le PC du nombre de quartets qu'il a lu. C'‚tait juste un rappel (dont a mon avis beaucoups ne se rappelait pas). Quand un GOSUB est execut‚, l'addresse du code suivant le GOSUB (qui est dans le PC) est sauvegard‚e dans la pile. On additionne ensuite a la valeur contenue dans le PC la valeur donn‚e par le GOSUB. Un petit exemple pour ceux qui n'ont compris qu'a 99% GOSUB toto A=A+.. ...du code *toto ... RTN Quand le processeur lit GOSUB toto, il sauve l'addresse de l'instruction A=A+.. dans RSTK et il fait PC=addresse de toto. En r‚alit‚e pour un GOSUB il fait PC=PC+OFFSET toto.(OFFSET toto= distance de toto par rappord a la ou on est, et ca donne bien l'addresse de toto). A la fin du gosub, quand le processeur tombe sur RTN, il fait juste un PC=RSTK et il retombe sur l'instruction A=A+.. Vous allez maintenant comprendre comment on fait pour avoir l'addresse d'un graph. GOSUB aftergraph $010205050201 %un graph quelquonque *aftergraph C=RSTK D0=C On fait un GOSUB et on r‚cupere l'addresse du graph dans RSTK(‚tant donn‚ que dans RSTK a ‚t‚ empil‚ l'addresse du graph lors du GOSUB). RSTK est comme la pile RPN sauf qu'il y a 8 niveaux maximums. Enfin la derniŠre technique est celle du GOINA. Il n'y a pas besoin de RSTK. GOINA label signifie en fait distance de ou je me trouve jusqu'au label. Cella se traduit lors du code par un LA distance (c'est a dire A=distance(sur 5 cases)). Un petit exemple: C=PC GOINA dessin A=A+C A D0=A ... *dessin $010203102025 On fait au d‚pard un C=PC, c'est a dire C=addresse de l'instruction GOINA, (car c'est la suivante). Ensuite GOINA dessin fait A=distance entre l'instruction GOINA et le label dessin. En additionnant A et C on obtient donc l'addresse du dessin. Pouvait on faire plus simple. Je me suis servit des 3. Au d‚but je mettait tous mes graphs dans la pile. Ensuite je me suis servi de GOSUB avec des C=RSTK car ca ‚vite de se prendre la tˆte a mettre les graph dans la pile, de plus a chaque foi il fallait se positionner sur celle-ci pour avoir le bon graph. J'avais vu ca dans BANNER et je m'en suis reservi. Enfin j'utilise maintenant les GOINA, car ca evite de faire des gosub a chaque foi pour savoir ou est le graph. De plus en th‚orie on comprend mieux car on voit tout de suite ce que ca fait. Si cela vous interresse je donne les differentes significations des GOIN GOINA fait un A=distance entre le GOINA(ou le LA en realit‚) et le label GOINC meme chose pour C GOIN3 distance instruction GOIN3 et destination(label) cod‚ sur 3 cases GOIN4 code la distance sur 4 cases GOIN5 code la distance sur 5 cases si vous mettez un GOIN3 ou 4 ou 5 dans votre programme ca va bugger car ca n'est pas un code c'est une distance. Il faut les mettre dans des tables. Personellement je me suis servit de GOIN5 en quantit‚e quand j'ai cod‚ une librairy directement. On passe de code en HEXA sur asmflash. Pour les prologues on met des $D9D20 (par exemple en g‚n‚ral $prologue) et pour les distances il faut mettre des GOIN5. Ensuite vous passer de la chaine de chiffre hexa a un objet librairy par GASS ou autre. Par exemple. Vous pouvez recopier cela: "!HEXA $C2D20 GOIN5 fin ... bout de code quelquonque(a la limite rien) ... *fin @" assemblez le et executer ensuite GASS(ou d‚broullier vous avec les commandes de DEV). Voila c'est la mˆme chose que quand ASMFLASH le fait directement. A titre de documentation je vous donne 4 codes different pour faire la mˆme chose: un GOSBVL en ROM a l'addresse 002FF: GOSBVL 002FF un gosbvl tout con ou LC 002FF on charge l'addresse ou aller PC=C on la fait passer dans le PC:saut automatique et instantan‚ ou LC 002FF ou aller dans C RSTK=C on sauve dans la pile RSTK(on empile une valeur) RTN retour de GOSUB artificiel(on d‚sempile d'une valeur la pile et on saute a cette valeur) ou C=PC Technique du GOINA por avoir l'addresse de addROM(a la fin) GOINA addROM A=A+C A voila A=addresse de addROM(ou plutot de $FF200) PC=(A) PC=contenu de l'addresse point‚e par A ... (donc PC=002FF a l'endrois) *addROM $FF200 Le dernier est le plus ardu. Personellement je ne me suis jamais servit de PC=(A) dans mes programmes, c'est trops sp‚cifique, et il y a toujours plus simple pour le faire. DIFFERECIER UNE SX ET UNE GX: Dans une GX la RAM n'est pas au mŠme endrois que dans une SX. Dans une GX la ram commence en 80000 alors que dans une SX, c'est en 70000. A ces addresses pr‚cises, il y a le CMOS word de la calculette qui est la pour bien verifier que la RAM n'a pas ‚t‚ corrompue. Il suffit donc de lire 5 quartets en 70000, si c'est une SX alors ce sera le CMOS word, si c'est une GX ca ne sera pas le CMOS word(il est en 80000). Voila un minuscule test et on sait sur quelle calculette on est. Peut etre aves vous remarqu‚ que la minid‚mo dans FLAG.COD marchait sur SX et sur GX en mˆme temps, et plus fort, que ca allait a la mˆme vitesse sur les 2 calculettes. Bah c'est grace a ca. Si je suis sur une GX j'attend + parce qu'elle est plus rapide. Attention c'est du code automodifiable alors ne le d‚clenchez pas sur une carte proteg‚e. Regardez le code pour voir comment j'ai fait(si vous ˆtes pas encore parti parce que c'est trops simple). MINISCROLL TOUT NAZE: Sans me vanter, j'ai cod‚ ca en 10 minutes a peine. Comme vous vouliez des petits programmes sympas et court, en voila 1. Vous vous appercevrez alors de la nullit‚e de la DEMOXV, car il suffit de rajouter un filtre pour que le graph apparaisse dans une fenetre triangulaire ou de forme quelquonque a l'‚cran(mˆme une forme de dinosaur ou n'importe quoi, il suffit de faire le masque, un dessin tout noir avec mˆme des petits trous). On lit en mˆme temps le graph et le masque(a chaque ligne son masque) on fait un ET logique(ne garde que les bits en mˆme temps a 1). Et voila votre nom d‚file dans une forme de dinosaur, c‚ ti pas g‚nial. Si je n'etais pas si nul en dessin je vous l'aurait fait mais regardez d‚ja le dessin de daube avec marqu‚ cocohp que j'ai mis 20 minutes a faire(plus long que le code). Si quelqu'un m'envoit un beau filtre, je le fait en moins d'une minute(il y a 10 lignes a rajouter). Pour ceux qui veulent je peu mˆme animer le dinosaur en mˆme temps que le scrol d‚file. Comment ca marche. Et bah c'est le programme le plus con du monde. Il recopi juste le graph a l'ecran, seulemen a chaque foi, il d‚cale toutes les lignes d'un bit vers la gauche: (si la ligne de graph est dans A W(sur 16 cases)) A=A+A W multiplie par 2 ou d‚cale d'un bit GONC non d‚pass‚ si le dernier Bit ‚tais 0, alors le champs W, n'est pas d‚pass‚(le r‚sutat de la multiplication tient dans A W) A=A+1 W Sinon le champs W est d‚pass‚(quand on a fait le d‚calage vers la gauche un bit a 1 a ‚t‚ perdu, ou encore, le r‚sultat de la multiplication ne tient pas dans A W) Donc on remet qui a ‚t‚ perdu a la fin au d‚but *non d‚pass‚ On a donc globalement une rotation circulaire des bits. On les d‚cale tous vers la gauche. bit0=0 bit1=ancien bit0 bit2=ancien bit1 .... bit63=ancien bit62 ancien bit 63 est perdu(sauf que la CARRY se met a 1 s'il ‚tait a 1) on teste donc par un GONC s'il ‚tait a 1 et si c'est le cas on le remet dans le Bit0 par A=A+1 W(ou encore ABIT=1 0) Voila … chaque foi, on r‚‚cris la ligne d‚cal‚e dans le graph et dans l'‚cran. La foi d'apres on la red‚calera avant de la r‚‚crire dans le graph et dans l'‚cran. "!PC !0-15 'PRO INTOFF %poke menu pour HBL D0= 00128,LC 37,DAT0=C B il faut mettre une valeur en 128 pour pouvoir ensuite lire son contenu(sinon ca marche pas) %SX ou GX %position dans l'ecran D0= 70000 addresse du CMOS word sur SX A=DAT0 A on lit 5 cases dans A LC A5C30 C=CMOS word(voir page 175) ?A#C A ,GOYES nonSX on teste si A diff‚rent de C sur 5 cases D0= 7050E,GOTO nonGX non alors on est sur SX(D0=add pour l'‚cran SX) *nonSX D0= 8068D oui alors on est sur GX(D0=add pour l'‚cran GX) *nonGX A=DAT0 A on lit l'addresse de l'‚cran en 7050E ou 8068D LC 002F5 on va y ajouter 2F5 pour se positionner au milieu de l'‚cran 2F5=34*22+9 22eme ligne et 9*4=36eme collonne A=A+C A R3=A A on sauve cette addresse dans R3 %affiche le graph *boucle GOSUB hbl ralenti GOSUB hbl ralenti(attend la HBL) %D0=add dessin C=PC,GOINA dessin,A=A+C A D0=A D0=addresse dessin(GOINA voir plus haut) %D1=add ecran A=R3 A D1=A D1=position dans l'ecran(sauv‚ dans R3) LC 1D %nb de lignes *rotate A=DAT0 W lit 16 cases dans le d‚ssin(1 ligne quoi) A=A+A W la d‚cale de 1 bit vers la gauche GONC nondepasse test le bit qui est sorti A=A+1 B si =1 alors on met le bit0 a 1 *nondepasse sinon on fait rien DAT1=A W on ‚cris le r‚sultat a l'‚cran DAT0=A W mais aussi dans le d‚ssin D0=D0+ 16 ligne suivante dans le graph(grah de 64 de large->64/4=16 quartets par lignes) D1=D1+ 16 ligne suivante dans l'‚cran(16+16+2=34) D1=D1+ 16 D1=D1+ 2 C=C-1 B d‚cr‚mente le nombre de lignes trait‚es GONC rotate tant que c'est pas fini on recomence %teste ENTER LC 010,OUT=C,GOSBVL 01160 teste si on a appuy‚ sur ENTER ?CBIT=0 4,GOYES boucle si "non" on resaute au d‚but *wait LC 010,OUT=C,GOSBVL 01160 si oui on attend que la touche soit lach‚e ?CBIT=1 4,GOYES wait INTON 'ENDE prologue de fin et tout %gosub HBL *hbl D0= 00128 *hbl1 C=DAT0 B,?C=0 B,GOYES hbl1 *hbl2 C=DAT0 B,?C#0 B,GOYES hbl2 RTN %merge le dessin *dessin 'COCO @" CONCLUSION: Je ne voulait pas faire un truc aussi long pour un programme aussi petit. Mais bon j'avais commencer a commenter le source directement sur HP et c'est trops prise de tˆte. C'est pas parce que je vous dis que c'est simple, et que vous ne comprenez pas bien qu'il faut vous d‚courager. Je veux juste dire que pour un mec qui sait un peu programmer, c'est vraiment tres facile. Et quand vous relirez tout ca une foi que vous saurez bien programmer, vous vous rendrez compte que l'asm c'est vraiment tout bˆte. Il n'y a pas plus ob‚issant et plus fiable. Tous les commentaires en CRS.