Routines "Standard" Test de touches: LC 001 % couple out de la touche testee, en l'ocurence + OUT=C % on "evoie" le courant dans le clavier GOSBVL 0115A % et on recupere ce qui "ressort" on n'utilise pas % A=IN car cette instruction buge si elle est sur un % adresse impaire , 115A corespond a A=IN RTN, et % le A=IN est sur une adrese paire ?ABIT=0 0 % le bit 0 corespond au couple in de la touche + GOYES PAS.APPUYEE % si il est a 0 s'est que la touche n'est pas pressee % donc on saute EXECUTION DU PROGRME DE LA TOUCHE % sa, au moins, c'est clair *PAS.APPUYEE % et la label de fin de saut Modifications possibles au lieu du GOYES, on peut, si la routine est appelle en GOSUB faire un RTNYES si le programe EXECUTION DU PROGRME DE LA TOUCHE est trop long, on peut faire ?ABIT=1 0 GOYES APPUYEE GOTO PAS. APPUYE *APPUYE EXECUTION DU PROGRME DE LA TOUCHE *PAS.APPUYE Initialiser un programe asembleur GOSBVL 0679B % La routine est en ROM alors on se borne a l'appelee, elle % sauve les registres Ba, Da, D1, D0 qui sont utilisees en % standard par le RPL, cette Routine ne modifie ni Aw ni Rxw Interdire les interuption ? mais , qu'est ce qu'une interuption. une interuption, ou exeption, c'est comme la sonerie du telephone, on est en train de faire quelque chose et sa sonne alors on vas decroche. Le coprosseseur, lui, kan ,sa sonne il fait un GOSBVL 0000F, si vous vous amuses a desasembler en F vous trouverez une routine monstrueuse qui ralentierat tout programe assembleur si les interuption ne sounts pas interdites.la routine en 01115 interdit les interuptions il faut bien entendut remetre les interuption a la fin d'un programe, la routine / 010E5 Recuperation de l'adresse d'un objet inclut dans un code l'objet serat inclut dans le code au moyen d'une macro. avec asmflash, vous devez cree dans le directoiry home un repertoire Macro. l'objet a inclure dans le code serat stoquer sous forme d'une chaine ascii ( hexa concactenee) sous un nom quelquonque on l'introduirat a l'endroit voulut dans le code en precetant son nom d'un "/" GOSUB apres.macro % on saute les datas tout en sauvegardant leure adresse % dans rstk /nom.du.fichier % Macro *apres.macro C=RSTK % Ca contiend l'adresse des datas routine de disp ( afichage d'un charactere ) pour aficher un charactere, il faut savoire quel charactere aficher, et avoire la fonte de charactere. aficher un charactere, s'est aficher le graphique d'un charactere. prenons l'exemple de l'afichage du charactere contenus dans Ab au coordonee contenues dans R1a et R2a sur un ecran standard dont l'adresse est dans R0a GOSUB APRES.FONTE /FONTE *APRES.FONTE C=RSTK % recuperation de l'adresse de la fonte ASL A % multiplication de Aa par 16 car le grob d'un charactere de 8*8 est code sur 16 quartets A=A+C A D1=A % D1 pointe maintenant sur le grob du charactere choisit A=R2 A % un ecran de taille standard fait 22h quartets, l'ecran etant % code ligne par ligne on multiplie le numero de ligne par 22h % pour conaitre l'adresse de la ligne a laquelle on afiche A=A+A A % on multiplie Y par 2 B=A A % Ba = Y*2 ASL A % Aa = Y*2*16 A=A+B A % Aa = Y*2+Y*2*16 = Y*22 C=R0 A % Ca = @ ecran A=A+C A % Aa = @ ecran + Y*22 = @ ligne ou l'on doit aficher C=R1 A % on veut conaitre l'adresse du quartet ou aficher, un quartet % s'est 4 pixels, donc on divise X par 4 pour savoire sur quel % quartet aficher B=C P CSRB A % Ca = X/2 CSRB A % Ca = X/4 A=A+C A % Aa = @ ecran + Y*22 + X/4 = @ pixel ou aficher D0=A % D0 pointe sur ce pixel LC 703 % on stoque 7 dans Cx et 3 dans Cp B=B&C P % on fait un et logique de Bp avec 3, 3h=0011b, donc on met a 0 % les bits 2 et 3 de B, dit autrement, on module X par 4 car on % conait le quartet ou ecrire mais pas le bit ou pixel car un % bit, l'orce qu'il est a l'ecran est considere comme un pixel % conserne de ce quartet *BOUCLE.AFICHE A=0 X % a est mis a 0 car pour aficher au pixel pres on vas % decaler le graphique du characer dans le registre mais % le grob faisant 8*8, il tient sur 2q mais si on veut % l'aficher sur le 3emme pixel on devera le decaler 3 % foies et utiliser jusqu'a 11 bits donc le champ X A=DAT1 B % on lit une ligne de la lettre C=B P % on recupere le decalage en pixel de la lettre C=C-1 P % si il est de 0, on ne decale pas GOC FIN.DECALE A=A+A X % il est au moins de 1, on multiplie donc Ax par % 2 ce qui corespond a le decale de 1 quartet % vers la gauche donc de 1 pixel C=C-1 P % on recomence l'operation 2 * GOC FIN.DECALE A=A+A X C=C-1 P GOC FIN.DECALE A=A+A X *FIN.DECALE DAT0=A X % on afiche enfin la ligne a l'ecran D1=D1+ 2 % on passe a la ligne suivante sur le grob D0=D0+ 16 % puis sur l'ecran D0=D0+ 16 D0=D0+ 2 C=C-1 XS % on decrement le compteur de ligne GONC BOUCLE.AFICHE % si il y a une retenue, on arette Modification possibles on peut modifier très facilement la hauteur des caractères, il suffit de changer la valeur de bouclage en Cxs et la multiplication du numéro de caractère en Aa, en assembleur, lorsque que l'on connaît l'un des nombres du produit, au lieu de faire une multiplication bette et longue, on va la faire grâces à une suite d'addition et de multiplication par 2 ou 16 que sait faire le Saturn Exemple A*5 = A*2*2+A ce qui se traduira par B=A A; A=A+A A;A=A+A A; A=A+B A pour aficher toute une ligne, on a 2 methodes: ou l'on appelle plusieures foies la routine de disp en incrementant le X ou l'on modifie la routine de disp pour que, apres l'afichage d'un charactere, D0 pointe sur le charactere suivant en soustrayant a D0 HAUTEURE CHR*22-Larrgeure grob en quartets une routine de disp est comme vous avez put le constater une routine d'afichage dont les grand trais sont RECUPERE L'ADRESSE DU QUARTET OU AFICHER RECUPERE L'ADRESSE DU GROB A AFICHER DE A=1 A NOMBRE DE LIGNE A AFICHER LIRE LA LIGNE 1 LA DECALER ECRIRE LIGNE 1 PASSER A LA LIGNE SUIVANT SUR LE GROB A AFICHER PASSER A LA LIGNE SUIVANT SUR LE GROB OU L'ON AFICHE FIN DE A etant doner le decalage avec ce genre de routine, on ne peut aficher plus de 61 pixel, mais c'est largement sufisant pour des targets Routine d'afichage en GOR d'un target de 16 * 16 aux coordonee dans X:Aa et Y:Ca, sur un ecran standard son adresse etant en R0a C=C+C A % multiplication par 22h qui doit devenire clasique pour vous B=C A CSL A C=C+B A B=A P % mise en memoire des 2 dernires bits de X pour le decalage ASRB A ASRB A A=A+C A % Aa = Y*22 + X/4 C=R0 A A=A+C A D0=A % D0 pointe sur le quartet ou aficher LC 3 B=B&C P % on ne garde que les 2 derniers bits de X, on module X par 4 GOSUB APRES.TARGET /TARGET *APRES.TARGET C=RSTK D1=C % D0 pointe sur le grob a aficher LC F % on doit boucler 16 foies D=C P *BOUCLE.AFICHE A=0 A % mise a 0 de Aa pour que les pixels de plus que l'on % afiche soit blancs A=DAT1 4 % on lit le grob C=B P C=C-1 P % on decale pour etre precis au pixel pres, car sur 1 % quartet on a 4 bits GOC FIN.DECALE A=A+A A % decalage d'un pixel ( multiplication par 2 en % binaire ) C=C-1 P GOC FIN.DECALE A=A+A A C=C-1 P GOC FIN.DECALE A=A+A A *FIN.DECALE C=DAT0 A % on lit le graphique a l'ecran C=C!A A % on fait un ou logique avec le graphique que l'on veut % aficher DAT0=C A % et on afiche le resultat D1=D1+ 4 % on passe a la ligne suivante sur le grob a aficher D0=D0+ 16 % et sur l'ecran D0=D0+ 16 D0=D0+ 2 D=D-1 P % decrementation du nombre de lignes qu'il reste a % aficher GONC BOUCLE.AFICHE % si le nombre etait diferent de 0 on recomence Modification possibles la hauteure du grob a aficher: on modifie juste le nombre en Dp ( attention, si on veut aficher plus de 16 lignes, on deverat passer sur un champ b la largeure du grob ( cette routine ne permet pas d'aficher un grob de plus de 61 pixel de large ), on modifierat l'incrementation de D1, qui deverat s'incrementer de le largeure e quartets du grob et le champ sur lequel on travaillerat pour les decalage et le ou ( pour un grob plus grand, on peut travailler sur un champ m ou w ou , plus interesant car plus rapide sur un champ wp ) Routine de Pixon ( alumer un point a l'ecran ) cette routine prend comme argeuments : l'adresse de l'ecran dans R0a, la coordonee X dans Aa et la coordonee Y dans Ca ( c'est la routine la plus rapide a l'heure actuelle!!) C=C+C B % multiplication de Ca par 22h pour avoire l'ofcet ligne ( ofcet: % decalage depuis l'adresse de depart en quartets ) B=C A BSL A B=B+C X % B=Ca*22h C=A P % on recupere en Cp les 2 bits de X qui nous indiqueronts le bit a % metre a 1 ( ne pas oublier que sur 1q on stoque 4 pixels ) ASRB B % on divise X par 4 pour avoire l'ofcet quartet ASRB B B=B+A X % et on l'aditione a Y*22h pour avoire l'ofcet du quartet ou ce % situe le bit a alumer A=R0 A A=A+B A % en y ajoutant l'adresse de l'ecran on trouve l'adresse du quartet % recherche D1=A % et on y fait pointer D1 CBIT=1 2 % la, c'est la grosse bidouille!! CBIT=1 3 % on vas se servire de p pour stoque dans le quartet 0 de C le bit % recherche P=C 0 LC 12480 P= 0 % puis on remet p a 0 A=DAT1 B % on lit 8 pixels ( plus rapide ) A=A!C P % on fait un ou avec le bit a metre a 1 DAT1=C B % et on reafiche ce qu'on a lut avec le bit corespondant au pixel a % 1