LEX 'ENDUPLEX' ID #71 MSG 0 POLL polhnd ENTRY endst CHAR #F ENTRY endup CHAR #D ENTRY start CHAR #F KEY 'ENDUP$' TOKEN 16 KEY 'ENDUP' TOKEN 17 KEY 'STARTUP$' TOKEN 18 MEMERR EQU #0944D MOVEU3 EQU #1B177 I/OALL EQU #1197D I/ODAL EQU #11A41 STROVF EQU #1411A REVPOP EQU #0BD31 D=AVMS EQU #1A460 EXPEXC EQU #0F186 XXHEAD EQU #1A44E DELAYd EQU #05493 STRNGP EQU #0379D LINEP+ EQU #02626 I/ORES EQU #118FF I/OFND EQU #118BA SFLAGS EQU #135FA SFLAG? EQU #1364C STKCHR EQU #18504 ADHEAD EQU #181B7 NXTSTM EQU #08A48 bSTART EQU #808 bENDUP EQU #A00 "A00" est le Nr de buffer * de l'ordre "ENDUP". flPWDN EQU #CF flTNOF EQU #CD pCONFG EQU #FB pPWROFF EQU #FC ENDTXT polhnd LC(2) pCONFG Est-ce le moment de * sauver le buffer ? ?B=C B GOYES savebf -Oui LC(2) pPWROFF -Non; le 71 veut-il * dormir ? ?B=C B GOYES xeq -Oui GONC rtncc -Non; c'est un BET. out C=R0 Ces lignes font partie * d'un point de sortie. * Cette place D=C A est inhabituelle, mais * Åvite un GOTO * supplÅmentaire. savebf LC(3) bENDUP Trouve ce buffer, s'il * existe, et empÁche sa * destruction. GOSBVL I/ORES rtncc A=0 A Il est indispensable de * dÅsarmer Carry, que le * poll ait A=A+1 A ou non ÅtÅ interceptÅ. RTNSXM Rend la main È l'appelant. xeq LC(3) bENDUP Il n'y a rien È faire si * le buffer n'existe pas. GOSBVL I/OFND GONC rtncc C=D A Le poll interceptÅ Åtant * un poll rapide, il faut * impÅrativement R0=C prÅserver D(A). LC(2) flPWDN Les 3 lignes suivantes GOSBVL SFLAG? peuvent Átre supprimÅes si GONC out l'on dÅsire que le HP71 * exÅcute le buffer mÁme en * mode programme. Mieux vaut * les garder, en vue d'une * utilisation future par HP, * È moins que ce ne soit * indispensable. LC(2) flTNOF La dÅmoniaque bÁte * s'Åtait-elle endormie ? GOSBVL SFLAG? GOC out Alors il ne faut pas la * dÅranger. LC(2) flTNOF AmÉnera TITAN È se * rendormir aprÉs un cours * passage par GOSBVL SFLAGS MAINLP. CD1EX D1 est inchangÅ depuis * GOSBVL I/OFND. Il pointe * sur la * chaÑne dans le buffer. GOVLNG LINEP+ Le buffer est copiÅ, * "tokenize", puis exÅcutÅ. strngp GOVLNG STRNGP delayd GOVLNG DELAYd REL(5) delayd DÅcompile ENDUP. REL(5) strngp Compile ENDUP: ENDUP * [chaÑne]. endup GOSBVL EXPEXC PrÅpare l'Åvaluation * d'une expression (?). GOSBVL XXHEAD Retire l'en-tÁte de la * chaÑne sur la pile. LCHEX #0D Signale du BASIC en * ASCII: la chaÑne devra * donc Átre P= 1 "tokenize". * STKWP n'est pas un point d'entrÅe supportÅ par * HP. Les possesseurs d'un HP-71 version 1BBBB * peuvent Åventuellement remplacer les lignes qui * suivent par: GOSBVL #1A55D. ST=0 0 * DesarmÅ pour que CD1EX * S ADHEAD rende la main. C=-C A * C+P+1 * T C=-C A * ?CC A * GOYES char10 * Sort en cas de chaÑne C=R2 * nulle. GOSBVL I/ODAL * DÅtruit l'ancien buffer * si nÅcessaire. GOVLNG NXTSTM * Continue l'exÅcution charer GOVLNG MEMERR * d'une ligne multi-ordres char10 B=A A * Copie la longueur C=0 A * actuelle du buffer. LC(2) 192 * 95 caractÉres + CR ?A<=C A * GOYES char40 * GOVLNG STROVF * ChaÑne est trop longue. char40 R1=A * C=R2 * C(A)= buffer ID. GOSBVL I/OALL * Alloue au buffer l'esp. * occupÅ par la chaÑne. GONC charer * Erreur en cas de mÅmoire * insuffisante. A=R0 * A= pointeur de chaÑne. D0=A * C=R1 * C= longueur de la chaÑne GOSBVL MOVEU3 * Copie la chaÑne dans le GOVLNG NXTSTM * buffer NIBHEX 00 start LC(3) bSTART GONC run (B.E.T.) NIBHEX 00 endst LC(3) bENDUP run AD1EX Sauvegarde D1 R1=A GOSBVL I/OFND Recherche le buffer. Arme * Carry s'il existe. CD1EX D0= adresse du dÅbut de * la chaÑne. CD0EX B=C A Sauvegarde l'ancien D0 =PC GOSBVL D=AVMS A=R1 RÅactualise D1. D1=A GONC bf2s20 Carry est dÅsarmÅe si le * buffer n'existe pas. * Renvoie * alors la chaine nulle. bf2s10 A=DAT0 B Recopie un caractÉre du * buffer. LCHEX 0D Peut-on faire autre chose? ?A=C B GOYES bf2s20 -Oui C=A B -Pas encore; il faut * placer le caractÉre sur la * pile GOSBVL STKCHR D0=D0+ 2 GONC bf2s10 et passer au suivant * (B.E.T.). bf2s20 C=B A Restaure D0. D0=C GOVLNG ADHEAD Renvoie enfin la chaÑne È * l'utilisateur impatient * et... END