100 REM  SPI.BAS  Copyright 1989 by Russell Kincaid
110 REM  Kincaid Engineering, Savage Road, Milford, NH 03055
120 REM  VERSION 1.0  FEBURARY 1988
130 CLS
140 PRINT"***************************************************************"
150 PRINT"  THIS PROGRAM GENERATES THE CONTROL DECK FOR SPICE OUTPUTS "
160 PRINT"  APPEND THE NETLIST FILE TO THIS ONE":PRINT
170 PRINT"  Written by:  Russ Kincaid, Milford, NH 03055":PRINT:PRINT
180 PRINT"  This is shareware, see the file README.DOC"
190 PRINT"***************************************************************"
200 PRINT:PRINT
210 INPUT"WHAT TITLE FOR THIS ANALYSIS ";T$
220 INPUT"WHAT WILL YOU NAME THE OUTPUT FILE ";NME$
230 POO$=NME$+".DEK" :NS=1
240 OPEN POO$ FOR OUTPUT AS  #1
250 PRINT#1,"* "+T$
260 PRINT"WHAT TYPE OF DRIVING SOURCE :"
270 PRINT TAB(10);"1 = SOURCE ALREADY CONNECTED"
280 PRINT TAB(10);"2 = DC"
290 PRINT TAB(10);"3 = AC (frequency sweep)"
300 PRINT TAB(10);"4 = SINE (transient analysis)"
310 PRINT TAB(10);"5 = PULSE (transient analysis)"
320 PRINT TAB(10);"6 = SINGLE FREQUENCY FM"
330 PRINT TAB(10);"7 = PROGRAM A LINEAR SEGMENT WAVEFORM"
340 INPUT"SELECT NUMBER :";S : IF S=1 THEN 750
350 IF C=1 THEN 400
360 INPUT"NAME OF SOURCE (MUST START WITH V OR I) :";NAM$
370 C=1
380 INPUT"FROM POSITIVE NODE :";N1$ : INPUT"TO NEGATIVE NODE :";N2$
390 PRINT#1,NAM$;" ";N1$;" ";N2$;" ";
400 ON S GOTO 750,410,430,490,560,490,700
410 INPUT"NOMINAL VOLTAGE = ";V$
420 PRINT#1,"DC ";V$;" ";: GOTO 750
430 PRINT : AC=1:INPUT"IS ONE VOLT OK ";Y$ :IF Y$="Y" THEN PRINT#1,"AC 1 ";
440 INPUT"IS ZERO PHASE OK ";X$:IF X$="Y" THEN PRINT#1,"";
450 IF LEFT$(Y$,1)="N" THEN INPUT"VOLTS = ";V$
460 IF LEFT$(X$,1)="N" THEN INPUT"PHASE (DEG) = ";P0$
470 IF LEFT$(Y$,1)="N" AND LEFT$(X$,1)="N" THEN PRINT#1,"AC ";V$;" ";P0$;" ";
480 GOTO 750
490 INPUT"PEAK VOLTS = ";V$ : INPUT"FREQUENCY = ";F$ : INPUT"DC OFFSET = ";VO$
500  IF S=6 THEN 540
510 INPUT"TIME DELAY (sec) = ";TD$ 
520 INPUT"DAMPING FACTOR (ZERO IF NONE) = ";THETA$
530 PRINT#1,"SIN(";VO$;" ";V$;" ";F$;" ";TD$;" ";THETA;") "; : GOTO 750
540 INPUT"MODULATION INDEX = ";MDI$ : INPUT"MODULATION FREQUENCY = ";FS$
550 PRINT#1," SFFM(";VO$;" ";V$;" ";F$;" ";MDI$;" ";FS$;")";:GOTO 750
560 INPUT"AMPLITUDE AT T=0 :";VO$ : INPUT"PEAK AMPLITUDE = ";V1$
570 INPUT"LINEAR (1) OR EXPONENTIAL (2) RISE AND FALL SHAPE ";J
580 INPUT"DELAY TIME = ";TD$
590 ON J GOTO 600,640
600 TYP$="PULSE"
610 INPUT"RISE TIME = ";TR$ : INPUT"FALL TIME = ";TF$
620 INPUT"PULSE WIDTH AT TOP = ";PW$ : INPUT"NEXT PULSE (PERIOD) = ";PER$
630 GOTO 680
640 TYP$="EXP"
650 INPUT"RISE TIME CONSTANT = ";TR$ : INPUT"FALL TIME CONSTANT = ";TF$
660 INPUT"DELAY TIME TO START OF FALL = ";PW$ 
670 PER$ = ""
680 PRINT#1,TYP$;"(";VO$;" ";V1$;" ";TD$;" ";TR$;" ";TF$;" ";PW$;" ";PER$;") ";
690 GOTO 750
700 INPUT"HOW MANY SEGMENTS TO THE PROGRAMMED VOLTAGE ";N
710 INPUT"TIME ZERO VOLTS = ";V0$ : PRINT#1,"PWL(0 ";V0$;" ";
720 FOR Q=1 TO N : INPUT"TIME = ";T$ : INPUT"VOLTS = ";V$ : PRINT
730 PRINT#1,T$;" ";V$;" ";: NEXT Q : PRINT#1,")"
740 REM END SOURCE DESCRIPTION
750 INPUT"MORE ";Y$: IF LEFT$(Y$,1)="Y" THEN 260
760 PRINT#1,""
770 PRINT : PRINT"WHAT TYPE OF ANALYSIS DO YOU WANT?" : PRINT
780 PRINT TAB(10);"1 = STATIC DC"
790 PRINT TAB(10);"2 = DC SWEEP (TRANSFER CHARACTERISTIC)"
800 PRINT TAB(10);"3 = FREQUENCY SWEEP"
810 PRINT TAB(10);"4 = TRANSIENT AND INITIAL DC"
820 PRINT TAB(10);"5 = TRANSIENT WITH FOURIER COMPONENTS"
830 PRINT TAB(10);"6 = SENSITIVITY ANALYSIS"
840 PRINT TAB(10);"7 = DISTORTION ANALYSIS"
850 PRINT TAB(10);"8 = NOISE ANALYSIS"
860 PRINT TAB(10);"9 = TRANSFER FUNCTION ANALYSIS"
870 PRINT TAB(10);"10 = QUIT"
880 PRINT : INPUT"WHICH ONE ";A
890 ON A GOTO 900,900,1130,1290,1290,1650,1740,1810,1940,2030
900 INPUT"DO YOU WANT TO ADD DC SOURCES ";Y$
910 IF LEFT$(Y$,1)="N" AND A=1 THEN 1010
920 IF LEFT$(Y$,1)="N" AND A=2 THEN 1020
930 INPUT"HOW MANY DC SOURCES :";NS
940 FOR Q=1 TO NS 
950 INPUT"VOLTS = ";V$ : INPUT"POS NODE = ";PP
960 INPUT "NEG NODE = ";NP
970 INPUT"SOURCE NAME (MUST START WITH V OR I) = ";NAM$(Q)
980 PRINT#1,NAM$(Q);" ";PP;" ";N;" ";" DC ";V$
990 PRINT
1000 NEXT Q : IF A=2 THEN 1020
1010 PRINT#1,".OP" : GOTO 2020
1020 PRINT#1,".DC ";
1030 PRINT"SWEEP INFO :":PRINT
1040 INPUT"WHAT IS THE NAME OF THE SOURCE ";NAM$
1050  INPUT"WHAT IS THE SWEEP START VOLTAGE  ";V0$
1060 INPUT"WHAT IS THE VOLTAGE STEP INCREMENT ";V1$
1070 INPUT"WHAT IS THE END VOLTAGE ";V2$
1080 PRINT#1,NAM$;" ";V0$;" ";V2$;" ";V1$;" ";
1090 INPUT"ANOTHER SWEPT SOURCE ";Y$
1100 IF Y$="Y" THEN 1040
1110 PRINT#1,""
1120 GOSUB 2050: GOTO 2020
1130 PRINT"WILL YOU USE LINEAR OR LOGRITHMIC SWEEP? "
1140 PRINT TAB(10);"1 = LINEAR"
1150 PRINT TAB(10);"2 = LOG DECADE"
1160 PRINT TAB(10);"3 = LOG OCTAVE"
1170 INPUT"WHICH ONE ";J : ON J GOTO 1180,1190,1200
1180 TYP$="LIN":GOTO 1220
1190 TYP$="DEC":GOTO 1210
1200 TYP$="OCT"
1210 PRINT"HOW MANY POINTS PER ";TYP$;:INPUT NP: GOTO 1230
1220 INPUT"HOW MANY LINEAR DATA POINTS ";NP
1230 INPUT"START FREQUENCY = ";F1 : INPUT"STOP FREQUENCY = ";F2
1240 IF F1 START":GOTO 1230
1250 PRINT#1,".AC ";TYP$;" ";NP;" ";F1;" ";F2:K=K+1:A$(K)=" AC "
1260 IF A=6 THEN 1660
1270 IF A=8 THEN 1820
1280 GOSUB 2050:GOTO 2020
1290 INPUT"WHAT IS THE MINUMUM TIMESTEP FOR OUTPUT ";TSTEP$
1300 INPUT"WHAT IS THE END TIME FOR OUTPUT ";TSTOP$
1310 INPUT"WILL YOU DELAY OUTPUT PRINTING TO A TIME TX ";Y$
1320 IF Y$="Y" OR Y$="YES" THEN 1450
1330 PRINT"DO YOU NEED INTERVALS SMALLER THAN ";TSTEP$;
1340 INPUT Y$ : IF Y$="Y" OR Y$="YES" THEN 1440
1350 INPUT"DO YOU WANT TO SPECIFY SOME INITIAL CONDITIONS ";Y$
1360 IF Y$="N" OR Y$="NO" THEN 1400
1370 PRINT#1,".IC "; : INPUT"HOW MANY NODES (INCLUDE SOURCES ) ";N
1380 FOR J=1 TO N : INPUT"NODE NUMBER = ";NM$ : INPUT"VALUE = ";VL$
1390 PRINT#1," V("+NM$+") ";VL$; : NEXT J : PRINT#1,"": PRINT
1400 INPUT"DO YOU WANT TO START FROM INITIAL CONDITIONS (1) OR QUIESCENT (2) ";J
1410 ON J GOTO 1420 ,1430
1420 UIC$="UIC" : GOTO 1470
1430 UIC$="" : GOTO 1470
1440 INPUT"HOW SMALL ";TMAX : TMAX$=STR$(TMAX) : GOTO 1350
1450 INPUT"WHEN ";TS$ 
1460 GOTO 1330
1470 IF A<>5 THEN 1620
1480 INPUT"WHAT IS THE FUNDAMENTAL FOURIER FREQUENCY ";F : F$=STR$(F)
1490 IF 1/F/1001 THEN 1130
1660 INPUT"HOW MANY NODES AND BRANCHES DO YOU WANT SENSITIVITY ON ";N
1670 PRINT#1,".SENS ";
1680 FOR J=1 TO N
1690 INPUT"NODE (V) OR BRANCH (I) ";NB$
1700 INPUT"NODE NUMBER OR VOLTAGE SOURCE NAME = ";NM$
1710 IF NB$="I" AND MID$(NM$,1,1)<>"V" THEN PRINT"MUST START WITH 'V'":GOTO 1690
1720 IF NB$="V" AND ASC(NM$)>57 THEN PRINT"ERROR, ILLEGAL NODE":GOTO 1690
1730 PRINT#1,NB$+"("+NM$+") "; :NEXT J:PRINT#1,"": GOTO 2020
1740 PRINT#1,".DISTO "; :K=K+1: A$(K)=" DISTO "
1750 INPUT"NAME OF LOAD RESISTOR = ";NM$
1760 IF ASC(NM$)<>82 THEN PRINT"ERROR, NOT A VALID NAME":GOTO 1750
1770 INPUT"INTERVAL FOR SUMMARY PRINTOUT(ZERO = NONE) ";IN$
1780 INPUT"RATIO F2/F1 = ";R$ : INPUT"AMPLITUDE OF F2 = ";AF$
1790 INPUT"REFERENCE POWER LEVEL (WATTS)--(1mW=0dBm) = ";REF$
1800 PRINT#1,NM$;" ";IN$;" ";R$;" ";REF$;" ";AF$:GOSUB 2340:GOTO 2020
1810 IF AC<>1 THEN 1130
1820 PRINT#1,".NOISE "; : K=K+1:A$(K)=" NOISE " 
1830 INPUT"NOISE OUTPUT NODE NUMBER ";NM$
1840 INPUT"INPUT NODE FOR EQUIVALENT NOISE ";NE$
1850 INPUT"FREQUENCY INTERVAL FOR SUMMARY PRINTOUT (ZERO=NONE) ";IN$
1860 PRINT#1,NM$;" ";NE$;" ";IN$ 
1870 INPUT"DO YOU WANT TABULAR (T) OR PLOTTED (P) OUTPUT ";Y$
1880 IF Y$="T" THEN 1900
1890 PRINT#1,".PLOT NOISE ";:GOTO 1910
1900 PRINT#1,".PRINT NOISE ";
1910 INPUT"DO YOU WANT OUTPUT IN DB (1) OR VOLTS (2) ";P:ON P GOTO 1920,1930
1920 PRINT#1,"INOISE(DB) ONOISE(DB)":GOTO 2020
1930 PRINT#1,"INOISE(M) ONOISE(M)":GOTO 2020
1940 PRINT#1,".TF";
1950 INPUT"NAME OF DRIVING SOURCE ";V$
1960 INPUT"IS THE OUTPUT A CURRENT (I) OR VOLTAGE (V) ";Y$
1970 IF Y$="I" THEN 2000
1980 PRINT "OUTPUT BETWEEN NODES:";:INPUT"FROM NODE =";N1$:INPUT"TO NODE =";N2$
1990 PRINT#1,"  V(";N1$;",";N2$;") ";V$:GOTO 2020
2000 INPUT"NAME OF CURRENT METER = ";IM$
2010 PRINT#1," I(";IM$;") ";V$
2020 INPUT"MORE ANALYSIS ";Y$:IF Y$="Y" OR Y$="YES" THEN 770
2030 CLOSE#1 : GOTO 2660
2040 REM PLOT ROUTINES 
2050 INPUT"DO YOU WANT TABULAR (T) OR PLOTTED (P) OUTPUT ";Y$
2060 IF Y$="T" THEN 2080
2070 PRINT#1,".PLOT ";A$(K); : GOTO 2090
2080 PRINT#1,".PRINT ";A$(K);
2090 INPUT"HOW MANY NODE VOLTAGES WILL YOU CHOOSE ";NV
2100 FOR Q=1 TO NV:INPUT"NODE NUMBER = ";NN$ 
2110 IF A=2 THEN 2190
2120 PRINT"DO YOU WANT: 1. REAL : IMAGINARY PARTS"
2130 PRINT TAB(14);"2. MAGNITUDE AND PHASE"
2140 PRINT TAB(14);"3. dB AND PHASE"
2150 INPUT P : IF P=1 THEN V1$="VR" : V2$="VI"
2160 IF P=2 THEN V1$="VM":V2$="VP"
2170 IF P=3 THEN V1$="VDB":V2$="VP"
2180 PRINT#1,V1$;"(";NN$;") ";V2$;"(";NN$;") "; : GOTO 2200
2190 PRINT#1,"V(";NN$;") ";
2200 NEXT Q
2210 INPUT"HOW MANY BRANCH CURRENTS WILL YOU CHOOSE ";NI
2220 FOR Q=1 TO NI:INPUT"NAME OF VOLTAGE SOURCE OR CURRENT METER ";NI$
2230 IF A=2 THEN 2310
2240 PRINT"DO YOU WANT: 1. REAL : IMAGINARY PARTS"
2250 PRINT TAB(14);"2. MAGNITUDE AND PHASE"
2260 PRINT TAB(14);"3. dB AND PHASE"
2270 INPUT P : IF P=1 THEN I1$="IR":I2$="II"
2280 IF P=2 THEN I1$="IM":I2$="IP"
2290 IF P=3 THEN I1$="IDB":I2$="IP"
2300 PRINT#1,I1$;"(";NI$;") ";I2$;"(";NI$;") ";
2310 PRINT#1,"I(";NI$;") ";
2320 NEXT Q:PRINT#1,""
2330 RETURN
2340 REM DISTO
2350 INPUT"DO YOU WANT TABULAR (T) OR PLOTTED (P) OUTPUT ";Y$:IF Y$="T" THEN 2370
2360 PRINT#1,".PLOT DISTO ";:GOTO 2380
2370 PRINT#1,".PRINT DISTO ";
2380 PRINT"DO YOU WANT: 1. REAL : IMAGINARY PARTS"
2390 PRINT TAB(14);"2. MAGNITUDE AND PHASE"
2400 PRINT TAB(14);"3. dB AND PHASE" : INPUT P
2410 IF P=1 THEN V1$="(R) ":V2$="(I) "
2420 IF P=2 THEN V1$="(M) ":V2$="(P) "
2430 IF P=3 THEN V1$="(DB) ":V2$="(P) "
2440 PRINT TAB(10);" 2ND HARMONIC = 2"
2450 PRINT TAB(10);" 3RD HARMONIC = 3"
2460 PRINT TAB(10);" BOTH + SUM & DIFF = 4"
2470 INPUT" WHICH ";P
2480 ON P GOTO 2490,2500,2510
2490 PRINT#1,"HD2";V1$;"HD2";V2$:RETURN
2500 PRINT#1,"HD3";V1$;"HD3";V2$:RETURN
2510 PRINT#1,"HD2";V1$;"HD2";V2$;"HD3";V1$;"HD3";V2$;"SIM2";V1$;"SIM2";V2$;
2520 PRINT#1,"DIM2";V1$;"DIM2";V2$;"DIM3";V1$;"DIM3";V2$:RETURN
2530 REM TRAN
2540 INPUT"DO YOU WANT TABULAR T OR PLOTTED P OUTPUT ";Y$:IF Y$="T" THEN 2560
2550 PRINT#1,".PLOT TRAN ";:GOTO 2570
2560 PRINT#1,".PRINT TRAN ";
2570 INPUT"PLOT NODE (V) OR BRANCH (I) ";NB$
2580 IF NB$="V" OR NB$="I" THEN 2600
2590 PRINT"MUST BE 'V' OR 'I'":GOTO 2570
2600 INPUT"NODE NUMBER OR VOLTAGE SOURCE (CURRENT METER) NAME = ";NM$
2610 IF NB$="I" AND LEFT$(NM$,1)<>"V" THEN PRINT"MUST START WITH 'V'":GOTO 2600
2620 IF NB$="V" AND ASC(NM$)>57 THEN PRINT"ERROR, ILLEGAL NODE":GOTO 2600
2630 PRINT#1,NB$+"("+NM$+") ";
2640 INPUT"MORE NODES ";Y$:IF Y$="Y" OR Y$="YES" THEN 2570
2650 PRINT#1,"":RETURN
2660 END


    Source: geocities.com/russlk/spice

               ( geocities.com/russlk)