LEX 'MASERLEX' TITLE Utilitaire pr l'assembleur - J-J Moreau - <860202-860214> ID #E1 PARIS-ROM MSG 0 POLL Polhnd ENDTXT * Interceptons le poll pTRANS. Polhnd LC(2) =pTRANS Recherche-t-on 1 traducteur? ?B=C B GOYES Rep010 Repend RTNSXM * N'interceptons le poll pTRANS que si: * le fichier FORTHRAM est en place; * il est de type FORTH; * et correctement placÅ; * si MSG$ È ÅtÅ appellÅe par le biais de BASIC$; * et si l'assembleur tourne. Rep010 GOSUB Fth$? N'a-t-on pas ÅtÅ appellÅ par BASIC$? GONC Repend GOSUB Asrun? L'assembleur n'est-il pas en action? GOC Repend * Sauvegardons ds la pile de retour BASIC: * D(A); * R3(4-0) (D1); * R3(9-5) (D0); * RSTK(0) (->=FPOLL); * RSTK(1) (->=MSG$); C=D A Sauvegardons D(A) GOSUB pshup+ C=RSTK L'adr de retour È =FPOLL GOSUB pshup+ C=RSTK L'adr de retour È =MSG$ GOSUB pshup+ A=R3 Le D1 utilisÅ par MSG$ GOSUB pshupd A=R3 Le D0 utilisÅ par MSG$ GOSBVL =ASRW5 GOSUB pshupd * Signalons notre passage par un bref message sonore GOSBVL =CHIRP BEEP ! * Plaµons notre message ds le tampon de sortie: * construisons le message dont le n est ds R0(A); * ajoutons-lui ' , in line '; * puis le n de ligne courant du fichier source; * ajoutons enfin 1 octet supl. si nÅcessaire (LIF1). GOSBVL =D0=AVS D0 @ AVMEMS D0=D0+ 4 Saute le futur en-tÁte de la ligne C=R0 N message -> C(A); D1=(5) =F-R1-2 DAT1=C A -> S-R1-2. GOSBVL =TBMSG$ Place le msg È partir de (AVMEMS)+4 GOSBVL =D=AVME (AVMEME) -> D(A). C=B A Pointeur de fin de msg (1 quartet aprÉs) D0=C -> D0; * Ajout de ' , in line ' D0=D0+ 16 Assurons ns qu'il y a suffisemment de place pr ajouter: D0=D0+ 6 ' in , line '. CD0EX -> D0. ?C B(A). B=B-1 A (En fait l'assembleur est si pressÅ qu'il indique dÅjÈ * le n de la ligne suivante; d'oË l'instr. B=B-1 A) LCHEX F4 Convertissons le n de ligne en dÅcimal, puis en ASCII, GOSBVL =D0ASCI supprimons les 0 inutiles, et ajoutons le tt È la suite C=0 A du message, en prenant soin d'Åliminer tt dÅchet inutile DAT0=C B (È cause du format LIF1) CD0EX Sauvegardons le nouveau pointeur de fin de msg B=C A -> B(A). GOSBVL =D0=AVS D0 @ AVMEMS D1=(5) =OUTBS DAT1=C A : LET (OUTBS)=(AVMEMS)=DÅbut de la ligne qu'il faudra * mettre ds MASERT. D0=C Pointeur de dÅbut de ligne -> C(A) puis D0. D0=D0+ 4 Pointeur de dÅbut de msg -> D0 puis C(A). CD0EX B=B-C A Longueur du msg=(Pt de fin de msg+1)-(Pt de dÅbut de msg) BSRB Longueur en octets A=B A En fait 1 double A=A+1 A L'arondÑt au 1er entier pair, par valeur supÅrieure ASRB . A=A+1 A (Ajoute 4 quartets pr l'en-tÁte) A=A+A A . A=A+A A Convertit en quartets D1=D1+ (=AVMEMS)-(=OUTBS) LET (AVMEMS)=1 quartet aprÉs la fin du msg CD0EX . C=C+A A . DAT1=C A . A=B A RÅcupÉre le double de la longueur du msg GOSBVL =SWPBYT La met ss format LIF1 D0=D0- 4 D0 @ AVMEMS (c'est È dire l'en-tÁte de la ligne) DAT0=A 4 Ecrit l'en-tÁte * A ce point on a fabriquÅ 1 ligne de fichier TEXT contenant: * msg&' , in line '&n ligne * Cette ligne se trouve ds le tampon de sortie, c'est È dire entre (OUTBS) et * (AVMEMS). Il faut maintenant calculer l'adr. de la fin du fichier MASERT, et * dÅplacer la ligne du tampon de sortie vers le fichier. Rep100 LCASC ' TRESAM' Nom du fichier A=C W -> A(W). GOSBVL =FILEF Existe-t-il? GONC Rep500 D=0 W CrÅons-le en mÅmoire centrale C=0 W de longueur nulle R0=C R2=C R3=C C=C+1 A et de type TEXT R1=C * CrÅation du fichier TEXT MASERT. GOSBVL =CRTF GOC Reperr Reporte 1 Åventuel manque de place GONC Rep100 (B.E.T.) Cette fois-ci ns allons trouver le fichier! * Trouvons la fin du fichier MASERT. Rep500 A=0 A Recherchons la derniÉre ligne de MASERT, c'est È dire A=A-1 A celle qui n'existe pas (elle a pr n -1) * Initialisation des registres pr POSTXT. R1=A -1 -> R1(A). AD1EX Pointeur de dÅbut d'en-tÁte de fichier R3=A -> R3(A). GOSUB POSTXT Trouvons la ligne -1 GONC Rep510 Tout va bien ?C#0 A Est-ce 1 erreur sÅrieuse (Ni EOF ni EOD)? GOYES Reperr Rep510 ?ST=1 sBADRC Le fichier MASERT est-il corrompu? GOYES Repbad C=0 A 0 -> R3(A) : on insert 1 ligne È la fin du fichier CR3EX Pt de dÅbut de fichier -> C(A). AD1EX Pt de fin de fichier -> A(A). * TransfÅrons la ligne du tampon de sortie È la fin du fichier MASERT. GOSBVL =MGOSUB DÅplace la ligne, rÅactualise certains pointeurs... CON(5) =RPLLIN GONC Repext Tout va bien GOC Reperr (B.E.T.) Repbad C=0 A GÅnÉre 1 l'erreur : 'Fin de fichier' LC(2) =eEOFIL Reperr GOVLNG =BSERR * Remettons-tt en place: * RSTK(1); * RSTK(0); * R3(9-5); * R3(4-0); * D(A) . Repext GOSUB popupd Restaure R3(9-5) GOSBVL =CSLW5 R3=C GOSUB popupd Restaure R3(4-0) C=R3 C=D A R3=C GOSUB popupd Restaure RSTK(1) RSTK=C GOSUB popupd Restaure RSTK(0) RSTK=C GOSUB popupd Restaure D(A) (Sic) D1=(5) =F-R1-2 Restaure R0 (#msg) C=DAT1 A R0=C RTNSXM Rends finalement la main pshup+ A=C A pshupd GOVLNG =PSHUPD popupd GOSBVL =POPUPD C=D A RTNCC * Recherche du buf utilisÅ par l'ass.: CC=>NtFnd;CS=>Ok * DÅplacement de D1 d'aprÉs C(A) assbuf B=C A Sauvegarde C(A) D1=(5) =oVARID Recherche du buf C=DAT1 A GOSBVL =I/OFND RTNNC C=0 A LCHEX 534 Si ce buf È cette longueur, c'est que l'ass. doÑt tourner ?A=C A GOYES assbu8 RTN assbu8 AD1EX DÅplace D1 A=A+B A D1=A A=DAT1 A Lit la valeur de la var. pointÅe par D1 RTNSC * Voyons si c'est BASIC$ qui ns a appelÅ. Fth$? D1=(5) =MAINST C=DAT1 A D1=C A=DAT1 W LCASC 'MARHTROF' ?A=C W Le 1er fichier a-t-il pr nom FORTHRAM? GOYES Fth010 RTNNC (B.E.T.) Fth010 D1=D1+ 16 A=0 A A=DAT1 4 LC(5) (=FthFil)+1 C=C-A A Est-il de type: C=C-1 A FORTH? GOC Fth020 C=C-1 A FORTH sÅcurisÅ? RTNNC Non; dÅsarmons carry Fth020 D1=D1+ 16 D1=D1+ 5 A=DAT1 A D1=(5) =MAINST C=DAT1 A ?A=C A Est-il È sa place? GOYES Fth030 RTNNC (B.E.T.) Fth030 D1=(5) =ACTIVE C=DAT1 A C=C-1 A C=C-1 A C=C-1 A Armons carry si la valeur de ACTIVE est -2 RTN DÅsarmons carry sinon * DÅterminons si l'ass. tourne ou non. Asrun? C=0 A GOSUB assbuf GONC Asset Pas de buf. => pas d'ass. C=DAT1 A C=C-1 A C=C-1 A Ne faisons rien lors de la 1Ére passe (Sic) RTNC C=0 A LC(2) 65 GOSUB assbuf A=A-1 A Lors de la 2nd, ne faisons rien non plus si l'option RTNC LIST OFF est active D1=(5) (=oLSTNG)+2 C=DAT1 A C=C-1 B Ne faisons rien non plus s'il existe 1 listing-file GONC Asset (Inverse l'ÅtÀt de carry) RTNCC (B.E.T.) (.) Asset RTNSC (.) * Ceci est (encore) 1 routine HP. Elle trouve 1 ligne ds 1 fichier TEXT. * Reportez-vs pr plus de dÅtails aux IDS vol.1. POSTXT D1=A D1=D1+ =oFTYPh D1=D1+ (=oFLAGh)-(=oFTYPh) GOSBVL =FILSK+ D=C A D1=D1+ 5 CD1EX A=R1 GOSUB FRCRDr RTNNC C=0 A ?ST=0 =sBADRC RTNYES LC(2) =eEOFIL RTNSC FRCRDr R1=A A=0 W A=A-1 A R0=A ST=0 =sEOF ST=0 =sBADRC FRCR10 GOSUB PRSREC RTNC D0=C A=R0 A=A+1 A R0=A C=R1 ?A=C A GOYES rtncc ?ST=1 =sBADRC RTNYES CD0EX GONC FRCR10 (B.E.T.) PRSREC B=0 A D1=C ?C>=D A GOYES PRSR10 D1=D1+ 4 CD1EX ?C>D A GOYES PRSR20 A=DAT1 4 GOSBVL =SWPBYT P= 3 B=A WP C=B A B=B+1 WP P= 0 RTNC BCEX A CSRB C=C+1 A C=C+C A C=C+C A AD1EX D1=A C=A+C A ?C<=D A GOYES rtncc ST=1 =sBADRC rtncc RTNCC PRSR10 ST=1 =sEOF RTNSC PRSR20 B=B-1 A ST=1 =sBADRC RTNSC =ACTIVE EQU #2FB0C =ASRW5 EQU #0ED0A =AVMEME EQU #2F599 =AVMEMS EQU #2F594 =BSERR EQU #0939A =CHIRP EQU #0EC5A =CRTF EQU #116C1 =CSLW5 EQU #0ED3D =D0=AVS EQU #09B2C =D0ASCI EQU #09833 =D=AVME EQU #1A476 =F-R1-2 EQU #2F8B5 =FILEF EQU #09FB0 =FILSK+ EQU #06F1D =FthFil EQU #0E218 =I/OFND EQU #118BA =MAINST EQU #2F558 =MEMERR EQU #0944D =MFERR EQU #09393 =MGOSUB EQU #1AF01 =OUTBS EQU #2F58F =POPUPD EQU #08F3E =PRGFMF EQU #0A146 =PSHUPD EQU #08F0D =RPLLIN EQU #013F7 =SWPBYT EQU #17A24 =TBMSG$ EQU #099AB =eEOFIL EQU #00036 =oFLAGh EQU #00014 =oFTYPh EQU #00010 =oLSTNG EQU #2FC4D =oVARID EQU #2FC43 =sEOF EQU #00007 =sBADRC EQU #00008 =pTRANS EQU #000EF PgmRun EQU #0000D