10  DIM A[6],I[25,6],K[6,2],M[3],N[3],O[25],P[51,3],R[25,3],S[25],Z[6]
20  DIM R$[72],T$[3],P$[61]
30  R$="RNDCONINDGENSINCOSTANATNPOTABSEXPLOGMULDIVZOHBANNEGPOSPOW"
40  R$[58]="SUMINTLIMRELSPA"
50  FOR I1=1 TO 6
60  A[I1]=0
70  NEXT I1
80  FOR I1=1 TO 25
90  O[I1]=S[I1]=0
100  NEXT I1
110  MAT I=ZER[25,6]
120  MAT R=ZER[25,3]
130  I9=J2=0
140  PRINT LIN(3)
150  PRINT SPA(19);"BASIC ANALOG SIMULATION PROGRAM"
160  PRINT  USING 170
170  IMAGE 19X,31("-")
180  PRINT LIN(3)
190  PRINT "SYSTEM DESCRIPTION:";LIN(1)
200  PRINT "DEFINE BLOCK FUNCTIONS,BLOCK INTERCONNECTIONS,";
210  PRINT "AND ASSOCIATED PARAMETERS."
220  PRINT "HOW MANY BLOCKS IN THE SYSTEM";
230  INPUT N
240  PRINT "INPUT BLOCK TYPE,INPUTS (1,2,3),AND BLOCK PARAMETERS (1,2)"
250  PRINT "BE SURE TO ENCLOSE BLOCK TYPE IN QUOTES.";LIN(1)
260  REM FILL BLOCK CHARACTERIZATION ARRAY
270  FOR I1=1 TO N
280  PRINT "BLOCK NO."I1;
290  INPUT T$,I[I1,2],I[I1,3],I[I1,4],I[I1,5],I[I1,6]
300  FOR I2=2 TO 4
310  IF ABS(I[I1,I2]) <= N THEN 350
320  PRINT LIN(1)
330  PRINT "UNDEFINED BLOCK NO. REFERENCED AS INPUT TO BLOCK NO.";I1
340  STOP 
350  NEXT I2
360  FOR J1=1 TO 24
370  REM ASSIGN NUMBER TO BLOCK TYPE
380  IF T$=R$[3*(J1-1)+1,3*(J1-1)+3] THEN 400
390  NEXT J1
400  IF J1 <= 24 THEN 440
410  PRINT LIN(1)
420  PRINT "ILLEGAL BLOCK TYPE GIVEN FOR BLOCK NO.";I1
430  STOP 
440  I[I1,1]=J1
450  IF J1 <> 21 THEN 490
460  I9=I9+1
470  A[I9]=I1
480  REM PLACE BLOCK NOS. OF ALL INTEGRATORS IN ARRAY A
490  NEXT I1
500  I4=1
510  I5=0
520  FOR I1=1 TO N
530  R[I1,3]=1
540  NEXT I1
550  REM********BEGIN SEQUENCING PHASE***********
560  J2=J2+1
570  IF J2>I9 THEN 610
580  REM FIND AN INTEGRATOR
590  I2=A[J2]
600  GOTO 800
610  IF J2 <> 1 THEN 650
620  PRINT "ERROR:NO INTEGRATORS IN SYSTEM"
630  STOP 
640  REM SEE IF SUB REC IS FULL//OR FIND THE END OF A FFWD LOOP
650  K1=0
660  FOR I1=K1+1 TO N
670  FOR J1=1 TO N
680  IF I1=R[J1,1] THEN 710
690  NEXT J1
700  GOTO 730
710  NEXT I1
720  GOTO 1270
730  K1=I1
740  FOR I1=1 TO N
750  FOR J1=2 TO 4
760  IF K1=I[I1,J1] THEN 660
770  NEXT J1
780  NEXT I1
790  I2=K1
800  FOR I3=1 TO N
810  IF R[I3,1]=0 THEN 840
820  NEXT I3
830  REM PLACE ELEMENT IN SUBSTITUTION RECORD
840  R[I3,1]=I2
850  FOR I1=2 TO 4
860  IF I[I2,I1]=0 THEN 880
870  R[I3,2]=R[I3,2]+1
880  NEXT I1
890  REM ALL INPUTS CURRENT ENTRY EXAMINED?
900  IF R[I3,3]>R[I3,2] THEN 1120
910  REM NO,EXAMINE NEXT INPUT
920  R[I3,3]=R[I3,3]+1
930  R1=R[I3,3]
940  R2=ABS(I[I2,R1])
950  REM IS INPUT FROM INTEGRATOR?
960  IF I[R2,1]=21 THEN 900
970  REM NO,FIND CORRESPONDING ENTRY IN SUB REC
980  FOR I1=1 TO N
990  IF R[I1,1]=R2 THEN 1030
1000  NEXT I1
1010  GOTO 1070
1020  REM INPUT FROM COMPLETED ELEMENT?
1030  IF R[I1,3]>R[I1,2] THEN 900
1040  REM INPUT FROM INCOMPLETE ELEMENT WITH LOWER SEQUENCE NO.?
1050  IF I1<I3 THEN 1090
1060  REM NO,PLACE ELEMENT IN SUB REC
1070  I2=R2
1080  GOTO 800
1090  PRINT "SORT FAILURE"
1100  STOP 
1110  REM FIRST ENTRY IN SUB REC?
1120  IF R[I3,1]=R[1,1] THEN 1180
1130  REM NO,RETURN TO PREVIOUS ENTRY
1140  I3=I3-1
1150  I2=R[I3,1]
1160  GOTO 900
1170  REM PLACE ELEMENTS IN SEQUENCE TABLE,S
1180  FOR I1=I4 TO N
1190  IF R[I1,1]=0 THEN 1210
1200  NEXT I1
1210  FOR J1=I1-1 TO I4 STEP -1
1220  I5=I5+1
1230  S[I5]=R[J1,1]
1240  NEXT J1
1250  I4=I1
1260  GOTO 560
1270  PRINT LIN(5)
1280  PRINT SPA(21);"SEQUENCE TABLE FOR BASP RUN"
1290  PRINT  USING 1300
1300  IMAGE 6X,56("-")
1310  PRINT  USING 1320
1320  IMAGE 6X,"BLOCK NO.",4X,"BLOCK TYPE",4X,"INPUT 1",4X,"INPUT 2",4X,"INPUT 3"
1330  PRINT  USING 1340
1340  IMAGE 6X,9("-"),4X,10("-"),3(4X,7("-"))
1350  IMAGE 9X,2D,12X,3A,9X,3(3D,8X)
1360  FOR I1=1 TO N
1370  R1=S[I1]
1380  J1=3*(I[R1,1]-1)+1
1390  PRINT  USING 1350;R1,R$[J1,J1+2],I[R1,2],I[R1,3],I[R1,4]
1400  NEXT I1
1410  REM GET RUN INFORMATION
1420  PRINT LIN(5)
1430  FOR I1=1 TO 3
1440  M[I1]=0
1450  NEXT I1
1460  PRINT "DETERMINE OUTPUT FORMAT:";LIN(1)
1470  PRINT "INPUT BLOCK NUMBERS OF OUTPUTS TO BE MONITORED."
1480  PRINT "(ENTER ZERO AS LAST INPUT IF LESS THAN THREE.)"
1490  FOR I1=1 TO 3
1500  INPUT M[I1]
1510  IF M[I1]=0 THEN 1530
1520  NEXT I1
1530  M1=I1-1
1540  PRINT LIN(2)
1550  PRINT "OUTPUT OPTIONS ARE AS FOLLOWS :"
1560  PRINT "  (1) TABULAR"
1570  PRINT "  (2) TABULAR PLUS GRAPHICAL";LIN(1)
1580  PRINT "WHICH IS YOUR CHOICE";
1590  INPUT C
1600  PRINT LIN(2)
1610  PRINT "DEFINE RUN-TIME PARAMETERS:";LIN(1)
1620  PRINT "INPUT INITIAL AND FINAL VALUES OF THE INDEPENDENT VARIABLE";
1630  INPUT T0,T9
1640  PRINT "ENTER THE INTEGRATION STEP SIZE";
1650  INPUT H
1660  T1=INT((T9-T0)/H)
1670  K1=1
1680  REM AUTOMATIC POINT SPACING
1690  IF T1/K1 <= 50 THEN 1730
1700  K1=K1*2
1710  GOTO 1690
1720  REM INITIALIZE ALL ZERO ORDER HOLDS
1730  FOR I1=1 TO 6
1740  Z[I1]=0
1750  NEXT I1
1760  FOR I1=1 TO N
1770  IF I[I1,1] <> 15 THEN 1790
1780  I[I1,6]=INT(I[I1,5]/H)
1790  NEXT I1
1800  REM INITIALIZE ALL INTEGRATORS
1810  FOR I1=1 TO I9
1820  R1=A[I1]
1830  O[R1]=I[R1,5]
1840  NEXT I1
1850  T=T0
1860  I4=0
1870  MAT K=ZER[6,2]
1880  MAT P=ZER[51,3]
1890  PRINT LIN(5)
1900  PRINT SPA(26);"BLOCK OUTPUT TABLE"
1910  PRINT  USING 1920
1920  IMAGE 5X,60("-")
1930  PRINT  USING 1940;M[1],M[2],M[3]
1940  IMAGE 5X,"IND. VAR.",3(5X,"BLOCK NO. ",2D)
1950  PRINT  USING 1960
1960  IMAGE 5X,9("-"),3(5X,12("-"))
1970  REM************BEGIN GENERATING PHASE*********************
1980  FOR T3=0 TO K1*INT(T1/K1)
1990  FOR B=1 TO 3
2000  REM SECOND ORDER RUNGA-KUTTA USED FOR INTEGRATION
2010  I3=Z1=0
2020  GOTO B OF 2150,2030,2040
2030  T=T+H
2040  FOR I1=1 TO I9
2050  R1=A[I1]
2060  I3=I3+1
2070  IF B=3 THEN 2110
2080  I[R1,6]=O[R1]
2090  O[R1]=O[R1]+H*K[I3,1]
2100  GOTO 2120
2110  O[R1]=I[R1,6]+.5*H*(K[I3,1]+K[I3,2])
2120  NEXT I1
2130  IF B=3 THEN 3760
2140  I3=0
2150  FOR I1=1 TO N
2160  REM FUNCTIONAL EVALUATION LOOP
2170  R1=S[I1]
2180  I2=0
2190  FOR J1=2 TO 4
2200  I2=I2+1
2210  J2=I[R1,J1]
2220  IF J2=0 THEN 2250
2230  N[I2]=SGN(J2)*O[ABS(J2)]
2240  GOTO 2260
2250  N[I2]=0
2260  NEXT J1
2270  GOTO I[R1,1] OF 2320,2360,2400,2440,2500,2540,2580,2620,2660,2700
2280  GOTO I[R1,1]-10 OF 2740,2780,2820,2860,2960,3060,3130,3200,3270
2290  GOTO I[R1,1]-19 OF 3310,3350,3400,3500,3570
2300  REM---------------------------------------------------------
2310  REM RND (TYPE 1)
2320  O[R1]=RND(R1/I1)
2330  GOTO 3610
2340  REM---------------------------------------------------------
2350  REM CON (TYPE 2)
2360  O[R1]=I[R1,5]
2370  GOTO 3610
2380  REM---------------------------------------------------------
2390  REM IND (TYPE 3)
2400  O[R1]=T
2410  GOTO 3610
2420  REM---------------------------------------------------------
2430  REM GEN (TYPE 4)
2440  W=I[R1,5]
2450  W1=I[R1,6]
2460  O[R1]=SIN(W*T+W1)
2470  GOTO 3610
2480  REM---------------------------------------------------------
2490  REM SIN (TYPE 5)
2500  O[R1]=SIN(N[1])
2510  GOTO 3610
2520  REM---------------------------------------------------------
2530  REM COS (TYPE 6)
2540  O[R1]=COS(N[1])
2550  GOTO 3610
2560  REM---------------------------------------------------------
2570  REM TAN (TYPE 7)
2580  O[R1]=TAN(N[1])
2590  GOTO 3610
2600  REM---------------------------------------------------------
2610  REM ATN (TYPE 8)
2620  O[R1]=ATN(N[1])
2630  GOTO 3610
2640  REM---------------------------------------------------------
2650  REM POT (TYPE 9)
2660  O[R1]=I[R1,5]*N[1]
2670  GOTO 3610
2680  REM---------------------------------------------------------
2690  REM ABS (TYPE 10)
2700  O[R1]=ABS(N[1])
2710  GOTO 3610
2720  REM---------------------------------------------------------
2730  REM EXP (TYPE 11)
2740  O[R1]=EXP(N[1])
2750  GOTO 3610
2760  REM---------------------------------------------------------
2770  REM LOG (TYPE 12)
2780  O[R1]=LOG(N[1])
2790  GOTO 3610
2800  REM---------------------------------------------------------
2810  REM MUL (TYPE 13)
2820  O[R1]=N[1]*N[2]
2830  GOTO 3610
2840  REM---------------------------------------------------------
2850  REM DIV (TYPE 14)
2860  IF N[2] <> 0 THEN 2900
2870  IF N[1] <> 0 THEN 2920
2880  O[R1]=0
2890  GOTO 3610
2900  O[R1]=N[1]/N[2]
2910  GOTO 3610
2920  O[R1]=1.E+37
2930  GOTO 3610
2940  REM---------------------------------------------------------
2950  REM ZOH (TYPE 15)
2960  Z1=Z1+1
2970  IF T3+B-1=I[R1,6] THEN 3000
2980  O[R1]=Z[Z1]
2990  GOTO 3010
3000  Z[Z1]=O[R1]=N[1]
3010  IF B <> 1 THEN 3610
3020  I[R1,6]=I[R1,6]+INT(I[R1,5]/H)
3030  GOTO 3610
3040  REM---------------------------------------------------------
3050  REM BAN (TYPE 16)
3060  IF N[1]<0 THEN 3090
3070  O[R1]=N[2]
3080  GOTO 3610
3090  O[R1]=-N[2]
3100  GOTO 3610
3110  REM---------------------------------------------------------
3120  REM NEG (TYPE 17)
3130  IF N[1]<0 THEN 3160
3140  O[R1]=N[2]
3150  GOTO 3610
3160  O[R1]=0
3170  GOTO 3610
3180  REM---------------------------------------------------------
3190  REM POS (TYPE 18)
3200  IF N[1]<0 THEN 3230
3210  O[R1]=0
3220  GOTO 3610
3230  O[R1]=-N[2]
3240  GOTO 3610
3250  REM---------------------------------------------------------
3260  REM POW (TYPE 19)
3270  O[R1]=ABS(N[1])^I[R1,5]
3280  GOTO 3610
3290  REM---------------------------------------------------------
3300  REM SUM (TYPE 20)
3310  O[R1]=N[1]+N[2]+N[3]
3320  GOTO 3610
3330  REM---------------------------------------------------------
3340  REM INT (TYPE 21)
3350  I3=I3+1
3360  K[I3,B]=N[1]+N[2]+N[3]
3370  GOTO 3610
3380  REM---------------------------------------------------------
3390  REM LIM (TYPE 22)
3400  IF N[1] >= N[3] THEN 3430
3410  O[R1]=N[3]
3420  GOTO 3610
3430  IF N[1] <= N[2] THEN 3460
3440  O[R1]=N[2]
3450  GOTO 3610
3460  O[R1]=N[1]
3470  GOTO 3610
3480  REM---------------------------------------------------------
3490  REM REL (TYPE 23)
3500  IF N[3]<0 THEN 3530
3510  O[R1]=N[1]
3520  GOTO 3610
3530  O[R1]=N[2]
3540  GOTO 3610
3550  REM---------------------------------------------------------
3560  REM SPA (TYPE 24)
3570  IF N[1] >= N[3] OR N[1] <= N[2] THEN 3600
3580  O[R1]=N[1]
3590  GOTO 3610
3600  O[R1]=0
3610  IF O[R1]<1.E+37 THEN 3650
3620  PRINT LIN(1)
3630  PRINT "CALCULATIONS HALTED DUE TO OVERFLOW."
3640  GOTO 4070
3650  NEXT I1
3660  IF B <> 1 THEN 3760
3670  REM SAVE POINTS ON B=1 LOOP ONLY
3680  IF T3 <> I4*K1 THEN 3760
3690  I4=I4+1
3700  FOR I1=1 TO M1
3710  R1=M[I1]
3720  P[I4,I1]=O[R1]
3730  NEXT I1
3740  PRINT  USING 3750;T,P[I4,1],P[I4,2],P[I4,3]
3750  IMAGE 4X,D.5DE,4X,SD.5DE,2(5X,SD.5DE)
3760  NEXT B
3770  NEXT T3
3780  PRINT LIN(5)
3790  IF C=1 THEN 4080
3800  M2=ABS(P[1,1])
3810  FOR I1=1 TO INT(T1/K1+1)
3820  FOR J1=1 TO M1
3830  IF M2>ABS(P[I1,J1]) THEN 3850
3840  M2=ABS(P[I1,J1])
3850  NEXT J1
3860  NEXT I1
3870  T$="+*@"
3880  PRINT SPA(3);"COMPOSITE PLOT OF BLOCK OUTPUTS VERSUS THE ";
3890  PRINT "INDEPENDENT VARIABLE"
3900  PRINT  USING 3910
3910  IMAGE 3X,63("-")
3920  PRINT SPA(3);"LEGEND:";LIN(1)
3930  FOR I1=1 TO M1
3940  PRINT  USING 3950;T$[I1,I1],M[I1]
3950  IMAGE 3X,A," DENOTES THE OUTPUT OF BLOCK NO. ",2D
3960  NEXT I1
3970  PRINT SPA(3);"SCALE: ONE DIVISION =";M2/30;"UNITS";LIN(3)
3980  P$=":----:----:----:----:----:----0----:----:----:----:----:----:"
3990  FOR I1=1 TO INT(T1/K1+1)
4000  FOR J1=1 TO M1
4010  X=31+INT(30*P[I1,J1]/M2)
4020  P$[X,X]=T$[J1,J1]
4030  NEXT J1
4040  PRINT SPA(4);P$
4050  P$="                              0                              "
4060  NEXT I1
4070  PRINT LIN(5)
4080  PRINT "PROGRAM OPTIONS AT THIS POINT INCLUDE THE FOLLOWING :"
4090  PRINT "  (1) CHANGE RUN-TIME PARAMETERS ONLY AND RUN UNDER"
4100  PRINT "      THE PREVIOUS OUTPUT OPTION."
4110  PRINT "  (2) CHANGE BLOCK PARAMETERS,RUN-TIME PARAMETERS"
4120  PRINT "      AND OUTPUT FORMAT FOR NEXT RUN."
4130  PRINT "      NOTE:BLOCK INTERCONNECTIONS MAY NOT BE ALTERED!"
4140  PRINT "  (3) TERMINATE RUN."
4150  PRINT LIN(1)
4160  PRINT "WHICH IS YOU CHOICE ";
4170  INPUT C
4180  GOTO C OF 1600,4190,4320
4190  PRINT LIN(1)
4200  PRINT "HOW MANY BLOCKS DO YOU WISH TO CHANGE";
4210  INPUT C
4220  IF C <= 0 THEN 1420
4230  PRINT "INPUT BLOCK NUMBER AND PARAMETER CHANGES (1,2)."
4240  FOR I1=1 TO C
4250  PRINT LIN(1)
4260  PRINT "BLOCK NO.";
4270  INPUT J1
4280  PRINT "PARAMETERS";
4290  INPUT I[J1,5],I[J1,6]
4300  NEXT I1
4310  GOTO 1420
4320  END 
