Initiation a l'assembleur Qu'est ce que l'assembleur, l'assembleur est un langage constitue d'une suite de chiffres hexad‚cimaux compr‚hensible par un microprocesseur* mais pratiquement incompr‚hensible par un homme. Pour faciliter la programmation, on a donne un nom ou mn‚monique … chaque instruction assembleur, par exemple, C0 … ‚t‚ appelle A=A+B B ( il est ‚vident que le nom a un rapport avec l'action r‚alis‚e par l'instruction, il aurait ‚t‚ bette de l'appeler TOTO ). Malheureusement, le processeur, lui ne comprend pas ces mn‚moniques, on utilisera donc un programme annexe appel‚ assembleur pour traduire la suite de mn‚moniques en une suite de chiffres hexad‚cimaux. Malheureusement pour nous, la HP48 est lente ce qui nous interdit de travailler dans un langage ‚volue comme le RPL ( La HP patine dans la semoule ) ou le C ( il existe tout de mˆme un compilateur Pascal assez rapide pour HP48 qui est distribue en sharware et qui tourne sur PC ). A cause de la faible vitesse d'horloge de la HP, nous sommes obliges pour avoir des logiciels rapides de programmer directement en assembleur. "Programmer en XYZ ", bˆtise a fait pi‚tiner l'informatique pendant des ann‚es, s'est pourquoi, je diviserais cette rubrique en 2 parties : La programmation ou conception d'algorithmes et l'assembleur. De ces 2 parties, la premiŠre est de loin la plus importante, car un langage n'est que la transcription de la pens‚ en une suite de signes ( auditifs, ‚crits... ) compr‚hensibles par d'autres ( def du petit Robert ) . Dans le cas particulier d'un langage informatique, s'est la traduction d'un algorithme en un langage compr‚hensible par un ordinateur particulier. Je compte donc dans cette rubrique vous apprendre … programmer ( ce qui vous servira quelque soit le langage que vous utiliserez ) et vous apprendre l'assembleur Saturn ( Le Saturn est le nom du processeur de la HP48, chaque microprocesseur possŠde un assembleur diff‚rent ). Programmer Programmer est un art comme la musique ( Mais pas inaccessible rassurez vous ), et comme tout art, il est difficile … transmettre. Je vais n‚anmoins essayer de vous initier a la PROGRAMMATION D‚velopper un programme, s'est 60% de conception sur papier, 25% de clavier et 15% de debugage* ( les 40% de devolopement sont de loin les plus "chiants" ). Je vais dans la partie Programmation tenter d'expliquer ce qui se cache derriŠre ces 60%. description du programme Il faut, avant de se lancer dans un programme quelconque savoir exactement tout ce qu'il doit faire. conception du programme Il faut exprimer, dans un langage simple, la suite d'actions que doit ex‚cuter le programme. La m‚thode que j'emploie personnellement, est une notation algorithmique avec un langage disposant de 4 structures, une structure de test ( SI ALORS SINON FIN SI ) et 3 structures de boucles ( TANT QUE FIN TANT QUE , REPETE JUSQU'A FIN JUSQUE et DE A FIN DE A ).Il est ‚vident que chacun peut se cr‚er son propre langage Pour chaque action "‚volu‚e" de "l'algorithme" on r‚p‚tera la mˆme op‚ration jusqu'… ce que les actions … effectuer soit assez simples pour ˆtre directement programm‚es dans le langage choisit. Voici un exemple d'un algorithme possible pour un arkanoid Initialiser le programme Afficher une pr‚sentation REPETE SI on appuie sur la touche A ALORS, faire d‚filer un info FIN SI SI on appuie sur la touche B ALORS red‚finir les touches FIN SI SI on appuie sur la touche J ALORS le jeu FIN SI JUSQU'A l'appuie sur la touche Drop FIN JUSQUE Ici l'instruction : "si on appuie sur la touche A" n'aura pas … ˆtre d‚taill‚e plus pour un programme en assembleur car on dispose d'une technique de test de touche "standard" (qui est … connaŒtre trŠs rapidement). Par contre il va falloir d‚tailler l'instruction "Le jeu" LE JEU Initialiser le jeu REPETER Initialiser le level REPETER Tester les touches et d‚placer la raquette Afficher la raquette D‚placer la balle SI elle est sur une brique ALORS d‚truire la brique FIN SI SI elle est tomb‚e ALORS enlever une vie SI il n'y a plus de vie ALORS perdu FIN SI FIN SI JUSQU'A ce qu' il n'y ait plus de briques FIN JUSQUE JUSQU'A ce que l'on soit au dernier niveau FIN JUSQUE Gagne On exprimera ainsi toutes les parties et sous parties ‚l‚mentaires du programme, jusqu'… ce que toutes les instructions … effectuer soit facilement programmables dans le langage choisit. ASSEMBLEUR SATURN l'assembleur est un langage dit de trŠs bas niveau, c'est … dire, pour le programmeur, que les instructions sont des instructions ‚l‚mentaires trŠs peut puissante mais rapides.Pour pouvoir programmer en ASM, on sera oblige de descendre bien plus profond dans l'analyse du programme que pour un langage ‚volu‚. Par exemple, en RPL, il existe l'instruction LINE. En assembleur, pour faire une ligne il faudra un programme de 300 instructions mais le line assembleur vas au bas mot 100 fois plus vite que le line RPL car il est programmer pour r‚pondre a des besoins trŠs pr‚cis ce qui permet de l'optimiser. Pour programmer en assembleur, il est indispensable de maŒtriser un certain nombre de choses essentielles. les instructions du microprocesseur ) La structure de la m‚moire ) voir Voyage au centre de la La structure des objets ) HP 48 de Paul Courbis et la structure du microprocesseur ) Sebastien lalande La structure Hard ( le dur, c'est … dire la structure ellectronique ) De maŒtriser PARFAITEMENT la base 2 ( le binaire ), la base 16 ( l'hexad‚cimal) et les op‚rations logiques .( Arithm‚tique de Boole, dans un quelconque bouquin sur les bases et il faut faire de nombreux exercices de conversion d‚cimale hexa binaire ). la syntaxe de l'assembleur que vous utiliserez. Dans cette rubrique , j'utiliserai la syntaxe de l'ASMFLASH d'HPninja sur HP48 en notation PC 0-15 ( disponible a Maubert ellectronique ou sur le serveur PULSAR :45-45-65-33). il existe ‚videment des assembleurs Saturn sur PC ( Areuh de P.David et J.taillandier , Satas de C.Dupont de Dinechin ) et un assembleur sur Mac ( HP48 ASM de C.bourjoit ( BouHP ) ). Moi, je suis la pour vous apprendre … traduire une instruction de votre algorithme en langage assembleur, pour vous donner des techniques de programmation, et des routines standart ( qui ne sont pas … recopier texto mais … adapter … chaque cas ), vous apprendre … optimiser un programme, vous transmettre toutes mes connaissances sur la HP48 et vous donner des compl‚ments sur les notions clefs suscit‚es ( cit‚es au-dessus pour les ignares ) les instructions du microprocesseur , leurs action et leurs specificites Voire la longue liste de Voyage (Je ne vais pas me faire chier a la taper ). Il ne faut pas s'affoler a la vue de la liste, en r‚alit‚, on peut regrouper les instruction par types d'action effectu‚es, il n'existe que 9 sortes d'instructions r‚ellement diff‚rantes ! ! !.Il suffit de savoir, a peut prŠs, les instructions dont on dispose, et l'on n'aura pas d'erreurs de syntaxe a l'assemblage. Trucs a conaitre pour ne pas taper des instruction inexistantes. On ne peut faire des ‚changes avec la m‚moire et les registres de sauvegarde qu'avec les registres A et C. Il n'existe des instructions math‚matiques et logiques qu'entre 2 registres "se suivant" et entre A et C ( A=A+D et B=B+D n'existe pas ) Le registre C est le registre roi , il dispose de tous les types d'instructions La structure du microprocesseur Le Saturn possŠde 13 registres, c'est a dire 13 zone de stockage d'informations les premiers registres ou registres de calcule sont au nombre de 4 et sont appel‚s A,B,C et D. En raison de leur longeure ( 64 bits , 16Q. par comparaison un registre de Intel 386 fait 32 bits ) ils sont divises en champs comme une propri‚t‚ agricole. Voici le Cadastre d'un registre de calcule F E D C B A 9 8 7 6 5 4 3 2 1 0 --------------------------Champ W------------------------------ s- --------------Champ M------------------------- -XS- --Ch B- ------champ A------ ----Ch X--- Il est possible de travailler sur n'importe quelle partie du registre, pour chaque instruction, il faudra presiser le champ du registre ou elle opererat ( on le mottera Cxs, registre C champ XS ) Par exemple A=A+C A : Addition de Aa et de Ca. il existe 2 autres champs, les champs P et WP qui sont de taille et de lieu variable, le Saturn possŠde un registre P ou Pointeur de champ, le registre P sera le quartet dont le num‚ro est dans le registre P et le champ WP l'ensemble des quartets de 0 a P il faut noter que lors d'un LC ou d'un LA, le chargement s'efectuerat a partir du champ P, si C contien 1111111111111111, que P est a 2, apres un LC 23 le registre C aurat comme valeure 1111111111123111 le saturn posede aussi 5 registres de sauvegarde notes R0, R1, R2, R3, et R4, ils sont divisees en champs comme les registres de calcul mais aucunes operations ne peuvent etre effectues sur eux autres que des instructions de sauvegardes et ceci seulement avec les registres A et C instructions avec les registres de sauvegardes A=Rx y, C=Rx y % recuperation du contenu de Rx dans Ay ou Cy Rx=A y, Rx=C y % stoquage de Cy ou Ay dans Rx ARxEX y, CRxEX y % echange du contenus de Ay ou de Cy avec Rx le saturn posede 16 drapeaux commes les flags RPL appeles STx qui peuvent etre soit a un soit a zero, il servent a conserver des etas du systemes generalement pour de tres courtes durees. les flags de 12 a 15 sont utilisees par la routine de traitement des interuptions ( le flag 15 sert a interdire les interuptions ) instruction sur les flags ST=0 x % mise a 0 du flag x ST=1 x % mise a 1 du flag x CLRST % mise a 0 de tous les flags C=ST % les drapeaux de 0 a 11 sont copies dans Cx a raison de 1 flag % par bit le program conter, ce registre contien l'adresse de la prochaine instruction a effectuer, c'est a dire qu'un saut se resume a une modification du program cunter A=PC, C=PC % mise dans Ca ou Aa de l'adresse de la prochaine instruction PC=A, PC=C % mise dans le programme cunter de l'adresse contenue dans % Aa ou Ca , le programme % continuerat a s'executer a cette adresse la APCEX, CPCEX % echange du contenus de Aa ou Ca avec PC, leprogramme % continuerat a s'efectuer a l'adresse % contenue dans Aa ou Ca PC=(A) , PC=c % on lit 5 quartets a l'adresse contenus dans Aa ou Ca % et on saute a cette adresse la La structure de la m‚moire La m‚moire de la HP48 est divis‚e en 6 zones distinctes, 5 d'entre elles peuvent ˆtre d‚plac‚e par l'utilisateur ou la machine ( lors du d‚but d'un programme assembleur , elles sont positionnes de maniŠres standart et doivent ˆtre dans cette mˆme position a la sortie ! !). Il faut voire la m‚moire comme une bande de papier d‚coup‚e en une multitude de petites case contenant chacune un chiffre hexad‚cimal. Chaque chiffre est rep‚r‚ par un num‚ro appel‚ adresse. une adresse est cod‚e sur 5 quartets. la premiŠre adresse est l'adresse 00000, la derniŠre l'adresse FFFFF. les zones m‚moires, a l'exception de la ROM peuvent ˆtre consid‚r‚es comme des bandelettes de papier que l'on pourrait placer ou l'on veut sur l'anneau m‚moire. ces bandes, de ce fait peuvent mordre les une sur les autres, si l'on lit la m‚moire a un endroit ou se recouvrent 2 zone m‚moire, on lira l'information de la bande du dessus. Pour pouvoir d‚placer ces zones m‚moires, il est n‚cessaires de savoir dans quel ordre elles sont g‚r‚es par le coprossesseur de pagination car, lors d'une demande de placement (configuration ) d'une zone m‚moire a un endroit quelconque il vas ex‚cuter la commande avec la premiŠre zone de m‚moire ( dans l'ordre de traitement ) non conffigurer. la premiŠre zone m‚moire de 256Ko est la ROM, ou est stock‚ le systŠme d'exploitation de la HP ( le noyau ), cette zone commence a l'adresse 00000 la deuxiŠme zone est une copie de la HIDDEN ROM et se situe en F0000 la troisiŠme zone de 64q appel‚e RAM des entres/sorties ou Driver commence a l'adresse 00100 et sert a l'‚change d'informations avec les copossesseurs ( elle recouvre une partie de la ROM ou il n'y a que des 0 ) la quatriŠme , la RAM d'une taille de 32Ko commence a l'adresse 70000 et sert a stoker toutes les informations du systŠme, les objets temporaires, et les donnes utilisateurs ( IL faut noter que la RAM recouvre une partie de la ROM appelle HIDDEN ROM les 2 derniŠres zone sont les zone des ports, elles ont la taille des cartes insŠres dans les ports, elles se situes au adresse 80000 pour le port 1 et C0000 pour le port 2. Mais , si la carte en port 2 est fusionn‚e et la carte en port 1 libre, la HP mets le port 2 en 80000 et le port 1 en C0000 ( rassurez vous, ceci a trŠs rarement a ˆtre pris en compte). Pour d‚placer une Zone de m‚moire, on a recourt a 2 instructions UNCNFG ( pour deconfigurer la zone m‚moire situ‚e a l'adresse charg‚e dans le registre Ca). Et CONFIG permettant de configurer la premiŠre zone m‚moire non configurer a l'adresse charg‚e en CaIl faut noter que pour une zone m‚moire de plus de 32Ko on devra pr‚ciser au copros la taille de m‚moire a configurere ( en r‚alit‚ l'inverse de la taille configurer ). pour onfigurer 32Ko en 70000 on devra faire LC F0000 % 32Ko = 10000 quartets et NOT 10000 = F0000 CONFIG % demande de configuration de 10000q ( 32Ko ) LC 70000 % on veut configurer la m‚moire en 70000 CONFIG % vas y , configure moi 32Ko en 70000 Voici donc d‚finie la structure Hard de la m‚moire. Je vous rasure on ne d‚place que trŠs rarement des bloques de m‚moire. ( La seule foie ou je l'ai fait s'‚tait pour d‚tourner le interruptions dans ma demo musicale ) Passons donc a l'accŠs m‚moire en assembleur. Le microprocesseur ‚tant trŠs limit‚ en capacit‚ de stockage d'informations il est n‚cessaire d'en stoker en RAM. pour ce faire, le Saturn dispose de 2 registres appel‚s pointeurs (D0 et D1 ) qui contiennes le num‚ro d'une case m‚moire, on dit qu'ils pointe a l'adresse de cette case On peut donner ou modifier l'adresse ou pointe ses registre garce aux instruction Dx= yyyyy % D1 vas pointer a l'adresse yyyyy ( on peut ne modifier % que les 2 ou 4 derniers chiffres de Dx % par les instructions Dx= yyyy et Dx= yy) Dx=A ou Dx=C % Dx prend la valeur de Aa ou Ca CDxEX et ADxEX % ‚change le contenus de Dx et de Aa ou Ca ( trŠs utile car % A=Dx et C=Dx n'existent pas ) Dx=Dx+ y % incr‚mente ou decremente Dx de y Dx=Dx- y % y ‚tant un nombre compris entre 1 et 16 A=DATx y et C=DATx y % lit ( peek ) le nombre de quartets sp‚cifi‚ par y ( y peut ˆtre soit un indicateur de champ soit un nombre comprit entre 1 et 16 ) a l'adresse point‚e par Dx et les place dans Cy. Le premier quartet lut ira dans le premier quartet du champ sp‚cifi‚, le deuxiŠme quartet lut dans le deuxiŠme quartet du champ etc... R‚sultat, les information en m‚moire sont retourn‚es.DATx=A y et DATx=C y % ‚crit (poke ) les quartets du champ pr‚ciser par y a l'adresse point‚e par Dx, les remarques valables pour le peek le sont aussi pour le poke. Exemple, pour incrementer de 1 un nombre sur 5 quartets placer a l'adresse 70200 D1= 70200 % D1 pointe sur le nombre s'est a dire en 70200 A=DAT1 A % Je place lit 5q en 70200 et je les place dans Aa A=A+1 A % J'incremente le nombre contenu dans Aa, c'est a dire le % nombre que j'ai lu en 70200 DAT1=A A % Je r‚crit en m‚moire le nombre que j'avais lut tout a % l'heure plus 1, car il a ‚t‚ modifier dans % le registre Aa mais pas en m‚moire