home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / misc3 / navigate.lzh / NAVPROG7.BAS (.txt) < prev    next >
Encoding:
GW-BASIC  |  1980-01-01  |  14.2 KB  |  378 lines

  1. 10  ' NAVPROG7.BAS       (c) 1982 Alan Bose      22-Jan-82   Rev 01/22/86
  2. 20  ' CP/M modifications (c) 1982 by Glen Hassebrock, Jr.
  3. 25  ' HP-150 modifications (c) 1984 by Alan Bose
  4. 26  ' PC-DOS modifications (c) 1985 by Bruce Carson          Version F.03.02
  5. 30  CLEAR:ON ERROR GOTO 2520:WIDTH 80:DEFINT I-J:GOSUB 4000
  6. 32  PROGDISK$="A:":DATADISK$="B:"
  7. 34  OPEN "I",1,"NAVDISCS.DAT"
  8. 36  INPUT #1,PROGDISK$,DATADISK$:CLOSE
  9. 40  BL$=CHR$(7):E$=CHR$(27)
  10. 50  U=57.2958
  11. 70  DEF FNS5(X)=SIN(X/U):DEF FNS6(X)=INT(X*10+0.5)/10
  12. 80  DEF FNS7(X)=ATN(X/SQR(1-X*X))*U
  13. 90  DEF FNS8(X)=SIN(ABS(A/2)/U)*COS(X/U)/SIN(Q2/2)
  14. 95  DIM ID$(20),PI(20)
  15. 100  CLS:PRINT TAB(34);"NAVPROGseven"
  16. 110  OPEN "R",1,DATADISK$+"AIRPORTS.RND",255
  17. 120  KEY OFF
  18. 130  LOCATE 5,1:PRINT "Aircraft identification?  <MENU>  N       ";
  19. 140  LOCATE ,POS(0)-7:LINE INPUT X$:IF X$="" THEN RUN PROGDISK$+"NAVMENU"
  20. 150  GOSUB 2830:IF X$="I" THEN CLOSE:RUN PROGDISK$+"AIRCRAFT"
  21. 160  F$="N"+X$
  22. 170  OPEN"I",2,DATADISK$+F$:LINE INPUT#2,AT$:INPUT#2,RU:INPUT#2,T9:INPUT#2,G9
  23. 180  INPUT#2,D9:INPUT#2,NA:INPUT#2,NS:INPUT#2,NF:INPUT#2,NB:INPUT#2,PH:CLOSE#2
  24. 190  RC=(NA/T9)*60:CF=(G9/T9)*60:CS=(D9/T9)*60
  25. 210  OPEN"I",2,DATADISK$+"FLIGHT.SEQ"
  26. 220  FOR J=1 TO 20:INPUT#2,ID$(J):ID$(J)=ID$(J)+SPACE$(5-LEN(ID$(J)))
  27. 230  INPUT #2,PI(J):N=J
  28. 240  NEXT J:CLOSE#2
  29. 250  DIM C(N),T(N),V$(N),V(N),Y(N),P$(N),P1(N),P2(N),Q(N),G(N),W(N),S(N),E(N)
  30. 260  DIM F(N),F1(N),J(N),K(N),I$(N),FR(N),K8(N),FC$(N),EL(N),AL%(N)
  31. 270  'data box
  32. 280  '
  33. 385  CLS:PRINT "       NAVPROGseven"TAB(38);F$;" "AT$TAB(88);NG$
  34. 390  LOCATE 2,7:PRINT "Ident Fac Freq"SPC(11)"Name"SPC(11)"Lat"SPC(5)"Long";
  35. 400  PRINT SPC(5)"Var   Elev"
  36. 410  FOR I=1 TO N:REC=(PI(I)\5)+1:SS=PI(I) MOD 5:GET#1,REC:RO=I+3:GOSUB 430
  37. 420  NEXT I:ERASE ID$,PI:GOTO 640
  38. 430  'decode & display
  39. 440  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$
  40. 450  F5=CVS(FR$):D6=CVI(D1$):M6=CVS(M1$)
  41. 460  D5=CVI(D$):M5=CVS(M$):V5=CVS(V$):E5=CVI(EL$):IF ID$=ID$(I) THEN 500
  42. 470  PRINT BL$;:LOCATE N+6,1:PRINT "Aborted.  Checkpoint ";ID$(I);" missing or moved"
  43. 480  PRINT"Delete this route, re-enter checkpoint if missing, re-enter route."
  44. 490  PRINT:PRINT"Press any key to continue...";:X$=INPUT$(1):GOTO 2450
  45. 500  I$(I)=ID$:FC$(I)=FAC$:FR(I)=F5:P$(I)=NM$:M1=M6/60:P2(I)=D6+M1:M=M5/60
  46. 510  P1(I)=D5+M:V(I)=V5:V$(I)=V1$:EL(I)=E5:IF V$(I)="E" THEN V(I)=-V(I)
  47. 520  LOCATE RO,1:PRINT I;TAB(7);ID$;TAB(13);FAC$;TAB(16);
  48. 530  IF F5=0 THEN PRINT SPC(7);:GOTO 580
  49. 540  IF F5>136 THEN PRINT USING"####";F5;:GOTO 580
  50. 550  IF F5*10\1=F5*10/1 THEN PRINT USING"####.#";F5;:GOTO 580
  51. 560  IF F5*100\1=F5*100/1 THEN PRINT USING"####.##";F5;:GOTO 580
  52. 570  PRINT USING"###.###";F5;
  53. 580  PRINT TAB(24);NM$;TAB(45);USING"##";D6;
  54. 590  PRINT TAB(48);USING"##.#";M6;
  55. 600  PRINT TAB(53);USING"###";D5;
  56. 610  PRINT TAB(57);USING"##.#";ABS(M5);
  57. 620  PRINT TAB(62);USING"###.#";V5;
  58. 630  PRINT TAB(68);V1$;TAB(70);USING"#####";E5:RETURN
  59. 640  LOCATE N+6,1:GOSUB 5000:PRINT "Route of flight correct? (Y or N)  <Y>  ";
  60. 650  X$=INPUT$(1):PRINT X$:IF X$=CHR$(13) THEN X$="Y"
  61. 660  GOSUB 2830:IF X$<>"N" AND X$<>"Y" THEN PRINT BL$:GOTO 640
  62. 670  IF X$="N" THEN KILL DATADISK$+"FLIGHT.SEQ":RUN PROGDISK$+"NAVMENU"
  63. 680  R1=0:CLOSE
  64. 690  LOCATE N+6,1:PRINT "Flight Service Station you'll close with?  ";
  65. 700  PRINT SPC(17);:LOCATE ,POS(0)-17:LINE INPUT X$:IF X$<>"" THEN GOSUB 2830:FS$=X$
  66. 710  FOR I=1 TO N
  67. 720  LOCATE N+6,1:GOSUB 5000
  68. 730  IF I=1 OR I=N THEN PRINT"Enter SURFACE wind at ";:GOTO 750
  69. 740  PRINT"Enter winds ALOFT at ";
  70. 750  PRINT I$(I)" "P$(I)"  (deg,kts)  ";:INPUT W(I),S(I):IF S(I)=0 THEN 830
  71. 760  IF W(I)>360 THEN PRINT BL$:PRINT"360 degrees maximum":GOTO 720
  72. 770  IF S(I)<50 THEN 810 ELSE PRINT BL$:PRINT"Wind > 50 knots?  (Y or N)  ";
  73. 780  X$=INPUT$(1):IF X$=CHR$(13) THEN X$="Y":GOSUB 2830
  74. 790  IF X$<>"Y" AND X$<>"N" THEN PRINT BL$;:GOTO 770
  75. 800  IF X$="N" THEN 720
  76. 810  IF W(I)<=180 THEN W(I)=W(I)+180:GOTO 830
  77. 820  W(I)=W(I)-180
  78. 830  NEXT I
  79. 840  LOCATE N+6,1:GOSUB 5000:PRINT"Enter usable fuel on board  <"NB">  ";
  80. 850  PRINT "    gal";:LOCATE ,POS(0)-7
  81. 860  LINE INPUT X$:UF=VAL(X$):IF X$="" THEN UF=NB
  82. 870  IF UF=0 THEN PRINT BL$;:GOTO 840
  83. 880  NB=UF:K8(0)=UF-RU:F=K8(0)
  84. 890  LOCATE N+6,1:GOSUB 5000:INPUT"Enter ZULU departure time  (hhmm)";HR
  85. 900  IF HR>2400 THEN PRINT BL$:PRINT"2400 hours maximum":GOTO 890
  86. 910  L0=INT(HR/100):L1=(HR/100-L0)*100/60
  87. 920  IF L1>1 THEN PRINT BL$:PRINT"60 minutes/hour":GOTO 890
  88. 930  CD=0:CK=0:CT=0:MT=0:OC=0:LOCATE N+6,1:GOSUB 5000:PRINT"Calculating..."
  89. 940  FOR I=1 TO N-1:LOCATE I+4,2
  90. 950  'distance
  91. 960  A=P1(I)-P1(I+1):B1=P2(I)-P2(I+1):P#=COS(P2(I)/U)*COS(P2(I+1)/U)
  92. 970  Q=P#*COS(ABS(A)/U)+COS(ABS(B1)/U)-P#:IF Q<=0 THEN PRINT BL$:GOTO 2470
  93. 980  Q2=ATN(SQR(1-Q*Q)/Q):Q=Q2*U*60
  94. 990  C(I)=FNS6(Q):IF C(I)>900 AND ABS(A)>30 THEN PRINT BL$:GOTO 2490
  95. 1000  IF C(I)=0 THEN T(I)=0:Y(I)=0:E(I)=0:G(I)=0:R=0:GOTO 1650
  96. 1010  'true course
  97. 1020  S=FNS8((P2(I)+P2(I+1))/2):IF S>=1 THEN S=90-S ELSE S=FNS7(S)
  98. 1030  IF A>0 AND B1=0 THEN T=90:GOTO 1080
  99. 1040  IF A<0 AND B1=0 THEN T=270:GOTO 1080
  100. 1050  IF A>0 AND B1<0 THEN T=S:GOTO 1080
  101. 1060  IF A>=0 AND B1>0 THEN T=180-S:GOTO 1080
  102. 1070  IF A<0 AND B1>0 THEN T=180+S ELSE T=360-S
  103. 1080  T(I)=FNS6(T)
  104. 1090  'magnetic course
  105. 1100  V1=(V(I)+V(I+1))/2:V2=FNS6(V1):Y(I)=T(I)+V2:IF Y(I)<0 THEN Y(I)=360+Y(I)
  106. 1110  IF Y(I)>360 THEN Y(I)=Y(I)-360
  107. 1120  IF I>1 THEN 1380
  108. 1130  LOCATE N+6,1:GOSUB 5000:PRINT"Initial magnetic course is"Y(I)"degrees."
  109. 1140  PRINT "Enter cruise altitude  ";
  110. 1150  IF Y(I)<180 THEN PRINT"(Odd thousands)  "; ELSE PRINT"(Even thousands)  ";
  111. 1160  PRINT "<"NA">       ";:LOCATE ,POS(0)-5
  112. 1170  LINE INPUT X$:CA=VAL(X$):IF X$="" THEN CA=NA
  113. 1180  FOR J=1 TO N:IF EL(J)+1000<=CA THEN 1220
  114. 1190  LOCATE N+6,1:GOSUB 5000:PRINT "Low altitude...less than 1000 ft terrain";
  115. 1200  PRINT " clearance at "P$(J):PRINT TAB(55)"Elev:"EL(J)
  116. 1210  PRINT "Press any key to continue...";:X$=INPUT$(1):GOTO 1130
  117. 1220  NEXT J:NA=CA:LOCATE N+6,1:GOSUB 5000
  118. 1230  PRINT"Enter cruise TAS  <"NS">       kts";:LOCATE ,POS(0)-8
  119. 1240  LINE INPUT X$:TA=VAL(X$):IF X$="" THEN TA=NS
  120. 1250  IF TA>30 AND TA<250 THEN 1300
  121. 1260  PRINT BL$:PRINT"Is"TA"knots the correct TAS?  (Y or N)  <Y>  ";
  122. 1270  X$=INPUT$(1):PRINT X$:IF X$=CHR$(13) THEN X$="Y"
  123. 1280  GOSUB 2830
  124. 1290  IF X$<>"Y" AND X$<>"N" THEN PRINT BL$:GOTO 1260 ELSE IF X$="N" THEN 1230
  125. 1300  NS=TA:LOCATE N+6,1:GOSUB 5000:PRINT"Enter cruise fuel consumption  <"NF">       gal";
  126. 1310  LOCATE ,POS(0)-8:LINE INPUT X$:F3=VAL(X$):IF X$="" THEN F3=NF
  127. 1320  IF F3>3 AND F3<50 THEN 1370
  128. 1330  PRINT BL$:PRINT"Is"F3"gal/hr the correct fuel rate?  (Y or N)  <Y>  ";
  129. 1340  X$=INPUT$(1):PRINT X$:IF X$=CHR$(13) THEN X$="Y"
  130. 1350  GOSUB 2830
  131. 1360  IF X$<>"Y" AND X$<>"N" THEN PRINT BL$:GOTO 1330 ELSE IF X$="N" THEN 1300
  132. 1370  NF=F3:LOCATE N+6,1:GOSUB 5000:PRINT "Calculating..."
  133. 1380  'cruise grndspd
  134. 1390  G0=I:A4=TA:GOSUB 2580
  135. 1400  'climb?..climb grndspd
  136. 1410  IF I=1 THEN AT=CA-EL(1)
  137. 1420  AL%(I)=CA-AT:IF AT<=0 THEN 1530
  138. 1430  G0=0:A4=CS:GOSUB 2580:TT=AT/RC:IF TT<C(I)/G(0) THEN 1480
  139. 1440  'climb entire leg
  140. 1450  CL=C(I)/G(0):CT=CT+CL:AT=AT-(RC*CL):IF CA-AT<EL(I+1)+1000 THEN MT=1
  141. 1460  IF CA-AT<EL(I+1) THEN MT=2
  142. 1470  CD=CD+C(I):R=CT:FU=CF:GOSUB 2810:K(I)=KU:CK=CK+KU:G(I)=G(0):GOTO 1540
  143. 1480  'climb part of leg
  144. 1490  DC=TT*G(0):R=TT:FU=CF:GOSUB 2810:K(I)=KU:KC=KU:CK=CK+KU:CD=CD+DC:CT=CT+R:G0=I
  145. 1500  A4=TA:R=(C(I)-DC)/G(I):FU=F3:GOSUB 2810:K(I)=K(I)+KU:K8(I)=K8(I)-KC:R=R+TT:G(I)=C(I)/R
  146. 1510  AT=0:GOTO 1540
  147. 1520  'no climb
  148. 1530  FU=F3:R=C(I)/G(I):GOSUB 2810:K(I)=KU
  149. 1540  G(I)=FNS6(G(I))
  150. 1550  'magnetic heading
  151. 1560  IF T(I)+180>360 THEN 1580
  152. 1570  IF Q(I)>T(I) AND Q(I)<T(I)+180 THEN 1590 ELSE 1610
  153. 1580  IF Q(I)<T(I) AND Q(I)>T(I)-180 THEN 1610
  154. 1590  E(I)=Y(I)-B:IF B<=Y(I) THEN 1620
  155. 1600  E(I)=360-E(I):GOTO 1620
  156. 1610  E(I)=Y(I)+B:IF E(I)>360 THEN E(I)=E(I)-360
  157. 1620  E(I)=FNS6(E(I))
  158. 1630  'time enroute
  159. 1640  R=C(I)/G(I)
  160. 1650  F(I)=INT(R):F1(I)=FNS6((R-F(I))*60)
  161. 1660  'ETA
  162. 1670  R1=R1+R:O3=INT(R1):O4=(R1-O3):L3=INT(L1+O4):L2=INT((L1+O4-L3)*600+0.5)/10
  163. 1680  J(I)=L2:IF C(I)=0 THEN J(I)=0
  164. 1690  OC=OC+C(I)
  165. 1700  NEXT I:PRINT 
  166. 1710  'short flight...max alt?
  167. 1720  IF N=2 THEN I=1:G0=N:A4=TA:GOSUB 2580:GN=G(N) ELSE GN=G(N-1)
  168. 1730  AL=CA-EL(N):DS=GN*3.333:DC=N-1:NR=DS/((GN/60)*6076.12):IF OC>D9*3 THEN 1800
  169. 1740  OC=OC*6076.12:PR=(RC/60)/((G(0)/60)*6076.12)
  170. 1750  X=((OC*NR)+EL(N)-EL(1))/(PR+NR):Y=(PR*X)+EL(1):IF CA<=Y THEN 1800
  171. 1760  PRINT BL$;:LOCATE N+6,1:GOSUB 5000:PRINT "Unable to calculate flight profile to"CA"feet."
  172. 1770  PRINT:PRINT"You can climb to"INT(Y)"feet before begining descent."
  173. 1780  PRINT"Select new cruise altitude and appropriate TAS & fuel consumption."
  174. 1790  PRINT:PRINT"Press any key to continue...";:X$=INPUT$(1):GOTO 930
  175. 1800  'descent profile
  176. 1810  DP=AL/1000*5:NC=0
  177. 1820  NC=NC+C(DC):IF DP<NC THEN 1860
  178. 1830  ND=NC*6076.12:AL%(DC)=(NR*ND)+EL(N):IF AL%(DC)<EL(DC)+1000 THEN DW=1
  179. 1840  IF AL%(DC)<EL(DC) THEN DW=2
  180. 1850  DP=DP-C(DC):DC=DC-1:GOTO 1820
  181. 1860  'final ETA
  182. 1870  L0=INT(L0+R1+L1):IF L2=60 THEN L0=L0+1:L2=0
  183. 1880  IF L0<>2 OR L2<>0 THEN IF L0>23 THEN L0=L0-24:GOTO 1880
  184. 1890  O4=INT(O4*60+0.5)
  185. 1900  'print
  186. 1910  CLS::O=0
  187. 1920  PRINT TAB(22)"IDENT"TAB(36)"DIST"TAB(44)"TC"TAB(51)"MH"TAB(57)"GS";
  188. 1930  PRINT TAB(63)"ETE"TAB(70)"ETA"TAB(75)"FUEL"
  189. 1940  PRINT TAB(5)"CHECKPOINT"TAB(29)"FREQ"TAB(36)"nm"TAB(43)"deg"TAB(50)"deg";
  190. 1950  PRINT TAB(56)"kts"TAB(62)"h:mm"TAB(69)":mm"TAB(75)"gal"
  191. 1960  PRINT STRING$(78,45)
  192. 1970  FOR I=1 TO N:PRINT P$(I)TAB(22)I$(I);
  193. 1980  IF FR(I)=0 THEN 2030
  194. 1990  IF FR(I)>136 THEN PRINT USING"####";FR(I);:GOTO 2030
  195. 2000  IF FR(I)*10\1=FR(I)*10/1 THEN PRINT USING"####.#";FR(I);:GOTO 2030
  196. 2010  IF FR(I)*100\1=FR(I)*100/1 THEN PRINT USING"####.##";FR(I);:GOTO 2030
  197. 2020  PRINT USING"###.###";FR(I);
  198. 2030  IF I=N THEN PRINT J1$:GOTO 2150
  199. 2040  PRINT TAB(34);USING "####.#";C(I);
  200. 2050  PRINT TAB(42);USING "###.#";T(I);
  201. 2060  PRINT TAB(49);USING "###.#";E(I);
  202. 2070  PRINT TAB(56);USING "###";G(I);
  203. 2080  PRINT TAB(61);USING "##";F(I);
  204. 2090  PRINT ":";USING "##";F1(I);
  205. 2100  PRINT TAB(69)":";USING "##";J(I);
  206. 2110  PRINT TAB(74);USING "##.#";K(I);
  207. 2120  IF K8(I)<=F3*0.5 THEN PRINT "<<":GOTO 2140
  208. 2130  IF K8(I)<F3*0.75 THEN PRINT "<" ELSE PRINT
  209. 2140  O=O+C(I):O1=O1+1:NEXT I
  210. 2150  PRINT:PRINT"Total dist ="O"nm"TAB(30)"Time Off =";
  211. 2160  PRINT TAB(55)"Time On ="
  212. 2170  PRINT "Total time ="O3"hrs:"O4"mins"TAB(30)"Depart at"HR"GMT";
  213. 2180  PRINT TAB(55)"Final ETA ="INT((L0*100)+L2)"GMT"
  214. 2190  F=UF-K8(N-1):F=FNS6(F)
  215. 2200  PRINT "Avg. fuel usage ="F"gal"TAB(30)"Fuel rate ="F3"gal/hr";
  216. 2210  PRINT TAB(55)"Fuel on board ="UF"gal"
  217. 2220  X8=INT(ABS(K8(I-1)/F3)):X9=INT((ABS(K8(I-1)/F3)-X8)*60)
  218. 2230  IF K8(I-1)<=0 THEN K8(I-1)=0:X8=0:X9=0
  219. 2240  PRINT "Reserve ="FNS6(K8(I-1))"gal ="X8":"X9;TAB(30)"Cruise Alt ="CA;
  220. 2250  PRINT "ft"TAB(55)"TAS ="TA"("USING"###";CS;
  221. 2260  PRINT " climb)"
  222. 2270  PRINT "Fuel to climb ="CK"gal"TAB(30)"Dist to climb ="FNS6(CD)"nm";
  223. 2280  PRINT TAB(55)"Time to climb ="INT(CT*60)"min"
  224. 2290  PRINT "Cost "CHR$(64)USING"$$##.##";PH;
  225. 2300  PRINT "/hr = "USING"$$##.##";PH*R1
  226. 2310  IF K8(I-1)<>0 THEN 2330
  227. 2320  PRINT BL$;" INSUFFICIENT FUEL TO COMPLETE TRIP! ":GOTO 2350
  228. 2330  IF K8(I-1)>=F3*0.5 THEN 2350
  229. 2340  PRINT BL$;" FUEL RESERVES LESS THAN VFR MINIMUMS! "
  230. 2350  LOCATE N+12,1:GOSUB 5000:PRINT "Hard copy printout? (Y or N)  <Y>  ";:X$=INPUT$(1)
  231. 2360  IF X$=CHR$(13) THEN X$="Y"
  232. 2370  GOSUB 2830:IF X$="Y" THEN HC=1
  233. 2380  IF X$="N" THEN 2410
  234. 2390  IF X$<>"Y" THEN PRINT BL$;:GOTO 2350
  235. 2400  O9=O:GOSUB 2870
  236. 2410  LOCATE N+12,1:GOSUB 5000:PRINT "Alternate winds aloft, cruise altitude? (Y or N)";
  237. 2420  PRINT"  <Y>  ";:X$=INPUT$(1):PRINT L$:IF X$=CHR$(13) THEN X$="Y"
  238. 2430  GOSUB 2830:IF X$="Y" THEN O9=0:R1=0:LOCATE N+5,1:GOSUB 5000:GOTO 710
  239. 2440  IF X$<>"N" THEN PRINT BL$;:GOTO 2410
  240. 2450  CLOSE:IF HC=1 THEN RUN PROGDISK$+"RNAVREF" ELSE KILL DATADISK$+"FLIGHT.SEQ":RUN PROGDISK$+"NAVMENU"
  241. 2460  'error trap
  242. 2470  LOCATE N+6,1:PRINT BL$"Distance "P$(I)" to "P$(I+1)" excessive.";
  243. 2480  PRINT"Press any key to continue...":X$=INPUT$(1):GOTO 210
  244. 2490  LOCATE N+6,1:PRINT BL$"Distance "P$(I)" to "P$(I+1)" excessive."
  245. 2500  PRINT "Possible course errors due to rhumb line."
  246. 2510  PRINT "Press any key to continue...":X$=INPUT$(1):GOTO 2450
  247. 2520  IF NOT(ERR=53 AND ERL=170) THEN 2550
  248. 2530  PRINT"No data on file for "F$:PRINT"Re-enter N-number or `I' to input";
  249. 2540  PRINT" data":RESUME 130
  250. 2550  IF ERR=53 AND ERL=210 THEN PRINT BL$"No flight on file.":RUN PROGDISK$+"NAVMENU"
  251. 2560  IF ERR=62 AND ERL=220 THEN N=J-1:J=21:RESUME 240
  252. 2565  IF ERR=53 AND ERL=34 THEN CLOSE:RESUME 40 
  253. 2570  ON ERROR GOTO 0
  254. 2580  'avg wind & grndspd
  255. 2590  IF S(I)=0 AND S(I+1)=0 THEN R2=0:Q(I)=T(I):GOTO 2750
  256. 2600  IF W(I)<W(I+1) THEN W3=W(I) ELSE W3=W(I+1)
  257. 2610  IF W(I)>W(I+1) THEN W4=W(I) ELSE W4=W(I+1)
  258. 2620  S3=S(I+1):S4=S(I)
  259. 2630  IF W3=W(I) THEN S3=S(I):S4=S(I+1)
  260. 2640  IF S3<>0 AND S4=0 THEN R2=S3/2:Q(I)=W3:GOTO 2750
  261. 2650  IF S3=0 AND S4<>0 THEN R2=S4/2:Q(I)=W4:GOTO 2750
  262. 2660  X=W4-W3:S1=S3*S3:S2=S4*S4
  263. 2670  IF X=0 THEN R2=(S3+S4)/2:Q(I)=W3:GOTO 2750
  264. 2680  IF X=180 THEN R2=0:Q(I)=T(I):GOTO 2750
  265. 2690  IF X>180 THEN X=360-X
  266. 2700  R=SQR(S1+S2-2*S3*S4*COS(X/U)):Q=(S2+R*R-S1)/(2*S4*R)
  267. 2710  R2=SQR((S2+(R/2)*(R/2))-2*S4*(R/2)*Q):X1=(S2+R2*R2-(R/2)*(R/2))/(2*S4*R2)
  268. 2720  X1=ATN(SQR(1-X1*X1)/X1)*U:IF X>180 THEN Q(I)=W4+X1:GOTO 2740
  269. 2730  Q(I)=W4-X1:GOTO 2750
  270. 2740  IF Q(I)>360 THEN Q(I)=Q(I)-360
  271. 2750  W=ABS(T(I)-Q(I)):IF W<=180 THEN 2770
  272. 2760  IF Q(I)<T(I) THEN W=360-T(I)+Q(I) ELSE W=360-Q(I)+T(I)
  273. 2770  B=(R2*FNS5(W))/A4:IF B>=1 THEN B=90 ELSE B=FNS7(B)
  274. 2780  G=180-(W+B):M=FNS5(W):IF M=0 THEN R=A4+R2:GOTO 2800
  275. 2790  T=FNS5(G):IF T=0 THEN R=A4-R2 ELSE R=(A4*T)/M
  276. 2800  G(G0)=R:RETURN
  277. 2810  'fuel used
  278. 2820  KU=FNS6(R*FU):K8(I)=K8(I-1)-KU:RETURN
  279. 2830  'map lc
  280. 2840  FOR L=1 TO LEN(X$):U$=MID$(X$,L,1)
  281. 2850  IF ASC(U$)>96 AND ASC(U$)<123 THEN MID$(X$,L,1)=CHR$(ASC(U$)-32)
  282. 2860  NEXT L:RETURN
  283. 2870  O=0:LPRINT TAB(31)"   NAVPROGseven"
  284. 2875  LPRINT F$" "AT$TAB(62)LEFT$(TIME$,5)" "DATE$
  285. 2880  LPRINT STRING$(78,61)
  286. 2890  LPRINT TAB(22)"IDENT"TAB(36)"DIST"TAB(42)"MC/TC"TAB(50)"MH"TAB(56)"GS";
  287. 2900  LPRINT TAB(62)"ETE"TAB(69)"ETA"TAB(75)"FUEL"
  288. 2910  LPRINT TAB(5)"CHECKPOINT"TAB(22)"ID/fac"TAB(29)"FREQ"TAB(34)"rem/leg";
  289. 2920  LPRINT TAB(43)"deg"TAB(50)"deg"TAB(56)"kts"TAB(62)"h:mm"TAB(69)":mm";
  290. 2930  LPRINT TAB(75)"gal":LPRINT STRING$(78,45):FOR I=1 TO N
  291. 2940  LPRINT P$(I)TAB(22)I$(I);
  292. 2950  IF FR(I)=0 THEN 3000
  293. 2960  IF FR(I)>136 THEN LPRINT USING"####";FR(I);:GOTO 3000
  294. 2970  IF FR(I)*10\1=FR(I)*10/1 THEN LPRINT USING"####.#";FR(I);:GOTO 3000
  295. 2980  IF FR(I)*100\1=FR(I)*100/1 THEN LPRINT USING"####.##";FR(I);:GOTO 3000
  296. 2990  LPRINT USING"###.###";FR(I);
  297. 3000  IF I=N THEN 3170
  298. 3010  LPRINT TAB(34)USING "####.#";O9;
  299. 3020  LPRINT TAB(42)USING"###.#";Y(I);
  300. 3030  LPRINT TAB(49)USING "###.#";E(I);
  301. 3040  LPRINT TAB(56)USING "###";G(I);
  302. 3050  LPRINT TAB(73)USING "###.#";K8(I-1);
  303. 3060  IF K8(I)<=F3*0.5 THEN LPRINT "<<":GOTO 3080
  304. 3070  IF K8(I)<F3*0.75 THEN LPRINT "<" ELSE LPRINT
  305. 3080  LPRINT I;:IF I=1 THEN LPRINT TAB(5)"Elev:"EL(1);:GOTO 3100
  306. 3090  IF AL%(I)<>AL%(I-1) THEN LPRINT TAB(5)"Alt:"AL%(I);
  307. 3100  LPRINT TAB(22)FC$(I)TAB(34)USING"####.#";C(I);
  308. 3110  LPRINT TAB(42)USING"###.#";T(I);
  309. 3120  LPRINT TAB(61)USING "##";F(I);
  310. 3130  LPRINT ":"USING "##";F1(I);
  311. 3140  LPRINT TAB(69)":"USING "##";J(I);
  312. 3150  LPRINT TAB(74)USING "##.#";K(I)
  313. 3160  O=O+C(I):O1=O1+1:O9=O9-C(I):IF I<>N THEN 3190
  314. 3170  LPRINT TAB(34)"CLOSE FLIGHT PLAN WITH "FS$" FSS"
  315. 3180  LPRINT TAB(5)"Elev:"EL(N)TAB(21)FC$(N):LPRINT STRING$(78,61):GOTO 3200
  316. 3190  LPRINT
  317. 3200  NEXT I:I=N
  318. 3210  LPRINT:LPRINT"Total dist ="O"nm"TAB(30)"Time Off ="TAB(55)"Time On ="
  319. 3220  LPRINT:LPRINT "Total time ="O3"hrs:"O4"mins"TAB(30)"Depart at"HR"GMT";
  320. 3230  LPRINT TAB(55)"Final ETA ="INT((L0*100)+L2)"GMT":LPRINT
  321. 3240  F=UF-K8(N-1):F=FNS6(F)
  322. 3250  LPRINT "Avg. fuel usage ="F"gal"TAB(30)"Fuel rate ="F3"gal/hr";
  323. 3260  LPRINT TAB(55)"Fuel on board ="UF"gal"
  324. 3270  LPRINT TAB(40)"("FNS6(CF)"climb)"
  325. 3280  X8=INT(ABS(K8(I-1)/F3)):X9=INT((ABS(K8(I-1)/F3)-X8)*60)
  326. 3290  IF K8(I-1)<=0 THEN K8(I-1)=0:X8=0:X9=0
  327. 3300  LPRINT "Reserve ="FNS6(K8(I-1))"gal ="X8":"X9;TAB(30)"Cruise Alt ="CA;
  328. 3310  LPRINT "ft"TAB(55)"TAS ="TA"("USING"###";CS;
  329. 3320  LPRINT " climb)"TAB(55)"CAS =";
  330. 3330  LPRINT INT(TA-(1.75*(CA/1000)))"("INT(CS-(1.75*(CA/2000)))"climb)"
  331. 3340  LPRINT "Fuel to climb ="CK"gal"TAB(30)"Dist to climb ="FNS6(CD)"nm";
  332. 3350  LPRINT TAB(55)"Time to climb ="INT(CT*60)"min":LPRINT
  333. 3360  LPRINT "Cost "CHR$(64)USING"$$##.##";PH;
  334. 3370  LPRINT "/hr = "USING"$$##.##";PH*R1
  335. 3380  IF MT<>2 THEN 3400
  336. 3390  LPRINT "WARNING! STANDARD CLIMB WILL NOT CLEAR TERRAIN DURING CLIMBOUT"
  337. 3400  IF MT<>1 THEN 3420
  338. 3410  LPRINT "CAUTION: MARGINAL TERRAIN CLEARANCE DURING CLIMBOUT"
  339. 3420  IF K8(I-1)<>0 THEN 3440
  340. 3430  LPRINT BL$PG$" INSUFFICIENT FUEL TO COMPLETE TRIP! "QG$:GOTO 3460
  341. 3440  IF K8(I-1)>=F3*0.5 THEN 3460
  342. 3450  LPRINT BL$PG$" FUEL RESERVES LESS THAN VFR MINIMUMS! "QG$
  343. 3460  IF DW<>2 THEN 3480
  344. 3470  LPRINT "WARNING! NOMINAL DESCENT WILL NOT CLEAR TERRAIN!":GOTO 3520
  345. 3480  LPRINT:LPRINT"Nominal descent: "INT(DS)"ft/min, ";
  346. 3490  LPRINT INT(DP)"nm from "I$(DC+1)" "P$(DC+1)
  347. 3500  IF DW<>1 THEN 3520
  348. 3510  LPRINT "WARNING! MARGINAL TERRAIN CLEARANCE DURING DESCENT/APPROACH."
  349. 3520  LPRINT "Check charts for minimum terrain and obstruction ";
  350. 3530  LPRINT "clearance altitudes."
  351. 3540  LPRINT:LPRINT " ID             LAT - LONG    --- WINDS ---"
  352. 3550  FOR J=1 TO N:LPRINT I$(J),
  353. 3560  IF W(J)>180 THEN W(J)=W(J)-180 ELSE W(J)=W(J)+180
  354. 3565  LPRINT USING "###.##";P1(J);
  355. 3566  LPRINT USING " ###.##";P2(J);
  356. 3570  IF S(J)>0 THEN LPRINT "   "W(J)"degrees at"S(J)"knots." ELSE LPRINT
  357. 3580  NEXT J
  358. 3590  LPRINT CHR$(12):RETURN
  359. 4000  '     install erase-to-end-of-screen  subroutine
  360. 4010  DEF SEG=&H1700
  361. 4020  FOR ADDR% = 0 TO 19
  362. 4030  READ CODE%
  363. 4040  POKE ADDR%,CODE%
  364. 4050  NEXT
  365. 4060  CLREOS% = 0
  366. 4070  RETURN
  367. 4080  DATA &h55,&h8b,&hec,&h8b,&h76,&h06,&h8b,&h0c
  368. 4090  DATA &hb8,&h20,&h0a,&hb7,&h00
  369. 4100  DATA &hcd,&h10
  370. 4110  DATA &h5d,&hca,&h02,&h00,&h00
  371. 5000  '    erase to end-of-screen
  372. 5010  CLINE = CSRLIN                            'remember cursor position
  373. 5020  CROW  = POS(0)
  374. 5030  NUMCHR% = 1919 - ((CLINE - 1)*80 +CROW)   'num chars to write
  375. 5040  CALL CLREOS%(NUMCHR%)                     'erase to end of screen
  376. 5050  LOCATE CLINE,CROW,1                       'restore cursor
  377. 5060  RETURN
  378.