100 ' ZIZL.BAS Dan Maguire AC6LA (With help/ideas from many others) 110 ' Version 2.2 120 ' 130 ' Impedance at input or load of transmission line, plus other data. 140 ' 150 ' EGA or better adapter, 640 x 350, with background color. 160 ' 170 KEY OFF 180 KEY 1,"": KEY 2,"": KEY 3,"": KEY 4,"": KEY 5,"" 190 KEY 6,"": KEY 7,"": KEY 8,"": KEY 9,"": KEY 10,"" 200 ON ERROR GOTO 240 210 SCREEN 9 220 COLOR 7,1 230 GOTO 310 240 SCREEN 0 250 COLOR 14 : PRINT 260 PRINT "ZIZL plotting not supported on current graphics adapter." 270 PRINT "Press any key to continue ..."; 280 COLOR 7,1 290 DUM$ = INKEY$ : IF DUM$ = "" THEN GOTO 290 300 RESUME 310 310 ON ERROR GOTO 0 320 ' 330 ' If double precision trig functions are available use double 340 ' precision for all calculations. If trig functions are done only 350 ' in single precision, use single. 360 ' 370 PI# = 4 * ATN(1#) 380 IF ABS(PI# - 3.141592653589793#) < .000000000000001# THEN DEFDBL A-Z: PRE$="D": ELSE PRE$="S" 390 ' 400 LOG10 = LOG(10#) 410 NEPER = 20 / LOG10 '= 8.685889... 420 TWOPI = 8 * ATN(1#) '= 6.283185... 430 SL = 299.7925# / .3048# '= 983.5712... 440 RAD = 180 / PI# 450 ' 460 RPT$ = "" 470 DEC% = 2 480 SAVELDS! = 0 : SAVEFQS! = 0 490 LF = 0 500 DIM PLTPP!(288,6) 510 DIM MAXPP!(6), MIDPP!(6), MINPP!(6) 520 PLT.SET% = 0 : PLTA% = 1 : PLTB% = 2 : ZOOM% = 1 530 ' 540 CLS 550 PRINT "--- ZIZL ---"; 560 PRINT " R";CHR$(241);"jX at input/load of transmission line"; 570 PRINT TAB(69); "Version 2.2" 580 ' 590 ' Get the defaults from the ZIZL.DAT file. Note that string data 600 ' entered via an INPUT statement under BASICA (but not GWBASIC or 610 ' QuickBasic) will have trailing blanks up to the next comma 620 ' preserved, so strip them off. (Can't depend on comma placement.) 630 ' 640 OPENERR$ = "" 650 ON ERROR GOTO 5570 660 GOTO 690 670 FILES "ZIZL.DAT" 'First error resumes to here 680 CHDIR PATH$ 'Then to here 690 OPEN "ZIZL.DAT" FOR INPUT AS #1 700 ON ERROR GOTO 0 710 IF OPENERR$ <> "" THEN PRINT: PRINT "Okay, let's go!" 720 ' 730 INPUT #1, D.FQ$, D.RA$, D.XA$, D.ZIZL$, D.PA$, D.LT$, D.LEN$, P.RES! 740 IF RIGHT$(D.FQ$,1) = " " THEN D.FQ$ = LEFT$(D.FQ$,LEN(D.FQ$)-1): GOTO 740 750 IF RIGHT$(D.RA$,1) = " " THEN D.RA$ = LEFT$(D.RA$,LEN(D.RA$)-1): GOTO 750 760 IF RIGHT$(D.XA$,1) = " " THEN D.XA$ = LEFT$(D.XA$,LEN(D.XA$)-1): GOTO 760 770 IF RIGHT$(D.PA$,1) = " " THEN D.PA$ = LEFT$(D.PA$,LEN(D.PA$)-1): GOTO 770 780 IF RIGHT$(D.LT$,1) = " " THEN D.LT$ = LEFT$(D.LT$,LEN(D.LT$)-1): GOTO 780 790 IF RIGHT$(D.LEN$,1) = " " THEN D.LEN$ = LEFT$(D.LEN$,LEN(D.LEN$)-1): GOTO 790 800 IF RIGHT$(D.ZIZL$,1) = " " THEN D.ZIZL$ = LEFT$(D.ZIZL$,LEN(D.ZIZL$)-1): GOTO 800 810 P.RES! = CINT(P.RES! / 2.5) * 2.5 820 IF P.RES! < 2.5 THEN P.RES! = 2.5 ELSE IF P.RES! > 10 THEN P.RES! = 10 830 ' 840 ' Start prompting for required input. Note that some numeric 850 ' data is also used later "as entered" in string form. 860 ' 870 MOREFQ$ = "" 880 PRINT 890 PRINT "Frequency in MHz ";MOREFQ$;"[";D.FQ$;"]? "; 900 LINE INPUT I.FQ$ 910 IF I.FQ$ = "" THEN I.FQ$ = D.FQ$ 920 IF RIGHT$(I.FQ$,1) <> "w" AND RIGHT$(I.FQ$,1) <> "d" THEN GOTO 1010 930 IF LF <> 0 THEN GOTO 950 940 BEEP: COLOR 14: PRINT "Length not yet set.": COLOR 7: GOTO 890 950 NW = VAL(LEFT$(I.FQ$,LEN(I.FQ$)-1)) 960 IF RIGHT$(I.FQ$,1) = "d" THEN NW = NW / 360 970 FQSP! = (NW * SL * VF) / LF 980 I.FQ$ = MID$(STR$(FQSP!),2) 990 FQ = FQSP! 1000 GOTO 1020 1010 FQ = VAL(I.FQ$) 1020 IF FQ >= .001 THEN GOTO 1070 1030 IF RPT$ <> "" THEN LOCATE 25,1 1040 BEEP: COLOR 14: PRINT "Minimum frequency is .001";: COLOR 7 1050 IF RPT$ = "" THEN PRINT: GOTO 890 1060 LOCATE 23,1: PRINT STRING$(79,32);: LOCATE 23,1: GOTO 890 1070 IF RPT$ <> "" THEN GOTO 2400 1080 ' 1090 PRINT 1100 PRINT RPT$; "R and ";CHR$(241);"X in ohms,"; 1110 PRINT " separated with a comma [";D.RA$;",";D.XA$;"]? "; 1120 LINE INPUT RAXA$ 1130 IF RAXA$ = "" THEN RAXA$ = D.RA$+","+D.XA$ 1140 COMMA% = INSTR(1,RAXA$,",") 1150 IF COMMA% = 0 THEN RA = VAL(RAXA$): XA = 0: GOTO 1180 1160 RA = VAL(LEFT$(RAXA$,COMMA%-1)) 1170 XA = VAL(MID$(RAXA$,COMMA%+1)) 1180 IF RPT$ <> "" THEN GOTO 2400 1190 ' 1200 PRINT "Is this at the input (i) or load (l) [";D.ZIZL$;"]? "; 1210 LINE INPUT ZIZL$ 1220 IF ZIZL$ = "" THEN ZIZL$ = D.ZIZL$ 1230 IF ZIZL$ = "i" THEN DIR = -1: GOTO 1270 1240 IF ZIZL$ = "l" THEN DIR = 1: GOTO 1270 1250 BEEP: COLOR 14: PRINT "Only choices are 'i' or 'l'.": COLOR 7: GOTO 1200 1260 ' 1270 PRINT 1280 PRINT "Input power in watts [";D.PA$;"]? "; 1290 LINE INPUT I.PA$ 1300 IF I.PA$ = "" THEN I.PA$ = D.PA$ 1310 PA = VAL(I.PA$) 1320 IF RPT$ <> "" THEN GOTO 2400 1330 ' 1340 PRINT 1350 PRINT "Line type choices are:" 1360 ' Only a small number of records in the file, don't bother 1370 ' with saving the data items. Just read again as needed. 1380 ' Skip past all the comment records until the "00" marker is found. 1390 LINE INPUT #1, MARKER$ 1400 IF MARKER$ <> "00" THEN GOTO 1390 1410 IF EOF(1) THEN GOTO 1460 1420 INPUT #1, LT$, I.R0$, I.VF$, I.DB$, I.FA$, SIGMA, LTDESC$ 1430 IF RIGHT$(LT$,1) = " " THEN LT$ = LEFT$(LT$,LEN(LT$)-1): GOTO 1430 1440 PRINT " '"; LT$; "'"; TAB(10); "for "; LTDESC$ 1450 GOTO 1410 1460 CLOSE 1 1470 PRINT " '00'"; TAB(10); "for manual entry of line parameters" 1480 MORELT$ = "" 1490 ' 1500 PRINT "Line type [";D.LT$;"]";MORELT$;"? "; 1510 LINE INPUT I.LT$ 1520 IF I.LT$ = "" THEN I.LT$ = D.LT$ 1530 IF I.LT$ = "?" THEN OPEN "ZIZL.DAT" FOR INPUT AS #1: GOTO 1340 1540 IF I.LT$ <> "00" THEN GOTO 1560 1550 LT$ = "00": SIGMA = .5: LTDESC$ = "User Defined Line": GOTO 1790 1560 OPEN "ZIZL.DAT" FOR INPUT AS #1 1570 LINE INPUT #1, MARKER$ 1580 IF MARKER$ <> "00" THEN GOTO 1570 1590 IF EOF(1) THEN GOTO 1640 1600 INPUT #1, LT$, I.R0$, I.VF$, I.DB$, I.FA$, SIGMA, LTDESC$ 1610 IF RIGHT$(LT$,1) = " " THEN LT$ = LEFT$(LT$,LEN(LT$)-1): GOTO 1610 1620 IF I.LT$ = LT$ THEN CLOSE 1: X0I = -99: GOTO 1690 'Found match 1630 GOTO 1590 1640 CLOSE 1 'If here, no match found 1650 IF RPT$ <> "" THEN LOCATE 25,1 1660 BEEP: COLOR 14: PRINT "Line type '";I.LT$;"' not recognized. ";: COLOR 7 1670 IF RPT$ = "" THEN PRINT: GOTO 1500 1680 LOCATE 23,1: PRINT STRING$(79,32);: LOCATE 23,1: GOTO 1500 1690 IF RIGHT$(I.R0$,1) = " " THEN I.R0$ = LEFT$(I.R0$,LEN(I.R0$)-1): GOTO 1690 1700 IF RIGHT$(I.VF$,1) = " " THEN I.VF$ = LEFT$(I.VF$,LEN(I.VF$)-1): GOTO 1700 1710 IF RIGHT$(I.DB$,1) = " " THEN I.DB$ = LEFT$(I.DB$,LEN(I.DB$)-1): GOTO 1710 1720 IF RIGHT$(I.FA$,1) = " " THEN I.FA$ = LEFT$(I.FA$,LEN(I.FA$)-1): GOTO 1720 1730 R0 = VAL(I.R0$) 1740 VF = VAL(I.VF$) 1750 DB = VAL(I.DB$) 1760 FA = VAL(I.FA$) 1770 IF RPT$ <> "" THEN GOTO 2400 ELSE GOTO 2220 1780 ' 1790 PRINT 1800 PRINT "Line characteristic Ro (and optional ', Xo')? "; 1810 LINE INPUT R0X0I$ 1820 IF R0X0I$ <> "" THEN GOTO 1870 1830 IF RPT$ <> "" THEN LOCATE 25,1 1840 BEEP: COLOR 14: PRINT "No default, enter a value.";: COLOR 7 1850 IF RPT$ = "" THEN PRINT: GOTO 1800 1860 LOCATE 23,1: PRINT STRING$(79,32);: LOCATE 23,1: GOTO 1800 1870 COMMA% = INSTR(1,R0X0I$,",") 1880 IF COMMA% = 0 THEN I.R0$ = R0X0I$: X0I = -99: GOTO 1920 1890 I.R0$ = LEFT$(R0X0I$,COMMA%-1) 1900 IF RIGHT$(I.R0$,1) = " " THEN I.R0$ = LEFT$(I.R0$,LEN(I.R0$)-1): GOTO 1900 1910 X0I = VAL(MID$(R0X0I$,COMMA%+1)) 1920 R0 = VAL(I.R0$) 1930 IF RPT$ <> "" AND RPT$ <> "lt" THEN GOTO 2400 1940 ' 1950 PRINT "Velocity factor? "; 1960 LINE INPUT I.VF$ 1970 IF I.VF$ <> "" THEN GOTO 2020 1980 IF RPT$ <> "" THEN LOCATE 25,1 1990 BEEP: COLOR 14: PRINT "No default, enter a value.";: COLOR 7 2000 IF RPT$ = "" THEN PRINT: GOTO 1950 2010 LOCATE 23,1: PRINT STRING$(79,32);: LOCATE 23,1: GOTO 1950 2020 VF = VAL(I.VF$) 2030 IF RPT$ <> "" AND RPT$ <> "lt" THEN GOTO 2400 2040 ' 2050 PRINT "Attenuation in dB/100 ft (and optional ', frequency')? "; 2060 LINE INPUT DBFA$ 2070 IF DBFA$ <> "" THEN GOTO 2120 2080 IF RPT$ <> "" THEN LOCATE 25,1 2090 BEEP: COLOR 14: PRINT "No default, enter a value.";: COLOR 7 2100 IF RPT$ = "" THEN PRINT: GOTO 2050 2110 LOCATE 23,1: PRINT STRING$(79,32);: LOCATE 23,1: GOTO 2050 2120 COMMA% = INSTR(1,DBFA$,",") 2130 IF COMMA% = 0 THEN I.DB$ = DBFA$: I.FA$ = I.FQ$: GOTO 2180 2140 I.DB$ = LEFT$(DBFA$,COMMA%-1) 2150 I.FA$ = MID$(DBFA$,COMMA%+1) 2160 IF RIGHT$(I.DB$,1) = " " THEN I.DB$ = LEFT$(I.DB$,LEN(I.DB$)-1): GOTO 2160 2170 IF LEFT$(I.FA$,1) = " " THEN I.FA$ = MID$(I.FA$,2): GOTO 2170 2180 DB = VAL(I.DB$) 2190 FA = VAL(I.FA$) 2200 IF RPT$ <> "" THEN GOTO 2400 2210 ' 2220 PRINT 2230 PRINT "Length in feet (or append 'w'/'d' for wavelengths/degrees)"; 2240 PRINT " [";D.LEN$;"]? "; 2250 LINE INPUT I.LEN$ 2260 IF I.LEN$ = "" THEN I.LEN$ = D.LEN$ 2270 LF = 0: LW = 0: LD = 0 2280 IF RIGHT$(I.LEN$,1) = "w" THEN LW = VAL(LEFT$(I.LEN$,LEN(I.LEN$)-1)): GOTO 2400 2290 IF RIGHT$(I.LEN$,1) = "d" THEN LD = VAL(LEFT$(I.LEN$,LEN(I.LEN$)-1)): GOTO 2400 2300 LF = VAL(I.LEN$) 2310 ' 2320 ' Common processing subroutine. 2330 ' Will set values for: 2340 ' DBFQ attenuation in db/100ft at frequency FQ 2350 ' X0 line Xo component, if not user set 2360 ' LF, LW, LD length, using whichever one is non-0 2370 ' MLDB matched line loss at given length 2380 ' RB and XB impedance at "other" end 2390 ' 2400 GOSUB 10800 2410 ' 2420 ' In remainder of program, RA/XA assumed to be input and RB/XB 2430 ' assumed to be load. If user requested load -> input, swap. 2440 ' 2450 IF ZIZL$ = "l" THEN SWAP RA, RB: SWAP XA, XB 2460 ' 2470 ' Total impedance, magnitude of reflection coefficient, and 2480 ' SWR at input and load. See Antenna Book pg 24-6 (17th edition). 2490 ' 2500 ZA = SQR(RA * RA + XA * XA) 2510 ZB = SQR(RB * RB + XB * XB) 2520 A = RA - R0: B = XA - X0 2530 C = RA + R0: D = XA + X0 2540 REAL = (A * C + B * D) / (C * C + D * D) 2550 IMAG = (B * C - A * D) / (C * C + D * D) 2560 RHOA = SQR(REAL * REAL + IMAG * IMAG) 2570 A = RB - R0: B = XB - X0 2580 C = RB + R0: D = XB + X0 2590 REAL = (A * C + B * D) / (C * C + D * D) 2600 IMAG = (B * C - A * D) / (C * C + D * D) 2610 RHOB = SQR(REAL * REAL + IMAG * IMAG) 2620 IF RHOA <> 1 THEN SWRA = (1 + RHOA) / (1 - RHOA) ELSE SWRA = 1.7E+38 2630 IF RHOB <> 1 THEN SWRB = (1 + RHOB) / (1 - RHOB) ELSE SWRB = 1.7E+38 2640 ' 2650 ' Find SWR loss using a modified calculation for rhoa and rhob. 2660 ' (Numerator uses the complex conjugate of the line Z0.) This 2670 ' method is accurate for both 0 and non-0 line X0, and has the 2680 ' added benefit of working in a negative SWR situation (rho > 1). 2690 ' For a discussion of rho > 1, negative SWR, and loss calculations, 2700 ' see W7XC Technical Correspondence, QST Nov 97, pg 70. 2710 ' 2720 ' (Note that the older method described in the Antenna Book of 2730 ' finding the total loss and then subtracting out the matched 2740 ' line loss to get the SWR loss has been shown to be slightly 2750 ' inaccurate when the line X0 component is other than 0.) 2760 ' 2770 ' After the SWR loss is found add it to the matched line loss to 2780 ' get the total line loss in dB, convert this to a ratio, then use 2790 ' that ratio to set load power based on input power. 2800 ' 2810 ' Special cases trapped to prevent "Divide by 0" and "Overflow". 2820 ' Case 1: If matched line loss = 0, no matter how high the SWR, 2830 ' total loss is 0 and load power = input power. 2840 ' Case 2: Rhob = 1 (infinite SWR) with matched line loss > 0 means 2850 ' infinite loss. Set DB values high and load power to 0. 2860 ' 2870 IF MLDB = 0 THEN SWDB = 0: TLDB = 0: PB = PA: GOTO 3150 2880 IF RHOB = 1 THEN SWDB = 999: TLDB = 999: PB = 0: GOTO 3150 2890 ' 2900 A = RA - R0: B = XA + X0 2910 C = RA + R0: D = XA + X0 2920 REAL = (A * C + B * D) / (C * C + D * D) 2930 IMAG = (B * C - A * D) / (C * C + D * D) 2940 MRHOA = SQR(REAL * REAL + IMAG * IMAG) 2950 A = RB - R0: B = XB + X0 2960 C = RB + R0: D = XB + X0 2970 REAL = (A * C + B * D) / (C * C + D * D) 2980 IMAG = (B * C - A * D) / (C * C + D * D) 2990 MRHOB = SQR(REAL * REAL + IMAG * IMAG) 3000 IF MRHOB >= 1 THEN SWDB = 999: TLDB = 999: PB = 0: GOTO 3150 3010 SWRATIO = (1 - MRHOA*MRHOA) / (1 - MRHOB*MRHOB) 3020 SWDB = 10 * (LOG(SWRATIO) / LOG10) 3030 ' 3040 TLDB = SWDB + MLDB 3050 TLRATIO = 10 ^ (TLDB / 10) 3060 PB = PA / TLRATIO 3070 ' 3080 ' Find current and voltage at input/load, based on power levels. 3090 ' Note that a negative R can be valid, for example in phased arrays. 3100 ' Not sure what to do about computing I and E in that case, using 3110 ' absolute value of R seems reasonable. 3120 ' 3130 ' (The offset IF stmts below prevent "Divide by 0" and "Overflow".) 3140 ' 3150 IF PA = 0 THEN IA = 0: GOTO 3190 3160 IF RA = 0 THEN IA = 1.7E+38: GOTO 3190 3170 IA = SQR(PA / ABS(RA)) 3180 ' 3190 IF IA >= 1.6E+38 AND ZA > 0 THEN EA = 1.7E+38: GOTO 3220 3200 EA = IA * ZA 3210 ' 3220 IF PB = 0 THEN IB = 0: GOTO 3260 3230 IF RB = 0 THEN IB = 1.7E+38: GOTO 3260 3240 IB = SQR(PB / ABS(RB)) 3250 ' 3260 IF IB >= 1.6E+38 AND ZB > 0 THEN EB = 1.7E+38: GOTO 3310 3270 EB = IB * ZB 3280 ' 3290 ' Compute SWR referenced to 50,0 (like a meter). 3300 ' 3310 RHO50A = SQR(((RA-50)*(RA-50) + XA*XA) / ((RA+50)*(RA+50) + XA*XA)) 3320 RHO50B = SQR(((RB-50)*(RB-50) + XB*XB) / ((RB+50)*(RB+50) + XB*XB)) 3330 IF RHO50A <> 1 THEN SWR50A = (1+RHO50A) / (1-RHO50A) ELSE SWR50A=1.7E+38 3340 IF RHO50B <> 1 THEN SWR50B = (1+RHO50B) / (1-RHO50B) ELSE SWR50B=1.7E+38 3350 ' 3360 ' Set number of decimal places to show on display (1-3, or e), 3370 ' which also sets max value that can be shown. 3380 ' (Only covers R, X, Z, P, I, E, and SWRs) 3390 ' 3400 ON DEC% GOTO 3410, 3420, 3430, 3440 3410 USTR$ = "#######.#": USTRPM$ = "+######.#": MAX = 999999.9: GOTO 3490 3420 USTR$ = "######.##": USTRPM$ = "+#####.##": MAX = 99999.99: GOTO 3490 3430 USTR$ = "#####.###": USTRPM$ = "+####.###": MAX = 9999.999: GOTO 3490 3440 USTR$ = "##.##^^^^": USTRPM$ = "+#.##^^^^": MAX = 1.7E+38 3450 ' 3460 ' If any fields were changed, must re-do plot set. 3470 ' (Changing display decimals does not changes any values.) 3480 ' 3490 IF RPT$ = "1" OR RPT$ = "2" OR RPT$ = "3" OR RPT$ = "e" THEN GOTO 3570 3500 PLT.SET% = 0 3510 ' 3520 ' Results. 3530 ' Note that data items entered by the user are printed "as entered" 3540 ' without truncation of trailing 0's or addition of "...0001" or 3550 ' "...9999" because of rounding to convert to numeric. 3560 ' 3570 CLS : COLOR 15 3580 PRINT CHR$(218);STRING$(78,196);CHR$(191); 3590 FOR LL% = 2 TO 17 3600 LOCATE LL%,1 : PRINT CHR$(179); : LOCATE LL%,80 : PRINT CHR$(179); 3610 NEXT LL% 3620 PRINT CHR$(192);STRING$(78,196);PRE$; : COLOR 7 3630 ' 3640 IF LEFT$(LT$,1) = "*" THEN GOTO 3690 3650 IF RPT$ <> "z" AND RPT$ <> "vf" AND RPT$ <> "at" THEN GOTO 3690 3660 LT$ = "*" + LT$ 3670 LTDESC$ = "*Altered* " + LTDESC$ 3680 ' 3690 LOCATE 2,4 3700 PRINT "Frequency = "; I.FQ$; " MHz"; TAB(77-LEN(LTDESC$)); LTDESC$ 3710 ' 3720 LOCATE 4,4 3730 PRINT "Line type = "; LT$; " Line char Zo = "; I.R0$; 3740 PRINT USING "+###.###"; X0; 3750 PRINT " Velocity factor = "; I.VF$ 3760 LOCATE 5,4 3770 PRINT "Attenuation = "; I.DB$; " dB/100 ft at "; I.FA$; " MHz"; 3780 IF FQ = FA THEN PRINT: GOTO 3800 3790 PRINT " (="; USING "##.###"; DBFQ;: PRINT " dB/100 at "; I.FQ$; " MHz)" 3800 LOCATE 7,4 3810 PRINT "Length in feet ="; USING "####.###"; LF; 3820 PRINT " wavelengths ="; USING "###.###"; LW; 3830 PRINT " degrees ="; USING "####.###"; LD 3840 ' 3850 SAVERA = RA: SAVEXA = XA: SAVERB = RB: SAVEXB = XB: SAVEPA = PA 3860 LOCATE 9,4 3870 PRINT " ------------Input-----------"; 3880 PRINT " ------------Load------------" 3890 LOCATE 10,4 3900 PRINT "R, X, Z : "; 3910 IF ABS(RA) > MAX THEN RA = MAX * SGN(RA) 3920 PRINT USING USTR$; RA; 3930 IF ABS(XA) > MAX THEN XA = MAX * SGN(XA) 3940 PRINT " "; USING USTRPM$; XA; 3950 IF ZA > MAX THEN ZA = MAX 3960 PRINT " "; USING USTR$; ZA; 3970 PRINT " "; 3980 IF ABS(RB) > MAX THEN RB = MAX * SGN(RB) 3990 PRINT USING USTR$; RB; 4000 IF ABS(XB) > MAX THEN XB = MAX * SGN(XB) 4010 PRINT " "; USING USTRPM$; XB; 4020 IF ZB > MAX THEN ZB = MAX 4030 PRINT " "; USING USTR$; ZB 4040 LOCATE 12,4 4050 PRINT "SWR, SWR50: "; 4060 IF ABS(SWRA) > MAX THEN SWRA = MAX * SGN(SWRA) 4070 PRINT USING USTR$; SWRA; 4080 IF ABS(SWR50A) > MAX THEN SWR50A = MAX * SGN(SWR50A) 4090 PRINT " "; USING USTR$; SWR50A; 4100 PRINT " "; 4110 IF ABS(SWRB) > MAX THEN SWRB = MAX * SGN(SWRB) 4120 PRINT USING USTR$; SWRB; 4130 IF ABS(SWR50B) > MAX THEN SWR50B = MAX * SGN(SWR50B) 4140 PRINT " "; USING USTR$; SWR50B 4150 LOCATE 14,4 4160 PRINT "P, I, E : "; 4170 IF PA > MAX THEN PA = MAX 4180 PRINT USING USTR$; PA; 4190 IF IA > MAX THEN IA = MAX 4200 PRINT " "; USING USTR$; IA; 4210 IF EA > MAX THEN EA = MAX 4220 PRINT " "; USING USTR$; EA; 4230 PRINT " "; 4240 IF PB > MAX THEN PB = MAX 4250 PRINT USING USTR$; PB; 4260 IF IB > MAX THEN IB = MAX 4270 PRINT " "; USING USTR$; IB; 4280 IF EB > MAX THEN EB = MAX 4290 PRINT " "; USING USTR$; EB 4300 LOCATE 15,4 4310 PRINT " ----------------------------"; 4320 PRINT " ----------------------------" 4330 RA = SAVERA: XA = SAVEXA: RB = SAVERB: XB = SAVEXB: PA = SAVEPA 4340 ' 4350 IF RA >= 0 AND RB >= 0 THEN GOTO 4420 4360 COLOR 14 4370 LOCATE 16,4 4380 IF RA < 0 THEN PRINT TAB(17) "Negative R. I and E suspect."; 4390 IF RB < 0 THEN PRINT TAB(49) "Negative R. I and E suspect."; 4400 COLOR 7 4410 ' 4420 LOCATE 17,4 4430 PRINT SPC(3); "Loss ="; 4440 PRINT USING "###.###"; MLDB; 4450 PRINT " dB Matched line +"; 4460 IF SWDB = 999 THEN PRINT " "CHR$(126)"999";: GOTO 4480 4470 PRINT USING "###.###"; SWDB; 4480 PRINT " dB SWR ="; 4490 IF TLDB = 999 THEN PRINT " "CHR$(126)"999";: GOTO 4510 4500 PRINT USING "###.###"; TLDB; 4510 PRINT " dB Total" 4520 ' 4530 LOCATE 19,1 4540 PRINT SPC(3); "Frequency (f), Input R and X (i), Load R and X (l), Input power (p)," 4550 PRINT SPC(3); "Line type (lt), Line parameters (z,vf,at), Length (len), Steps (s)," 4560 PRINT SPC(3); "Frequency sweep (fs), Plot (plt,res), Decimals (1,2,3,e), or Quit (q)." 4570 LOCATE 23,1 4580 PRINT "Enter a code ('f', 'i', etc) and (optional) data [q]? "; 4590 LINE INPUT RPT$ 4600 LOCATE 23,1 : PRINT STRING$(79,32); 4610 LOCATE 25,1 : PRINT STRING$(79,32); 4620 LOCATE 23,1 4630 ' 4640 IF RPT$ <> "q" AND RPT$ <> "" THEN GOTO 4680 4650 INPUT "Confirm quit ([y]/n)"; QUIT$ 4660 IF QUIT$ = "n" THEN GOTO 4570 4670 COLOR 7,0: CLS: SYSTEM 4680 IF RPT$ = "s" THEN XTR$ = "" : STEPS$ = "LD" : GOTO 5900 4690 IF RPT$ = "fs" THEN XTR$ = "" : STEPS$ = "FQ" : GOTO 5900 4700 IF RPT$ = "plt" THEN GOTO 7430 4710 IF LEFT$(RPT$,3) <> "res" THEN GOTO 4900 4720 XTR$ = MID$(RPT$,4) 4730 IF XTR$ <> "" THEN P.RES! = VAL(XTR$) : GOTO 4790 4740 PRINT "Plot resolution (2.5, 5, 7.5, 10";CHR$(248); 4750 PRINT ") [Now";STR$(P.RES!);"]? "; 4760 LINE INPUT XTR$ 4770 IF XTR$ = "" THEN GOTO 4570 4780 P.RES! = VAL(XTR$) 4790 P.RES! = CINT(P.RES! / 2.5) * 2.5 4800 IF P.RES! < 2.5 THEN P.RES! = 2.5 ELSE IF P.RES! > 10 THEN P.RES! = 10 4810 LOCATE 25,1 : PRINT "Plot resolution set to";STR$(P.RES!);CHR$(248); 4820 PLT.SET% = 0 4830 GOTO 4570 4840 ' 4850 ' If previous was load -> input, swap back before repeating. 4860 ' Note that it may not be necessary to repeat all calculations for 4870 ' any given changed item, but doing so makes the program logic simpler. 4880 ' Also modify the prompts for Frequency and Line type. 4890 ' 4900 IF ZIZL$ = "l" THEN SWAP RA, RB: SWAP XA, XB 4910 MOREFQ$ = "(or append 'w'/'d' for wavelengths/degrees) " 4920 MORELT$ = " (Enter '?' for list)" 4930 ' 4940 IF RPT$ = "f" THEN GOTO 890 4950 IF RPT$ = "i" THEN RPT$ = "Input ": ZIZL$ = "i": DIR = -1: GOTO 1100 4960 IF RPT$ = "l" THEN RPT$ = "Load " : ZIZL$ = "l": DIR = 1: GOTO 1100 4970 IF RPT$ = "p" THEN GOTO 1280 4980 IF RPT$ = "lt" THEN GOTO 1500 4990 IF RPT$ = "z" THEN GOTO 1800 5000 IF RPT$ = "vf" THEN GOTO 1950 5010 IF RPT$ = "at" THEN GOTO 2050 5020 IF RPT$ = "len" THEN GOTO 2230 5030 IF RPT$ = "1" THEN DEC% = 1: GOTO 2400 'Re-do calculations 5040 IF RPT$ = "2" THEN DEC% = 2: GOTO 2400 ' in case 5050 IF RPT$ = "3" THEN DEC% = 3: GOTO 2400 ' any fields 5060 IF RPT$ = "e" THEN DEC% = 4: GOTO 2400 ' were maxed out. 5070 ' 5080 ' No match so far. See if input was a "compound" entry, 5090 ' a valid repeat code followed by extra input (XTR$). 5100 ' To determine the repeat code, first look for appended 5110 ' numeric type data or blanks. Failing that, look 5120 ' explicitly for "lt", which is the only code that might 5130 ' be followed immediately by non-numeric data. 5140 ' Strip off any leading blanks from extra input field. 5150 ' 5160 FOR N% = 2 TO LEN(RPT$) STEP 1 5170 CODE% = ASC(MID$(RPT$,N%,1)) 5180 IF CODE% >= 48 AND CODE% <= 57 THEN GOTO 5250 '0-9 5190 IF CODE% >= 43 AND CODE% <= 46 THEN GOTO 5250 '+,-. 5200 IF CODE% = 32 THEN GOTO 5250 'blank 5210 NEXT N% 5220 IF LEFT$(RPT$,2) = "lt" THEN N% = 3: GOTO 5250 5230 GOTO 5490 'Give up 5240 ' 5250 XTR$ = MID$(RPT$,N%) 5260 RPT$ = LEFT$(RPT$,N%-1) 5270 IF LEFT$(XTR$,1) = " " THEN XTR$ = MID$(XTR$,2): GOTO 5270 5280 ' 5290 IF RPT$ = "f" THEN I.FQ$ = XTR$: GOTO 920 5300 IF RPT$ = "i" THEN RAXA$ = XTR$: ZIZL$ = "i": DIR = -1: GOTO 1140 5310 IF RPT$ = "l" THEN RAXA$ = XTR$: ZIZL$ = "l": DIR = 1: GOTO 1140 5320 IF RPT$ = "p" THEN I.PA$ = XTR$: GOTO 1310 5330 IF RPT$ = "lt" THEN I.LT$ = XTR$: GOTO 1530 5340 IF RPT$ = "z" THEN R0X0I$ = XTR$: GOTO 1870 5350 IF RPT$ = "vf" THEN I.VF$ = XTR$: GOTO 2020 5360 IF RPT$ = "at" THEN DBFA$ = XTR$: GOTO 2120 5370 IF RPT$ = "len" THEN I.LEN$ = XTR$: GOTO 2270 5380 IF RPT$ <> "s" THEN GOTO 5420 5390 IF ZIZL$ = "l" THEN SWAP RA, RB: SWAP XA, XB 5400 STEPS$ = "LD" 5410 GOTO 5900 5420 IF RPT$ <> "fs" THEN GOTO 5490 5430 IF ZIZL$ = "l" THEN SWAP RA, RB: SWAP XA, XB 5440 STEPS$ = "FQ" 5450 GOTO 5900 5460 ' 5470 ' Can't recognize the request. 5480 ' 5490 BEEP : COLOR 14 5500 PRINT "Choice '";RPT$;"' not recognized, enter again? "; 5510 COLOR 7 5520 IF ZIZL$ = "l" THEN SWAP RA, RB: SWAP XA, XB 5530 GOTO 4590 5540 ' 5550 ' Error trap for "File not found"/"Path not found" opening ZIZL.DAT. 5560 ' 5570 IF ERR = 76 THEN GOTO 5750 5580 IF ERR <> 53 THEN ON ERROR GOTO 0 5590 IF OPENERR$ = "" THEN OPENERR$ = "1": PRINT: RESUME 670 5600 IF OPENERR$ = "2" THEN GOTO 5720 5610 BEEP 5620 PRINT "The required file 'ZIZL.DAT' was not found in the above directory." 5630 PRINT 5640 PRINT "You can avoid this annoying prompt in the future by either moving" 5650 PRINT "the 'ZIZL.DAT' file or changing the default directory used in your" 5660 PRINT "BASIC environment." 5670 PRINT 5680 PRINT "For now, enter the complete path (c:\ etc.) for the directory" 5690 PRINT "which contains 'ZIZL.DAT'. If you want to quit now, enter 'q'." 5700 OPENERR$ = "2" 5710 GOTO 5780 5720 PRINT 5730 PRINT "Still can't find it. Try again, or quit." 5740 GOTO 5780 5750 PRINT 5760 PRINT "This is even worse. That's an invalid path. "; 5770 PRINT "Try again, or quit." 5780 PRINT 5790 INPUT "Path, or 'q'"; PATH$ 5800 IF PATH$ = "q" THEN COLOR 7,0: CLS: SYSTEM 5810 RESUME 680 5820 '---------------------------------------------------------------------- 5830 ' 5840 ' Show items of data at various line lengths in degrees, 5850 ' or at various frequencies, all with a constant load. 5860 ' If a steps screen was already shown, repeat it without 5870 ' any explanatory notes. Also skip notes if a "compound" 5880 ' request was made on the main screen. 5890 ' 5900 CLS 5910 ' 5920 SAVEFQ = FQ: SAVEDBFQ = DBFQ: SAVEX0 = X0: SAVEMLDB = MLDB 5930 SAVELF = LF: SAVELW = LW: SAVELD = LD: SAVEDIR = DIR 5940 SAVERA = RA: SAVEXA = XA: SAVERB = RB: SAVEXB = XB 5950 RA = RB: XA = XB: DIR = 1 5960 ' 5970 IF XTR$ <> "" THEN F.T.S$ = XTR$: GOTO 6360 5980 ' 5990 IF STEPS$ = "LD" THEN GOTO 6140 6000 IF SAVEFQS! <> 0 THEN XXF! = SAVEFQF!: XXT! = SAVEFQT!: XXS! = SAVEFQS!: GOTO 6540 6010 PRINT SPC(25); "Frequency Sweep, Constant Load" 6020 PRINT 6030 PRINT SPC(3); "You may examine line input impedance and power at one or more frequencies," 6040 PRINT SPC(3); "while keeping the line length in feet constant. Specify the frequencies" 6050 PRINT SPC(3); "to be shown by giving a starting frequency, ending frequency, and step" 6060 PRINT SPC(3); "size, all in MHz. Values are separated with commas." 6070 PRINT 6080 PRINT SPC(3); "For example, to examine the line input sweeping from 7 MHz to 7.15 MHz" 6090 PRINT SPC(3); "by steps of .01 MHz, enter '7, 7.15, .01'. Note that all calculations" 6100 PRINT SPC(3); "are done keeping the same physical line length (although the electrical" 6110 PRINT SPC(3); "length will change) and the same impedance and power -at the load-." 6120 GOTO 6270 6130 ' 6140 IF SAVELDS! <> 0 THEN XXF! = SAVELDF!: XXT! = SAVELDT!: XXS! = SAVELDS!: GOTO 6550 6150 PRINT SPC(22); "Steps of Line Length, Constant Load" 6160 PRINT 6170 PRINT SPC(3); "You may examine line input impedance and power at one or more points as" 6180 PRINT SPC(3); "measured back from the load end. Specify the points to be shown by" 6190 PRINT SPC(3); "giving a starting distance, ending distance, and step size, all in" 6200 PRINT SPC(3); "degrees. Values are separated with commas." 6210 PRINT 6220 PRINT SPC(3); "For example, to examine the line at 15 degree intervals for a half" 6230 PRINT SPC(3); "wavelength back from the load, enter '0, 180, 15'. To examine the line" 6240 PRINT SPC(3); "in detail around 45 degrees back from the load, enter '44.5, 45.5, .1'." 6250 PRINT SPC(3); "Note that all calculations are done keeping the same impedance and power" 6260 PRINT SPC(3); "-at the load-." 6270 PRINT 6280 PRINT SPC(3); "To return to the main screen enter 'q'." 6290 PRINT STRING$(80,196); 6300 PRINT 6310 ' 6320 IF STEPS$ = "LD" THEN GOTO 6340 6330 PRINT "Frequency in MHz: From, To, Step (or 'q')? "; : GOTO 6350 6340 PRINT "Line length in degrees from load: From, To, Step (or 'q')? "; 6350 LINE INPUT F.T.S$ 6360 IF F.T.S$ = "q" THEN GOTO 7280 6370 IF LEFT$(F.T.S$,1) = "s" AND STEPS$ = "LD" THEN F.T.S$ = MID$(F.T.S$,2) : GOTO 6390 6380 IF LEFT$(F.T.S$,2) = "fs" AND STEPS$ = "FQ" THEN F.T.S$ = MID$(F.T.S$,3) 6390 COMMA% = INSTR(1,F.T.S$,",") 6400 IF COMMA% > 0 THEN GOTO 6420 6410 BEEP: COLOR 14: PRINT "Enter 3 values, or 'q'.": COLOR 7: GOTO 6320 6420 XXF! = VAL(LEFT$(F.T.S$,COMMA%-1)) 6430 T.S$ = MID$(F.T.S$,COMMA%+1) 6440 COMMA% = INSTR(1,T.S$,",") 6450 IF COMMA% > 0 THEN GOTO 6470 6460 BEEP: COLOR 14: PRINT "Enter 3 values, or 'q'.": COLOR 7: GOTO 6320 6470 XXT! = VAL(LEFT$(T.S$,COMMA%-1)) 6480 XXS! = VAL(MID$(T.S$,COMMA%+1)) 6490 IF XXS! <> 0 THEN GOTO 6510 6500 BEEP: COLOR 14: PRINT "Step size must be non-0.": COLOR 7: GOTO 6320 6510 PRINT STRING$(79, "-") 6520 ' 6530 IF STEPS$ = "LD" THEN GOTO 6550 6540 PRINT " Freq Deg Wl"; : GOTO 6560 6550 PRINT " Deg Wl Ft"; 6560 PRINT " R X Z P"; 6570 PRINT " I E" 6580 ' 6590 LCNT% = 0 6600 FOR XX! = XXF! TO XXT! STEP XXS! 6610 IF LCNT% < 21 THEN GOTO 6720 6620 PRINT "Next line of data will cause top line to scroll off screen." 6630 INPUT "Enter 's' to stop now, anything else to continue"; CHK$ 6640 IF CHK$ = "s" THEN GOTO 7230 6650 LCNT% = 0 6660 IF STEPS$ = "LD" THEN GOTO 6680 6670 PRINT " Freq Deg Wl"; : GOTO 6690 6680 PRINT " Deg Wl Ft"; 6690 PRINT " R X Z P"; 6700 PRINT " I E" 6710 ' 6720 IF STEPS$ = "LD" THEN LD = XX! : LF = 0 : LW = 0 : GOTO 6740 6730 FQ = XX! : IF FQ < .001 THEN FQ = .001 6740 GOSUB 10800 6750 RA1 = RB: XA1 = XB: ZA1 = SQR(RA1 * RA1 + XA1 * XA1) 6760 ' 6770 IF MLDB = 0 THEN PA1 = PB: GOTO 6930 6780 IF RHOB = 1 THEN PA1 = 0: GOTO 6930 6790 IF MRHOB >= 1 THEN PA1 = 0: GOTO 6930 6800 ' 6810 A = RA1 - R0: B = XA1 + X0 6820 C = RA1 + R0: D = XA1 + X0 6830 REAL = (A * C + B * D) / (C * C + D * D) 6840 IMAG = (B * C - A * D) / (C * C + D * D) 6850 MRHOA1 = SQR(REAL * REAL + IMAG * IMAG) 6860 SWRATIO1 = (1 - MRHOA1*MRHOA1) / (1 - MRHOB*MRHOB) 6870 SWDB1 = 10 * (LOG(SWRATIO1) / LOG10) 6880 ' 6890 TLDB1 = SWDB1 + MLDB 6900 TLRATIO1 = 10 ^ (TLDB1 / 10) 6910 PA1 = PB * TLRATIO1 6920 ' 6930 IF PA1 = 0 THEN IA1 = 0: GOTO 6960 6940 IF RA1 = 0 THEN IA1 = 1.7E+38: GOTO 6960 6950 IA1 = SQR(PA1 / ABS(RA1)) 6960 IF IA1 >= 1.6E+38 AND ZA1 > 0 THEN EA1 = 1.7E+38: GOTO 6990 6970 EA1 = IA1 * ZA1 6980 ' 6990 IF STEPS$ = "LD" THEN GOTO 7040 7000 PRINT USING "####.###"; FQ; 7010 PRINT USING "#####.###"; LD; 7020 PRINT USING "####.###"; LW; 7030 GOTO 7080 7040 PRINT USING "####.###"; LD; 7050 PRINT USING "####.###"; LW; 7060 PRINT USING "#####.###"; LF; 7070 ' 7080 IF ABS(RA1) > MAX THEN RA1 = MAX * SGN(RA1) 7090 PRINT USING USTR$; RA1; 7100 IF ABS(XA1) > MAX THEN XA1 = MAX * SGN(XA1) 7110 PRINT USING USTRPM$; XA1; 7120 IF ZA1 > MAX THEN ZA1 = MAX 7130 PRINT USING USTR$; ZA1; 7140 IF PA1 > MAX THEN PA1 = MAX 7150 PRINT USING USTR$; PA1; 7160 IF IA1 > MAX THEN IA1 = MAX 7170 PRINT USING USTR$; IA1; 7180 IF EA1 > MAX THEN EA1 = MAX 7190 PRINT USING USTR$; EA1 7200 LCNT% = LCNT% + 1 7210 NEXT XX! 7220 ' 7230 IF STEPS$ = "LD" THEN SAVELDF! = XXF!: SAVELDT! = XXT!: SAVELDS! = XXS!: GOTO 7250 7240 SAVEFQF! = XXF!: SAVEFQT! = XXT!: SAVEFQS! = XXS! 7250 PRINT STRING$(79, "-") 7260 GOTO 6320 7270 ' 7280 FQ = SAVEFQ: DBFQ = SAVEDBFQ: X0 = SAVEX0: MLDB = SAVEMLDB 7290 LF = SAVELF: LW = SAVELW: LD = SAVELD: DIR = SAVEDIR 7300 RA = SAVERA: XA = SAVEXA: RB = SAVERB: XB = SAVEXB 7310 GOTO 3570 7320 '---------------------------------------------------------------------- 7330 ' 7340 ' Plot R,X / Z,Za / I,E versus length from load in degrees. 7350 ' (PLTN%= 1 2 3 4 5 6) 7360 ' 7370 ' For array PLTPP!, second subscript is: 7380 ' 0: Len deg 1: R 3: Z 5: I 7390 ' 2: X 4: Za 6: E 7400 ' Didn't have enough memory under GWBASIC to include 'feet' 7410 ' in the array, so compute again as needed. 7420 ' 7430 CLS 7440 REDRAW$ = "AB" 7450 IF PLT.SET% = 1 THEN GOTO 8600 7460 COLOR 15 7470 LOCATE 6,32 : PRINT "Please wait ..."; 7480 LOCATE 8,29 : COLOR 7 : PRINT STRING$(20,254); 7490 LOCATE 10,15 : PRINT "(Increase plot resolution to decrease wait time)"; 7500 LOCATE 17,16 : PRINT "Press F1 to stop now and return to main screen,"; 7510 LOCATE 18,16 : PRINT "then use code 'res' to change plot resolution."; 7520 COLOR 12 7530 ' 7540 SAVEMLDB = MLDB 7550 SAVELF = LF: SAVELW = LW: SAVELD = LD: SAVEDIR = DIR 7560 SAVERA = RA: SAVEXA = XA: SAVERB = RB: SAVEXB = XB 7570 ' 7580 ON KEY(1) GOSUB 7620 7590 KEY(1) ON 7600 TRAP% = 0 7610 GOTO 7650 7620 TRAP% = 1 7630 RETURN 8360 7640 ' 7650 RA = RB: XA = XB: DIR = 1 7660 PPI% = -1 7670 FOR I% = 1 TO 6: MAXPP!(I%) = -1: NEXT I% 7680 TCNT! = 1 7690 FOR XX! = 0 TO 720 STEP P.RES! 7700 LD = XX! : LF = 0 : LW = 0 7710 GOSUB 10890 'Bypass first part since freq constant for plotting 7720 RA1 = RB : XA1 = XB 7730 ' 7740 ON SGN(RA1)+2 GOTO 7750, 7790, 7830 7750 ON SGN(XA1)+2 GOTO 7760, 7770, 7780 7760 AA1 = ATN(XA1/RA1)*RAD-180 : ZA1 = SQR(RA1*RA1+XA1*XA1) : GOTO 7880 7770 AA1 = 180 : ZA1 = -RA1 : GOTO 7880 7780 AA1 = 180+ATN(XA1/RA1)*RAD : ZA1 = SQR(RA1*RA1+XA1*XA1) : GOTO 7880 7790 ON SGN(XA1)+2 GOTO 7800, 7810, 7820 7800 AA1 = -90 : ZA1 = -XA1 : GOTO 7880 7810 AA1 = 0 : ZA1 = 0 : GOTO 7880 7820 AA1 = 90 : ZA1 = XA1 : GOTO 7880 7830 ON SGN(XA1)+2 GOTO 7840, 7850, 7860 7840 AA1 = ATN(XA1/RA1)*RAD : ZA1 = SQR(RA1*RA1+XA1*XA1) : GOTO 7880 7850 AA1 = 0 : ZA1 = RA1 : GOTO 7880 7860 AA1 = ATN(XA1/RA1)*RAD : ZA1 = SQR(RA1*RA1+XA1*XA1) 7870 ' 7880 IF MLDB = 0 THEN PA1 = PB: GOTO 8040 7890 IF RHOB = 1 THEN PA1 = 0: GOTO 8040 7900 IF MRHOB >= 1 THEN PA1 = 0: GOTO 8040 7910 ' 7920 A = RA1 - R0: B = XA1 + X0 7930 C = RA1 + R0: D = XA1 + X0 7940 REAL = (A * C + B * D) / (C * C + D * D) 7950 IMAG = (B * C - A * D) / (C * C + D * D) 7960 MRHOA1 = SQR(REAL * REAL + IMAG * IMAG) 7970 SWRATIO1 = (1 - MRHOA1*MRHOA1) / (1 - MRHOB*MRHOB) 7980 SWDB1 = 10 * (LOG(SWRATIO1) / LOG10) 7990 ' 8000 TLDB1 = SWDB1 + MLDB 8010 TLRATIO1 = 10 ^ (TLDB1 / 10) 8020 PA1 = PB * TLRATIO1 8030 ' 8040 IF PA1 = 0 THEN IA1 = 0: GOTO 8070 8050 IF RA1 = 0 THEN IA1 = 1.7E+38: GOTO 8070 8060 IA1 = SQR(PA1 / ABS(RA1)) 8070 IF IA1 >= 1.6E+38 AND ZA1 > 0 THEN EA1 = 1.7E+38: GOTO 8100 8080 EA1 = IA1 * ZA1 8090 ' 8100 IF RA1 > 9999.999 THEN RA1 = 9999.999 8110 IF ABS(XA1) > 9999.999 THEN XA1 = 9999.999 * SGN(XA1) 8120 IF ZA1 > 9999.999 THEN ZA1 = 9999.999 8130 IF IA1 > 9999.999 THEN IA1 = 9999.999 8140 IF EA1 > 9999.999 THEN EA1 = 9999.999 8150 ' 8160 PPI% = PPI% + 1 8170 PLTPP!(PPI%,0) = XX! 8180 PLTPP!(PPI%,1) = RA1 : PLTPP!(PPI%,2) = XA1 8190 PLTPP!(PPI%,3) = ZA1 : PLTPP!(PPI%,4) = AA1 8200 PLTPP!(PPI%,5) = IA1 : PLTPP!(PPI%,6) = EA1 8210 ' 8220 IF PPI% = 0 AND (RA1 = 0 OR RA1 = 9999.999) THEN GOTO 8300 8230 IF RA1 > MAXPP!(1) THEN MAXPP!(1) = RA1 8240 IF ZA1 > MAXPP!(3) THEN MAXPP!(3) = ZA1 8250 IF IA1 > MAXPP!(5) THEN MAXPP!(5) = IA1 8260 IF EA1 > MAXPP!(6) THEN MAXPP!(6) = EA1 8270 IF ABS(XA1) > MAXPP!(2) THEN MAXPP!(2) = ABS(XA1) 8280 IF ABS(AA1) > MAXPP!(4) THEN MAXPP!(4) = ABS(AA1) 8290 ' 8300 IF XX!/TCNT! > 36 THEN LOCATE 8,29 : PRINT STRING$(TCNT!,254); : TCNT! = TCNT! + 1 8310 NEXT XX! 8320 LOCATE 8,29 : PRINT STRING$(20,254); 8330 MAXFT! = LF 8340 D2F! = (SL * VF) / (360 * FQ) 8350 ' 8360 MLDB = SAVEMLDB 8370 LF = SAVELF: LW = SAVELW: LD = SAVELD: DIR = SAVEDIR 8380 RA = SAVERA: XA = SAVEXA: RB = SAVERB: XB = SAVEXB 8390 KEY(1) OFF 8400 IF TRAP% = 1 THEN GOTO 3570 8410 ' 8420 ' Set max/min/mid plot ranges. 8430 ' For X and Za, center range on zero. 8440 ' Don't bother trying to plot possible negative R values. 8450 ' 8460 FOR I% = 1 TO 6 8470 FOR AA! = 0 TO 3 8480 FOR BB! = 1 TO 10 8490 PLT.RNG! = BB! * 10 ^ AA! 8500 IF MAXPP!(I%) <= PLT.RNG! THEN MAXPP!(I%) = PLT.RNG! : GOTO 8530 8510 NEXT BB! 8520 NEXT AA! 8530 IF I% = 2 OR I% = 4 THEN MINPP!(I%) = -MAXPP!(I%) ELSE MINPP!(I%) = 0 8540 MIDPP!(I%) = (MAXPP!(I%) + MINPP!(I%)) / 2 8550 NEXT I% 8560 PLT.SET% = 1 8570 ' 8580 ' Build text annotation (except range). 8590 ' 8600 COLOR 15 8610 LOCATE 1,75 : PRINT LEFT$(STR$(MAXPP!(PLTA%))+" ",6); 8620 LOCATE 6,75 : PRINT LEFT$(STR$(MIDPP!(PLTA%))+" ",6); 8630 LOCATE 11,75 : PRINT LEFT$(STR$(MINPP!(PLTA%))+" ",6); 8640 LOCATE 12,75 : PRINT LEFT$(STR$(MAXPP!(PLTB%))+" ",6); 8650 LOCATE 17,75 : PRINT LEFT$(STR$(MIDPP!(PLTB%))+" ",6); 8660 LOCATE 22,75 : PRINT LEFT$(STR$(MINPP!(PLTB%))+" ",6); 8670 IF PLTB% = 2 OR PLTB% = 4 THEN LOCATE 12,75 : PRINT "+"; 8680 ' 8690 IF PLTA% = 1 THEN TA$ = "R" : LA$ = "Ohms" : GOTO 8720 8700 IF PLTA% = 3 THEN TA$ = "Z" : LA$ = "Ohms" : GOTO 8720 8710 IF PLTA% = 5 THEN TA$ = "I" : LA$ = "Amps" 8720 IF PLTB% = 2 THEN TB$ = "X" : LB$ = "Ohms" : GOTO 8760 8730 IF PLTB% = 4 THEN TB$ = CHR$(237) : LB$ = "Degs" : GOTO 8760 8740 IF PLTB% = 6 THEN TB$ = "E" : LB$ = "Volts" 8750 ' 8760 COLOR 7 8770 LOCATE 3,76 : PRINT LA$; 8780 LOCATE 14,76 : PRINT LB$; : IF LEN(LB$) < 5 THEN PRINT " "; 8790 ' 8800 LOCATE 24,52 : PRINT "Res =";STR$(P.RES!);CHR$(248); 8810 LOCATE 24,71 : PRINT "Load"; 8820 LOCATE 24,17 : PRINT "Relative input point = ";: COLOR 10: PRINT CHR$(124); 8830 ' 8840 ' Horizontal range annotation. 8850 ' 8860 COLOR 15 8870 LOCATE 23,2 : PRINT MID$(STR$(720/ZOOM%),2);CHR$(248); 8880 LOCATE 23,19 : PRINT MID$(STR$(540/ZOOM%),2);CHR$(248); 8890 LOCATE 23,37 : PRINT MID$(STR$(360/ZOOM%),2);CHR$(248);" "; 8900 LOCATE 23,55 : PRINT MID$(STR$(180/ZOOM%),2);CHR$(248);" "; 8910 LOCATE 23,74 : PRINT "0";CHR$(248); 8920 COLOR 7 8930 LFI% = (2 * SL * VF) / (ZOOM% * FQ) 8940 LOCATE 24,2 : PRINT CHR$(126);MID$(STR$(LFI%),2);" ft "; 8950 IF ZOOM% = 1 THEN UPPER% = PPI% ELSE UPPER% = PPI% / ZOOM% + 1 8960 ' 8970 ' Top plot (A) view port, title, grid, and data points. 8980 ' 8990 IF REDRAW$ = "B" THEN GOTO 9100 9000 VIEW (12,7)-(587,146),7,15 9010 COLOR 14 9020 LOCATE 2,4 : PRINT " ";TA$;" "; 9030 GOSUB 10240 'Grid 9040 PLTN% = PLTA% 9050 PLTCOL% = 12 9060 GOSUB 10610 'Data 9070 ' 9080 ' Bottom plot (B) view port, title, grid, and data points. 9090 ' 9100 IF REDRAW$ = "A" THEN GOTO 9210 9110 VIEW (12,161)-(587,300),7,15 9120 COLOR 14 9130 LOCATE 13,4 : PRINT " ";TB$;" "; 9140 GOSUB 10240 'Grid 9150 PLTN% = PLTB% 9160 PLTCOL% = 9 9170 GOSUB 10610 'Data 9180 ' 9190 ' Prompt and wait for key press. 9200 ' 9210 LOCATE 25,3 9220 PRINT "Press ";CHR$(27);CHR$(47);CHR$(26);" (range), "; 9230 PRINT CHR$(24);CHR$(47);CHR$(25);" (data points), "; 9240 PRINT "PgUp/PgDn (other plots), F1 (return)."; 9250 VIEW : WINDOW : LINE (0,153)-(639,153),7,,&HCCCC 9260 REDRAW$ = "AB" 9270 ' 9280 AK$ = INKEY$ : IF LEN(AK$) < 2 THEN GOTO 9280 9290 AK$ = RIGHT$(AK$,1) 9300 IF ASC(AK$) <> 59 THEN GOTO 9330 'F1 9310 VIEW 9320 GOTO 3570 9330 IF ASC(AK$) <> 72 THEN GOTO 9380 'CsrUp 9340 DP% = PLTA% 9350 CC$ = TA$ : UNITS$ = LA$ 9360 REDRAW$ = "B" 9370 GOTO 9630 9380 IF ASC(AK$) <> 80 THEN GOTO 9430 'CsrDown 9390 DP% = PLTB% 9400 CC$ = TB$ : UNITS$ = LB$ 9410 REDRAW$ = "A" 9420 GOTO 9630 9430 IF ASC(AK$) <> 77 THEN GOTO 9470 'CsrRight 9440 IF ZOOM% = 4 THEN GOTO 9280 9450 ZOOM% = ZOOM% * 2 9460 GOTO 8860 9470 IF ASC(AK$) <> 75 THEN GOTO 9510 'CsrLeft 9480 IF ZOOM% = 1 THEN GOTO 9280 9490 ZOOM% = ZOOM% / 2 9500 GOTO 8860 9510 IF ASC(AK$) <> 81 THEN GOTO 9550 'PgDn 9520 IF PLTA% = 5 THEN GOTO 9280 9530 PLTA% = PLTA% + 2 : PLTB% = PLTB% + 2 9540 GOTO 8600 9550 IF ASC(AK$) <> 73 THEN GOTO 9280 'PgUp 9560 IF PLTA% = 1 THEN GOTO 9280 9570 PLTA% = PLTA% - 2 : PLTB% = PLTB% - 2 9580 GOTO 8600 9590 ' 9600 ' Build sub-window with data points. 9610 ' Use VIEW to blank out underlying window to avoid confusion. 9620 ' 9630 IF REDRAW$ = "A" THEN GOTO 9670 9640 VIEW (12,161)-(587,300),7,15 9650 L1%=12: L2%=13: L3%=22: L4%=12: L5%=12: L6%=22 9660 GOTO 9690 9670 VIEW (12,7)-(587,146),7,15 9680 L1%=11: L2%=2 : L3%=1 : L4%=2 : L5%=1 : L6%=11 9690 LOCATE L1%,19 : PRINT CC$; SPC(37); CC$; 9700 FOR LL% = L2% TO L2%+8 9710 LOCATE LL%,19 : PRINT CHR$(179); SPC(37); CHR$(179); 9720 NEXT LL% 9730 LOCATE L3%,19 : PRINT CC$; STRING$(37,196); CC$; 9740 LOCATE L3%,47 : PRINT " "; UNITS$; " "; 9750 VIEW : WINDOW : LINE (127,153)-(471,153),1 9760 LOCATE 25,1 : PRINT STRING$(79,32); 9770 LOCATE 25,12 : PRINT "Press PgUp/PgDn/Home/End to scroll, F1 to close window."; 9780 ' 9790 COLOR 7 9800 IF RIGHT$(STR$(P.RES!),2) = ".5" THEN UU1$ = "###.#" ELSE UU1$ = "####" 9810 IF MAXFT! < 99.99 THEN UU2$ = "##.##" : GOTO 9830 9820 IF MAXFT! < 999.99 THEN UU2$ = "###.##" ELSE UU2$ = "####.##" 9830 IF DP% = 2 THEN UU3$ = "+####.###" ELSE UU3$ = "#####.###" 9840 KK% = -1 9850 FOR LL% = L4% TO L4%+9 9860 LOCATE LL%,22 9870 KK% = KK% + 1 9880 IF KK% > PPI% THEN PRINT STRING$(35,32); : GOTO 9920 9890 PRINT USING UU1$; PLTPP!(KK%,0); : PRINT CHR$(248); 9900 PRINT TAB(31); "("; USING UU2$; PLTPP!(KK%,0)*D2F!; : PRINT " ft)"; 9910 PRINT TAB(45); USING UU3$; PLTPP!(KK%,DP%); 9920 NEXT LL% 9930 ' 9940 AK$ = INKEY$ : IF LEN(AK$) < 2 THEN GOTO 9940 9950 AK$ = RIGHT$(AK$,1) 9960 IF ASC(AK$) <> 59 THEN GOTO 10000 'F1 9970 LOCATE L5%,19 : PRINT STRING$(39,32); 9980 LOCATE L6%,19 : PRINT STRING$(39,32); 9990 GOTO 8990 10000 IF ASC(AK$) <> 81 THEN GOTO 10040 'PgDn 10010 IF KK% >= PPI% THEN GOTO 9940 10020 KK% = KK% - 1 10030 GOTO 9850 10040 IF ASC(AK$) <> 73 THEN GOTO 10090 'PgUp 10050 IF KK% = 9 THEN GOTO 9940 10060 IF KK% < 18 THEN KK% = 18 10070 KK% = KK% - 19 10080 GOTO 9850 10090 IF ASC(AK$) <> 79 THEN GOTO 10130 'End 10100 IF KK% >= PPI% THEN GOTO 9940 10110 KK% = PPI% - 10 10120 GOTO 9850 10130 IF ASC(AK$) <> 71 THEN GOTO 9940 'Home 10140 IF KK% = 9 THEN GOTO 9940 10150 KK% = -1 10160 GOTO 9850 10170 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 10180 ' 10190 ' Subroutine to draw grid lines in view port. 10200 ' Vertical are solid on 180, 360, 540, else dotted. 10210 ' Horizontal dotted. 10220 ' Tic mark(s) at current line length relative to half wavelength. 10230 ' 10240 WINDOW (0,0)-(1,1) 10250 ' Vertical 10260 IF ZOOM% <> 1 THEN GOTO 10310 10270 LINE (.25,0)-(.25,1),15 10280 LINE (.5 ,0)-(.5 ,1),15 10290 LINE (.75,0)-(.75,1),15 10300 GOTO 10390 10310 IF ZOOM% <> 2 THEN GOTO 10360 10320 LINE (.25,0)-(.25,1),15,,&HAAAA 10330 LINE (.5 ,0)-(.5 ,1),15 10340 LINE (.75,0)-(.75,1),15,,&HAAAA 10350 GOTO 10390 10360 LINE (.25,0)-(.25,1),15,,&HAAAA 10370 LINE (.5 ,0)-(.5 ,1),15,,&HAAAA 10380 LINE (.75,0)-(.75,1),15,,&HAAAA 10390 LINE (.125,0)-(.125,1),15,,&HAAAA 10400 LINE (.375,0)-(.375,1),15,,&HAAAA 10410 LINE (.625,0)-(.625,1),15,,&HAAAA 10420 LINE (.875,0)-(.875,1),15,,&HAAAA 10430 ' Horizontal 10440 LINE (0,.25)-(1,.25),15,,&HAAAA 10450 LINE (0,.5 )-(1,.5 ),15,,&HAAAA 10460 LINE (0,.75)-(1,.75),15,,&HAAAA 10470 ' Tic marks 10480 REL.LD! = LD 10490 IF REL.LD! > 180 THEN REL.LD! = REL.LD! - 180: GOTO 10490 10500 WINDOW (-720/ZOOM%,0)-(0,1) 10510 FOR NN! = 0 TO 4/ZOOM% - 1 10520 TIC! = -(REL.LD! + (NN! * 180)) 10530 LINE (TIC!,0)-(TIC!,.05),10 10540 NEXT NN! 10550 RETURN 10560 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 10570 ' 10580 ' Subroutine to draw data lines in view port. 10590 ' Note that the Y range may not include the 0 degree point. 10600 ' 10610 WINDOW (-720/ZOOM%,MINPP!(PLTN%))-(0,MAXPP!(PLTN%)) 10620 IF ABS(PLTPP!(0,PLTN%)) > MAXPP!(PLTN%) THEN GOTO 10650 10630 PSET (0,PLTPP!(0,PLTN%)),PLTCOL% 10640 GOTO 10660 10650 PSET (0,MAXPP!(PLTN%)*SGN(PLTPP!(0,PLTN%))),PLTCOL% 10660 FOR I% = 1 TO UPPER% 10670 LINE -(-PLTPP!(I%,0),PLTPP!(I%,PLTN%)),PLTCOL% 10680 NEXT I% 10690 RETURN 10700 '---------------------------------------------------------------------- 10710 ' 10720 ' Common processing subroutine. 10730 ' X0 set per Charlie Michaels, W7XC, TC article, QST Nov 97 pg 70. 10740 ' Code associated with transmission line equation provided by 10750 ' John Grebenkemper, KI6WX, via ARRL technical order no. 3495. 10760 ' 10770 ' Interpolate attenuation to given frequency. 10780 ' Set line characteristic X0, if not user specified. 10790 ' 10800 IF FA = 0 THEN DBFQ = 0 ELSE DBFQ = DB * (FQ / FA) ^ SIGMA 10810 IF X0I <> -99 THEN X0 = X0I: GOTO 10890 10820 ALPHA = (DBFQ / 100) / NEPER 'nepers per foot 10830 BETA = (TWOPI * FQ) / (SL * VF) 'radians per foot 10840 X0 = -R0 * ALPHA / BETA 10850 ' 10860 ' Length in feet, wavelengths, degrees. 10870 ' Attenuation at this length (= matched line loss). 10880 ' 10890 IF LF <> 0 THEN LW = (LF * FQ) / (SL * VF): LD = LW * 360: GOTO 10920 10900 IF LW <> 0 THEN LF = (LW * SL * VF) / FQ: LD = LW * 360: GOTO 10920 10910 IF LD <> 0 THEN LW = LD / 360: LF = (LW * SL * VF) / FQ: 10920 MLDB = DBFQ / 100 * LF 10930 ' 10940 ' For special case of length = 0, just set output to input and return. 10950 ' 10960 IF LW = 0 THEN RB = RA: XB = XA: RETURN 10970 ' 10980 ' Freq at which line is one wavelength long. 10990 ' Propagation constant, complex, for direction DIR. 11000 ' (DIR = -1, input -> load. DIR = 1, load -> input.) 11010 ' 11020 F1 = FQ / LW 11030 GR = DIR * MLDB / NEPER 11040 GI = DIR * TWOPI * FQ / F1 11050 ' 11060 ' Complex sinh and cosh. 11070 ' 11080 E1 = EXP(GR) 11090 E2 = EXP(-GR) 11100 SR = COS(GI) * (E1 - E2) / 2 11110 SI = SIN(GI) * (E1 + E2) / 2 11120 CR = COS(GI) * (E1 + E2) / 2 11130 CI = SIN(GI) * (E1 - E2) / 2 11140 ' 11150 ' Transmission line equation. 11160 ' 11170 HR = RA * CR - XA * CI + R0 * SR - X0 * SI 11180 HI = RA * CI + XA * CR + R0 * SI + X0 * SR 11190 QR = R0 * CR - X0 * CI + RA * SR - XA * SI 11200 QI = R0 * CI + X0 * CR + RA * SI + XA * SR 11210 YR = ( HR * QR + HI * QI) / (QR * QR + QI * QI) 11220 YI = (-HR * QI + HI * QR) / (QR * QR + QI * QI) 11230 RB = R0 * YR - X0 * YI 11240 XB = R0 * YI + X0 * YR 11250 ' 11260 RETURN