10 REM *******************************************
20 REM *                                         *
30 REM *        TRACEUR D'OSCILLOGRAMMES         *
40 REM *                                         *
50 REM *            Jacques CHARRIER             *
60 REM *                                         *
70 REM *             Picosoft  1987              *
80 REM *                                         *
90 REM *******************************************
100 '
110 REM * Initialisation *
120 '
130 INK 1,0:INK 0,26:BORDER 2:MODE 2:i$=CHR$(24)
140 REM Definition de la touche 17 ( [ ) -> ( mu pour micro)
150    KEY DEF 17,0,183:REM effectuer un RUN apres ecriture de cette ligne
160 REM Apres RUN, ( [ ) devient ( 7 ) mu sur l'ecran et 7 pour l'imprimante
170 REM L'imprimante DMP2000 remplace le caractere 183 par chr$(183-&80)="7"
180 REM Dans la ligne suivante, dans W$ le 7 est un mu. pressez ( [ )
190     w$="pn搶 kMG"
200 REM Les autres" mu " seront signales dans le listing  (4950)
210 DEFINT h,i,j,k,m,n,p:DIM y1(100):DIM y2(100):modif=0
220 ON BREAK GOSUB 5320
230 MEMORY &A4FF:IF PEEK(&A500) <> 205 THEN GOSUB 5170
240 DIM cal$(12):DIM vit$(22):DIM cal(12):DIM VIT(22):INK 1,26
250 I=5:J=5:K=10:v1=160:v2=160:REM I voie 1,J voie 2,K vit bal
260 GOSUB 4850:REM Enregistre les calibres et les vitesses de balayages
270 GOSUB 5020:REM Definition des touches de fonction
280 GOSUB 2610:REM Affichage des fenetres
290 GOSUB 2520:REM trace la grille ecran
300 GOSUB 2850:REM Affichage calibre voie 1
310 GOSUB 2880:REM Affichage calibre voie 2
320 GOSUB 2910:REM Affichage vitesse de balayage
330 GOSUB 1190:REM Constitution du circuit
340 '
350 REM * Boucle attente d'une commande *
360 '
370     GOSUB 5350:REM Get A$
380     IF A$="A" THEN GOSUB 4510 :REM Aide
390     IF A$="F" AND SI=1 THEN GOSUB 1490
400     IF A$="E" AND SI=2 THEN GOSUB 2520:GOSUB 1910:GOSUB 1850
410     IF A$="M" THEN GOSUB 3770
420     IF ASC(A$)>238 OR ASC(A$)<222 THEN A$="":GOTO 370
430     COM=239-ASC(A$):a$=""
440     ON com GOSUB 490,520,550,580,610,640,1190,1310,670,690,710,770,830,             950,1010,1070,1130
450 GOTO 370
460 '
470 REM * Execution des commandes *
480 '
490 REM vit bal croit
500   IF k<22 THEN k=k+1:GOSUB 2910:ON SI GOTO 1540,1780
510  RETURN
520 REM vit bal decroit
530   IF k>1 THEN k=k-1::GOSUB 2910:ON SI GOTO 1540,1780
540  RETURN
550 REM cal 2 decroit
560   IF J>1 THEN J=J-1:GOSUB 2520:GOTO 2880
570  RETURN
580 REM cal 2 croit
590   IF J<12 THEN J=J+1:GOSUB 2520:GOTO 2880
600  RETURN
610 REM cal 1 decroit
620   IF I>1 THEN I=I-1:GOSUB 2520:GOTO 2850
630  RETURN
640 REM cal 1 croit
650   IF I<12 THEN I=I+1:GOSUB 2520:GOTO 2850
660  RETURN
670 REM copie d'ecran
680  CALL &A500::PRINT #8,CHR$(27);CHR$(64):RETURN
690 REM efface la courbe
700  GOTO 2520
710 REM trace voie 1
720  GOSUB 2910
730  ORIGIN 120,64+v1,120,520,384,64 :PLOT 0,0
740  FOR n=0 TO 100
750   DRAW 4*n,y1(n)*Y1m/cal(I),1
760  NEXT:RETURN
770 REM trace voie 2
780  GOSUB 2910
790  ORIGIN 120,64+v2,120,520,384,64 :PLOT 0,0
800  FOR n=0 TO 100
810   DRAW 4*n,y2(n)*Y2m/cal(j),1
820  NEXT:RETURN
830 REM trace en X.Y
840   ORIGIN 320,224,120,520,384,64:PLOT 0,0
850   LOCATE#3,2,8:PRINT#3,"   X . Y   "
860   MOVE  y1(0)*Y1m/cal(i),y2(0)*Y2m/cal(j)
870   FOR n=0 TO 100
880    DRAW y1(n)*Y1m/cal(i),y2(n)*Y2m/cal(j),1
890   NEXT
900 RETURN
910 REM Dans les 4 sous-programmes qui suivent, figurent des caracteres de
920 REM controle qui seront affiches sur l'ecran mais pas sur le listing
930 REM PRINT"      " est en fait PRINT"CTRL I"
940 REM PRINT":est en fait PRINT"CTRL H":
950 REM origine v1 monte
960   IF v1<320 THEN v1=v1+1
970   ORIGIN 105,64,105,520,384,64
980   TAG:MOVE 0,v1+8:PRINT"1";:MOVE 7,v1+8
990   PRINT" ";:TAGOFF:REM Print"CTRL I" pour fleche ->
1000  RETURN
1010 REM origine v2 monte
1020   IF v2<320 THEN v2=v2+1
1030   ORIGIN 120,64,120,535,384,64
1040   TAG:MOVE 401,v2+8:PRINT"";:REM PRINT"CTRL H" pour fleche <-
1050   MOVE 407,v2+8:PRINT"2";:TAGOFF
1060  RETURN
1070 REM origine v1 descend
1080   IF v1>0 THEN v1=v1-1
1090   ORIGIN 105,64,105,520,384,64
1100   TAG:MOVE 0,v1+24:PRINT" ";:MOVE 0,v1+8:PRINT"1";
1110   MOVE 7,v1+8:PRINT" ";:TAGOFF:REM PRINT"CTRL I" pour fleche ->
1120 RETURN
1130 REM origine v2 descend
1140   IF v2>0 THEN v2=v2-1
1150   ORIGIN 120,64,120,535,384,64
1160   TAG:MOVE 407,v2+24:PRINT" ";:MOVE 407,v2+8:PRINT"2";
1170   MOVE 401,v2+8:PRINT"";:TAGOFF:REM PRINT"CTRL H" pour fleche <-
1180 RETURN
1190 REM  constitution du circuit et choix du signal
1200   CLS #4:GOSUB 2520:INK 1,0
1210   LOCATE #4,2,4:PRINT#4,i$;" Constitution du circuit " ;
1220   PRINT #4,": pressez RETURN pour valider un choix ou une donnee ";i$;
1230   FOR n=0 TO 3:R(n)=0:C(n)=0:L(n)=0:NEXT:m=-1
1240   CALL &BB06: CLS #4
1250   LOCATE 29,1:PRINT i$;" Constitution du circuit ";i$;
1260   ORIGIN 0,0,0,639,0,399:MOVE 115,26
1270   DEG:FOR ang=0 TO 360 STEP 10:DRAWR 2*SIN(ang),2*COS(ang):NEXT:RAD
1280   ORIGIN 120,26:MOVE 8,-15:DRAWR 0,-10:MOVE 8,15:DRAWR 0,10
1290   GOSUB 3150:REM resistance interne du generateur
1300   GOSUB 2990:REM Constitution du circuit
1310  REM Choix du signal
1320   CLS #5:LOCATE#4,2,1:PRINT#4,i$;"   Signal   ";i$
1330   LOCATE#4,1,2:PRINT#4,   " Sinusoidal ? ";
1340   LOCATE #4,1,3:PRINT#4,;"   Echelon ?  ";
1350   LOCATE #4,1,4:PRINT#4,;"  ( S / E )  ";
1360   GOSUB 5350:REM Get A$
1370   IF A$="S" THEN Si=1:GOTO 1410
1380   IF A$="E" THEN si=2:GOTO 1680
1390  GOTO 1360
1400 '
1410 REM * Signal sinusoidal *
1420 '
1430   ORIGIN 120,26,120,135,19,35:CLG:ORIGIN 120,26,0,639,0,399:CLS #5:CLS #6
1440   DEG:FOR ang=0 TO 360 STEP 30:DRAW ang/30,4*SIN(ang):NEXT:RAD
1450   WINDOW #7,4,13,23,23:CLS #7
1460   LOCATE #5,1,2:PRINT #5,"Vem":INPUT #7,"=",amp
1470   IF (amp<0.005) OR (amp>40) THEN 1450
1480   v=amp:GOSUB 2940:LOCATE #4,1,2:PRINT#4,"Vem=";SCI$;"V"
1490   WINDOW #7,4,13,25,25:CLS #7
1500   LOCATE#5,1,4:PRINT #5," F ":INPUT #7,"=",F
1510   IF (F<0.1) OR (F>10000000) THEN 1490
1520   GOSUB 4360:REM ajustement vitesse de balayage
1530   v=f:GOSUB 2940:LOCATE #4,1,4:PRINT#4," F =";SCI$;"Hz";:omega=2*PI*f
1540   GOSUB 4210:REM Calcul des impedances
1550   v=v1m:GOSUB 2940:LOCATE#4,67,2:PRINT#4,"V1m=";SCI$;"V";
1560   v=v2m:GOSUB 2940:LOCATE#4,67,4:PRINT#4,"V2m=";SCI$;"V";
1570   GOSUB 4400 :REM Ajustement des calibres
1580  REM Calcul y1 et y2
1590   GOSUB 2520:LOCATE 37,1:PRINT i$;" Calcul ";i$;
1600   st=vit(K)/10:t=0
1610   FOR n=0 TO 100
1620    y1(n)=SIN(omega*t):y2(n)=SIN(omega*t+fi)
1630   t=t+st:NEXT
1640   LOCATE 37,1:PRINT "________";CHR$(7);
1650   Y1m=40*v1m:Y2m=40*v2m:GOSUB 710:GOSUB 770:REM trace 1 et 2
1660  RETURN
1670 '
1680 REM * Echelon de tension *
1690 '
1700  ORIGIN 120,26,120,135,18,35:CLG:ORIGIN 120,26,0,639,0,399:CLS #5:CLS #6
1710  MOVE 0,-4:DRAWR 4,0,1:DRAWR 0,8,1:DRAWR 8,0,1
1720  omega=1: GOSUB 4210:REM Calcul des impedances
1730  IF C<>0 AND L=0 THEN GOSUB 1970 :REM circuit R C
1740  IF C=0  AND L<>0 THEN GOSUB 2080:REM circuit R L
1750  IF C<>0 AND L<>0 THEN GOSUB 2170:REM circuit R L C
1760  IF (C=0) AND (L=0) THEN DEF FNUNE=SR1/SRT:DEF FNDEU=SR2/SRT:                    F=1000:GOSUB 4360
1770  IF   modif=0 THEN GOSUB 1910:REM demande hauteur echelon
1780  st=vit(k)/10:t=0:Ymax1=0:Ymax2=0:modif=0
1790  GOSUB 2520:LOCATE 37,1:PRINT i$;" Calcul ";i$;
1800  FOR n=0 TO 100
1810   y1(n)=FNUNE:y2(n)=FNDEU
1820   Ymax1=MAX(y1(n),Ymax1):Ymax2=MAX(y2(n),Ymax2)
1830  t=t+st:NEXT
1840   LOCATE 37,1:PRINT "________";CHR$(7);
1850  REM affiche les valeurs maxi
1860  v1m=YMax1*amp:v2m=YMax2*amp:GOSUB 4400:REM aj. calibres
1870  v=v1m:GOSUB 2940:LOCATE#4,67,2:PRINT#4,"V1m=";SCI$;"V";
1880  v=v2m:GOSUB 2940:LOCATE#4,67,4:PRINT#4,"V2m=";SCI$;"V"; 
1890  Y1m=40*amp:Y2m=40*amp:GOSUB 710:GOSUB 770:REM trace 1 et 2
1900 RETURN
1910 REM Hauteur echelon
1920   WINDOW #7,4,13,24,24:CLS #7
1930   LOCATE #5,1,3:PRINT #5," E ";:INPUT #7,"=",amp
1940   IF (amp<0.005) OR (amp>40) THEN 1920
1950   CLS #5:v=amp:GOSUB 2940:LOCATE #4,1,3:PRINT#4," E =";SCI$;"V"
1960 RETURN
1970 REM circuit R C
1980   B1=SR1/SRT:B2=SR2/SRT:A1=0:A2=0:tau=SRT*C
1990   FOR p=m1 TO m
2000    IF C(p)<>0 THEN A1=A1+C/C(p):B1=B1-C/C(p)
2010   NEXT
2020   FOR p=m2 TO m
2030    IF C(p)<>0 THEN A2=A2+C/C(p):B2=B2-C/C(p)
2040   NEXT
2050   f=1/3/tau:GOSUB 4360
2060   DEF FNUNE=A1+B1*EXP(-t/tau):DEF FNDEU=A2+B2*EXP(-t/tau)
2070 RETURN
2080 REM circuit R L
2090   tau=L/SRT:A1=0:A1=SR1/SRT:B1=-A1:A2=SR2/SRT:B2=-A2
2100   FOR p=m1 TO m
2110    IF L(p)<>0 THEN B1=B1+L(p)/L
2120   NEXT
2130   FOR p=m2 TO m
2140    IF L(p)<>0 THEN B2=B2+L(p)/L
2150   NEXT
2160 GOTO 2050:REM cf circuit R C
2170 REM circuit R L C
2180   Tau=2*L/SRT:A1=0:A2=0:B1=0:B2=0:C1=0:C2=0
2190   D=1/(L*C) -(SRT/(2*L))^2:
2200   IF D>0 THEN GOSUB 2340:REM Regime pseudo-periodique
2210   IF D<0 THEN GOSUB 2400:REM Regime aperodique
2220   IF D=0 THEN GOSUB 2440:REM Regime critique
2230   FOR p=m1 TO m
2240    IF R(p) <> 0 THEN B1=R(p)/L/omega+B1
2250    IF L(p) <> 0 THEN B1=B1-L(p)/(L*tau*omega):C1=C1+L(p)/L
2260    IF C(P) <> 0 THEN B1=B1-C/(C(p)*tau*omega):C1=C1-C/C(p):A1=A1+C/C(p)
2270   NEXT
2280   FOR p=m2 TO m
2290    IF R(p) <> 0 THEN B2=R(p)/L/omega+B2
2300    IF L(p) <> 0 THEN B2=B2-L(p)/(L*tau*omega):C2=C2+L(p)/L
2310    IF C(P) <> 0 THEN B2=B2-C/(C(p)*tau*omega):C2=C2-C/C(p):A2=A2+C/C(p)
2320   NEXT
2330 RETURN
2340 REM Regime pseudo periodique
2350  omega=SQR(D):f=(1/tau+omega/2/PI)/4:GOSUB 4360:REM Aj. Vt balayage
2360  DEF FNUNE=A1+(B1*SIN(omega*t)+C1*COS(omega*t))*EXP(-t/tau)
2370  DEF FNDEU=A2+(B2*SIN(omega*t)+C2*COS(omega*t))*EXP(-t/tau)
2380 RETURN
2390 REM Regime aperiodique
2400  omega=SQR(-D):f=(1/tau-omega)/3:GOSUB 4360:w1=-3*f:w2=-omega-1/tau
2410  DEF FNUNE=A1+((B1+C1)*EXP(w1*t)+(C1-B1)*EXP(w2*t))/2
2420  DEF FNDEU=A2+((B2+C2)*EXP(w1*t)+(C2-B2)*EXP(w2*t))/2
2430 RETURN
2440 REM Regime critique
2450  omega=1:f=1/4/tau:GOSUB 4360:REM Aj. Vt balayage 
2460  DEF FNUNE=A1+(B1*t+C1)*EXP(-t/tau)
2470  DEF FNDEU=A2+(B2*t+C2)*EXP(-t/tau)
2480 RETURN
2490 '
2500 REM * Module de gestion de l'ecran *
2510 '
2520 REM Trace la grille Ecran
2530    ORIGIN 120,64,120,520,384,64 :CLG
2540    FOR n=0 TO 8:MOVE 0,n*40:DRAWR 400,0:NEXT
2550    FOR n=0 TO 10:MOVE n*40,0:DRAWR 0,320:NEXT
2560    FOR n=0 TO 50 :MOVE 8*n,156:DRAWR 0,8:NEXT
2570    FOR n=0 TO 40 :MOVE 196,8*n:DRAWR 8,0:NEXT
2580    FOR n=0 TO 50 : PLOT 8*n,64,1:PLOT 8*n,256,1:NEXT
2590   GOSUB 970:GOSUB 1030:REM Affiche les origines des voies
2600 RETURN
2610 REM Definition des fenetres d'affichage
2620   WINDOW #1,1,15,2,11:WINDOW #2,1,14,13,22
2630   WINDOW #3,67,80,2,22:WINDOW #4,1,79,22,25:CLS #4
2640   WINDOW #5,1,13,22,25:WINDOW #6,66,79,22,25
2650   CLS #1:LOCATE #1,1,2:PRINT#1,"  Voie 1 & X "
2660   LOCATE #1,4,4:PRINT #1,"Calibre"
2670   LOCATE #1,4,8:PRINT#1,i$;"f1";i$;CHR$(241);" ";i$;"f4";i$;CHR$(240)
2680   CLS #2:LOCATE #2,1,2:PRINT#2,"  Voie 2 & Y "
2690   LOCATE #2,4,4:PRINT #2,"Calibre"
2700   LOCATE #2,4,8:PRINT#2,i$;"f2";i$;CHR$(241);" ";i$;"f5";i$;CHR$(240)
2710   CLS #3:LOCATE #3,1,2:PRINT #3,"   Vitesse  "
2720   LOCATE #3,7,4:PRINT #3,"de"
2730   LOCATE #3,4,6:PRINT #3,"balayage "
2740   LOCATE #3,5,10:PRINT #3,i$;"f3";i$;CHR$(241)
2750   LOCATE #3,9,10:PRINT #3,i$;"f6";i$;CHR$(240)
2760   LOCATE #3,4,12:PRINT #3,i$;"A ";i$;" Aide "
2770   LOCATE #3,4,14:PRINT #3,i$;"f7";i$;" Trace "
2780   LOCATE #3,4,16:PRINT #3,i$;"f8";i$;" CLG "
2790   LOCATE #3,4,18:PRINT #3,i$;"f9";i$;" Hcop "
2800   ORIGIN 0,0,0,639,0,399
2810   MOVE 6,384:DRAWR 97,0:DRAWR 0,-150:DRAWR -97,0:DRAWR 0,150
2820   MOVE 6,214:DRAWR 97,0:DRAWR 0,-150:DRAWR -97,0:DRAWR 0,150
2830   MOVE 535,384: DRAWR 96,0:DRAWR 0,-320:DRAWR -96,0:DRAWR 0,320
2840 RETURN
2850 REM affiche le calibre de la voie 1
2860    LOCATE#1,2,6:PRINT#1,cal$(I);" / div"
2870 RETURN
2880 REM affiche le calibre de la voie 2
2890    LOCATE #2,2,6:PRINT #2,cal$(J);" / div"
2900  RETURN
2910 REM Affiche la vitesse de balayage
2920    LOCATE #3,2,8:PRINT #3,vit$(K);" / div"
2930  RETURN
2940 REM * mise sous forme scientifique de la valeur v *
2950   v=(v+v*0.000001)*1000000000098304: h=INT(LOG10(v)/3)
2960   sci$=LEFT$(STR$(v/(10^(3*h))),5)+" "+MID$(w$,h,1)
2970 RETURN
2980 '
2990 REM  * Constitution du circuit *
3000 '
3010  IF m=3 THEN GOTO 3520
3020  CLS #5:PEN #7,1:PAPER #7,0
3030  LOCATE#5,2,1:PRINT #5,i$;"R";i$;"esistance ";
3040  LOCATE#5,2,2:PRINT #5,i$;"S";i$;"elf ";
3050  LOCATE#5,2,3:PRINT #5,i$;"C";i$;"apacite ";
3060  LOCATE#5,2,4:PRINT #5,i$;"F";i$;"in"
3070  GOSUB 5340: REM get A$
3080  IF A$="R" THEN GOSUB 3140
3090  IF A$="S" THEN GOSUB 3250
3100  IF A$="C" THEN GOSUB 3420
3110  IF A$="F" THEN GOSUB 3520:GOTO 3130
3120 GOTO 3010
3130 RETURN
3140 REM * Resistance *
3150   m=m+1:CLS #5:LOCATE #5,2,1:PRINT #5,i$;" Resistance ";i$;
3160   WINDOW #7,4,13,24,24:CLS #7
3170   LOCATE #5,2,3:PRINT #5,"R";CHR$(48+m);:INPUT #7,"=",R(m)
3180   IF (R(m)<0.1) OR (R(m)>=999000000)  THEN 3160
3190   DRAWR 20,0:DRAWR 2,2
3200   FOR n=1 TO 7:DRAWR 4,-4:DRAWR 4,4:NEXT
3210   DRAWR 2,-2: DRAWR 17,0
3220   v=R(m):GOSUB 2950:LOCATE #4,19+m*12,3:PRINT #4,sci$;CHR$(191)
3230   C(m)=0:L(m)=0
3240 RETURN
3250 REM * Self *
3260   m=m+1:CLS #5:LOCATE #5,2,1:PRINT #5,i$;"    Self    ";i$;
3270   WINDOW #7,4,13,23,23:CLS #7
3280   LOCATE #5,2,2:PRINT #5,"L";CHR$(48+m);:INPUT #7,"=",L(m)
3290   IF (L(m)<0.000001) OR (L(m)>1000) THEN 3270
3300   LOCATE #5,2,3:PRINT #5,i$;" Resistance ";i$;
3310   WINDOW #7,4,13,25,25:CLS #7
3320   LOCATE #5,2,4:PRINT #5,"R";CHR$(48+m);:INPUT #7,"=",R(m)
3330   IF (R(m)<0.1) OR (R(m)>10000000) THEN 3310
3340   DRAWR 20,0:DRAWR 2,2
3350   FOR n=1 TO 7:DRAWR 6,-6:DRAWR 0,-1:DRAWR -2,-2
3360   DRAWR -2,2:DRAWR 0,1:DRAWR 6,6:NEXT
3370   DRAWR 2,-2: DRAWR 17,0
3380   v=L(m):GOSUB 2950:LOCATE #4,19+m*12,3:PRINT #4,sci$;"H"
3390   v=R(m):GOSUB 2950:LOCATE #4,19+m*12,4:PRINT #4,sci$;CHR$(191)
3400  C(m)=0
3410 RETURN
3420 REM * Capacite *
3430   m=m+1:CLS #5:LOCATE #5,2,1:PRINT #5,i$;"  Capacite  ";i$;
3440   WINDOW #7,4,13,24,24:CLS #7
3450   LOCATE #5,2,3:PRINT #5,"C";CHR$(48+m);:INPUT #7,"=",C(m)
3460   IF (C(m)<0) OR (C(m)>0.003)  THEN 3440
3470   DRAWR 46,0:MOVER 0,-6:DRAWR 0,12:MOVER 1,0:DRAWR 0,-12:MOVER 6,0
3480   DRAWR 0,12:MOVER 1,0:DRAWR 0,-12:MOVER 0,6:DRAWR 43,0
3490   v=C(m):GOSUB 2950:LOCATE #4,19+m*12,3:PRINT #4,sci$;"F"
3500   R(m)=0
3510 RETURN
3520 REM *  fin *
3530   IF m<2 THEN GOTO 2990
3540   CLS #5:LOCATE 29,1:PRINT"____________________________"
3550   DRAWR 0,-51:DRAWR -(m+1)*97,0:GOSUB 5020
3560   FOR n=0 TO m-1:LOCATE #4,29+n*12,2:PRINT#4,i$;CHR$(65+n);i$;:NEXT
3570   LOCATE #4,68,2:PRINT#4,;i$;"Choix V1 ";i$;
3580   A$=UPPER$(INKEY$): n=n+1
3590   IF N>10 THEN LOCATE#4,77,2:PRINT#4,I$;CHR$(65+RND(1)*(m-1));i$;:n=0
3600   IF A$="" THEN 3580
3610   m1=ASC(A$)-64
3620   IF m1<1 OR m1>m THEN PRINT CHR$(7):GOTO  3580
3630   LOCATE #4,77,2:PRINT#4,i$;a$;i$;
3640   LOCATE #4,68,4:PRINT#4,;i$;"Choix V2 ";i$;:li=4
3650   A$=UPPER$(INKEY$): n=n+1
3660   IF n>10 THEN LOCATE#4,77,4:PRINT#4,i$;CHR$(65+RND(1)*(m-1));i$;:n=0
3670   IF A$="" THEN 3650
3680   m2=ASC(A$)-64
3690   IF m2<1 OR m2>m OR m2=m1 THEN PRINT CHR$(7):GOTO 3650
3700   LOCATE #4,77,4:PRINT#4,i$;a$;i$;
3710   MOVER m1*97-6,4:DRAWR 0,42:DRAWR -4,-5:MOVER 4,5:DRAWR 4,-5
3720   LOCATE #4,29+(m1-1)*12,2:PRINT#4,"V1"
3730   MOVE 8,-25:MOVER m2*97-6,4:DRAWR 0,42:DRAWR -4,-5:MOVER 4,5:DRAWR 4,-5
3740   LOCATE #4,29+(m2-1)*12,2:PRINT#4,"V2"
3750 RETURN
3760 REM
3770 REM * Modification du circuit *
3780  PEN #7,0:PAPER #7,1:modif=1
3790  CLS #6:LOCATE#6,1,2:PRINT#6,"RETURN->Idem"
3800  LOCATE#6,1,4:PRINT#6,"ESPACE->Modif";
3810  FOR p=0 TO m
3820    IF L(p)<>0 THEN GOSUB 3890:REM modif self
3830    IF C(p)<>0 THEN GOSUB 4040:REM modif capa
3840    IF (R(p)>0) AND (L(p)=0) THEN GOSUB 4120 :REM modif resistance
3850  NEXT
3860  PEN #7,1:PAPER #7,0:CLS #6
3870  ON si GOSUB 1540,1720
3880 RETURN
3890 REM Modif self
3900   v=L(p):GOSUB 2950:LOCATE #4,19+p*12,3:PRINT #4,i$;sci$;"H";i$
3910   GOSUB 5340:IF (A$<>CHR$(13)) AND (A$<>CHR$(32)) THEN 3910
3920   IF A$=CHR$(13) THEN 3950
3930   WINDOW #7,19+p*12,27+p*12,24,24:CLS #7:INPUT #7,"=",L(p)
3940   IF (L(p)<0.000001) OR (L(p)>1000) THEN 3930
3950   v=L(p):GOSUB 2950:LOCATE #4,19+p*12,3:PRINT #4,sci$;"H "
3960   v=R(p):GOSUB 2950:LOCATE #4,19+p*12,4:PRINT #4,i$;sci$;CHR$(191);i$
3970   GOSUB 5340:IF (A$<>CHR$(13)) AND (A$<>CHR$(32)) THEN 3970
3980   IF A$=CHR$(13) THEN 4010
3990   WINDOW #7,19+p*12,27+p*12,25,25:CLS #7:INPUT #7,"=",R(p)
4000   IF (R(p)<0.1) OR (R(p)>10000000) THEN 3990
4010   v=R(p):GOSUB 2950:LOCATE #4,19+p*12,4:PRINT #4,sci$;CHR$(191);" "
4020   ORIGIN 0,0,0,639,0,399:MOVE 127,0:DRAWR (m+1)*97,0
4030 RETURN
4040 REM Modif capa
4050   v=C(p):GOSUB 2950:LOCATE #4,19+p*12,3:PRINT #4,i$;sci$;"F";i$
4060   GOSUB 5340:IF (A$<>CHR$(13)) AND (A$<>CHR$(32)) THEN 4060
4070   IF A$=CHR$(13) THEN 4100
4080   WINDOW #7,19+p*12,27+p*12,24,24:CLS #7:INPUT #7,"=",C(p)
4090   IF (C(p)<0) OR (C(p)>0.003)  THEN 4080
4100   v=C(p):GOSUB 2950:LOCATE #4,19+p*12,3:PRINT #4,sci$;"F "
4110 RETURN
4120 REM Modif resistance
4130   v=R(p):GOSUB 2950:LOCATE #4,19+p*12,3:PRINT #4,i$;sci$;CHR$(191);i$;
4140   GOSUB 5340:IF (A$<>CHR$(13)) AND (A$<>CHR$(32)) THEN 4140
4150   IF A$=CHR$(13) THEN 4180
4160   WINDOW #7,19+p*12,27+p*12,24,24:CLS #7:INPUT #7,"=",R(p)
4170   IF (R(p)<0.1) OR (R(p)>=999000000)  THEN 4160
4180   v=R(p):GOSUB 2950:LOCATE #4,19+p*12,3:PRINT #4,isc$;CHR$(191);" "
4190 RETURN
4200 '
4210 REM * Calcul des impedances *
4220   L=0:Cinv=0:C=0
4230   FOR p=0 TO m
4240    IF L(p)<>0 THEN Z(p)= omega*L(p):L=L+L(p)
4250    IF C(p)<>0 THEN Z(p)=-1/(omega*C(p)):CInv=Cinv+1/C(p)
4260    IF (R(p)<>0) AND (L(p)=0) THEN Z(p)=0
4270   NEXT
4280   IF Cinv<>0 THEN C= 1/Cinv
4290   SRT=0.001:SZT=0:FOR p=0  TO m:SRT=SRT+R(p):SZT=SZT+Z(p):NEXT
4300   SR1=0.001:SZ1=0:FOR p=m1 TO m:SR1=SR1+R(p):SZ1=SZ1+Z(p):NEXT
4310   SR2=0.001:SZ2=0:FOR p=m2 TO m:SR2=SR2+R(p):SZ2=SZ2+Z(p):NEXT
4320   ZT=SQR(SRT^2+SZT^2):Z1=SQR(SR1^2+SZ1^2):Z2=SQR(SR2^2+SZ2^2)
4330   fi=ATN(SZ2/SR2)-ATN(SZ1/SR1):V1m=amp*Z1/ZT:V2m=amp*Z2/ZT
4340 RETURN
4350 '
4360 REM Ajustement des vitesses
4370   WHILE 1/F<8*VIT(K) AND k<22 :K=K+1:WEND
4380   WHILE 1/F>8*VIT(k) AND K>1  :K=K-1:WEND
4390   GOSUB 2910:RETURN
4400 REM Ajuste calibres V1 et V2
4410   WHILE V1m < 4*CAL(i) AND i<12  :i=i+1:WEND
4420   WHILE V1m > 4*CAL(i) AND i>1   :i=i-1:WEND
4430   WHILE V2m < 4*CAL(j) AND j<12  :j=j+1:WEND
4440   WHILE V2m > 4*CAL(j) AND j>1   :j=j-1:WEND
4450   GOSUB 2850:GOSUB 2880:REM Affichages
4460 RETURN
4470 REM * Pause *
4480 CALL &BB06:LOCATE #7,1,3:PRINT #7,CHR$(20)
4490 RETURN
4500 '
4510 REM *  AIDE  *
4520 '
4530  ORIGIN 120,143,120,518,64,143:CLG
4540  DRAWR 0,-79:DRAWR 400,0
4550  WINDOW #7,17,65,17,20:CLS #7
4560  LOCATE #7,22,1:PRINT#7,i$;" AIDE ";i$
4570  LOCATE#7,11,3:PRINT #7,i$;"f0";i$;"  Constitution du circuit"
4580 GOSUB 4470
4590  LOCATE#7,12,3:PRINT#7,i$;"SHIFT";i$;"  ";i$;"f0";i$;"   Choix du signal"
4600 GOSUB 4470
4610  LOCATE#7,16,3:PRINT#7,i$;"f7";i$;"  Trace la voie 1";
4620 GOSUB 4470
4630  LOCATE#7,12,3:PRINT#7,i$;"SHIFT";i$;" ";i$;"f7";i$;"  Trace la voie 2"
4640 GOSUB 4470
4650 LOCATE#7,10,3:PRINT#7,i$;"CONTROL";i$;" ";i$;"f7";i$;"  Trace en mode X,Y
4660 GOSUB 4470
4670  LOCATE#7,4,3:PRINT#7,i$;"f8";i$;"  Efface l'ecran :  ";
4680  PRINT#7,i$;"f9";i$;"  Hardcopy  DMP2000"
4690 GOSUB 4470
4700  LOCATE#7,10,3:PRINT#7,i$;" ";CHR$(240);" ";i$;" ou ";
4710  PRINT#7,i$;" ";CHR$(241);" ";i$;"  Deplacent la voie 1"
4720 GOSUB 4470
4730  LOCATE#7,7,3:PRINT#7,i$;"SHIFT";i$;" "; i$;" ";CHR$(240);" ";i$;" ou ";
4740  PRINT#7,i$;" ";CHR$(241);" ";i$;"  Deplacent la voie 2"
4750 GOSUB 4470
4760  LOCATE#7,11,3:PRINT#7,i$;" M ";i$;"  Modifications du circuit"
4770 GOSUB 4470
4780  LOCATE#7,3,3:PRINT#7,i$;" F ";i$;
4790  PRINT#7,"  Nouvelle frequence  :  Signal sinusoidal"
4800 GOSUB 4470
4810  LOCATE#7,3,3:PRINT#7,i$;" E ";i$;
4820  PRINT#7,"  Nouvelle valeur de E  :  Signal  echelon "
4830 GOSUB 4470
4840  GOSUB 2520:RETURN:REM trace l'ecran
4850 REM * Calibres et vitesse de balayage *
4860 '
4870 RESTORE 4910:FOR n= 1 TO 12:READ cal$(n):NEXT
4880 RESTORE 4930:FOR n=1 TO 22: READ vit$ (n):NEXT 
4890 RESTORE 4980:FOR n=1 TO 12:READ CAL(n):NEXT
4900 RESTORE 4990:FOR n=1 TO 22:READ VIT(n):NEXT
4910 DATA " 20 V"," 10 V"," 5 V "," 2 V "," 1 V "," .5 V"
4920 DATA " .2 V", " .1 V","50 mV","20 mV","10 mV"," 5 mV"
4930 DATA " 1 s "," .5 s"," .2 s"," .1 s","50 ms","20 ms"
4940 DATA "10 ms"," 5 ms"," 2 ms"," 1 ms",".5 ms",".2 ms"
4950 REM Dans les deux lignes suivantes, pour chaque 7, pressez la touche 
4955 REM ( [ ) pour obtenir le caratere "mu = 7  " sur l'ecran
4960 DATA ".1 ms","50 新","20 新","10 新"," 5 新"," 2 新"
4970 DATA " 1 新",".5 新",".2 新",".1 新"
4980 DATA 20,10,5,2,1,0.5,0.2,0.1,5E-2,2E-2,1E-2,5E-3
4990 DATA 1,0.5,0.2,0.1,5E-2,2E-2,1E-2,5E-3,2E-3,1E-3,5E-4,2E-4,1E-4,5E-5  
5000 DATA 2E-5,1E-5,5E-6,2E-6,1E-6,5E-7,2E-7,1E-7
5010 RETURN
5020 REM * Definition des touches de fonction *
5030 '
5040   KEY DEF 4,0,238:REM fonct F6; vit croit
5050   KEY DEF 5,0,237:REM fonct F3; vit decroit
5060   KEY DEF 12,0,236:REM fonct F5 cal2; croit
5070   KEY DEF 14,0,235:REM fonct F2 cal2; decroit
5080   KEY DEF 20,0,234:REM fonct F4 cal1; croit
5090   KEY DEF 13,0,233:REM fonct F1 cal1; decroit
5100   KEY DEF 15,0,232,231:REM fonct f0 def. circuit et signal
5110   KEY DEF 3,0,230:REM fonct F9 copie d'ecran
5120   KEY DEF 11,0,229:REM fonct F8 efface la courbe
5130   KEY DEF 10,0,228,227,226:REM trace  courbe voie 1 et 2  et X.Y
5140   KEY DEF 0,1,225,224:REM voie 1 ou voie 2 momtent
5150   KEY DEF 2,1,223,222:REM voie 1 ou voie 2 descendent
5160 RETURN
5170 REM * Copie d'ecran sur DMP2000 cf. notice (adaptee) *
5180 '
5190  RESTORE 5200:FOR n=0 TO 191:READ cod:POKE (&A500+n),cod:NEXT:RETURN
5200  DATA 205,46,189,216,205,168,165,62,27,205,159,165,62,51,205,159
5210  DATA 165,62,17,205,159,165,205,186,187,205,231,187,50,182,165,17
5220  DATA 0,0,33,143,1,34,180,165,62,7,50,179,165,62,10,205
5230  DATA 159,165,62,13,205,159,165,62,27,205,159,165,62,42,205,159
5240  DATA 165,62,6,205,159,165,62,127,205,159,165,62,2,205,159,165
5250  DATA 14,0,58,179,165,71,229,197,213,205,240,187,209,193,33,182
5260  DATA 165,190,225,55,32,1,167,203,17,43,0,16,233,121,205,159
5270  DATA 165,19,229,33,127,2,55,237,82,225,56,5,42,180,165,24
5280  DATA 207,205,27,187,254,50,32,2,24,30,124,180,32,4,125,181
5290  DATA 40,22,124,254,255,40,17,17,0,0,34,180,165,24,142,205
5300  DATA 46,189,56,251,205,43,189,201,62,27,205,159,165,62,64,205
5310  DATA 159,165,201,0,0,0,0,0,0,0,0,0,0,0,0,0
5320 REM reinitialisation du clavier si Break**
5330  CALL &BB00:KEY DEF 17,0,183:MODE 2:END
5340 REM  * get a$ *
5350   A$=UPPER$(INKEY$):IF A$="" THEN 5350
5360 RETURN