1 GOTO 64000
10 x=x+1
20 t$=t$+z$:IF t$="fin" THEN t$="":z$="" ELSE t$="bonjour" 
30 FOR i=1 TO n:NEXT i 
40 t$=""
50 ON x GOTO 60,70
60 IF t$="jhgjh" THEN i=6
64000 GOSUB 64910
64005 LOCATE 3,17:PRINT "Aide a l'analyse de programme BASIC"
64010 LOCATE 12,24:PRINT "Alain Beaussant"
64015 PRINT TAB(18) "1986";
64020 FOR i=1 TO 2500:NEXT i
64025 '  ** MENU PRINCIPAL **
64030 LOCATE 1,6:PRINT CHR$(20)
64035 LOCATE 13,6:PRINT "MENU PRINCIPAL":PRINT TAB(13) STRING$(14,CHR$(208))
64040 LOCATE 1,10:PRINT "1    SCANNER : examen des lignes BASIC"
64045 LOCATE 1,12:PRINT "2    SAUTS : liste des pts d'appel"
64050 LOCATE 1,14:PRINT "3    VARIABLES : recherche et classement"
64055 LOCATE 1,16:PRINT "5    SOUS PROG. : debut, fin, pts appel"
64060 LOCATE 1,18:PRINT "6    FIN de travail"
64065 ml1=10:ml2=20
64070 GOSUB 64945
64075 IF choix=5 THEN CLS:END
64080 ON choix GOSUB 64090,64285,64395,64535
64085 GOTO 64025
64090 '  ** MENU SCANNER **
64095 LOCATE 1,6:PRINT CHR$(20)
64100 LOCATE 16,6:PRINT "SCANNER":PRINT TAB(16) STRING$(7,CHR$(208))
64105 PRINT :PRINT TAB(6) "Examen du format de stockage":PRINT TAB(4) "d'un programme BASIC en  memoire"
64110 LOCATE 1,12:PRINT "1    Tout le programme"
64115 LOCATE 1,14:PRINT "2    une partie du Pg."
64120 LOCATE 1,16:PRINT "3    Une seule ligne"
64125 ml1=12:ml2=18
64130 GOSUB 64945
64135 ON choix GOTO 64150,64155
64140 LOCATE 15,20:PRINT CHR$(20):INPUT "Ligne : ",ld
64145 la=ld:GOTO 64165
64150 ld=1:la=63999:GOTO 64165
64155 LOCATE 1,19:PRINT CHR$(20):LOCATE 15,20:INPUT "Ligne de depart : ",ld
64160 LOCATE 15,21:INPUT "Ligne d'arrivee : ",la 
64165 GOSUB 65030
64170 ' ** SCANNER **
64175 MODE 2
64180 nl=0:l=0:k1=368:flag1=0
64185 IF flag1=0 THEN PRINT "Suite = <Enter>":PRINT
64190 WHILE nl<ld:GOSUB 65005:WEND
64195 WHILE nl<=la
64200 flag1=1
64205 FOR h=h1 TO h2 STEP 8
64210 j=0
64215 PRINT #(h),k;PEEK(k),k+1;PEEK(k+1),"longueur de ligne =";l
64220 PRINT #(h),k+2;PEEK(k+2),k+3;PEEK(k+3),"numero   de ligne =";nl
64225 FOR i=k+4 TO k+l-1
64230 PRINT #(h),TAB(j) i;PEEK(i);
64235 j=j+14:IF j>78 THEN j=0
64240 NEXT i
64245 PRINT #(h),CHR$(10)+CHR$(13)
64250 NEXT h
64255 INPUT "",r$
64260 GOSUB 65005
64265 WEND
64270 IF flag1=0 THEN PRINT "pas de ligne a ce numero."
64275 PRINT:INPUT"retour au menu : <Enter> ",r$
64280 GOSUB 64910:RETURN
64285 '  **   SAUTS   ***
64290 GOSUB 65090
64295 DIM st$(300,1):k1=368:x=0:flag2=2
64300 GOSUB 65005
64305 WHILE nl<=63999
64310 FOR i=k+4 TO k+l-1
64315 IF PEEK(i)=159 OR PEEK(i)=160 OR PEEK(i)=151 OR PEEK(i)=235 OR PEEK(i)=202 OR PEEK(i)=198 OR PEEK(i)=199 OR PEEK(i)=200 THEN 64320 ELSE 64345
64320 FOR j=i+1 TO k+l-1
64325 IF PEEK(j)<>30 THEN IF PEEK(j)=1 OR PEEK(j)=161 THEN 64345 ELSE 64340
64330 x=x+1:st$(x,0)=STR$(PEEK(j+1)+(PEEK(j+2)*256)):st$(x,1)=STR$(nl)
64335 j=j+2:i=j
64340 NEXT j
64345 NEXT i
64350 GOSUB 65005
64355 WEND
64360 GOSUB 64850:IF x=0 THEN LOCATE 1,21:PRINT CHR$(7);"Pas de ligne d'appel":GOSUB 65125:GOTO 64390 ELSE GOSUB 65030
64365 IF h1>0 THEN 64385
64370 MODE 2:WINDOW #1,1,80,1,3
64375 PRINT #1, " Ligne ";TAB(15) "appelee par lignes :" TAB(60) " Suite : <ENTER> )":PRINT #1, STRING$(80,"_");:LOCATE #1,8,2:PRINT #1,"":PRINT #1, TAB(8) "";
64380 LOCATE 8,4:PRINT "";:j=9
64385 vs=9:GOSUB 64790
64390 ERASE st$:RETURN
64395 ' *** VARIABLES ***
64400 GOSUB 64910:LOCATE 15,6:PRINT "VARIABLES":PRINT TAB(15) STRING$(9,CHR$(208)):PRINT :PRINT " Recherche et classement des variables."
64405 PRINT :PRINT TAB(9) "Lignes d'utilisation."
64410 LOCATE 11,18:PRINT "veuillez patienter"
64415 DIM st$(300,1):k1=368:x=0:flag2=3
64420 GOSUB 65005
64425 WHILE nl<=63999
64430 FOR i=k+4 TO k+l-1
64435 IF PEEK(i)=2 OR PEEK(i)=3 OR PEEK(i)=4 OR PEEK(i)=13 THEN 64440 ELSE 64480
64440 IF PEEK(i+1)<>0 OR PEEK(i+2)<>0 OR PEEK(i-1)=30 THEN 64480
64445 IF PEEK(i)=2 THEN ty$="%" ELSE IF PEEK(i)=3 THEN ty$="$" ELSE IF PEEK(i)=4 THEN ty$="!" ELSE ty$=""
64450 x1=i+3:x=x+1
64455 IF PEEK(x1)>=128 THEN 64465
64460 st$(x,0)=st$(x,0)+CHR$(PEEK(x1)):x1=x1+1:GOTO 64455
64465 st$(x,0)=st$(x,0)+CHR$(PEEK(x1)-128)+ty$
64470 IF PEEK(x1+1)=40 THEN st$(x,0)=st$(x,0)+"()"
64475 st$(x,1)=STR$(nl):i=x1+1
64480 NEXT i
64485 GOSUB 65005
64490 WEND
64495 GOSUB 64850:IF x=0 THEN LOCATE 1,21:PRINT CHR$(7);"pas de variables":GOSUB 65125:GOTO 64530
64500 GOSUB 65030
64505 IF h1>0 THEN 64525
64510 MODE 2:WINDOW #1,1,80,1,3
64515 PRINT #1," VARIABLES" TAB(16) "" TAB(18) "utilisees lignes :" TAB(60) "( Suite : <ENTER> )":PRINT #1,STRING$(80,"_"):LOCATE #1,16,2:PRINT #1,"":PRINT #1,TAB(16) "";
64520 LOCATE 16,4:PRINT "";:j=17
64525 vs=17:GOSUB 64790
64530 ERASE st$:RETURN
64535 '  **  SOUS-PROGRAMMES  **
64540 GOSUB 64910:LOCATE 12,6:PRINT "SOUS-PROGRAMMES":PRINT TAB(12) STRING$(15,CHR$(208)):PRINT :PRINT "Recherche et classement:"
64545 PRINT :PRINT TAB(9) "Debut et Fin":PRINT TAB(9) "Lignes d'appels":PRINT TAB(9) "Sorties conditionnelles"
64550 LOCATE 11,18:PRINT "veuillez patienter"
64555 DIM st$(300,1):k1=368:x=0:flag2=2
64560 GOSUB 65005
64565 WHILE nl<=63999
64570 FOR i=k+4 TO k+l-1
64575 IF PEEK(i)=159 THEN 64580 ELSE 64605
64580 FOR j=i+1 TO k+l-1
64585 IF PEEK(j)<>30 THEN IF PEEK(j)=1 OR PEEK(j)=161 THEN 64605 ELSE 64600
64590 x=x+1:st$(x,0)=STR$(PEEK(j+1)+(PEEK(j+2)*256)):st$(x,1)=STR$(nl)
64595 j=j+2:i=j
64600 NEXT j
64605 NEXT i
64610 GOSUB 65005
64615 WEND
64620 GOSUB 64850
64625 IF x=0 THEN LOCATE 1,11:PRINT CHR$(7);CHR$(20);"PAS DE SOUS-PROGRAMMES":LOCATE 11,18:GOSUB 65125:GOTO 64780
64630 GOSUB 65030
64635 x1=1:x2=0:MODE 2
64640 WHILE x1<=x
64645 CLS:LOCATE 30,12:PRINT "VEUILLEZ PATIENTER"
64650 k1=368:x2=x2+1:nsp$="":flag4=0
64655 GOSUB 65005:IF nl<VAL(st$(x1,0)) THEN 64655
64660 IF nl=VAL(st$(x1,0)) THEN FOR i=k+4 TO k+l-1:IF PEEK(i)=197 OR PEEK(i)=192 THEN FOR j=i+1 TO k+l-1:nsp$=nsp$+CHR$(PEEK(j)):NEXT j ELSE NEXT i
64665 IF nl>VAL(st$(x1,0)) THEN flag4=1
64670 DIM rc(20):x3=0
64675 flag1=0:FOR i=k+4 TO k+l-1
64680 IF PEEK(i)=161 THEN flag1=1
64685 IF (PEEK(i)=201 OR PEEK(i)=152) AND flag1=1 THEN x3=x3+1:rc(x3)=nl:flag1=0:GOTO 64695
64690 IF PEEK(i)=201 OR PEEK(i)=152 THEN rc(0)=nl:GOTO 64705
64695 NEXT i
64700 GOSUB 65005:GOTO 64675
64705 CLS:FOR h=h1 TO h2 STEP 8
64710 PRINT #h:PRINT #h,"SOUS-PROGRAMME  ";x2:PRINT #h:LOCATE 1,5
64715 IF nsp$<>"" THEN PRINT #h,"Nom :",nsp$
64720 PRINT #h,"Debut :",st$(x1,0);:IF flag4=1 THEN PRINT #h,"  ( NB : cette ligne n'existe pas )";
64725 PRINT #h:PRINT #h,"Appel :",:x3=x1
64730 PRINT #h,VAL(st$(x3,1));:IF st$(x3,0)=st$(x3+1,0) THEN x3=x3+1:GOTO 64730
64735 PRINT #h:PRINT #h,"Fin :",rc(0)
64740 IF rc(1)=0 THEN 64755
64745 PRINT #h,"Retours conditionnels :",:x3=0
64750 x3=x3+1:IF rc(x3)<>0 THEN PRINT #h,rc(x3);:GOTO 64750 
64755 IF h=0 THEN LOCATE 60,23:INPUT "<ENTER> ",r$
64760 PRINT #h:NEXT h
64765 ERASE rc
64770 x1=x1+1:IF st$(x1-1,0)=st$(x1,0) THEN 64770
64775 WEND
64780 ERASE st$:GOSUB 64910:RETURN
64785 ' *** EDITION TABLEAU ***
64790 j=vs
64795 FOR h=h1 TO h2 STEP 8:FOR i = 1 TO x
64800 IF st$(i,0)=st$(i-1,0) THEN 64820
64805 IF h=8 THEN PRINT #8,CHR$(10)+CHR$(13);
64810 IF h=0 THEN INPUT "",r$
64815 PRINT #(h),st$(i,0);TAB(vs-1)"";:j=vs:z=1
64820 IF st$(i,1)=st$(i+1,1) AND st$(i,0)=st$(i+1,0)THEN z=z+1:GOTO 64830
64822 IF z=1 THEN 64826
64824 PRINT #h,TAB(j) "(";z;")";:z=1
64825 j=j+8:IF j>78 THEN j=vs:PRINT #(h),TAB(vs-1) "";
64826 PRINT #(h),TAB(j) st$(i,1);
64828 j=j+8:IF j>78 THEN j=vs:PRINT #(h),TAB(vs-1) "";
64830 NEXT i:IF h=8 THEN PRINT #8,CHR$(10)+CHR$(13)
64835 NEXT h
64840 PRINT :PRINT :IF h1=0 THEN INPUT "retour au menu : <ENTER> ",r$
64845 GOSUB 64910:RETURN
64850 ' *** TRI TABLEAU SAUTS / VARIABLES ***
64855 flag1=0:IF x=0 THEN 64905
64860 FOR i = 1 TO x-1
64865 IF flag2=2 THEN 64875
64870 IF st$(i,0)<=st$(i+1,0) THEN 64895 ELSE 64880
64875 IF VAL(ST$(i,0))<=VAL(ST$(i+1,0)) THEN 64895
64880 st$(0,0)=st$(i,0):st$(i,0)=st$(i+1,0):st$(i+1,0)=st$(0,0)
64885 st$(0,1)=st$(i,1):st$(i,1)=st$(i+1,1):st$(i+1,1)=st$(0,1)
64890 flag1=1
64895 NEXT i
64900 IF flag1=1 THEN 64855
64905 RETURN
64910 ' ** analys **
64915 MODE 1:LOCATE 14,1
64920 PRINT CHR$(204); STRING$(9,CHR$(208));CHR$(205)
64925 PRINT TAB(14) CHR$(211);" ANALYSE ";CHR$(209)
64930 PRINT TAB(14) CHR$(205);STRING$(9,CHR$(210));CHR$(204)
64935 RETURN
64940 ' ** gestion curseur de choix **
64945 ml=ml1
64950 LOCATE 8,23:PRINT "Deplacement par 'spc bar'"
64955 LOCATE 9,25:PRINT "Validation par 'Enter'";
64960 LOCATE 3,ml:PRINT CHR$(146); CHR$(243);:mp=VPOS(#0)
64965 r$=INKEY$:IF r$="" THEN 64965
64970 IF r$=CHR$(13) THEN 64995  
64975 LOCATE 3,ml:PRINT SPC(2)
64980 ml=ml+2
64985 IF ml=ml2 THEN ml=ml1
64990 GOTO 64960
64995 choix=(mp-ml1)/2+1
65000 RETURN
65005 '  **  lecture n. et l. de ligne  **
65010 l=PEEK(k1)+(PEEK(k1+1)*256):nl=PEEK(k1+2)+(PEEK(k1+3)*256)
65015 k=k1:k1=k1+l
65020 RETURN
65025 ' ** MENU D'EDITION **
65030 LOCATE 1,6:PRINT CHR$(20)
65035 LOCATE 16,6:PRINT "EDITION":PRINT TAB(16) STRING$(7,CHR$(208))
65040 LOCATE 1,10:PRINT "1    ECRAN"
65045 LOCATE 1,12:PRINT "2    IMPRIMANTE"
65050 LOCATE 1,14:PRINT "3    Ecran ET Imprimante"
65055 ml1=10:ml2=16
65060 GOSUB 64945
65065 ON choix GOTO 65075,65080
65070 h1=0:h2=8:GOTO 65085
65075 h1=0:h2=0:GOTO 65085
65080 h1=8:h2=8
65085 RETURN
65090 ' *** Menu SAUTS ***
65095 GOSUB 64910:LOCATE 17,6:PRINT "SAUTS":PRINT TAB(17) STRING$(5,CHR$(208))
65100 PRINT :PRINT "Recherche des lignes appelees par :":PRINT
65105 PRINT "1 -  GOTO, GOSUB, ON... , THEN et ELSE.":PRINT
65110 PRINT "2 -  RUN, RENUM, RESTORE et RESUME"
65115 LOCATE 11,18:PRINT "VEUILLEZ PATIENTER"
65120 RETURN
65125 INPUT "Retour au menu : <ENTER> ",r$:RETURN