LEX 'SWAPLEX' * (c) Copyright PPC Paris 1986 TITLE Utilitaire BASIC - J.J. Moreau - * <860215-860216> * 64 ave de la * paix * 93150 le * Blanc-Mesnil * (1) * 48-67-33-04 (SIG#? PC#149 CRTF#1) ID #E1 PARIS-ROM MSG 0 POLL 0 ENTRY Swap CHAR #D Programmable tout-terrain KEY 'SWAP' TOKEN 71 =ARRYCK EQU #0366A =AVE=D1 EQU #18BB8 =COMCK+ EQU #032AE =D1MSTK EQU #1954E =DEST EQU #0F7B0 =DSTRDC EQU #05280 =EOLCK EQU #02A7E =EXPEX- EQU #0F178 =EXPEXC EQU #0F186 =IVVARe EQU #02E66 =NTOKEN EQU #0493B =NXTSTM EQU #08A48 =POPMTH EQU #1B3DB =POPUPD EQU #08F3E =PSHUPD EQU #08F0D =RESPTR EQU #03172 =STORE EQU #0F5F8 =SVTRC EQU #0FA35 =SYNTXe EQU #02E2B =VARP EQU #0350E ENDTXT * Compile l'ordre SWAP: * tSWAP tVAR VAR tCOMMA tVAR VAR * c'est È dire SWAP var1,var2 * ex: SWAP Z9$,C0,A$,U5(I) Swapp GOSUB Swap+ Compile 1 var. GOSBVL =NTOKEN Cherche le token suivant * la var. prÅcÅdente GOSBVL =COMCK+ Est-ce 1 virgule? GONC syntxe Non GOSUB Swap+ Oui: compile 1 2nd var. GOSBVL =EOLCK N'est-elle pas suivie de: * tEOL, tTHEN ou t! ? GONC syntxe GOVLNG =RESPTR Si: alors tout est compilÅ * comme il faut Swap+ ST=0 8 GOSBVL =VARP GOC Swap+5 ST=1 8 Swap+5 ?ST=0 2 RTNYES GOSBVL =ARRYCK ?ST=0 8 RTNYES B=B-1 A ?B=0 P RTNYES syntxe GOVLNG =SYNTXe * DÅcompile une suite de variable: * tVAR VAR1 tCOMMA tVAR VAR2 tCOMMA ... tCOMMA * tVAR VARN * c'est È dire: VAR1,VAR2,...,VARN * ex: [DIM ]A,B,C2$,...,U9$(10) Swapd GOVLNG =DSTRDC DÅcompile une liste de * variables REL(5) Swapd REL(5) Swapp --- SWAP Var1,Var2 --- Swap GOSUB Swapt Initialise le mode TRACE * VARS GOSBVL =EXPEX- Place la valeur de la 1Ére * var. sur la pile * RÅactualise AVMEME GOSBVL =DEST Sauvegarde d'adrs pr le * stackage de la 2nd var. D0=D0+ 2 Saute la virgule (,) AD0EX Sauvegade le pointeur du * tampon d'entrÅe... R0=A ... dans R0 ... GOSBVL =PSHUPD ... et dans la pile de * retour BASIC A=R0 Restaure ce pointeur D0=A . GOSBVL =EXPEXC Evalue la 2nd variable * * Il est È noter que EXPEX- ne prÅserve pas ce * qui se trouve sous * l'AVMEME, mais considÉre que AVMEME=FORSTK, ce * qui n'est pas * le cas de EXPEXC qui ne touche en aucun È ce * qui se trouve entre * AVMEME et FORSTK, ce qui est trÉs utile si l'on * veut preserver qqch sur la pile. * Notons encore que les 2 routines rÅactualise * AVMEME avant de rendre la main, et prÅserve ainsi * les informations qu'elles viennent de dÅposer * sur la pile. * GOSBVL =STORE Stocke la 2nd var. ds la * 1Ére (Cf =RECALL, IDS vol.3) GOSBVL =POPUPD RÅcupÅrons maintenant le * pointeur du tampon C=D A de sortie D0=C . * * Rappellons que EXPEX- È laissÅ sur la pile les * informations relatives * È la 1Ére var.; EXPEXC ceux relative È la 2nd, * et au-dessus. * Ces derniÉres informations ne nous intÅressent * plus aussi allons-nous * les Åliminer, en incrÅmentant AVMEME. * GOSUB Swaps DÅtruit les info. * inutiles, c'est È dire saute par-dessus... GOSBVL =AVE=D1 ... puis rÅactualise AVMEME GOSUB Swapt Initialisons le mode TRACE * VARS GOSBVL =EXPEXC Rappellons que D0 @ tampon * de sortie * * La ligne prÅcÅdente peut vs paraÑtre inutile, * car elle * sert È mettre sur la pile la valeur de la 2nd * var., alors qu'on * vs È expliquer plus haut qu'on enlevait cette * info. qui ne servait * È rien. En fait c'est vrai; mais EXPEXC * initialise les reg. du CPU pr =DEST. * Pr rendre SWAP plus rapide, il faudra sans * doute remplacer ce dernier appel de EXPEXC * par un appel a RECALL ou ADDRSS. * GOSBVL =DEST PrÅpare le stockage ds la * 2nd var. GOSUB Swaps EnlÉve une fois pr tte les * info. inutiles A=DAT1 W Initialise A(W) GOSBVL =STORE Stocke var1 ds var2 GOVLNG =NXTSTM C'est tout Swaps GOSBVL =D1MSTK D1 @ AVMEME GOVLNG =POPMTH Saute le 1er truc sur la * pile Swapt ?ST=0 15 Mode TRACE? RTNYES Non GOVLNG =SVTRC Oui; l'initialise END