home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 1 / HamRadio.cdr / tech / engprog / unigrid.bas < prev    next >
BASIC Source File  |  1986-04-17  |  12KB  |  253 lines

  1. 10 REM WORLDWIDE QTH LOCATOR, CONTEST SCORING AND MAP PROGRAM BY N6NB.
  2. 20 REM *A PUBLIC DOMAIN PROGRAM FOR USE ON APPLE, COMMODORE, IBM, TRS-80
  3. 30 REM    AND OTHER MICROCOMPUTERS WITH BASIC AND AT LEAST 32K OF RAM.
  4. 40 REM *THIS PROGRAM CONVERTS LAT-LONG TO 4 AND 6-DIGIT LOCATORS, CALCULATES
  5. 50 REM    BEAM HEADINGS AND DISTANCE BETWEEN LOCATORS, TALLIES LOCATOR-BASED
  6. 60 REM    CONTEST SCORES, AND PROVIDES MAP-TO-LOCATOR TRANSLATIONS.
  7. 70 REM *THANKS TO WA1JXN, W4RUU, KC6A AND SM5AGM FOR THEIR SUGGESTIONS.
  8. 80 REM *NOTE:  ENTER MINUS SIGN ('-') FOR EAST LONGITUDE OR SOUTH LATITUDE.
  9. 90 REM  --IF 0 DEGREES EAST OR SOUTH, USE MINUS SIGN ('-') WITH MINUTES.
  10. 100 REM   (EXAMPLES:  -31 DEGR, 10.1 MINS OR 0 DEGR, -10.1 MINS).
  11. 110 PI=3.14159:RA=57.29583:DEF FNA(X)=INT(X*100+.5)/100:PT=0:NR=5:C1=0
  12. 120 M(1)=50:M(2)=100:M(3)=150:M(4)=250:F(1)=1:F(2)=2:F(3)=3:F(4)=4:F(5)=5
  13. 130 U(1)=82:U(2)=82:U(3)=57:U(4)=57:U(5)=88:U(6)=88
  14. 140 L(1)=65:L(2)=65:L(3)=48:L(4)=48:L(5)=65:L(6)=65
  15. 150 SX(1)=.06336:SX(2)=.12672:SX(3)=.25344:SX(4)=1.01376:SX(5)=2.64
  16. 160 SY(1)=13.71494:SY(2)=6.857469:SY(3)=3.428734:SY(4)=.857184:SY(5)=.329159
  17. 170 S$(1)="1:1,000,000 SCALE":S$(2)="1:500,000 SCALE":ML$=" MI"
  18. 180 S$(3)="1:250,000 SCALE":S$(4)="1:62,500 SCALE":S$(5)="1:24,000 SCALE"
  19. 190 PRINT:PRINT:PRINT:REM PUT YOUR CLEAR-SCREEN COMMAND HERE
  20. 200 PRINT:PRINT:PRINT "  QTH LOCATOR PROGRAM STARTUP MENU"
  21. 210 PRINT:PRINT "1 - CONVERT LOCATORS TO COORDINATES"
  22. 220 PRINT "2 - CONVERT COORDINATES TO LOCATORS"
  23. 230 PRINT "3 - OBTAIN LOCATOR OF A POINT ON MAP"
  24. 240 PRINT "4 - PINPOINT A KNOWN LOCATOR ON MAP"
  25. 250 PRINT "5 - COMPUTE DX AND CONTEST SCORES"
  26. 260 PRINT "6 - CHANGE CONTEST SCORING SYSTEM"
  27. 270 PRINT "7 - EXIT"
  28. 280 PRINT:INPUT "ENTER 1,2,3,4,5,6 OR 7";CN 
  29. 290 ON CN GOTO 330,480,1710,2060,680,1160,1590
  30. 300 PRINT "INVALID CHOICE.":GOTO 200
  31. 310 REM LOCATOR-TO-COORDINATE CONVERSION ROUTINE; 4 AND 6-DIGIT LOCATORS OK.
  32. 320 REM IF 4 DIGITS, APPROXIMATE CENTER OF AREA IS ASSUMED.
  33. 330 PRINT:PRINT "ENTER LOCATOR TO CONVERT:":GOSUB 340:GOTO 200
  34. 340 INPUT G1$
  35. 350 IF LEN(G1$)=4 THEN G1$=G1$+"MM"
  36. 360 IF LEN(G1$)<>6 THEN 1370
  37. 370 FOR K=1 TO 6:A(K)=ASC(MID$(G1$,K,1))
  38. 380 IF A(K)>U(K) OR A(K)<L(K) THEN 1370
  39. 390 NEXT K
  40. 400 LO=180-(A(1)-65)*20-(A(3)-48)*2-(A(5)-64.5)/12
  41. 410 LA=-90+(A(2)-65)*10+A(4)-48+(A(6)-64.5)/24
  42. 420 XO$="W LONG":LX=ABS(LO):IF LO<0 THEN XO$="E LONG"
  43. 430 XA$="N LAT":LY=ABS(LA):IF LA<0 THEN XA$="S LAT"
  44. 440 OM=(LX-INT(LX))*60:AM=(LY-INT(LY))*60
  45. 450 PRINT G1$;" = ";INT(LX);"DEG ";FNA(OM);"MIN ";XO$
  46. 460 PRINT TAB(10)INT(LY);"DEG ";FNA(AM);"MIN ";XA$:RETURN
  47. 470 REM COORDINATE-TO-LOCATOR CONVERSION ROUTINE
  48. 480 GOSUB 490:GOSUB 610:GOTO 200
  49. 490 PRINT:PRINT "USE (-) FOR EAST LONG, SOUTH LAT"
  50. 500 PRINT "ENTER THE LONGITUDE (DEGREES,MINS)":INPUT LO,OM
  51. 510 L2=ABS(OM):IF LO<0 THEN OM=-L2
  52. 520 L1=ABS(LO):LO=LO+OM/60:XO$="W LONG":IF LO<0 THEN XO$="E LONG"
  53. 530 IF L1>179 THEN 1340
  54. 540 IF L2>59.99 THEN 1340
  55. 550 PRINT "ENTER THE LATITUDE (DEGREES,MINS)":INPUT LA,AM
  56. 560 L4=ABS(AM):IF LA<0 THEN AM=-L4
  57. 570 L3=ABS(LA):LA=LA+AM/60:XA$="N LAT":IF LA<0 THEN XA$="S LAT"
  58. 580 IF L3>89 THEN 1340
  59. 590 IF L4>59.99 THEN 1340
  60. 600 QA=LA:QO=LO:RETURN
  61. 610 QP=(180-QO)/20:C=INT(QP):B$=CHR$(C+65):R=(QP-C)*10:C=INT(R):D$=CHR$(C+48)
  62. 620 M=(R-C)*24:C=INT(M):F$=CHR$(C+65):QB=(QA+90)/10:C=INT(QB):C$=CHR$(C+65)
  63. 630 R=(QB-C)*10:C=INT(R):E$=CHR$(C+48):M=(R-C)*24:C=INT(M):G$=CHR$(C+65)
  64. 640 A$=B$+C$+D$+E$+F$+G$
  65. 650 PRINT:PRINT "AT ";INT(L1);"/";FNA(L2);XO$;" - ";INT(L3);"/";FNA(L4);XA$
  66. 660 PRINT "THE GRIDLOCATOR IS ";A$:RETURN
  67. 670 REM CONTEST SCORING ROUTINE--COMPUTES DX, BEAM HEADINGS AND POINT TOTALS.
  68. 680 PRINT:PRINT "ENTER YOUR OWN QTH LOCATOR:":GOSUB 340
  69. 690 HO=LO/RA:HA=LA/RA:H$=G1$:XX=0
  70. 700 PRINT:INPUT "LOCATOR OR COMMAND ('?' FOR MENU)";G1$
  71. 710 IF G1$="QRT" THEN PRINT:GOTO 1100
  72. 720 IF G1$="X" THEN 1380
  73. 730 IF G1$="?" THEN 1400
  74. 740 IF G1$="+" THEN 1480
  75. 750 IF G1$="-" THEN 1540
  76. 760 IF G1$="C" THEN GOSUB 490:GOSUB 610:PRINT:GOTO 700
  77. 770 IF G1$="M" THEN GOSUB 1630:PRINT:GOTO 700
  78. 780 IF LEN(G1$)>3 THEN GOSUB 350:GOSUB 800:GOTO 1090
  79. 790 PRINT "INVALID ENTRY.  PLEASE TRY AGAIN.":GOTO 700
  80. 800 LO=LO/RA:LA=LA/RA:ZL=LA
  81. 810 L=HO-LO:IF L<>0 THEN 840
  82. 820 IF HA>ZL THEN AZ=180:GOTO 940
  83. 830 IF HA<=ZL THEN AZ=0:GOTO 940
  84. 840 IF L>PI THEN L=L-2*PI
  85. 850 IF L<-PI THEN L=L+2*PI
  86. 860 IF SIN(LA)=0 THEN AA=PI/2:GOTO 880
  87. 870 AA=COS(L)*(COS(LA)/SIN(LA)):AA=ATN(AA)
  88. 880 IF SIN(AA)=0 THEN AZ=0:GOTO 900
  89. 890 AZ=((COS(L)/SIN(L))*COS(HA+AA))/SIN(AA):IF AZ<>0 THEN AZ=ATN(1/AZ)
  90. 900 AZ=AZ*RA:L=L*RA
  91. 910 IF L>0 AND AZ<0 THEN AZ=AZ+180
  92. 920 IF L<0 AND AZ>0 THEN AZ=AZ+180
  93. 930 IF L<0 AND AZ<0 THEN AZ=AZ+360
  94. 940 AZ=INT(AZ+.5):DX=(SIN(HA)*SIN(LA))+(COS(HA)*COS(LA)*COS(HO-LO))
  95. 950 IF DX>1 THEN DX=1
  96. 960 IF DX<=-1 THEN DX=180:GOTO 1030
  97. 970 DX=SQR(1-(DX*DX))/DX
  98. 980 IF HO<>LO THEN 1010
  99. 990 IF HA=>ZL THEN DX=HA-LA:GOTO 1020
  100. 1000 IF HA<ZL THEN DX=LA-HA:GOTO 1020
  101. 1010 DX=ATN(DX)
  102. 1020 DX=DX*RA:IF DX<0 AND DX>-90 THEN DX=DX+180
  103. 1030 DX=DX*69.0468:KM=DX/.6215:DX=FNA(DX):KM=FNA(KM):PX=F(1)
  104. 1040 PRINT "DX FROM CENTER OF ";H$;" TO ";G1$;":"
  105. 1050 PRINT TAB(6)DX;" MI";" AND ";KM;" KM":IF ML$=" MI" THEN KM=DX
  106. 1060 PRINT TAB(6)AZ;" DEGREES AZIMUTH"
  107. 1070 FOR J=1 TO NR-1:IF KM=>M(J) THEN PX=F(J+1)
  108. 1080 NEXT J:RETURN
  109. 1090 PRINT TAB(6)PX;" PT(S) FOR THIS QSO":PT=PT+PX:D9=D9+KM:QS=QS+1:XX=1
  110. 1100 PRINT:PRINT TAB(6)"----------------------"
  111. 1110 PRINT TAB(6)PT;" TOTAL PTS"
  112. 1120 PRINT TAB(6)D9;" ";ML$;" TOTAL DX"
  113. 1130 PRINT TAB(6)QS;" QSOS ENTERED":IF G1$="QRT" THEN 1590
  114. 1140 GOTO 700
  115. 1150 REM ROUTINE TO MODIFY SCORING SYSTEM.
  116. 1160 PRINT:PRINT "UNLESS YOU CHANGE THE VALUES HERE,"
  117. 1170 PRINT "THIS SCORING SYSTEM WILL APPLY:":PRINT
  118. 1180 PRINT F(1);" PT(S) PER QSO IF DX < ";M(1);ML$:IF NR<=2 THEN 1220
  119. 1190 FOR J=2 TO NR-1
  120. 1200 PRINT F(J);" PTS IF DX = ";M(J-1);" TO ";M(J);ML$
  121. 1210 NEXT J
  122. 1220 PRINT F(NR);" PTS IF DX => ";M(NR-1);ML$:PRINT
  123. 1230 INPUT "ARE THESE VALUES CORRECT (Y/N)";OK$
  124. 1240 IF OK$="Y" THEN 200
  125. 1250 PRINT:INPUT "USE MILES (MI) OR KILOMETERS (KM)";ML$:ML$=" "+ML$
  126. 1260 PRINT:INPUT "ENTER THE LOWEST PT VALUE";F(1):NR=2
  127. 1270 PRINT "ENTER MAXIMUM DX FOR ";F(1);" PT(S)";:INPUT M(1)
  128. 1280 PRINT:INPUT "ENTER THE NEXT POINT VALUE";F(NR)
  129. 1290 PRINT "ENTER MAXIMUM DX FOR "F(NR);" PTS"
  130. 1300 INPUT "(IF NO HIGHER LIMIT EXISTS, ENTER 0)";M(NR)
  131. 1310 IF M(NR)=0 THEN 1150
  132. 1320 NR=NR+1:GOTO 1280
  133. 1330 REM OPERATOR MESSAGES AND EDITING FUNCTIONS
  134. 1340 PRINT "ENTRY INCORRECT.  MAXIMUM COORDINATES:"
  135. 1350 PRINT "89 DEG LATITUDE, 179 DEG LONGITUDE,"
  136. 1360 PRINT "AND 59.99 MINUTES":GOTO 490
  137. 1370 PRINT "INVALID ENTRY FORMAT.  PLEASE TRY AGAIN.":GOTO 340
  138. 1380 IF XX=0 THEN PRINT "CAN'T DELETE":GOTO 700
  139. 1390 XX=0:QS=QS-1:PT=PT-PX:D9=D9-KM:PRINT "--LAST ENTRY DELETED--":GOTO 1100
  140. 1400 PRINT:PRINT:PRINT TAB(12)"DATA ENTRY MENU":PRINT
  141. 1410 PRINT "YOU MAY ENTER A STATION'S LOCATOR, OR--"
  142. 1420 PRINT:PRINT "'X' TO DELETE THE LAST ENTRY"
  143. 1430 PRINT "'+' TO ADD PRIOR QSOS TO TOTALS"
  144. 1440 PRINT "'-' TO DELETE ANY PREVIOUS QSO"
  145. 1450 PRINT "'C' TO CONVERT COORDINATES TO LOCATOR"
  146. 1460 PRINT "'M' TO PERFORM MAP OPERATIONS"
  147. 1470 PRINT "'QRT' TO END SESSION":PRINT:GOTO 700
  148. 1480 PRINT:PRINT:PRINT "THIS OPTION ALLOWS YOU TO ADD QSOS,"
  149. 1490 PRINT "DX, AND CONTEST POINTS FROM"
  150. 1500 PRINT "A PREVIOUS SESSION TO YOUR TOTALS.":PRINT
  151. 1510 PRINT "HOW MANY QSOS TO ADD?":INPUT Q1:QS=QS+Q1
  152. 1520 PRINT "HOW MANY TOTAL MILES (OR KM) TO ADD?":INPUT D1:D9=D9+D1
  153. 1530 PRINT "HOW MANY POINTS TO ADD?":INPUT P1:PT=PT+P1:GOTO 1100
  154. 1540 PRINT:PRINT:PRINT "THIS OPTION ALLOWS YOU TO DELETE"
  155. 1550 PRINT "ANY PREVIOUS QSO FROM THE TOTALS"
  156. 1560 PRINT "BY ENTERING ITS LOCATOR.":PRINT
  157. 1570 INPUT "LOCATOR TO DELETE";G1$:GOSUB 350:GOSUB 800
  158. 1580 QS=QS-1:PT=PT-PX:D9=D9-KM:XX=0:GOTO 1100
  159. 1590 PRINT:PRINT "NOTE:   YOU HAVE EXITED THE PROGRAM."
  160. 1600 PRINT "BE SURE TO WRITE DOWN YOUR DATA"
  161. 1610 PRINT "BEFORE TURNING OFF YOUR COMPUTER!":END
  162. 1620 REM MAP CONVERSION ROUTINES 
  163. 1630 PRINT:PRINT "MAP OPERATIONS.  CHOOSE EITHER--"
  164. 1640 PRINT "1 - OBTAIN LOCATOR OF A POINT ON MAP"
  165. 1650 PRINT "2 - PINPOINT A KNOWN LOCATOR ON MAP"
  166. 1660 PRINT "ENTER 1 OR 2";:INPUT M9
  167. 1670 IF M9=1 THEN GOSUB 1720:GOTO 700
  168. 1680 IF M9=2 THEN GOSUB 2070:GOTO 700
  169. 1690 PRINT "INVALID CHOICE--TRY AGAIN":GOTO 1630
  170. 1700 REM ROUTINES TO OBTAIN QTH LOCATOR OF A POINT ON A MAP
  171. 1710 GOSUB 1720:GOTO 200
  172. 1720 GOSUB 2200:PRINT:PRINT "MEASURE THE VERTICAL AND HORIZONTAL"
  173. 1730 PRINT "DISTANCE FROM THE REFERENCE POINT"
  174. 1740 PRINT "TO THE POINT FOR WHICH YOU NEED"
  175. 1750 PRINT "A QTH LOCATOR.":PRINT
  176. 1760 PRINT "NOTE: USE MINUS ('-') TO INDICATE A"
  177. 1770 PRINT "DISTANCE SOUTH OR EAST OF REFERENCE PT.":PRINT
  178. 1780 INPUT "# INCHES VERTICALLY FROM REF PT.";V
  179. 1790 INPUT "# INCHES HORIZONTALLY FROM REF. PT.";H
  180. 1800 IF ABS(M3+(V*S2/50))<90 THEN 1820
  181. 1810 PRINT "ERROR: ENTRY >90 DEGR LAT":GOTO 1780
  182. 1820 C2=4:IF H=>0 AND V<0 THEN C2=1
  183. 1830 IF V=>0 AND H=>0 THEN C2=2
  184. 1840 IF V=>0 AND H<0 THEN C2=3
  185. 1850 V3=ABS(V)*S2:H3=ABS(H)*S2
  186. 1860 IF V3=0 THEN A3=90:GOTO 1880
  187. 1870 A3=(ATN(H3/V3))*RA
  188. 1880 R3=(H3^2+V3^2)^.5
  189. 1890 IF C2=1 THEN T3=A3+180
  190. 1900 IF C2=2 THEN T3=360-A3
  191. 1910 IF C2=3 THEN T3=A3
  192. 1920 IF C2=4 THEN T3=180-A3
  193. 1930 NA=(R3*(COS(T3/RA))/60)+M3:XA$="N LAT":IF NA<0 THEN XA$="S LAT"
  194. 1940 IF T3=90 THEN 1990
  195. 1950 IF T3=270 THEN 1990
  196. 1960 X=LOG(TAN((45+(M3/2))/RA)):X1=LOG(TAN((45+(NA/2))/RA))
  197. 1970 NO=M4+RA*(TAN(T3/RA))*(X-X1)
  198. 1980 GOTO 2000
  199. 1990 NO=M4-(R3*SIN(T3/RA))/(60*COS(M3/RA))
  200. 2000 IF NO=>180 THEN NO=NO-360
  201. 2010 IF NO=<-180 THEN NO=360+NO
  202. 2020 XO$="W LONG":IF NO<0 THEN XO$="E LONG"
  203. 2030 QA=NA:NA=ABS(NA):L3=INT(NA):L4=(NA-INT(NA))*60
  204. 2040 QO=NO:NO=ABS(NO):L1=INT(NO):L2=(NO-INT(NO))*60:GOTO 610
  205. 2050 REM ROUTINES TO PINPOINT A KNOWN QTH LOCATOR ON A MAP
  206. 2060 GOSUB 2070:GOTO 200
  207. 2070 GOSUB 2200:PRINT:PRINT "ENTER THE GRIDLOCATOR THAT YOU"
  208. 2080 PRINT "WISH TO PINPOINT ON YOUR MAP":GOSUB 340
  209. 2090 NA=LA:NO=LO:A4=ABS((M3+NA)/2):D4=ABS(M3-NA):D5=ABS(M4-NO)
  210. 2100 D6=69.0541-.351726*COS((2*A4)/RA)
  211. 2110 D7=69.23001*COS(A4/RA)-.05875*COS((3*A4)/RA)
  212. 2120 V4=D6*D4*S3:G4=D7*D5*S3
  213. 2130 X7$=" NORTH":IF LA<M3 THEN X7$=" SOUTH"
  214. 2140 X8$=" WEST":IF LO<M4 THEN X8$=" EAST"
  215. 2150 PRINT:PRINT "THE CENTER OF ";G1$;" IS"
  216. 2160 PRINT FNA(V4);" INCHES ";X7$
  217. 2170 PRINT "FROM THE REFERENCE POINT AND"
  218. 2180 PRINT FNA(G4);" INCHES ";X8$
  219. 2190 PRINT "FROM THE REFERENCE POINT":RETURN
  220. 2200 IF C1=0 THEN 2270
  221. 2210 PRINT:PRINT "CURRENT MAP PARAMETERS:"
  222. 2220 PRINT:PRINT "REFERENCE POINT IS"
  223. 2230 PRINT INT(L5);"/";FNA(L6);X1$;" - ";INT(L7);"/";FNA(L8);X2$
  224. 2240 IF S1=6 THEN PRINT "MAP SCALE: ";MI;" MILES/INCH":GOTO 2260
  225. 2250 PRINT "MAP USES ";S$(S1) 
  226. 2260 INPUT "WANT TO CHANGE MAP PARAMETERS (Y/N)";CM$:IF CM$<>"Y" THEN RETURN
  227. 2270 PRINT:PRINT "PLEASE DESCRIBE YOUR MAP AND SELECT"
  228. 2280 PRINT "A REFERENCE POINT FOR MEASUREMENTS."
  229. 2290 PRINT "------------------------------------"
  230. 2300 PRINT "|                :                 |"
  231. 2310 PRINT "|     X----------:                 |"
  232. 2320 PRINT "|     :          :                 |"
  233. 2330 PRINT "|     :          :                 |"
  234. 2340 PRINT "|................R.................|"
  235. 2350 PRINT "|                :                 |"
  236. 2360 PRINT "|                :                 |"
  237. 2370 PRINT "|                :                 |"
  238. 2380 PRINT "|                :                 |"
  239. 2390 PRINT "------------------------------------"
  240. 2400 PRINT "(R IS YOUR REFERENCE POINT ON THE MAP,"
  241. 2410 PRINT "AND X IS AN UNKNOWN POINT OR LOCATOR).":C1=1:PRINT
  242. 2420 PRINT "FOR YOUR REFERENCE POINT ON THE MAP:"
  243. 2430 GOSUB 490:M3=LA:M4=LO:L5=L1:L6=L2:L7=L3:L8=L4:X1$=XO$:X2$=XA$
  244. 2440 PRINT:PRINT "NOW SPECIFY THE MAP'S SCALE:"
  245. 2450 PRINT:PRINT TAB(7)"1.  ";S$(1):PRINT TAB(7)"2.  ";S$(2)
  246. 2460 PRINT TAB(7)"3.  ";S$(3):PRINT TAB(7)"4.  ";S$(4)
  247. 2470 PRINT TAB(7)"5.  ";S$(5):PRINT TAB(7)"6.  ANY # MILES/INCH"
  248. 2480 PRINT:INPUT "ENTER 1,2,3,4,5 OR 6";S1:IF S1=6 THEN 2510
  249. 2490 IF S1>6 THEN PRINT "INVALID SCALE--TRY AGAIN.":GOTO 2440
  250. 2500 S2=SY(S1):S3=SX(S1):GOTO 2210
  251. 2510 PRINT:INPUT "ENTER MAP SCALE IN MILES/INCH";MI
  252. 2520 S2=MI/1.15078:S3=1/MI:GOTO 2210
  253.