BIN 'DIFBIN' =ADRS40 EQU #0F52B =AVE=D1 EQU #18BB8 =D1=AVE EQU #18651 =DEST EQU #0F7B0 =ENDBIN EQU #0764B =EXPEXC EQU #0F186 =HDFLT EQU #1B31B =STORE EQU #0F5F8 =S-R1-2 EQU #2F88B =tCOM EQU #F1 =tEOL EQU #F0 =tLITRL EQU #C4 =tPRMEN EQU #F8 =tPRMST EQU #F4 =tSUB EQU #C1 =tSVAR EQU #2D CHAIN MINPR premier sous-programme GOVLNG =ENDBIN REL(2) MINPRC CON(2) =tSUB MINPR CON(5) -1 pas d'autres sous-prog. CON(2) =tLITRL NIBASC 'MINPRIO' nom du sous-programme CON(2) =tPRMST CON(2) =tSVAR NIBASC 'T' premier parametre CON(2) =tCOM NIBASC 'P' deuxieme parametre CON(2) =tCOM NIBASC 'O' troisieme parametre CON(2) =tCOM NIBASC 'L' quatrieme parametre CON(2) =tPRMEN MINPRC CON(2) =tEOL * L=LEN(T$) SETHEX P= 0 LC(3) #074 code de T$ B=C X GOSBVL =ADRS40 D0=D0+ 2 C=DAT0 A D0=C D0 := ^ T$ A=0 A A=DAT0 4 A[3:0] := longeur T$ GOSUB CONPUS M.S. := LEN(T$) * P=0 @ K=0 @ O=6 C=0 A R0=C R0[A] recoit P D1=C D1 recoit K (var. locale) C=C+1 B C[B] := 1 R2=C R2[A] := I P= 2 C=P 15 C[S] := 15 R3=C R3 = 2??????????00001 C=C+1 S C[S] := 3 C=C+C S C[S] := 6 A=C S parametre O dans A[S] * premiere partie de "FOR I=1 TO L" * teste si on doit quitter la boucle C=DAT0 4 C[A] := LEN(T$) ?C#0 A LEN(T$) = 0 ? GOYES L240 oui, executer la boucle GOTO L350 non, passer la boucle * deuxieme partie de "FOR I=1 TO L" * calcule l'adresse du premier element de T$ L240 C=C-1 A D=C A compteur dans D C=C+C A D0=D0+ 4 AD0EX A=A+C A D0=A D0 := ^ T$[1,1] * troisieme partie de "FOR I=1 TO L" * debut d'execution de la boucle L250 A=DAT0 B K$ est dans A[B] P= 0 * IF K$='(' THEN K=K+1 @ GOTO 340 LCASC '(' ?A#C B IF K$#'(' THEN 270 GOYES L270 D1=D1+ 1 K=K+1 GOTO L340 * IF K$=')' THEN K=K+1 @ GOTO 340 L270 LCASC ')' ?A#C B IF K$#')' THEN 280 GOYES L280 D1=D1- 1 K=K-1 GOTO L340 * IF K#0 THEN 340 L280 CD1EX C[A] := K D1=C ?C#0 A IF K#0 THEN 340 GOYES L340 * IF K$='+' THEN ... LCASC '+' ?C#A B IF K$#'+' THEN 300 GOYES L300 P= 1 GOTO L339 fin de boucle * IF K$='-' THEN ... L300 LCASC '-' ?C#A B IF K$#'-' THEN 310 GOYES L310 P= 2 GOTO L339 fin de boucle L310 C=R3 B=C W B[W] = 2??????????00001 * IF K$='*' THEN ... LCASC '*' P= 3 valeur pour O GOSUB L337 P= 0 * IF K$='/' THEN ... LCASC '/' P= 4 valeur pour O GOSUB L337 P= 0 * IF K$='/' THEN ... B=B+B S B[S] := 4 B=B+1 S B[S] := 5 LCASC '^' P= 5 valeur pour O GOSUB L337 GOTO L340 fin de boucle * ... AND (O>N OR P=1) THEN ... (n=2 ou n=5) L337 ?C#A B C vaut '*' ou '/' ou '^' RTNYES ?A>B S O>2 ? GOYES L338 C=R0 C recoit P ?C#B A B[A] := 1 RTNYES L338 C=RSTK * ... O=N @ P=I L339 C=P 15 A=C S nouvelle valeur pour O C=R2 R0=C * NEXT I L340 D0=D0- 2 adresse du prochain * element de T$ C=R2 C=C+1 A R2=C I=I+1 D=D-1 A decremente le compteur GOC L350 sortie de boucle GOTO L250 L350 P= 0 LC(5) #2F6E9 adresse des flags 0 a 3 CD1EX B=C A A=DAT1 1 lit les flags * CFLAG 1 LC(1) #D masque A=A&C B * IF K#0 THEN CFLAG 0 @ SFLAG 1 ?B=0 A GOYES L360 K=0 LC(1) 2 masque A=A!C B SFLAG 1 LC(1) #E A=A&C B CFLAG 0 L360 DAT1=A 1 reecrit les flags 0 a 3 * met a jour les valeurs de P, O et L A=0 A ASLC A[S] = 0 GOSUB CONPUS A=R0 GOSUB CONPUS LCASC 'P' GOSUB POPSTO LCASC 'O' GOSUB POPSTO LCASC 'L' GOSUB POPSTO GOVLNG =ENDBIN fin du sous-programme * sous-programme CONPUS CONPUS GOSBVL =HDFLT SETHEX GOSBVL =D1=AVE D1=D1- 16 decremente le pointeur DAT1=A W copie A vers la pile CONPU1 GOVLNG =AVE=D1 met a jour le pointeur * et retour * sous-programme POPSTO POPSTO A=C B copie le nom dans A[B] GOSUB POPST1 CON(2) 0 reserve un octet CON(2) =tEOL POPST1 C=RSTK D0=C DAT0=A B copie le nom dans l'octet * reserve GOSBVL =D1=AVE RSTK=C sauvegarde de D1 GOSBVL =EXPEXC GOSBVL =DEST A=0 A D1=(5) =S-R1-2 DAT1=A A C=RSTK relit D1 RSTK=C D1=C A=DAT1 W GOSBVL =STORE C=RSTK relit D1 encore une fois D1=C D1=D1+ 16 incremente le pointeur GOTO CONPU1 END