LEX 'LINKLEX' * (c) Copyright PPC Paris 1986 ID #E1 MSG 0 POLL 0 ENTRY LABEL$ CHAR #F ENTRY PMN CHAR #F KEY 'LABEL$' TOKEN 76 KEY 'MNEMO' TOKEN 77 ENDTXT ADHEAD EQU #181B7 D=AVMS EQU #1A460 DRANGE EQU #1B076 EXPR EQU #0F23C FNRTN4 EQU #0F238 HDFLT EQU #1B31B REV$ EQU #1B38E REVPOP EQU #0BD31 ************************************************** * * Nom: MNEMO ; Type: fonction * * Syntaxe: MNEMO(chaÑne) * * But: 'chaÑne' est l'enregistrement d'un fichier * source, MNEMO renvoie la position de la * mnÅmonique en tenant compte des cas * particuliers suivants. * * Sortie: P= MNEMO(chaÑne) * P=0: chaÑne nulle (LEN=0) * chaÑne blanche * chaÑne dÅbutant par '*' * POS(1er caractÉre # espace) > 24 * P#0: P ^ mnÅmo si enregistrement valide * P=LEN(chaÑne) si chaÑne='label...' ************************************************** NIBHEX 411 1 chaÑne PMN GOSBVL REVPOP MS <- chaÑne retournÅe CD1EX D1 @ 1er car (low mem) D1=C C[A]= D1 C=C+A A et A[A]= longueur RSTK=C RSTK @ sommet Math Stack ASRB Nb quartets -> octets R1=A R1= LEN ST=1 0 * Cherche 1er caractÉre GOSUB PMN10 * <> espace GOC exit0 Tous blancs/chaÑne nulle B=C B B[B]= 1er caractÉre LCASC '*' ?B=C B Ligne de remarque ? GOYES exit0 oui C=R1 C[A]= LEN C=C-A A B=C A B[A]= position C=0 A LC(2) 24 ?B>C A Position > 24 ? GOYES exit0 C'est une ligne de Rem LC(2) 3 ?B espace * (= dÅbut mnÅmonique) * PMN30 ST=1 0 GOSUB PMN10 GOC exitln Pas trouvÅ C=R1 C[A]= LEN C=C-A A B=C A B[A]= position GONC Exit B.E.T. ********************************** * Recherche du 1er caractÉre * = blanc ( ST=0 0 ) * # blanc ( ST=1 0 ) * * EntrÅe: * D1 = dÅbut recherche * A[A]= longueur chaÑne * * Sortie: * Carry SET --> Not Found * Carry CLR: * D1 @ caractÉre suivant * A[A]= Len - position * C[B]= caractÉre ********************************** PMN10 LCASC ' ' B=C B B[B]= ' ' PMN15 A=A-1 A Fin chaÑne ? RTNC oui: retour CS C=DAT1 B C[B]= caractÉre D1=D1+ 2 ?ST=1 0 Teste si # blanc ? GOYES tst# oui tst= ?B#C B blanc ? GOYES PMN15 RTN oui: retour CC tst# ?B=C B # blanc ? GOYES PMN15 RTN oui: retour CC ********************************** * Nom: LABEL$ ; Type: fonction * * Syntaxe: LABEL$(string$) * * But: vÅrifie que string$ est une Åtiquette * valide * d'un programme assembleur. Les conditions * È remplir sont les suivantes. * * EntrÅe: une chaÑne, appelÅe LABEL$ * * Sortie/algorithme: * Si LABEL$[1,1]='=' * LABEL$=LABEL$[2] * Si len(LABEL$)>6 * ou len(LABEL$)<2 * ou LABEL$[1,1]='#' * ou LABEL$ commence par 1 chiffre * --> renvoie chaÑne nulle * Si len(LABEL$)=2 et LABEL$='XS' * --> renvoie chaÑne nulle * Renvoie LABEL$ * * Exemples: * "TEST145" --> "" car len>6 * "LBLtst" --> "LBLtst" * "=NXTSTM" --> "NXTSTM" * car '=' en 1er position est ignorÅ * "#FFC" --> "": c'est une adresse * "#TST" --> assimilÅ cas prÅcÅdent * "1token" --> "": commence par 1 chiffre * ********************************** NIBHEX 411 1 chaÑne LABEL$ GOSBVL REVPOP cf MNEMO B=0 W B=A A BSRB B[A]= LEN en octets C=0 A C=C+1 A ?B<=C A LEN<2 ? GOYES null$ A=DAT1 A A[3-0]= LABEL$[1,2] LCASC '=' ?A#C B LABEL$[1,1]='=' ? GOYES LBL10 non * On Åjecte '=': LABEL$=LABEL$[2] * B=B-1 A LEN= LEN-1 D1=D1+ 2 D1 @ 2e caractÉre A=DAT1 A * B[A]= LEN ; D1 @ 1er caractÉre valide * A[3-0]= LABEL$[1,2] * LBL10 LC(2) 2 C[A]= 00002 ?BC A LEN>6 ? GOYES null$ LCASC '#' ?A=C B LABEL$= '#....' ? GOYES null$ GOSBVL DRANGE Commence par un chiffre ? GONC null$ oui LC(2) 2 ?B#C B LEN#2 ? GOYES LBL30 oui * LEN=2: teste si LABEL$='XS' * LCASC 'SX' P= 3 ?A#C WP DiffÅrent ? GOYES LBL30 oui * Renvoie une chaÑne nulle. Pour cela on * positionne le pointeur de dÅbut de chaÑne D1 * en fin de chaÑne & on indique une longueur nulle * null$ CD1EX C=C+B A D1=D1+LEN (quartets) C=C+B A CD1EX D1 @ sommet MS B=0 A LEN=0 * Renvoie la chaÑne pointÅe par D1, dont la * longueur est en B[B] en octets * LBL30 P= 0 B=B+B B octets -> quartets GOSBVL D=AVMS D[A]=AVMS ; C=D1 C=C+B A C= pointeur+longueur R1=C R1 @ sommet MS (hi mem) * D1 @ dÅbut chaÑne (lw mm) ST=1 0 Retour aprÉs ADHEAD GOSBVL ADHEAD Construit en-tÁte chaÑne GOSBVL REV$ Retourne chaÑne GOVLNG EXPR Renvoie la chaÑne pointÅe * par D1 sur la MS END END