home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1980-01-01 | 12.7 KB | 372 lines |
- 10 ' AIRINPUT.BAS (c) 1982 Alan Bose 22-Jan-82 Rev 01/22/86
- 20 ' CP/M modifications (c) 1982 by Glen Hassebrock, Jr.
- 25 ' HP-150 modifications (c) 1984 by Alan Bose
- 26 ' PC-DOS modifications (c) 1985 by Bruce Carson Version F.03.02
- 30 CLEAR:WIDTH 80:ON ERROR GOTO 3160
- 32 PROGDISK$="A:":DATADISK$="B:"
- 34 OPEN "I",1,"NAVDISCS.DAT"
- 36 INPUT #1,PROGDISK$,DATADISK$:CLOSE
- 38 GOSUB 8000 'install erase_eos routine
- 40 BL$=CHR$(7):E$=CHR$(27)
- 50 U=57.2958
- 70 DEF FNS6(X)=INT(X*10+0.5)/10
- 80 DEF FNS7(X)=ATN(X/SQR(1-X*X))*U
- 90 DEF FNS8(X)=SIN(ABS(A/2)/U)*COS(X/U)/SIN(Q2/2)
- 100 CLS:PRINT"Standby one";:MX=32767:MN=0
- 110 OPEN"R",1,DATADISK$+"AIRPORTS.RND",255:GOSUB 3330:PRINT"..."
- 120 OPEN"R",2,DATADISK$+"AIRINDEX.RND",255:MD=(MD*5)-1:IF MD=-1 THEN MD=0
- 130 OL=MD+50:DIM ID$(OL),RN$(2),RN(2):FOR J=0 TO MD:REC=(J\51)+1:SS=J MOD 51
- 140 IF LOC(2)<>REC THEN GET #2,REC
- 150 FIELD #2,SS*5 AS DU$,5 AS ID$:ID$(J)=ID$
- 160 IF ASC(ID$)=0 THEN ID$(J)=SPACE$(5)
- 170 NEXT J:CLOSE#2:IM=MD
- 180 '
- 190 CLS
- 280 PRINT TAB(7);"Ident Fac Freq";TAB(32);"Name";TAB(47);"Lat";
- 290 PRINT TAB(55);"Long";TAB(64);"Var";TAB(70);"Elev"
- 300 LOCATE 5,9:PRINT"1";TAB(13);"2";TAB(19);"3";TAB(33);"4";TAB(47);
- 310 PRINT "5";TAB(56);"6";TAB(65);"7";TAB(72);"8"
- 320 'menu
- 330 LOCATE 7,1,1:GOSUB 9000
- 340 LOCATE 24,24:PRINT "I- Input U- Update E- Exit :";
- 360 X$=INPUT$(1):GOSUB 3120:MD$=X$:LOCATE 8,1:IF MD$="I" THEN 430
- 370 IF MD$="U" THEN 440
- 375 IF MD$="!" THEN X$="Y":GOTO 410
- 380 IF MD$<>"E" THEN PRINT BL$:GOTO 320
- 390 CLS:PRINT"Returning to menu. Sure? (Y or N) <N> ";:X$=INPUT$(1):PRINT X$
- 400 IF X$=CHR$(13) THEN X$="N"
- 410 GOSUB 3120:IF X$="Y" THEN CLOSE:GOSUB 2680:RUN PROGDISK$+"NAVMENU"
- 420 IF X$="N" THEN 180 ELSE PRINT BL$:GOTO 390
- 430 C8=0:GOTO 510
- 440 'revise
- 450 LOCATE 8,1:PRINT SPC(79);:LOCATE 8,7:PRINT "Enter Identifier <MENU> ";
- 460 LINE INPUT X$:GOSUB 9000:IF X$="" THEN 320
- 470 IF LEN(X$)>5 THEN PRINT BL$:GOTO 450
- 480 GOSUB 3120:AP$=X$+SPACE$(5-LEN(X$)):NL$=AP$:GOSUB 1450
- 490 IF FD=0 THEN PRINT BL$"Can't find "AP$:GOTO 450
- 500 RO=3:GOSUB 1750
- 510 IF MD$="I" AND C8=8 THEN PUT#1,REC:ID$(PI)=ID$:EN=1:GOTO 320
- 520 IF MD$="I" THEN C8=C8+1:GOTO 560
- 530 LOCATE 7,1:GOSUB 9000:GOSUB 3380:LOCATE 8,7,1:PRINT"Press number for revision <EXIT> ";
- 540 C$=INPUT$(1):IF C$=CHR$(13) THEN PUT#1,REC:ID$(PI)=ID$:GOTO 180
- 545 'PRINT E$"&j@";
- 550 C8=VAL(C$)
- 560 LOCATE 7,1:GOSUB 9000
- 570 ON C8 GOTO 590,750,840,900,980,1160,1320,1400
- 580 PRINT BL$:GOTO 530
- 590 'id
- 610 IF MD$="U" THEN PRINT:PRINT"Enter 'D' to erase listing"
- 615 PRINT "Enter airport/facility code: ";STRING$(5,32);:LOCATE ,POS(0)-5
- 620 LINE INPUT X$:IF MD$="I" AND X$="" THEN 320
- 630 IF X$="" THEN 500
- 640 GOSUB 3120:AP$=X$+SPACE$(5-LEN(X$)):NL$=AP$
- 650 IF (MD$="I" AND X$="D") OR LEN(X$)>5 THEN PRINT BL$:GOTO 560
- 660 IF MD$="I" THEN GOSUB 1600
- 670 IF X$<>"D" THEN LSET ID$=NL$:EN=1:GOTO 500
- 680 GOSUB 3200:KY=KY-1:FOR J=1 TO KY:IF LI$(J)=ID$ THEN LI$(J)="":EE=1
- 690 IF R1$(J)=ID$ AND R1(J)=PI THEN R1$(J)="":EE=1
- 700 IF R2$(J)=ID$ AND R2(J)=PI THEN R2$(J)="":EE=1
- 710 IF R1$(J)="" AND R2$(J)="" THEN LI$(J)=""
- 720 IF LI$(J)="" THEN DD=DD+1
- 730 NEXT J:IF EE=1 THEN GOSUB 3270 ELSE GOSUB 3320
- 740 GOSUB 2630:GOSUB 1750:GOTO 320
- 750 'facility
- 770 PRINT:PRINT"A = Airport":PRINT"V = VOR/VORTAC":PRINT"N = NDB/LOM"
- 780 PRINT "I = Intersection":PRINT "R = Reporting point":PRINT "C = Checkpoint"
- 790 PRINT "W = Waypoint":PRINT "L = Landmark" :PRINT
- 795 PRINT "Enter facility codes: ";STRING$(2,32);:LOCATE ,POS(0)-2:LINE INPUT X$
- 800 IF LEN(X$)>2 THEN PRINT BL$:GOTO 560
- 810 IF MD$="I" AND X$="" THEN 320
- 820 IF X$<>"" THEN GOSUB 3120:LSET FAC$=X$
- 830 GOTO 500
- 840 'freq
- 850 IF MD$="I" AND INSTR(FAC$,"V")=0 AND INSTR(FAC$,"N")=0 THEN 500
- 860 PRINT"Enter navaid frequency ";SPC(5);:LOCATE ,POS(0)-5:LINE INPUT X$
- 870 IF MD$="I" AND X$="" THEN 320
- 880 IF X$<>"" THEN LSET FR$=MKS$(VAL(X$))
- 890 GOTO 500
- 900 'name
- 905 PRINT SPC(79);:LOCATE CSRLIN,1,1
- 910 PRINT "Enter facility name ";SPC(20);:LOCATE ,POS(0)-20:LINE INPUT X$
- 920 IF MD$="I" AND X$="" THEN 320
- 930 IF LEN(X$)>20 THEN PRINT BL$"20 characters maximum";:LOCATE 7,1:GOTO 910
- 940 IF INSTR(X$,",")<>0 THEN 960
- 950 PRINT BL$"Forgot state preceded by comma";:LOCATE 7,1:GOTO 910
- 960 IF X$<>"" THEN LSET NM$=X$
- 970 GOTO 500
- 980 'lat
- 990 IF MD$="I" AND INSTR(FAC$,"I")>0 AND INSTR(FAC$,"V")=0 THEN 1000 ELSE 1020
- 1000 IF INSTR(FAC$,"N")=0 THEN GOSUB 1930:GOTO 500
- 1020 PRINT:PRINT"Enter `R' for RNAV calculation of lat. & long. from known fix"
- 1025 PRINT:PRINT"Enter degrees latitude"TAB(30);" deg";:LOCATE ,POS(0)-8
- 1030 LINE INPUT X$:X=VAL(X$)
- 1040 IF MD$="I" AND X$="" THEN 320
- 1050 IF X$="R" OR X$="r" THEN TR=REC:TS=SS:I$=ID$:PUT#1,REC:GOSUB 1930:GOTO 500
- 1060 IF X$="" THEN 500
- 1070 IF X>90 OR X<=0 THEN PRINT BL$:GOTO 1030
- 1080 LSET D1$=MKI$(X)
- 1090 GOSUB 9000:PRINT "Enter minutes latitude <0> ";" min";:LOCATE ,POS(0)-9
- 1100 LINE INPUT X$:X=VAL(X$):IF X$="" THEN X=0:PRINT "0"
- 1110 IF X>=60 OR X<0 THEN PRINT BL$:GOTO 1090
- 1120 PRINT "Enter seconds latitude <0> ";" sec";:LOCATE ,POS(0)-8
- 1130 LINE INPUT X$:Y=VAL(X$):IF X$="" THEN Y=0:PRINT "0"
- 1140 IF Y>60 OR Y<0 THEN PRINT BL$:GOTO 1120
- 1150 X=X+(Y/60):LSET M1$=MKS$(X):GOTO 500
- 1160 'enter long
- 1162 PRINT"East or West Longitude? <W> ";:X$=INPUT$(1):PRINT X$
- 1164 IF X$="E" OR X$="e" THEN EW=1 ELSE EW=0
- 1180 PRINT:PRINT"Enter `R' for RNAV calculation of lat. & long. from known fix"
- 1185 PRINT:PRINT"Enter degrees longitude"TAB(31);" deg";:LOCATE ,POS(0)-8
- 1190 LINE INPUT X$:X=VAL(X$)
- 1200 IF MD$="I" AND X$="" THEN 320
- 1210 IF X$="" THEN 500
- 1220 IF X$="R" OR X$="r" THEN TR=REC:TS=SS:I$=ID$:PUT#1,REC:GOSUB 1930:GOTO 500
- 1230 IF X>180 OR X<0 THEN PRINT BL$:GOTO 1170
- 1235 IF EW=1 THEN X=-X
- 1240 LSET D$=MKI$(X)
- 1250 GOSUB 9000:PRINT "Enter minutes longitude <0> min";:LOCATE ,POS(0)-8
- 1260 LINE INPUT X$:X=VAL(X$):IF X$="" THEN X=0:PRINT K$"0"
- 1270 IF X>=60 OR X<0 THEN PRINT BL$;:GOTO 1250
- 1280 PRINT"Enter seconds longitude <0> sec";:LOCATE ,POS(0)-8
- 1290 LINE INPUT X$:Y=VAL(X$):IF X$="" THEN Y=0:PRINT K$"0"
- 1300 IF Y>60 OR Y<0 THEN PRINT BL$:GOTO 1280
- 1310 X=X+(Y/60)
- 1312 IF EW=1 THEN X=-X
- 1314 LSET M$=MKS$(X):GOTO 500
- 1320 'var
- 1330 PRINT"Enter magnetic variation <0> deg";:LOCATE ,POS(0)-8
- 1340 LINE INPUT X$:X=VAL(X$):IF MD$="I" AND X$="" THEN X=0
- 1350 IF X$="" THEN 500
- 1360 LSET V$=MKS$(X):IF X=0 THEN LSET V1$=" ":GOTO 500
- 1370 PRINT"East or West variation? ";:X$=INPUT$(1):PRINT X$:GOSUB 3120
- 1380 IF X$<>"E" AND X$<>"W" THEN PRINT BL$;:GOTO 1370
- 1390 LOCATE 7,1:GOSUB 9000:LSET V1$=X$:GOTO 500
- 1400 'elev
- 1410 PRINT"Enter elevation of facility ";:LOCATE ,POS(0)-5
- 1420 LINE INPUT X$:X=VAL(X$):IF MD$="I" AND X$="" THEN PRINT BL$:GOTO 560
- 1430 IF X$<>"" THEN LSET EL$=MKI$(X)
- 1440 GOTO 500
- 1450 'search-match
- 1460 RO=3
- 1470 FD=0
- 1480 FOR J=0 TO IM:IF ID$(J)<>AP$ THEN 1530
- 1490 IF FD=1 THEN RO=7:GET#1,REC:LOCATE 7,1:GOSUB 9000:GOSUB 1750:RO=8:FD=2
- 1500 PI=J
- 1510 IF FD>1 THEN REC=(J\5)+1:SS=J MOD 5:GET#1,REC:GOSUB 1750:FD=FD+1:RO=RO+1
- 1520 IF FD=0 THEN FD=1:REC=(J\5)+1:SS=J MOD 5:GET#1,REC
- 1530 NEXT J
- 1540 IF FD=0 OR FD=1 THEN 1590
- 1550 LOCATE RO+1,1:PRINT "Enter number of your choice <"PI"> ";
- 1560 LOCATE ,POS(0)-3:LINE INPUT X$
- 1570 IF X$="" THEN 1590
- 1580 PI=VAL(X$):REC=(PI\5)+1:SS=PI MOD 5:GET #1,REC:LOCATE 6,1:GOSUB 9000
- 1590 RETURN
- 1600 'search-blank
- 1610 FD=0:FH=0:FOR J=0 TO IM
- 1620 IF ID$(J)=SPACE$(5) THEN FH=1:TI=J:J=IM+1
- 1630 IF ID$(J)<>AP$ THEN 1650
- 1640 FD=FD+1:RO=8+FD:REC=(J\5)+1:SS=J MOD 5:GET#1,REC:PI=J:GOSUB 1750
- 1650 NEXT J
- 1660 IF FH=0 THEN IM=IM+1:TI=IM
- 1670 IF IM<=OL THEN 1690
- 1680 CLS:PRINT"Standby one...then re-enter":CLOSE:GOSUB 2680:GOTO 10
- 1690 RO=3:IF FD=0 THEN 1730
- 1700 LOCATE 10+FD,7:PRINT"Found...continue with additional entry? (Y or N)";
- 1710 PRINT " <Y>";:X$=INPUT$(1):GOSUB 3120:IF X$="N" THEN 320
- 1720 IF X$<>"Y" AND X$<>CHR$(13) THEN PRINT BL$:GOTO 1700
- 1730 PI=TI:REC=(PI\5)+1:SS=PI MOD 5:GET #1,REC:GOSUB 1750:GOSUB 2630
- 1740 RETURN
- 1750 'decode & display
- 1760 FIELD #1,SS*50 AS DU$,5 AS ID$,2 AS FAC$,4 AS FR$,20 AS NM$,2 AS D1$,4 AS M1$,2 AS D$,4 AS M$,4 AS V$,1 AS V1$,2 AS EL$
- 1770 F5=CVS(FR$):D6=CVI(D1$):M6=CVS(M1$):D5=CVI(D$):M5=CVS(M$):V5=CVS(V$)
- 1780 E5=CVI(EL$)
- 1790 PI$=STR$(PI):PI$=PI$+SPACE$(4-LEN(PI$)):LOCATE RO,1:PRINT PI$;
- 1800 PRINT TAB(7);ID$;TAB(13);FAC$;TAB(16);SPC(7);:LOCATE ,16
- 1810 IF F5=0 THEN 1860
- 1820 IF F5>136 THEN PRINT USING"#####";F5;:GOTO 1860
- 1830 IF F5*10\1=F5*10/1 THEN PRINT USING"####.#";F5;:GOTO 1860
- 1840 IF F5*100\1=F5*100/1 THEN PRINT USING"####.##";F5;:GOTO 1860
- 1850 PRINT USING"###.###";F5;
- 1860 PRINT TAB(24);NM$;
- 1870 PRINT TAB(45);USING "## ##.#";D6,M6;
- 1880 PRINT TAB(53);USING "### ##.#";D5,ABS(M5);
- 1890 PRINT TAB(62);USING"###.#";V5;
- 1900 PRINT TAB(68);V1$;TAB(70);USING"#####";E5
- 1910 IF INSTR(FAC$,"V")=0 AND INSTR(FAC$,"N")=0 THEN NV=0 ELSE NV=1
- 1920 RETURN
- 1930 'RNAV lat & long
- 1940 LOCATE 6,1:GOSUB 9000
- 1950 PRINT"This routine will find the latitude & longitude of "I$
- 1960 PRINT"by taking fixes on 1 or 2 navaids already on file.":PRINT
- 1970 PRINT"The navaids you specify should be the ones you'll use in the air"
- 1980 PRINT"to determine your position.":PRINT
- 1990 PRINT"Postion can be determined two ways:":PRINT
- 2000 PRINT TAB(5)"1 - Distance & bearing FROM one navaid":PRINT
- 2010 PRINT TAB(5)"2 - Bearings FROM two navaids":PRINT
- 2020 PRINT TAB(5)"Enter selection <RETURN> ";:X$=INPUT$(1):PRINT X$
- 2030 '2 bearings
- 2040 IF X$=CHR$(13) THEN C8=C8-1:GOTO 2620
- 2050 IF X$="2" THEN RN=1:GOTO 2070
- 2060 IF X$="1" THEN RN=0 ELSE PRINT BL$K$;:GOTO 2020
- 2070 LOCATE 7,1:GOSUB 9000
- 2080 PRINT "Enter identifier of known fix on file ";
- 2090 PRINT STRING$(5,32);:LOCATE ,POS(0)-5:LINE INPUT X$:GOSUB 9000
- 2100 IF X$="" THEN C8=C8-1:GOTO 2620
- 2110 IF LEN(X$)>5 THEN PRINT BL$:GOTO 2080
- 2120 GOSUB 3120:AP$=X$+SPACE$(5-LEN(X$)):PUT#1,REC:TI=PI:RO=9:GOSUB 1470
- 2130 IF FD=0 THEN PRINT BL$"Can't find "AP$:GOTO 2080
- 2140 LOCATE 7,1:GOSUB 9000:RO=9:GOSUB 1750:RN$(RN)=ID$:RN(RN)=PI:PI=TI
- 2150 IF NV=1 THEN 2200
- 2160 PRINT BL$"Not listed as navaid. Use? (Y or N) <N> ";:X$=INPUT$(1):PRINT X$
- 2170 IF X$=CHR$(13) THEN X$="N"
- 2180 GOSUB 3120:IF X$="N" THEN 2080
- 2190 IF X$<>"Y" THEN PRINT BL$:GOTO 2160
- 2200 X4=D6+(M6/60):X6=-(D5+(M5/60)):K9=0:L9=0
- 2210 IF RN<>0 THEN LOCATE RO+2,1:PRINT "Bearing FROM "ID$" to "NL$:GOTO 2270
- 2220 'dist & 1 bearing
- 2230 LOCATE RO+2,1:PRINT "Distance & bearing FROM "ID$" to "NL$
- 2240 PRINT TAB(5);"Enter distance in nautical miles ";
- 2250 LOCATE ,POS(0)-3
- 2260 LINE INPUT D$:D=VAL(D$):IF D=0 THEN PRINT BL$:GOTO 2240
- 2270 LOCATE RO+5,5:PRINT "Enter bearing ";:LOCATE ,POS(0)-3
- 2280 LINE INPUT H$:H=VAL(H$):IF H<0 OR H>360 THEN PRINT BL$:GOTO 2270
- 2290 IF H$="" THEN C8=C8-1:GOTO 1930
- 2300 LOCATE RO+6,5:PRINT "Is bearing True or Magnetic? <T> ";
- 2310 X$=INPUT$(1):PRINT X$:GOSUB 3120:IF X$="T" OR X$=CHR$(13) THEN 2350
- 2320 IF X$<>"M" THEN PRINT BL$:GOTO 2300
- 2330 V=V5:IF V1$="E" THEN V=-V
- 2340 H=H-V
- 2350 IF RN<>0 THEN P2(RN)=X4:P1(RN)=-X6:RA(RN)=H
- 2360 IF RN=1 THEN RN=2:GOTO 2070
- 2370 IF RN=2 THEN GOSUB 2800:GOTO 2400
- 2380 C=D:C1=H
- 2390 'solve lat & long
- 2400 IF C1>270 THEN 2440
- 2410 IF C1>180 THEN 2450
- 2420 IF C1>90 THEN 2460
- 2430 IF C1<=90 THEN 2470
- 2440 A=360-C1:GOSUB 2480:K=B1:L=-B2:GOTO 2490
- 2450 A=C1-180:GOSUB 2480:K=-B1:L=-B2:GOTO 2490
- 2460 A=180-C1:GOSUB 2480:K=-B1:L=B2:GOTO 2490
- 2470 A=C1:GOSUB 2480:K=B1:L=B2:GOTO 2490
- 2480 B=A/U:B1=C*COS(B):B2=C*SIN(B):RETURN
- 2490 K9=K:L9=L:X8=X4+(K9/60):X9=(X4+X8)/(2*U):X8=ABS(X8):Y=INT(X8):Y1=X8-Y
- 2500 Y2=Y1*60:Y3=(L9/COS(X9))/60:Y4=ABS(X6+Y3):Y5=INT(Y4):Y6=Y4-Y5:Y7=Y6*60
- 2510 REC=(PI\5)+1:SS=PI MOD 5:GET#1,REC:RO=3:GOSUB 1750:LSET D1$=MKI$(Y)
- 2520 LSET M1$=MKS$(Y2):LSET D$=MKI$(Y5):LSET M$=MKS$(Y7):GOSUB 1750:C8=C8+1
- 2530 IF INSTR(FAC$,"V")>0 THEN 2620
- 2540 GOSUB 3200:LI$(KY)=NL$
- 2550 IF RN=0 THEN R1$(KY)=RN$(0):R1(KY)=RN(0):R2$(KY)="":R2(KY)=0:GOTO 2570
- 2560 R1$(KY)=RN$(1):R1(KY)=RN(1):R2$(KY)=RN$(2):R2(KY)=RN(2)
- 2570 RP=0:FOR J=1 TO KY-1
- 2580 IF LI$(J)=LI$(KY) AND R1$(J)=R1$(KY) AND R1(J)=R1(KY) THEN 2590 ELSE 2600
- 2590 IF R2$(J)=R2$(KY) AND R2(J)=R2(KY) THEN RP=1
- 2600 NEXT J
- 2610 IF RP=0 THEN GOSUB 3270 ELSE GOSUB 3320
- 2620 RETURN
- 2630 'clear
- 2640 EN=1:LSET ID$=SPACE$(5):LSET FAC$=SPACE$(2):LSET FR$=MKS$(0)
- 2650 LSET NM$=SPACE$(20):LSET D1$=MKI$(0):LSET M1$=MKS$(0)
- 2660 LSET D$=MKI$(0):LSET M$=MKS$(0):LSET V$=MKS$(0):LSET V1$=" "
- 2670 LSET EL$=MKI$(0):PUT#1,REC:ID$(PI)=SPACE$(5):RETURN
- 2680 'write index
- 2690 IF EN=0 THEN RETURN
- 2700 CLS:PRINT"Standby one..."
- 2710 OPEN"R",2,DATADISK$+"AIRINDEX.RND",255
- 2720 REC=1:FOR J=0 TO IM:RC=(J\51)+1:SS=J MOD 51
- 2730 IF REC<>RC THEN PUT#2,REC:REC=RC:FIELD#2,255 AS CL$:LSET CL$=" "
- 2740 FIELD #2,SS*5 AS DU$,5 AS ID$
- 2750 LSET ID$=ID$(J)
- 2760 NEXT J
- 2770 IF RC<>LOC(2)-1 THEN PUT#2,RC
- 2780 CLOSE#2:RETURN
- 2790 '2 bearings
- 2800 IF RA(1)>RA(2) AND RA(2)<RA(1)-180 THEN AB=(360-RA(1))+RA(2):GOTO 2820
- 2810 AB=ABS(RA(1)-RA(2))
- 2820 IF AB>180 THEN AB=AB-180
- 2830 IF AB>=15 AND AB<=165 THEN 2870
- 2840 PRINT BL$;:LOCATE 7,1:GOSUB 9000:LOCATE 9,1:PRINT"You're too close to the line that ";
- 2850 PRINT "runs between the navaids":PRINT "to compute your position ";
- 2860 PRINT "accurately.":GOTO 2080
- 2870 GOSUB 2950
- 2880 IF RA(1)>T AND T<RA(1)-180 THEN AA=(360-RA(1))+T ELSE AA=ABS(T-RA(1))
- 2890 IF AA>180 THEN AA=AA-180
- 2900 IF T>180 THEN T1=T-180 ELSE T1=T+180
- 2910 IF RA(2)>T1 AND T1<RA(2)-180 THEN AC=(360-RA(2))+T1 ELSE AC=ABS(T1-RA(2))
- 2920 IF AC>180 THEN AC=AC-180
- 2930 SC=SIN(AC/U)*SIN(Q2)/SIN(AB/U):SC=ATN(SC/SQR(-SC*SC+1)):C=SC*U*60
- 2940 C1=RA(1):X4=P2(1):X6=-P1(1):H=RA(1):RETURN
- 2950 'distance
- 2960 A=P1(1)-P1(2):B1=P2(1)-P2(2):P#=COS(P2(1)/U)*COS(P2(2)/U)
- 2970 Q=P#*COS(ABS(A)/U)+COS(ABS(B1)/U)-P#:IF Q<=0 THEN PRINT BL$:GOTO 3100
- 2980 Q2=ATN(SQR(1-Q*Q)/Q):Q=Q2*U*60
- 2990 C=FNS6(Q):IF C>900 AND ABS(A)>30 THEN PRINT BL$:GOTO 3090
- 3000 IF C=0 THEN T=0:RETURN
- 3010 ' true course
- 3020 S=FNS8((P2(1)+P2(2))/2):IF S>=1 THEN S=90-S ELSE S=FNS7(S)
- 3030 IF A>0 AND B1=0 THEN T=90:GOTO 3080
- 3040 IF A<0 AND B1=0 THEN T=270:GOTO 3080
- 3050 IF A>0 AND B1<0 THEN T=S:GOTO 3080
- 3060 IF A>=0 AND B1>0 THEN T=180-S:GOTO 3080
- 3070 IF A<0 AND B1>0 THEN T=180+S ELSE T=360-S
- 3080 T=FNS6(T):RETURN
- 3090 PRINT BL$"Distance excessive...":GOTO 1990
- 3100 PRINT BL$"Distance excessive."
- 3110 PRINT"Possible course errors due to rhumb line.":GOTO 1990
- 3120 'map lc
- 3130 FOR L=1 TO LEN(X$):U$=MID$(X$,L,1)
- 3140 IF ASC(U$)>96 AND ASC(U$)<123 THEN MID$(X$,L,1)=CHR$(ASC(U$)-32)
- 3150 NEXT L:RETURN
- 3160 'error
- 3170 IF ERR=53 AND ERL=3210 THEN KY=1:RESUME 3260
- 3180 IF ERL=2750 AND ERR=9 THEN RESUME NEXT
- 3182 IF ERR=53 AND ERL=34 THEN CLOSE:RESUME 38
- 3184 IF ERR=5 AND ERL=3320 THEN RESUME NEXT
- 3190 ON ERROR GOTO 0
- 3200 'read RNAV
- 3210 OPEN"I",2,DATADISK$+"RNAVLIST.DAT"
- 3220 INPUT#2,KY
- 3230 KY=KY+1:DIM LI$(KY),R1$(KY),R1(KY),R2$(KY),R2(KY)
- 3240 FOR J=1 TO KY-1:LINE INPUT#2,LI$(J):LINE INPUT#2,R1$(J):INPUT#2,R1(J)
- 3250 LINE INPUT#2,R2$(J):INPUT#2,R2(J):NEXT J:CLOSE#2
- 3260 RETURN
- 3270 'write RNAV
- 3280 OPEN"O",2,DATADISK$+"RNAVLIST.DAT":PRINT#2,KY-DD
- 3290 FOR J=1 TO KY:IF LI$(J)="" THEN 3310 ELSE PRINT#2,LI$(J)
- 3300 PRINT#2,R1$(J):PRINT#2,R1(J):PRINT#2,R2$(J):PRINT#2,R2(J)
- 3310 NEXT J:CLOSE#2
- 3320 DD=0:ERASE LI$,R1$,R1,R2$,R2
- 3322 RETURN
- 3330 MD=(MX+MN)\2:GET #1,MD:IF EOF(1) THEN MX=MD ELSE MN=MD
- 3340 IF MX>MN+1 THEN 3330 ELSE MD=MN:RETURN
- 3380 ' Revise mode softkeys
- 3395 KEY 1,"1" 'ident
- 3400 KEY 2,"2" 'facility
- 3420 KEY 3,"3" 'frequency
- 3430 KEY 4,"4" 'name
- 3440 KEY 5,"5" 'latitude
- 3450 KEY 6,"6" 'longitude
- 3460 KEY 7,"7" 'mag variation
- 3470 KEY 8,"8" 'elevation
- 3480 KEY 9,"" 'return
- 3490 RETURN
- 8000 ' install erase-to-end-of-screen subroutine
- 8010 DEF SEG=&H1700
- 8020 FOR ADDR% = 0 TO 19
- 8030 READ CODE%
- 8040 POKE ADDR%,CODE%
- 8050 NEXT
- 8060 CLREOS% = 0
- 8070 RETURN
- 8080 DATA &h55,&h8b,&hec,&h8b,&h76,&h06,&h8b,&h0c
- 8090 DATA &hb8,&h20,&h0a,&hb7,&h00
- 8100 DATA &hcd,&h10
- 8110 DATA &h5d,&hca,&h02,&h00,&h00
- 9000 ' erase to end-of-screen
- 9010 CLINE = CSRLIN 'remember cursor position
- 9020 CROW = POS(0)
- 9030 NUMCHR% = 1919 - ((CLINE - 1)*80 +CROW) 'num chars to write
- 9040 CALL CLREOS%(NUMCHR%) 'erase to end of screen
- 9050 LOCATE CLINE,CROW,1 'restore cursor
- 9060 RETURN
-