DECLARE SUB HearDisp (Tmp$) DECLARE SUB GScalc (B$, a!, Lat!, Lon!, good!) DECLARE SUB PIRNT (a$) DECLARE SUB ReadPage (Lin) DECLARE SUB ZeroLnP () DECLARE SUB HangUp () DECLARE SUB LoadLine (a$, mine, NewF, abt!) DECLARE SUB InitMore () DECLARE SUB LoadFile (N!) DECLARE SUB AddP (Call$) DECLARE SUB FindP (a$) DECLARE SUB DXcalls (a$, LALO$) DECLARE FUNCTION LocOK (y, yo, x, xo, a$) DECLARE SUB XYtoLL (Lat!, Lon!, alt$, LALO$) DECLARE SUB PRa (a$, P$) DECLARE SUB PR2N (a!, P$) DECLARE SUB NewScrn (d$, c!, d) DECLARE SUB Calldisp () DECLARE SUB JustPosits (Tmp$) DECLARE SUB DispDigi (js$) DECLARE SUB CountyDo (s, L!, a$, Colr!, NML!) DECLARE SUB ViewBox (c!) DECLARE FUNCTION Fmt$ (a$, a) DECLARE SUB SendLine (To$, a$, m$, lno) DECLARE SUB EraseCMD (j!) DECLARE SUB NTSad (x$) DECLARE SUB NTSform () DECLARE SUB NTSgSho (m$, P$, L!, c!) DECLARE SUB NTShead (x$) DECLARE FUNCTION NxFld$ (a$, x!, j!) DECLARE FUNCTION Tdeg$ (a$, L!) DECLARE SUB AddL (Call$) DECLARE SUB FindL (Call$) DECLARE SUB SendCW (a$) DECLARE SUB DigiList () DECLARE SUB PL25 (a$, c!) DECLARE SUB Winds () DECLARE SUB EnterWX () DECLARE SUB DispWX (j!) DECLARE SUB WXalarms () DECLARE SUB PPrnt (a$) DECLARE SUB Xmit (a!, a$) DECLARE SUB OverlayPos () DECLARE SUB GetMETAR () DECLARE FUNCTION LzN$ (a!, N) DECLARE SUB PR23 (a$, B$, P$, N) DECLARE SUB Noise (a!) DECLARE SUB HSPsw (a!) DECLARE SUB PL1 (z$, c!) DECLARE SUB Clearbuf () DECLARE SUB GetBrng (a$, Pos$, BH$) DECLARE SUB RightCall (Call$) DECLARE SUB DigiDo (a) DECLARE SUB DigiFind (a$, x) DECLARE SUB PL24 (a$, c!) DECLARE SUB ClrScn () DECLARE SUB Do3D (x!, y!) DECLARE SUB FileRead (a) DECLARE SUB HookDspLM (c, P) DECLARE SUB SymDo (a$, B$, c$, d$, Tmp$) DECLARE SUB SendMsgs (a$) DECLARE SUB Title () DECLARE SUB TooBad () DECLARE SUB AddBL (a$) DECLARE SUB ParseA (a$, TY$, LA!, LO!, sym$) DECLARE SUB Drawunit (R!, P, Tmp$, cc!, live, o) DECLARE SUB SymType (sym$) DECLARE SUB ParseGdSq (a$, k!, Call$, LALO$, c$) DECLARE SUB ShowSetup () DECLARE SUB PassWD (a$, c$, Val$) DECLARE SUB GpWxVal (Val$, B) DECLARE SUB OverWrite (a$, B$, FirstLine!) DECLARE SUB BeamHeading (Pos$) DECLARE SUB PwrAnt (a!, Pos$) DECLARE SUB ParseVel (a$, sym$, CSE!, CSE$, SPD!, SPD$, BRG$, QAL$, CMTS!, PHG$) DECLARE SUB CommTNC (a$, Astr$, c$) DECLARE SUB PrepTNC (c$) DECLARE SUB SymShow () DECLARE SUB PR (a$, T$) DECLARE SUB Help () DECLARE SUB GetChar (a$) DECLARE SUB DoLabels (x!, y!, a$, F!, c) DECLARE SUB ComputeDelT (T$, Del!) DECLARE FUNCTION LOB! (CSE!, Dist!, c!, s!) DECLARE FUNCTION Xval! (Lon!) DECLARE FUNCTION Yval! (Lat!) DECLARE SUB ControLine () DECLARE SUB Pause (T!) DECLARE SUB Valid (B$) COMMON SHARED AC AS STRING * 1 COMMON SHARED LS() AS STRING * 80 COMMON SHARED BL() AS STRING * 80 COMMON SHARED PS() AS STRING * 80 COMMON SHARED DG() AS STRING * 50 'COMMON SHARED DP() AS STRING * 64 COMMON SHARED HP() AS STRING * 16 COMMON SHARED HL() AS STRING * 23 COMMON SHARED GC() AS STRING * 24 COMMON SHARED BN() AS STRING * 86 COMMON SHARED ML() AS STRING * 12 COMMON SHARED DX() AS STRING * 70 COMMON SHARED Mail() AS STRING * 80 COMMON SHARED Msg$(), Mst$(), Dup(), Hrain%(), Drain%(), Sy$(), ToAd$ COMMON SHARED Strt, Borders, WPM, LnR, Prings, es$, LastALL$, Crsr(), F$ COMMON SHARED LineL, LineP, LineB, Ogga, Hooked, LM, PM, LogW, GetGPStime COMMON SHARED Dwx, HF, Ver$, Key$, Display$, Ignet, LogF, FILoff, BLsave COMMON SHARED Ycen, yfg, yft, yfc, Bfac, Sfac, Hfac, Lfac, RS, ReDrw, HrdMe COMMON SHARED CDX, CDY, CPX, CPY, CUX, CUY, Lat$, Lon$, ScrnType, HFa$, MY$ COMMON SHARED Allon, TagsON, LblsC, LdrsON, RdsON, WtrON, linsON, OnlyBCNS COMMON SHARED XMTon, TNCon, Upload, DRon, Vusr, CWon, PBvia$, DXon, JustW COMMON SHARED L01, L02, L03, Lm9, L05, FgC, Bgc, Auto, NewWX, Wrr, Pon, Grid$ COMMON SHARED L18, L19, L21, L22, L23, L24, L24B, L25, BlnX, SSvr, Lok, Doz COMMON SHARED SLAT$, SLON$, UTC, Zulu, ZTG$, Pmax, Lmax, EndL, DGPSon, ALIAS$ COMMON SHARED StrtL, StrtP, StrtB, ID, nmg, nsl, R0MIR$, MLC, Dual, Gfltr, Mgrp$ COMMON SHARED DTG$, DTGs$, HR, GPSprd, PPP, MaxTime, CWfreq, Space, Tagn$, Twn COMMON SHARED NxBCN, NxPOS, NxOBJ, NxMsg, SAREXtime, Beamtime, NxWx, Modem COMMON SHARED NxOBJ(), DcayO%(), OBJ, NxMsg(), DecayM(), STSon, Oprt, GRP$ COMMON SHARED DecayM, GPSon, WXon, DFon, MsgsAre, Ofn, Rain, KAM, Junk, TelNo$ COMMON SHARED DecayB, DecayP, CapGd, DimCol, NewRead, NewUser, SPM, BEEPSoff COMMON SHARED Uid$, Port$, TNCcom$, GPScom$, TNCbaud, GPSbaud, TNC, HSP, DGGA COMMON SHARED StrtD, lineD, LinB, BestLON, BestLAT, BestRNG, NewBltn, LstPkt COMMON SHARED Gval, Dval, Wval, Sval, MagVar, Fade, FadeTime, Wind, Ignore COMMON SHARED Rnav, mss, ReDrwT, HTemp, LTemp, Ralarm, Metric, Wrng, NoGPS COMMON SHARED Enet$, Qstr$, Qc, S25$, Ptime, Bln, MSp, Csp, MapFile$, HSPonGPS COMMON SHARED hspp, GotP, Pdone, Astr$, LastGPS, DoPOS, DoTEMP, DoLTST, DoNOW COMMON SHARED Ptemp$, Pnow$, PpmP, PpmT, PpmN, Nbltn, ZipLan, ReDoM, QRX, Alarm COMMON SHARED Ofw, MyLAT, MyLON, Cy1, Cy2, Cy3, Cx1, In3D, War, Nlog, AGL COMMON SHARED AltNet$, Game, Unstr$, MyMove, HisMove, AltPath$(), AltT(), LastPkt COMMON SHARED NewVia$, Via$, DFSP, DFhdg, Success, SucTime, NoSPD, Gdfmt, Dots COMMON SHARED MScat, MS, MSectr, NewPkt, LineTH, NetPath$, SavPrd, MapSize COMMON SHARED g, Mla(), MLo(), Mr(), County, ViewD, LocFil, CmpFmt, NewE, Dsave COMMON SHARED LineH, LineR, LineDX, OnLine, CalActy, NoTel, DST, Palias$, Vcnty COMMON SHARED ACK$, ACall$, Wpts, Trial, PCT$(), NewMsg, WPP, WPS, PtsLoc$ END SUB AtorBcn PRINT #1, CHR$(13); PRINT #1, "APRS DE "; LEFT$(LS(0), 6); MID$(LS(0), 8, 1); PRINT #1, "/"; MID$(LS(0), 19, 6); " "; RTRIM$(MID$(LS(0), 26)); CHR$(13); PRINT #1, CHR$(3); "T"; PRINT #1, CHR$(3); "E"; END SUB SUB BeamHeading (Pos$) CALL PR23("0", a$, "DF Bearing (0=OMNI, 360=N. End with R if Relative, M if Mag)", 0) IF a$ = "0" THEN CALL PwrAnt(0, Pos$) MID$(Pos$, 45) = "/ /" 'zero old beamhdg ELSEIF a$ <> "" THEN CALL GetBrng(a$, Pos$, BH$) IF BH$ <> "000" THEN CALL PR(Q$, "Enter Quality (1 to 8) [8]") IF Q$ = "" THEN Q$ = "8" IF Q$ < "0" OR Q$ > "9" THEN Q$ = "?" R = INT(.00001 + LOG(RS) / LOG(2)): R$ = MID$(STR$(R), 2, 1) MID$(Pos$, 37) = "\" MID$(Pos$, 45) = "/" + BH$ + "/9" + R$ + Q$ + "/DFreport" Beamtime = TIMER: NxPOS = TIMER: DecayP = 5 END IF END IF END SUB SUB BorderTxt IF Borders THEN LOCATE Bln - 1, 1 PRINT " Showing BORDERS of all MAPS in MAPLIST."; MapFile$; PRINT " file with ranges of about"; INT(MapSize); "mi."; LOCATE Bln, 1 PRINT " Use SPACE BAR to cancel, ']' to see smaller maps and '[' to see larger maps."; LINE (0, L23)-(639, L25), 14, B END IF END SUB SUB Bye (a$, Fault) PRINT #1, CHR$(3); : Pause (.1) CALL ClrScn PRINT PRINT " Current data is saved in BACKUP.BK for re-Load using FILE-LOAD. To also" PRINT " save a Track History and Beacon log, you must give a name other than BACKUP" PRINT " or do a FILE-SAVE before you Quit, so that unique BK, LOG and HST files are" PRINT " saved. " a = 30: LOCATE Bln - 5, 1 PRINT " APRS will enable your TNC BText, with your position every 30 minutes (180).." 'IF a$ = "Q" THEN CALL PR2N(a, "To SILENCE your BText, enter 0. Or enter a new value") a = 30 'IF TNC <> 3 AND KAM <> 1 THEN a = a * 6 CALL PIRNT("B E" + STR$(a)) 'IF HF = 0 AND INSTR(1, PBvia$, "GATE") > 0 THEN CALL PIRNT("UN APRS VIA RELAY") LOCATE Bln - 8, 2: PRINT "Wait while using RESTORE.TNC to restore TNC parameters..." DO UNTIL EOF(3) LINE INPUT #3, x$ IF LEFT$(x$, 1) <> "*" THEN CALL PIRNT(x$) LOOP IF TNC = -1 THEN PRINT #1, "ALFD ON" ELSE PRINT #1, "AUTOLF ON" LOCATE Bln - 9, 1 PRINT " APRS has modified these TNC parameters: ECHO, MCOM, BK, MSTAMP, FLOW, AUTOLF " PRINT " HEADERLINE, LFADD, SCRN plus any other ones you add to the SYSTEM\InitTAPR.TNC " PRINT " file. It will restore the ones that YOU set in the SYSTEM\RESTORE.TNC file. " PRINT " For AEA TNC's, use InitAEA.TNC and be sure to read the README\AEA.txt file. " LINE (0, 214 * yft)-(639, 294 * yft), 12, B CLOSE #3 DEF SEG = 64 IF TNCcom$ = "COM3:" OR GPScom$ = "COM3:" THEN POKE &H0, &HF8 IF TNCcom$ = "COM4:" OR GPScom$ = "COM4:" THEN POKE &H2, &HF8 END SUB SUB Calldisp CALL PR(a$, "CALLSIGN FORMATS: Callsigns, Baro, Temps, Winds, Spd/alt, None") TagsON = -1 SELECT CASE a$ CASE "C": Dwx = 0 CASE "W": Dwx = 1 CASE "T": Dwx = 9 CASE "B": Dwx = 8 CASE "S": Dwx = 3 CASE "N": TagsON = 0 END SELECT END SUB SUB ChannelCap (CntrT, Pcntr) Del = TIMER - CntrT IF Del < 600 THEN 'midnight fix PCT = INT((Pcntr / Del) * 200) REM 240 = 100% * .7 sec / .36 capacity. assumes each packet is .8 c = 10 IF PCT > 60 THEN c = 14 IF PCT > 90 THEN c = 12 IF PCT > 30 AND Doz = 0 THEN LOCATE Bln - 2, 62 PRINT " Channel Load"; PCT; "%"; LINE (488, L22)-(639, L23), c, B END IF END IF CntrT = TIMER Pcntr = 0 END SUB SUB CkPts (Pos$) 'in DoRxPkt: IF MID$(Pos$, 28, 5) = "04000" THEN CALL CkPts(Pos$) 'then 4000.ta/04000.nn is the table, ambiguity and nn number 'POINTS.TBL format is Tnn,WB4APR-15 @145347z3859.11N/07629.11W-stuff ' 123456789-123456789=123456789%123456789# ' 123456789-123456789=123456789%123456789#12 IF MID$(Pos$, 19, 4) = "4000" THEN T$ = MID$(Pos$, 24, 1) g$ = MID$(Pos$, 25, 1) 'ambiguity Tnn$ = T$ + MID$(Pos$, 34, 2) OPEN "POINTS.TBL" FOR INPUT AS #3 DO UNTIL EOF(3) LINE INPUT #3, a$ IF LEFT$(a$, 3) = Tnn$ THEN MID$(Pos$, 19, 8) = MID$(a$, 23, 8) MID$(Pos$, 28, 9) = MID$(a$, 32, 9) END IF LOOP CLOSE #3 END IF END SUB SUB CkRS (sym$) max = 64: min = 8 sm$ = RIGHT$(sym$, 1) IF sm$ = "d" THEN min = 512: max = 1024 IF sm$ = "q" THEN min = 128: max = 512 IF sm$ = "G" THEN min = 8: max = 64 ' was "?" IF RS > max THEN RS = max IF RS < min THEN RS = min END SUB SUB CmptCENTER (LA, LO, Rng) MAXLAT = -90: MAXLON = -180 MINLAT = 90: MINLON = 180 FOR i = 0 TO LineP CALL ParseA(PS(i), TY$, Lat, Lon, sym$) IF Lat <> 0 AND Lon <> 0 THEN IF Lat > MAXLAT THEN MAXLAT = Lat IF Lon > MAXLON THEN MAXLON = Lon IF Lat < MINLAT THEN MINLAT = Lat IF Lon < MINLON THEN MINLON = Lon END IF NEXT i IF i > 2 THEN RLAT = (MAXLAT - MINLAT) / 2 RLON = (MAXLON - MINLON) / 2 IF RLON > RLAT * 1.3 THEN BRNG = RLON * .6 * 60 + 1 ELSE BRNG = RLAT * 60 + 1 END IF Rng = 2 ^ (1 + INT(LOG(BRNG) / LOG(2))) LA = MINLAT + RLAT: LO = MINLON + RLON END IF END SUB SUB CommTalk (Astr$) IF GPSon OR WXon OR DFon THEN CALL ClrScn LOCATE Bln, 41: PRINT "[ *** Hit ESC to return to APRS *** ]"; a = 0: Flow = 1 DO WHILE a$ <> CHR$(27) DO a$ = INKEY$: IF a$ = CHR$(27) THEN EXIT DO IF a$ = "" AND Flow = 1 THEN EXIT DO IF a$ <> "" THEN Flow = 0: a = a + 1 IF a = 1 THEN CALL PL25("", 0) LOCATE Bln, a: PRINT a$; : PRINT #2, a$; END IF IF a$ = CHR$(13) THEN PRINT #2, CHR$(10); IF a$ = CHR$(13) THEN Flow = 1: a = 0: LOCATE Bln - 1, 1: EXIT DO LOOP IF LOC(2) > 0 THEN PRINT INPUT$(LOC(2), #2); LOOP: CLS : PRINT "Enter next APRS command..." ELSE PRINT "COMM port not activated for that device..." END IF END SUB SUB CommTNC (z$, Astr$, c$) es$ = "TNCcomms" IF TNCon OR Modem THEN IF z$ = "G" THEN sw = 1 CALL HSPsw(sw) IF LEFT$(c$, 8) = "*** CONN" THEN CALL SendCW("QRV") CALL PrepTNC(c$) END IF IF LEFT$(c$, 8) = "Entering" THEN CALL PrepTNC(c$) ' Above only PREPS TNC 1st time. Is skipped after ERR RESUME Pause (.01): Astr$ = "" IF LOC(1) <> 0 THEN a$ = INPUT$(LOC(1), #1) IF ScrnType >= 8 THEN COLOR 15, 1 Tint = 120 + 120 * Bfac' Activity timer=4 for VHF, 6 for HF c$ = "": Cnctd = 0: LOCATE 1, 1: Acty = TIMER WHILE c$ <> CHR$(27) WHILE LOC(1) > 0 a$ = INPUT$(LOC(1), 1) IF a$ <> "\" OR BkSpc = 0 THEN PRINT a$; WEND c$ = "": c$ = INKEY$ IF c$ = "" THEN IF ABS(TIMER - Acty) > Tint THEN c$ = CHR$(27) ELSE Acty = TIMER IF MID$(c$, 2, 1) = CHR$(45) THEN Cnctd = -1: c$ = CHR$(27) IF c$ <> CHR$(27) THEN PRINT #1, c$; IF MID$(c$, 2) = CHR$(66) THEN sw = NOT sw: CALL HSPsw(sw) IF c$ = CHR$(8) THEN PRINT CHR$(29); CHR$(22); CHR$(29); : BkSpc = -1 ELSE BkSpc = 0 END IF END IF WEND IF ScrnType >= 8 THEN COLOR FgC, Bgc IF NOT Cnctd THEN PRINT #1, CHR$(3); : Pause (.1) CALL PIRNT("Echo OFF") CALL PIRNT("FLOW off") CALL PIRNT("MCON off") CALL PIRNT("D") CALL PIRNT("CONV") END IF IF z$ = "G" THEN CALL HSPsw(0) END IF END SUB SUB DFrings (a) B = 1: e = 10 'Do all rings IF a = 0 THEN B = 10 'Only do 0 rings (for NOT-HEARD) IF a = 1 THEN e = 9 'Only do colored rings (for HEARD) Prings = 2: REM makes DrawUnit draw DFrings and fill them FOR i = B TO e IF i = 10 THEN cc = 0 ELSE cc = i REM do NULL sigs last FOR j = 0 TO LineP IF MID$(PS(j), 38, 3) = "DFS" AND VAL(MID$(PS(j), 41, 1)) = cc THEN CALL Drawunit(0, j, Tmp$, cc, 0, o) REM c carries the value of i, and 10=>0 END IF NEXT j NEXT i Prings = 3' restore to do a normal plot units, but the 3 suppresses DFS ' but does permit Power rings END SUB SUB DigiDo (a) ' IF a THEN ' NewVia$ = PBvia$ ' rn = RND(TIMER) ' FOR i = 1 TO 3 ' IF RND(i) > 1 - (AltT(i) / 100) THEN CALL DigiFind(AltPath$(i), x) ' NEXT ' END IF NewVia$ = PBvia$ 'fix in 863 to replace above code IF NewVia$ <> Via$ THEN DO UNTIL ABS(TIMER - LastPkt) > 5 CALL PL1("Pause, changing DIGI ", 9) LOOP: CALL PL1(" ", 12) PRINT #1, CHR$(3); : CALL Pause(.1) CALL PIRNT(Unstr$ + NewVia$): CALL Pause(.005 * LEN(NewVia$)) CALL PIRNT("conv"): CALL Pause(.1) Via$ = NewVia$ CALL Clearbuf END IF IF Doz = 0 THEN CALL ControLine END SUB SUB DigiFind (a$, x) ' FOR x = 1 TO 12 ' IF LEFT$(DP(x), 2) = LEFT$(a$, 2) THEN ' NewVia$ = RTRIM$(MID$(DP(x), 3)) ' CALL DigiDo(0) ' x = 99 ' END IF ' NEXT x END SUB SUB DigiList ' CALL NewScrn("DigiP", 6, 1) ' PRINT " DIGIPEATER PATHS SAVED " ' LOCATE 2, 58: PRINT " AltPATH Usage (%) " ' LOCATE 4, 1: ' Mpct = 0: FOR i = 1 TO 3: Mpct = Mpct + AltT(i): NEXT ' AltT(0) = 100 - Mpct '0 holds main path (for display only) ' FOR i = 1 TO 12 'NP ' PRINT DP(i); ' FOR j = 0 TO 3 ' IF LEFT$(DP(i), 2) = AltPath$(j) THEN PRINT AltT(j); ' NEXT j: PRINT ' NEXT i END SUB SUB Digipath (a$) ' NP = 12' Number ofpaths! Change here, cfigINPUTS/PRINTS and change CFIG name! ' ' ALSO change in DigiFIND,DIGIlist ' ' AND DIMENSION it in MAIN, and InitVAR ' ' P$ = "Enter/List/Save/Del/Alt," ' FOR i = 1 TO NP ' P$ = P$ + " " + LEFT$(DP(i), 2) ' IF i <> NP THEN P$ = P$ + "," ' NEXT i ' CALL PR23("", a$, P$, 0) ' IF a$ = "D" THEN ' CALL DigiList ' CALL PR23("", z$, " Delete which TWO letter path name", 0) ' FOR i = 1 TO NP ' IF LEFT$(DP(i), 2) = z$ THEN DP(i) = "*" ' NEXT i ' ELSEIF a$ = "S" THEN ' CALL DigiList ' z$ = " Enter TWO letter path NAME followed by VIA and then DIGI LIST (with commas)" ' CALL PL24(z$, 14) ' CALL PR23("", b$, "Path NAME, VIA and DIGIs", 0) ' IF LEN(b$) > 4 THEN ' j0 = NP: j = 0 ' FOR i = 1 TO NP ' IF LEFT$(DP(i), 1) = "*" THEN j0 = i ' IF LEFT$(b$, 2) = LEFT$(DP(i), 2) THEN j = i: i = NP ' NEXT i: IF j <> 0 THEN DP(j) = b$ ELSE DP(j0) = b$ ' END IF ' ELSEIF a$ = "L" THEN Display$ = "DigiP" ' ELSEIF a$ = "A" THEN ' CALL DigiList ' OK = -1 ' FOR i = 1 TO 3 ' IF OK THEN CALL PR23("", AltPath$(i), "Enter up to 3 two character Alt paths (Hit ENTER when done)", 0) ' IF AltPath$(i) = "" THEN OK = 0 ' IF OK THEN ' CALL PR2N(a, "Enter PERCENTAGE for " + AltPath$(i) + " Path") ' IF a > 50 THEN AltT(i) = 50 ELSE AltT(i) = a ' ELSE AltPath$(i) = "": AltT(i) = 0 ' END IF ' NEXT ' ELSEIF a$ = "E" THEN ' ELSEIF a$ <> "" THEN ' CALL DigiFind(a$, x) ' IF x >= 99 THEN ' AltPath$(0) = LEFT$(a$, 2) ' PBvia$ = Via$ ' ELSE CALL PRa("", "NO Digipath saved under that name. Use OPS-DIGI-S to save a Digipath.") ' END IF ' END IF ' IF Display$ = "DigiP" THEN CALL DigiList ' END SUB SUB DoTel (a$, PreKey$) 'LOCATE Bln, 2: PRINT LEFT$(a$, 78); 'IF LEFT$(a$, 7) = "CONNECT" THEN ' CALL PL25(" Logging on...", 15) ' PRINT #1, "v,APR"; Ver$; ","; Pmax; ", 50" 'SIZE and SPEED MHZ ' PRINT #1, "c,"; CINT(CPY * 10); ","; CINT(CPX * 10); ","; RS ' PRINT #1, "p,"; PS(0) ' PRINT #1, "l,"; LS(0) 'ELSE CALL LoadLine(a$, -1, -1, abt) ' IF abt THEN CALL HangUp: CALL ReadPage(Lin): PreKey$ = " " 'END IF END SUB SUB DX2pos (a$, k) Spot$ = MID$(a$, k + 1, 75)' removes beeps at end Call$ = MID$(Spot$ + " ", 27, 9) CALL FindP(Call$): IF PM = -1 THEN CALL AddP(Call$) LALO$ = "" SP = INSTR(40, Spot$, " ") IF UCASE$(MID$(Spot$, 40, 4)) = "IOTA" THEN sm$ = "i -IOTA-/" ELSEIF SP = 44 OR SP = 46 THEN ' ***** GRID SQUARE **** GS$ = LEFT$("[" + MID$(Spot$, 40, SP - 40) + "] /", 8) CALL ParseGdSq(GS$, 0, Call$, LALO$, sm$) END IF IF LALO$ <> "" THEN sm$ = LEFT$(sm$, 1) + " GridSQ/"'get only the SYMBOL" ELSE ' ***** BY CALLSIGN **** sm$ = "d ByCall/" CL$ = MID$(Spot$, 27, 3)'was 27 and 29 Num$ = MID$(Spot$, 29, 1) IF Num$ < "0" OR Num$ > "9" THEN Num$ = MID$(Spot$, 28, 1) SELECT CASE CL$ CASE "VA " TO "VEZ": CL$ = "*" + Num$ + "," CASE "A: " TO "AG ", "K/ " TO "KG ": CL$ = "#" + Num$ + "," CASE "N/ " TO "NG ", "W/ " TO "WG ": CL$ = "#" + Num$ + "," END SELECT CALL DXcalls(CL$, LALO$) IF CWon THEN CALL SendCW(MID$(Spot$, 27, 6)) END IF IF MID$(a$, k + 10, 1) = ">" THEN ELSEIF LALO$ <> "" THEN MID$(PS(PM), 11) = "/" + ZTG$ + LALO$ + sm$ + MID$(Spot$, 40, 28) + MID$(Spot$, 18, 8) END IF END SUB SUB DXall es$ = "In DXall" OPEN "SYSTEM\DXcalls.dat" FOR INPUT AS #3 WHILE a$ <> "END" INPUT #3, a$, y, x x = Xval(x) y = Yval(y) IF LocOK(y, 0, x, 0, a$) THEN PRINT a$; 'IF y > yfc AND y < 349 * yfg AND x > 8 AND x < 616 THEN ' LOCATE y / (yfc), (x / 8) + 3 ' PRINT LEFT$(RTRIM$(a$), (616 - x) / 8); 'END IF WEND CLOSE #3 a$ = "" END SUB SUB DXcalls (a$, LALO$) STATIC CS AS STRING * 3 a$ = LEFT$(UCASE$(a$), 3) CS = "" OPEN "SYSTEM\dxcalls.dat" FOR INPUT AS #3 DO UNTIL CS = "END" INPUT #3, CS, LA1%, LO1% IF CS <= a$ THEN LA% = LA1%: LO% = LO1% ELSE CS = "END" LOOP CLOSE #3 IF LA% <> 0 AND LO% <> 0 THEN a = LA% + INT((RND * 5) - 2): RANDOMIZE (TIMER) o = LO% + INT((RND * 7) - 3) CALL XYtoLL(a, o, "\", LALO$) MID$(LALO$, 4, 4) = " . " ELSE LALO$ = "" END IF END SUB SUB FadeKey (MyID$, LL$, Pos$) STATIC Num, ch CALL PR(a$, "New Antenna or Rcvr configuration (Y/N)? [N]") a$ = LEFT$(a$, 1) IF a$ = "Y" THEN ch = ch + 1: Num = 0 IF ch > 26 THEN ch = 1 Num = Num + 1: IF Num > 9 THEN Num = 0 CALL RightCall(Call$) Call$ = "(" + Call$ + ")" + CHR$(65 + ch) + MID$(STR$(Num), 2, 1) + " " Pos$ = Call$ + " +" + ZTG$ + LL$ + "/Fade point" END SUB SUB FadePlot (MyID$) c = 15 FOR i = 1 TO LineP - 1 IF LEFT$(PS(i), 1) = "(" AND MID$(PS(i), 5, 1) = ")" THEN CALL ParseA(PS(i), TY$, LA, LO, sym$) X1 = Xval(LO): Y1 = Yval(LA) Found = 0 FOR j = i + 1 TO LineP IF LEFT$(PS(j), 6) = LEFT$(PS(i), 6) THEN Found = 1 CALL ParseA(PS(j), TY$, LA, LO, sym$) X2 = Xval(LO): Y2 = Yval(LA) LINE (X1, Y1)-(X2, Y2), 1 Xd = X2 - X1: IF Xd = 0 THEN Xd = .001 Yd = Y2 - Y1 Xm = X1 + (Xd) / 2 Ym = Y1 + (Yd) / 2: CIRCLE (Xm, Ym), 4, 15 AZ = ATN(Yd / (Xd * Lfac)) AZ = AZ - 1.5707 dy = 200 * SIN(AZ) DX = 200 * COS(AZ) / Lfac LINE (Xm, Ym)-(Xm + DX, Ym + dy), 15, , 255 * 16 LINE (Xm, Ym)-(Xm - DX, Ym - dy), 15, , 255 * 16 END IF NEXT j IF Found = 0 THEN c = c - 1 END IF NEXT i END SUB SUB FileRead (R) a = LEN(F$) - 4: IF a < 1 THEN a = 1 IF INSTR(a, F$, ".") = 0 THEN F$ = F$ + ".TXT" Lline = Bln - 3 IF R = 99 THEN 'load anything... ELSEIF R THEN F$ = "README\" + F$ ELSE F$ = "SYSTEM\" + F$: Lline = Bln - 2 END IF CALL ClrScn PRINT "Loading "; F$; "..." OPEN F$ FOR INPUT AS #3 CALL PL25(" F1(HELP)-FILES: Use Down arrow key and PgDN to scroll. Q to QUIT.", 11) LOCATE 1, 1 stst = TIMER DO UNTIL EOF(3) IF Lnc < Lline THEN LINE INPUT #3, a$ PRINT a$ Lnc = Lnc + 1 END IF a$ = UCASE$(INKEY$): IF a$ <> "" THEN stst = TIMER IF LEN(a$) = 2 THEN B$ = MID$(a$, 2, 1) ELSE B$ = "" IF a$ = CHR$(13) OR a$ = " " THEN B$ = "Q" IF B$ = "Q" THEN Lnc = 0 'PgDn IF B$ = "P" THEN Lnc = Lline - 1'dn IF a$ = "Q" OR TIMER - stst > 80 THEN EXIT DO LOOP CLOSE #3 CALL PL25("", 0) END SUB SUB FindCall (Fa, B) STATIC Fstr$ CALL PR23(Fstr$, a$, "Enter CALL or Grid or Rcvd Msg #", 0) Fstr$ = a$: a = VAL(a$) CALL GScalc(Fstr$, 3, LA, LO, good) IF LEN(a$) = 1 AND a THEN Fstr$ = RTRIM$(LEFT$(Msg$(a), 9)) IF good THEN CALL ParseGdSq("[" + Fstr$, 0, "ABCD", LALO$, c$) CALL ParseA("abcdefghi @123456/" + LALO$, TY$, LA, LO, sym$) CDX = LO: CDY = LA IF RS < 128 THEN RS = 64 IF RS > 512 THEN RS = 512 Fa = 6 ELSE L = LEN(Fstr$) LM = -1: PM = -1 FOR i = 1 TO LineL IF UCASE$(LEFT$(LS(i), L)) = Fstr$ THEN LM = i NEXT i FOR i = 1 TO LineP IF UCASE$(LEFT$(PS(i), L)) = Fstr$ THEN PM = i NEXT i Fa = 0 IF LEFT$(Display$, 3) = " MP" THEN IF PM > -1 THEN Fa = 5: Key$ = " " IF LM > -1 AND PM = -1 THEN Fa = 7: c = 10 LOCATE Bln - 3, 1: PRINT " CALL: "; LEFT$(LS(LM), 9); SPACE$(24); CALL HookDspLM(c, -1) END IF ELSEIF PM > -1 AND (LEFT$(Display$, 2) = "PO" OR LM = -1) THEN StrtP = INT(PM / Lm9) * Lm9: Fa = 4 B = 5 + PM - StrtP IF Display$ = "POH" THEN Fa = 2 IF Display$ = "POD" THEN Fa = 3 ELSEIF LM > -1 THEN Fa = 1 StrtL = INT(LM / Lm9) * Lm9 B = 5 + LM - StrtL END IF END IF IF B > Bln - 2 OR B < 4 THEN B = 4 IF Fa = 0 THEN CALL PRa("", "STATION " + Fstr$ + " NOT FOUND!" + CHR$(7)) LINE (0, L22 - 1)-(639, L23), 12, B END IF END SUB SUB GetBrng (a$, Pos$, BH$) B$ = RIGHT$(a$, 1) c = VAL(LEFT$(a$, LEN(a$) - 1)) IF B$ = "R" THEN IF DFhdg <> 0 THEN bearing = c + DFhdg ELSE bearing = 0 CALL PRa("", "Vehicle HEADING is ZERO! Use INPUT-MY-HEADING to set!") CALL Noise(1): CALL Pause(2) END IF ELSEIF B$ = "M" THEN bearing = c + MagVar ELSE bearing = VAL(a$) END IF IF bearing > 360 THEN bearing = bearing - 360 BH$ = LzN$(bearing, 3) END SUB SUB GetTel 'IF Modem THEN ' OUT hspp, INP(hspp) OR 3: CALL Pause(.1) ' CALL PIRNT("ATV1") ' F$ = "APRStel.sys": CALL FileRead(0) ' ' IF TelNo$ = "" THEN TelNo$ = "Maryland" ' CALL PR23(TelNo$, a$, "Dial which Number", 0) ' IF a$ = "Maryland" THEN a$ = "1,4102935952" ELSE TelNo$ = a$ ' ' CALL PIRNT("ATDT" + a$) ' CALL PL25(" Dialing..", 14) ' CalActy = TIMER ' OnLine = 2 'END IF END SUB SUB Help Display$ = "HELP" F$ = "APRSHLP.sys" CALL FileRead(0) LINE (0, 0)-(639, 1.3 * yfc), 14, B LINE (120, 0)-(639, 1.3 * yfc), 14, BF LINE (0, 10 * yfc)-(639, 10 * yfc), 15 LINE (0, 17 * yfc)-(639, 17 * yfc), 15 LINE (330, 1 * yfc)-(330, 17 * yfc), 15 LOCATE 1, 52: PRINT " Memory:"; FRE(""); FRE(-1); LINE (0, 0)-(639, 23 * yfc), 15, B END SUB SUB HelpMenu STATIC F1$ CALL PR(a$, "HELPs: About, Digi, Files, Help, Maps, NEWuser, Symbols, Validation") ShowFiles = -1 IF a$ = "D" THEN Display$ = "VIA" F$ = "UNPROTO2.sys": CALL FileRead(0) CALL ControLine END IF IF a$ = "H" THEN CALL Help IF a$ = "A" THEN CALL Title IF a$ = "M" THEN Display$ = "CD": IF RS < 512 THEN RS = 512 IF a$ = "N" THEN F$ = "SUMMARY.sys": CALL FileRead(0) IF a$ = "S" THEN CALL SymShow IF a$ = "V" THEN B$ = "SKIP": CALL Valid(B$) IF a$ = "F" THEN CALL ClrScn PRINT "These TXT files are in the APRS\README directory. Select any to read using " PRINT "PgDn or the DOWN arrow" PRINT FILES "README\*.*" PRINT CALL PR23(F1$, F$, "Enter filename", 0) F1$ = F$ IF LEFT$(F$, 1) = "\" THEN F = 99 ELSE F = 1 IF F$ <> "END" THEN CALL FileRead(F) END IF END SUB SUB HSPsw (a) IF a THEN IF HSP = -2 THEN 'new in 843 PRINT #1, CHR$(5); ELSE OUT hspp, INP(hspp) AND 254' Toggle on GPS HSPonGPS = TIMER END IF CALL PL1("Toggling for NMEA...", 10) 'IF HSP = -2 THEN PRINT #1, CHR$(5); ELSE OUT hspp, INP(hspp) OR 3 ' GPS off, TNC on CALL PL1("HSP returned to TNC...", 12) LastGPS = TIMER CALL Pause(.1): a$ = INPUT$(LOC(1), 1) END IF END SUB SUB HSPtest IF (INP(hspp) AND 1) THEN IF ABS(TIMER - LastGPS) > GPSprd THEN IF Display$ <> "VIEW" THEN CALL HSPsw(1) ELSE LastGPS = TIMER END IF ELSEIF ABS(TIMER - HSPonGPS) > 2 THEN CALL HSPsw(0) CALL PL1("HSP PORT TIME OUT...", 14) END IF END SUB SUB JustONE (drw, Tmp$) drw = 0 'xnrml=-1: SYm$="" IF Display$ = "POD" THEN CALL PR23("", js$, "Enter Search String", 0) CALL DispDigi(js$) ELSE F$ = "O" Jagn: CALL PR(a$, "JUST: 1sym, Active, Digis, HF,Icons, Mobles, Objs, Print, Spcl, VHF, WX") IF a$ = "P" THEN CALL PR23("LPT1", F$, "Print to or", 0): GOTO Jagn SELECT CASE a$ 'removed Non-QTH as similar intent to Active CASE "": CALL PRa("", "") 'CASE "A": Tmp$ = "active" CASE "O": Tmp$ = "obj" 'xnrml=0 CASE "I": Tmp$ = "": Key$ = "*"'xnrml=0 CASE "S": Tmp$ = "spcl"'xnrml=0 CASE "1": sym$ = "" CALL SymType(sym$) IF sym$ <> "" THEN Tmp$ = sym$'xnrml=0 CASE "A", "D", "M", "W", "N", "H", "V" Tmp$ = "Do" + a$ ' DoM, DoW'xnrml=0 END SELECT IF Display$ = "POH" THEN CALL HearDisp(Tmp$) ELSEIF F$ <> "O" OR LEFT$(Display$, 3) = "POS" THEN CALL JustPosits(Tmp$) ELSE drw = -1 END IF END IF END SUB SUB LOBcal (CSE, Dist, x, y, LaO, LoO) IF CSE THEN IF Dist > 8 * RS THEN Dist = 8 * RS AZ = (90 - CSE) / 57.3 LaO = Dist * SIN(AZ) / 60 LoO = Dist * COS(AZ) / (60 * Lfac) ELSE LaO = 0: LoO = 0 END IF LoO = Xval(x - LoO) LaO = Yval(y + LaO) END SUB FUNCTION LzN$ (a, N) IF a > 32000 THEN a = 32000 N$ = RIGHT$("00000" + MID$(STR$(CINT(ABS(a))), 2), N) IF a < 0 THEN MID$(N$, 1, 1) = "-" LzN$ = N$ END FUNCTION SUB NewQTH (Dflt) LOCATE 3, 51: PRINT "Move cursor to your QTH with" LOCATE 4, 51: PRINT "(shift)arrows, NumLok off and" LOCATE 5, 51: PRINT "zoom with PgUP/Dn. Then press" LOCATE 6, 51: PRINT "IMP. When done, do alt-S-SAVE" LINE (396, L02)-(639, 6 * L01), 10, B LOCATE Bln - 6, 65: PRINT "Use F1 for HELP"; LINE (508, L18)-(639, L19), 15, B IF Dflt THEN LOCATE Bln - 5, 3: PRINT "Using MAPLIST."; MapFile$; LOCATE Bln - 4, 3: PRINT "use MCC to change" LINE (12, L19)-(156, (Bln - 4) * L01), 14, B END IF END SUB SUB Noise (a) IF Doz THEN ELSEIF BEEPSoff THEN IF a = 1 THEN SOUND 700, .3 ELSE SELECT CASE a CASE 1: SOUND 700, 1 CASE 2: SOUND 700, 1 CASE 7: SOUND 1000, 1: SOUND 1500, 1: SOUND 2250, 1 'rcv msg CASE 8: SOUND 200, 3: SOUND 700, 3: SOUND 1500, 3 'new bulletin CASE 9: FOR i = 1 TO 3: SOUND 200, 3: SOUND 700, 3: SOUND 1500, 3: NEXT i CASE 10: FOR i = 1 TO 5: SOUND 800, 3: SOUND 1600, 3: NEXT i 'congrats CASE 11: SOUND 1200, 4: SOUND 2200, 5: SOUND 700, 4 'DGPS error CASE 12: SOUND 800, 2: SOUND 1900, 2: SOUND 500, 2 'REJ CASE 13: SOUND 3000, 1 'XMT CASE 14: FOR i = 1 TO 8: SOUND 2000, 1: Pause (.05): NEXT i 'Alarm END SELECT ' was PauseF(.1) END IF END SUB SUB NTSad (x$) x = 3: j = 0 FOR z = 1 TO 4 LOCATE 6 + z, 9: PRINT NxFld$(x$, x, j); NEXT z END SUB SUB NTSdisp (B, N, T) CALL ClrScn Display$ = "NTS" j = 13: CALL NTSform FOR i = 1 TO N IF B THEN x$ = RTRIM$(MID$(BN(i), 14)) L = LEN(x$): LN$ = "" Call$ = MID$(BN(i), 4, 9) ELSE x$ = MID$(Msg$(i), 11) L = LEN(x$) - 4: LN$ = RIGHT$(x$, 4) Call$ = LEFT$(Msg$(i), 9) END IF IF NOT Done OR Scall$ = Call$ THEN L3$ = LEFT$(x$, 3): SELECT CASE L3$ CASE "N#\" IF Done THEN i = N ELSE Done = -1: CALL NTShead(x$): Scall$ = Call$ CASE "NA\": CALL NTSad(x$) CASE "NP\": LOCATE 11, 9: PRINT MID$(x$, 4, L - 3) CASE "NT\": LOCATE j, 9: j = j + 1 PRINT MID$(x$, 4, L - 3); TAB(76); LN$ CASE "NS\": LOCATE 19, 14: PRINT MID$(x$, 4, L - 3) CASE "NR\": x = 3: k = 0: i = N FOR z = 1 TO 4 c = VAL(MID$("x10275065", z * 2, 2)) LOCATE 21, c: PRINT NxFld$(x$, x, k); NEXT z END SELECT 'IF INSTR("NT\N1\N2\N3\N4\N5\N6\", L3$) THEN ' LOCATE j, 9: PRINT MID$(X$, 4): j = j - 1 'END IF END IF NEXT i END SUB SUB NTSform CLS LINE (0, 0)-(640, 3 * yfc), 14, BF LOCATE 2, 4: PRINT " ARRL/APRS " LOCATE 2, 66: PRINT " ARRL/APRS " LOCATE 2, 32: PRINT " R A D I O G R A M " LOCATE 4, 2 PRINT "Number Precedence Hndlng Origin-Stn Check Place-of-Origin Time Date" LOCATE 7, 2: PRINT "Addr:" LOCATE 11, 2: PRINT "Phone:" LOCATE 7, 44: PRINT "Time: "; ZTG$ x = 3: j = 0 FOR z = 1 TO 4 LOCATE 7 + z, 44: PRINT NxFld$(MY$, x, j); NEXT z LOCATE 13, 2: PRINT "BT" LOCATE 19, 2: PRINT "Signature:" LOCATE 21, 2: PRINT "Recvd:" LOCATE 21, 44: PRINT "Sent:" LINE (0, 5.8 * yfc)-(292, 11 * yfc), 15, B LINE (340, 5.8 * yfc)-(639, 11 * yfc), 15, B LINE (0, 3 * yfc)-(639, 5.1 * yfc), 15, B FOR i = 2 TO 8 c = 8 * VAL(MID$("x0209202738446672", i * 2, 2)) - 12 'LINE (c, 40)-(c, 72), 15 LINE (c, 3 * yfc)-(c, 5.1 * yfc), 15 NEXT i LINE (0, 11.5 * yfc)-(639, 17.7 * yfc), 15, B LINE (0, 17.7 * yfc)-(639, 19.4 * yfc), 15, B LINE (0, 19.4 * yfc)-(639, 21.1 * yfc), 15, B LINE (204, 19.4 * yfc)-(204, 21.1 * yfc), 15 LINE (340, 19.4 * yfc)-(340, 21.1 * yfc), 15 LINE (508, 19.4 * yfc)-(508, 21.1 * yfc), 15 END SUB SUB NTSgSho (m$, P$, L, c) CALL PR23("", a$, P$, 0) m$ = m$ + a$ + "\" LOCATE L, c: PRINT a$ END SUB SUB NTShead (x$) x = 3: j = 0 FOR z = 1 TO 8 c = VAL(MID$("x0209202738446672", z * 2, 2)) LOCATE 5, c: PRINT NxFld$(x$, x, j); NEXT z END SUB SUB NTSsend STATIC mm ' MLC = 10 'omitted in 845 mm = mm + 1: m$ = LzN$(mm, 2) CALL EraseCMD(j) IF nsl + nmg > Lm9 THEN CALL Noise(1) CALL PL24(" *** SEND/RCV buffer full! ", 12) ELSE Mpath$ = "To " CALL PR23("", To$, "Send NTS traffic to whom", 0) IF To$ <> "" THEN IF LEFT$(RIGHT$(To$, 3), 1) = "/" THEN Mpath$ = RIGHT$(To$, 2) + " " To$ = Mpath$ + LEFT$(To$ + SPACE$(9), 9) + ":" CALL NTSform H$ = "N#\Number\Precedence\Hndlng\Origin-Stn\Check\Place-of-Origin\Time\Date\" u = 3: N = 0: Mst$ = To$ + "N#\" 'PROMPT for N# entries FOR i = 1 TO 8 CALL PR23("", a$, NxFld$(H$, u, N), 0) IF i = 5 THEN Cks = LEN(Mst$) + 1: a$ = RIGHT$(" " + a$, 5) Mst$ = Mst$ + a$ + "\" CALL NTShead(MID$(Mst$, 14)) NEXT i nsl = nsl + 1: Ckl = nsl: CALL SendLine(To$, Mst$, m$, 1) Mst$ = To$ + "NA\" FOR i = 1 TO 4 CALL PR23("", a$, "TO Address (line" + STR$(i) + ")", 0) Mst$ = Mst$ + a$ + "\" CALL NTSad(MID$(Mst$, 14)) NEXT i nsl = nsl + 1: CALL SendLine(To$, Mst$, m$, 1) CALL PR23("", a$, "Phone", 0) LOCATE 11, 9: PRINT a$ IF a$ <> "" THEN Mst$ = To$ + "NP\" + a$: nsl = nsl + 1: CALL SendLine(To$, Mst$, m$, 1) Ck = 0 FOR i = 1 TO 7 CALL PR23("", a$, "Enter Text Lines", 0) LOCATE 12 + i, 9: PRINT a$ Ck = Ck + 1 FOR j = 1 TO LEN(a$) - 1 IF MID$(a$, j, 1) = " " AND MID$(a$, j + 1, 1) <> " " THEN Ck = Ck + 1 NEXT j 'Mst$ = To$ + "N" + LTRIM$(STR$(i)) + "\" + a$ Mst$ = To$ + "NT\" + a$ nsl = nsl + 1: CALL SendLine(To$, Mst$, m$, 1) IF a$ = "" THEN i = 7: Ck = Ck - 1'last line overwritten by signblock NEXT Ck$ = LEFT$(Ck$, 3) + MID$(STR$(Ck), 2) 'Mst$ = To$ + "NS\": CALL NTSgSho(Mst$, "Signature block:", 19, 13) CALL PR23("", a$, "Signature block:", 0) Mst$ = To$ + "NS\" + a$ LOCATE 19, 13: PRINT a$ CALL SendLine(To$, Mst$, m$, 1) Mst$ = "To LOG :NR\" CALL NTSgSho(Mst$, "Received From:", 21, 13) CALL NTSgSho(Mst$, "Received Time and Date:", 21, 27) Mst$ = Mst$ + To$ + "\" + ZTG$ nsl = nsl + 1: Mst$(nsl) = Mst$: CALL SendLine(To$, Mst$, m$, 1) CALL PR23(Ck$, a$, "Confirm CHECKsum", 0): Ck$ = a$ Ck$ = RIGHT$(" " + Ck$, 5) MID$(Mst$(Ckl), Cks) = Ck$ LOCATE 5, 38: PRINT Ck$ END IF END IF END SUB FUNCTION NxFld$ (a$, x, j) 'x was last location of \ 'j is number of chars to next \ 'Return with characters between them L = LEN(a$) x = x + j + 1: j = 0 DO UNTIL MID$(a$, x + j, 1) = "\" OR j > L: j = j + 1: LOOP NxFld$ = MID$(a$, x, j) END FUNCTION SUB OverWrite (a$, B$, FirstLine) a = -1 IF B$ = " Bcn" THEN c = 10: IF Display$ = "LSL" THEN a = LM IF B$ = " Pos" THEN c = 11: IF Display$ = "POS" THEN a = PM IF Doz THEN ELSEIF a <> -1 THEN LL = 6 + a - FirstLine IF LL > 0 AND LL < Bln - 2 THEN LOCATE LL, 1 IF LL < Bln - 1 - nmg - nsl THEN PRINT LEFT$(a$, 80); END IF ELSEIF Display$ = "VIEW" THEN CALL ViewBox(c) ELSE CALL PL24(B$ + ":" + LEFT$(a$, 74), c) END IF END SUB SUB ParseA (a$, TY$, LA, LO, sym$) TY$ = MID$(a$, 11, 1) 'type of posit (!,@,/,* or + sym$ = MID$(a$, 27, 1) + MID$(a$, 37, 1) LM = 10 * VAL(MID$(a$, 21, 1)) + VAL(MID$(a$, 22, 4)) LA = VAL(MID$(a$, 19, 2)) + LM / 60 IF UCASE$(MID$(a$, 26, 1)) = "S" THEN LA = -LA LM = 10 * VAL(MID$(a$, 31, 1)) + VAL(MID$(a$, 32, 4)) LO = VAL(MID$(a$, 28, 3)) + LM / 60 IF UCASE$(MID$(a$, 36, 1)) = "E" THEN LO = -LO END SUB SUB ParseVel (a$, sym$, CSE, CSE$, SPD, SPD$, BRG$, QAL$, CMTS, PHG$) sm$ = RIGHT$(sym$, 1) Flg$ = MID$(a$, 41, 1) PHG$ = "PHG5130" CMTS = 46 CSE = 0: SPD = 0 CSE$ = MID$(a$, 38, 3) IF CSE$ <> "" AND INSTR("PHG/DFS/Rng/WAR", CSE$) > 0 THEN PHG$ = MID$(a$, 38, 7) ELSEIF Flg$ <> "" AND INSTR("/@1", Flg$) THEN PHG$ = "PHG3020"'Default for moving vehicle 10W,10ft,2dB IF War THEN PHG$ = "PHG2210" CSE$ = MID$(a$, 38, 3): SPD$ = MID$(a$, 42, 3) IF MID$(a$, 45, 1) = "g" THEN SPD$ = MID$(a$, 46, 3) IF INSTR(CSE$, "%") = 0 THEN CSE = VAL(CSE$) ELSE CSE = 0 IF INSTR(SPD$, "%") = 0 THEN SPD = VAL(SPD$) ELSE SPD = 0 IF Flg$ = "1" THEN SPD = SPD + 1000 ELSE CSE = 0: SPD = 0: CMTS = 38 END IF IF sm$ = "\" AND LEN(a$) > 51 THEN BRG$ = MID$(a$, 46, 3): QAL$ = MID$(a$, 50, 3) IF CSE = 0 THEN CSE$ = "000" IF SPD = 0 THEN SPD$ = "000" END SUB SUB PosChange (P$, a$) IF Game THEN MyMove = MyMove + 1 MID$(P$, 45) = "Move #" + STR$(MyMove) a$ = "Y" FOR i = 1 TO LineP IF MID$(PS(i), 11, 1) = "+" THEN MID$(PS(i), 18, 1) = "*" NEXT i ELSE Pos$ = P$ CALL PPrnt(Pos$) sym$ = MID$(Pos$, 27, 1) + MID$(Pos$, 37, 1) CALL SymType(sym$) MID$(Pos$, 27, 1) = LEFT$(sym$, 1) sm$ = RIGHT$(sym$, 1) MID$(Pos$, 37, 1) = sm$ CALL ParseVel(Pos$, sym$, CSE, CSE$, SPD, SPD$, BRG$, QAL$, CMTS, PHG$) IF sm$ = "l" THEN SPD$ = MID$(Pos$, 41, 4) xx = INT(SQR(1 + 1500 * ABS(CDX - CPX))): IF xx > 99 THEN xx = 99 yy = INT(SQR(1 + 1500 * ABS(CDY - CPY))): IF yy > 99 THEN yy = 99 IF xx = 99 OR yy = 99 THEN CALL PL24("WARNING: Size truncated to 400 miles. ", 14): CALL Noise(1) END IF CALL PR(a$, "Type of AREA: Box, Circle, Line, or Triangle") 'CALL SymDo(a$, "BCLT", "4013", "", t$) B$ = "BCLT4013": T = INSTR(B$, a$) IF T THEN T$ = MID$(B$, T + 4, 1) IF T$ = "1" THEN CALL PR2N(w, "Enter half-width if box either-side-of-line") IF w <> 0 THEN w$ = "{" + LzN$(w, 3) + "}" ELSE CALL PR(a$, "Fill it with color [N]") IF a$ = "Y" THEN T$ = CHR$(ASC(T$) + 5) END IF IF CDX - CPX < 0 AND T$ = "1" THEN T$ = "6" 'other quadrant IF T$ <> "" THEN CSE$ = T$ + LzN$(yy, 2) CALL PR23("5", c$, "Select color. (0 to 8 are dim, 9 to 15 are bright)", 0) IF LEN(c$) = 1 THEN c$ = "/" + c$ IF c$ <> "" THEN SPD$ = c$ + LzN$(xx, 2) IF T$ <> "" OR c$ <> "" THEN MID$(Pos$, 38) = CSE$ + SPD$ CMTS = 46 ELSE CMTS = 46 CALL PR2N(CSE, "Enter new COURSE") CSE$ = LzN$(CSE, 3) ' MID$(Pos$, 38, 4) = CSE$ + "/": CALL PPrnt(Pos$) IF PM = 0 THEN DFhdg = CSE CALL PR2N(SPD, "Enter new SPEED") SPD$ = LzN$(SPD, 3) 'MID$(Pos$, 41, 5) = "/" + SPD$ + "/" CS$ = CSE$ + "/" + SPD$ + "/" 'IF CS$ = "000/000/" THEN CS$ = ".../.../" IF CS$ = "000/000/" THEN CS$ = "" MID$(Pos$, 38) = CS$ END IF IF sm$ = "\" THEN CALL BeamHeading(Pos$): CMTS = 46 CALL PPrnt(Pos$) P$ = "Enter Comments" IF sm$ = "\" THEN CMTS = 54 CMTS$ = RTRIM$(MID$(Pos$, CMTS)) CALL PR23(CMTS$, a$, P$, 0) CMTS$ = a$'P$ preserves LC IF INSTR("PHG-Rng-WAR", LEFT$(P$ + "xxx", 3)) THEN CMTS = 38 IF P$ <> "" THEN CMTS$ = P$ MID$(Pos$, CMTS) = w$ + CMTS$ + SPACE$(42): CALL PPrnt(Pos$) MID$(Pos$, 10, 1) = "%" CALL PR23(ZTG$, a$, "Enter DATE-TIME. (Use S if SAME)", 0) IF a$ = "S" THEN a$ = "" MID$(Pos$, 12) = a$ CALL PPrnt(Pos$) FOR i = 1 TO 99 CALL PRa("", "New position report correct and accurate (y/n)") CALL GetChar(a$) IF a$ = "Y" THEN P$ = Pos$: i = 99 ELSEIF a$ = "N" THEN i = 99 ELSE CALL Noise(1) END IF NEXT END IF END SUB SUB PPrnt (a$) LOCATE Bln - 1, 1: PRINT " POS: "; LEFT$(a$, 74); LINE (0, L22 - 1)-(639, L24B), 11, B END SUB SUB PwrAnt (a, Pos$) 'a=1 is for POWER 'a=0 is for DF signal strength 'Defaults are P=10 watts, H= 20 feet, Gn= 3dB, D=0 'HAAT boundaries are 10,20,40,80,160,320,640,1280,2560,5120 in FEET P = 3: H = 20: Gn = 3: d = 0 IF a THEN P$ = "PHG" P = 10: CALL PR2N(P, "XMIT power in watts") P = INT(SQR(P)): IF P > 9 THEN P = 9 ELSE P$ = "DFS" P = 0: CALL PR2N(P, "Signal strength 0-9 (0 = not heard)") P = ABS(INT(P)) END IF CALL PR2N(H, "Height-Above-Average-Terrain in feet") H = INT(LOG(H / 10) / LOG(2) + .5) IF H > 9 THEN H = 9 CALL PR2N(Gn, "Antenna GAIN in dB") IF Gn > 9 THEN Gn = 9 CALL PR2N(d, "Direction of your best horizon (0=omni, 360=north, etc)") d = INT(.5 + d / 45) IF Gn < 1 THEN Gn = 0 IF d < 1 THEN d = 0 a$ = MID$(STR$(P), 2) + MID$(STR$(H), 2) + MID$(STR$(Gn), 2) + MID$(STR$(d), 2) IF MID$(Pos$, 38, 3) = "PHG" THEN Replace = -1 IF MID$(Pos$, 38, 3) = "DFS" THEN Replace = -1 IF MID$(Pos$, 41, 1) = "/" THEN Replace = -1 IF MID$(Pos$, 37, 1) <> "l" THEN 'Do nothing if its an area IF NOT Replace THEN MID$(Pos$, 46) = MID$(Pos$, 38) MID$(Pos$, 38, 8) = P$ + a$ + "/" END IF END SUB SUB RightCall (Call$) a = INSTR(4, PS(0), " ") B = INSTR(4, PS(0), "-") IF B > 4 AND B < 8 THEN a = B Call$ = MID$(PS(0), a - 3, 3) END SUB SUB ShowBorders (Lon, Lat, MapMax, MapName$, Fill) IF RS < 2 * MapMax AND RS > MapMax / 2 THEN 'center crosses IF RS > MapMax THEN c = 15 ELSE c = 14 x = Xval(Lon) y = Yval(Lat) IF In3D THEN CALL Do3D(x, y) PSET (x, y), c: DRAW "l3r6l3u3d6" END IF REM MapSize is desired BOX size REM MAPmax is SIZE of the particular map IF Borders THEN IF MapSize < .5 THEN MapSize = .5 x = Xval(Lon) y = Yval(Lat) dy = MapMax * Sfac / 60 DX = 1.8 * dy dy = dy * yfg c = 15: IF MapSize > RS THEN MapSize = RS MaxMax = MapSize * 2 ' Limits larger maps to only 2* range (Was 4) IF MapMax > 0 THEN c = 9 + INT(.00001 + LOG(MapMax) / LOG(2)) ELSE c = 9 IF c < 9 THEN c = 9 IF c > 15 THEN c = c - 7 IF MapMax > MapSize THEN IF Fill AND MapMax < 4096 THEN LINE (x - DX, y - dy)-(x + DX, y + dy), c, BF ELSEIF MapMax <= MaxMax THEN LINE (x - DX, y - dy)-(x + DX, y + dy), c, B ELSEIF MapMax > MaxMax THEN LINE (x - DX, y - dy)-(x + DX, y + dy), 0, B END IF IF MapMax > RS / 4 THEN CALL DoLabels(x + DX, y + dy, RTRIM$(MapName$), 1, c) END IF END IF es$ = "finished MapBrdrs" END SUB SUB Title CALL ClrScn Tcolor = 11 a$ = "PASSWORD VALIDATION REGISTRATION" PSET (50, 130), Tcolor DRAW "m+22,-112r45m+23,+112l30m-8,-48l13m+6,-32m+4,16l7m-12,+64l30" 'A PSET (200, 130), Tcolor DRAW "u112r90d64l60u48r30d32l30d64l30" 'P PSET (350, 130), Tcolor DRAW "u112r90d64l30m+30,48l30m-30,-48u48r30d32l30d64l30" 'R PSET (500, 130), Tcolor DRAW "u16r60u32l60u64r90d16l60d32r60d64l90" 'S FOR i = 55 TO 505 STEP 150: PAINT (i, 120), Tcolor: NEXT LINE (17, 8 * yft)-(624, 161 * yft), 10, B LOCATE 10 * BlnX, 76: PRINT "R" CIRCLE (603, 133 * yft), 10, 14 'was 9.5*yfc LINE (0, 0)-(638, 322 * yft), 14, B REM LOCATE 11 * BlnX, 11: PRINT " Licensed to Naval Research Labs, San Diego, CA 92152. " 'LOCATE 11 * BlnX, 11: PRINT " Custom Version "; Ver$; " Licensed to KCI Communications Inc" LOCATE 11 * BlnX, 11: PRINT " HAM Radio Version "; Ver$; " (Contact author for commercial use)" LOCATE 15 * BlnX, 36: PRINT " A P R S " LOCATE 13 * BlnX, 12: PRINT "*** WARNING! NOT TO BE USED AS AN AID TO NAVIGATION! ***" LINE (76, 168 * yft)-(562, 182 * yft), 14, B LOCATE 17 * BlnX, 6: PRINT "A U T O M A T I C P O S I T I O N R E P O R T I N G "; PRINT "S Y S T E M " LOCATE 19 * BlnX, 11: PRINT " Bob Bruninga WB4APR, 115 Old Farm Ct, Glen Burnie MD 21060 "; LINE (17, 189 * yft)-(624, 273 * yft), 12, B LOCATE 21 * BlnX, 4: PRINT "Copyright 1993 - 99. All rights reserved. No warranty expressed or implied." LINE (9, 280 * yft)-(632, 294 * yft), 11, B END SUB SUB Valid (B$) F$ = "share.sys" CALL FileRead(0) LINE (0, 0)-(639, 4.3 * yfc), 4, BF LOCATE 1, 5: PRINT " SHAREWARE INFORMATION " LOCATE 3, 5: PRINT " Bob Bruninga WB4APR " LOCATE 4, 5: PRINT " 115 Old Farm Ct, Glen Burnie, MD 21060 " LOCATE 6, 1: LINE (0, 0)-(639, 22.3 * yfc), 15, B 'IF b$ = "SKIP" THEN 'ELSE CALL PR23("", b$, "Enter your validation number", 0) 'END IF REM CALL ShowSetup Display$ = "VAL" END SUB SUB Validsub (Val$) 'IF NOT Vusr THEN B$ = "": CALL Valid(B$): CALL ShowSetup CALL PassWD(Uid$, c$, B$) ' IF b$ = c$ THEN Vusr = -1: Val$ = B$: F$ = "WELCOME2.sys" CALL FileRead(0) LINE (0, 0)-(639, L22 - 1), 14, B ' END IF CALL ShowSetup 'END IF 'IF (GPSon OR SPM) AND Gval = 0 THEN a$ = "GPS" 'IF WXon AND Wval = 0 THEN a$ = "WX" 'IF a$ <> "" THEN ' CALL PR2N(b, "Enter your " + a$ + " validation number") ' CALL GpWxVal(Val$, b) 'END IF a$ = "" 'IF (DFon OR DFSP) AND Dval = 0 THEN a$ = "DF/DR"'had been w/o DFon ''IF STSon AND Sval = 0 THEN a$ = "STREETS" 'IF a$ <> "" THEN ' CALL PR2N(B, "Enter your " + a$ + " validation number") ' CALL GpWxVal(Val$, B) 'END IF END SUB SUB Winds P = Pmax / 4 DIM LA(P), LO(P), wdl(P), ang(P) NX = 0 FOR i = 0 TO LineP IF INSTR("$(*:<@QT_egptw{W", MID$(PS(i), 37, 1)) THEN NX = NX + 1 CALL ParseA(PS(i), TY$, LA, LO, sym$) LO(NX) = Xval(LO): LA(NX) = Yval(LA) SPD = VAL(MID$(PS(i), 42, 3)) CSE = VAL(MID$(PS(i), 38, 3)) IF SPD = 0 THEN wdl(NX) = 0 ELSE wdl(NX) = 9 * LOG(SPD + 2) ang(NX) = (90 - CSE) / 57.3 END IF NEXT i FOR y = 16 TO 316 STEP 24 FOR x = 20 TO 640 STEP 30 wd = 0: vx = 0: vy = 0 FOR i = 1 TO NX wxd = wdl(i) * COS(ang(i)) / Lfac wyd = -wdl(i) * SIN(ang(i)) d = (x - LO(i)) ^ 2 + (y - LA(i)) ^ 2 wd = wd + 1 / d vx = vx + wxd / d vy = vy + wyd / d NEXT i IF wd THEN LINE (x, y)-(x + vx / wd, y + vy / wd), 7 CIRCLE (x, y), 1, 9 NEXT x NEXT y END SUB SUB WXalarms LOCATE Bln - 1, 1 PRINT " WEATHER ALARMS: "; PRINT HTemp; TAB(25); LTemp; TAB(31); Ralarm; TAB(37); Wind; TAB(43); Wrng; SPACE$(32); LINE (0, L23 - 1)-(639, L24), 11, B CALL PR(a$, "Change settings: HighT, LowT, Rain, Wind, rAnge, CLEAR-alarm, ZeroRn") SELECT CASE a$ CASE "H": CALL PR2N(HTemp, "High TEMP limit") CASE "L": CALL PR2N(LTemp, "Low TEMP limit") CASE "R": CALL PR2N(Ralarm, "Rain limit in TENTHS") CASE "W": CALL PR2N(Wind, "Wind alarm threshold") CASE "A": CALL PR2N(Wrng, "Range in miles") CASE "Z": Hrain%(7) = 9 CASE ELSE: IF Alarm >= 0 THEN MID$(PS(Alarm), 10, 1) = " " Alarm = -1 END SELECT LOCATE Bln - 1, 1 PRINT " WEATHER ALARMS: "; PRINT HTemp; TAB(28); LTemp; TAB(37); Ralarm; TAB(43); Wind; TAB(49); Wrng; SPACE$(26); LINE (0, L23 - 1)-(639, L24), 11, B END SUB SUB WXcheck (a$, c) '_ccc/sssg...t...r...p...P...b.....h.. CALL ParseA(a$, TY$, LA, LO, sym$) IF ABS(LA - CDY) < Wrng / 60 AND ABS(LO - CDX) < Wrng / 60 THEN a = INSTR(45, UCASE$(a$), "T") IF a > 44 AND a < 54 THEN Temp = VAL(MID$(a$, a + 1, 3)) IF Temp >= HTemp OR Temp < LTemp THEN c = 12 END IF IF Wind AND MID$(a$, 41, 1) = "/" AND VAL(MID$(a$, 42, 3)) >= Wind THEN c = 12 a = INSTR(49, UCASE$(a$), "R") IF a > 48 AND a < 58 AND VAL(MID$(a$, a + 1, 2)) >= Ralarm THEN c = 12 END IF END SUB SUB WxMenu (R, NML) R = 0 IF RIGHT$(Display$, 4) = "READ" THEN Lin = Bln - 2 - nmg - nsl IF Lin < 1 THEN Lin = 1 LOCATE Lin, 1 FOR i = 1 TO nsl PRINT Fmt$("", NxMsg(i)) NEXT i ELSE CALL PR(a$, "WX: Alarms>, Calls>, Displays>, Enter, Log, Metric, Query, Zones") SELECT CASE a$ CASE "A": CALL WXalarms CASE "L": LogW = NOT LogW CASE "M": Metric = NOT Metric: R = -1 CASE "Q": CALL Xmit(1, "?WX?") 'CASE "G": CALL GetMETAR CASE "D": CALL PR(a$, "WX DISPLAYS: JustWXalways, No-countys, Show-countys, Winds") R = -1 SELECT CASE a$ CASE "J": JustW = NOT JustW CASE "N": County = NOT County CASE "S": CALL CountyDo(3, 1, "_", 5, NML): R = 0 CASE "W": CALL Winds: R = 0 'Removed in 833. Back in 838 END SELECT CASE "C": R = -1: CALL Calldisp CASE "E" IF Lok = 0 THEN CALL PR2N(a, "Wind direction"): IF a > 360 THEN a = 0 CSE$ = LzN$(a, 3) CALL PR2N(s, "Sustained Wind speed"): IF Metric THEN s = s / 1.61 SPD$ = "/" + LzN$(s, 3) CALL PR2N(g, "GUST Wind speed in last 5 mins") IF Metric THEN g = g / 1.61 SPD$ = SPD$ + "g" + LzN$(g, 3) CALL PR2N(T, "Temperature"): IF Metric THEN T = INT(T * 1.8 + 32.5) Ttmp$ = "t" + LzN$(T, 3) CALL PR2N(dew, "DewPoint") IF dew AND dew < T THEN IF Metric THEN dew = INT(dew * 1.8 + 32.5) dew$ = "d" + LzN$(dew, 3) ELSE dew$ = "" END IF CALL PR23("", a$, "Rain (100ths) in last hour (If SNOW then INCHES(CM) & end with S)", 0) IF RIGHT$(a$, 1) = "S" THEN a$ = LEFT$(a$, LEN(a$) - 1): B$ = "s" ELSE B$ = "r" END IF IF a$ <> "" THEN Rai$ = B$ + RIGHT$("00" + a$, 3) ELSE Rai$ = "" CALL PR2N(br, "Barometer in tenths of Millibars ") IF br > 9000 THEN Bar$ = "b" + LzN$(br, 5) ELSE Bar$ = "" MID$(PS(0), 11) = "@" + ZTG$ MID$(PS(0), 27) = "M" MID$(PS(0), 37) = "_" + CSE$ + SPD$ + Ttmp$ MID$(PS(0), 53) = dew$ + Rai$ + Bar$ + "/dos Manual " P$ = "Enter any other WX conditions: " CALL PR23("", a$, P$, 0) LS(0) = LEFT$(LS(0), 10) + DTGs$ + ">" + ZTG$ + P$ DecayP = 15: DecayB = 15 NxPOS = TIMER: NxBCN = TIMER: NewWX = TIMER CALL DispWX(0) CALL Drawunit(0, 0, Tmp$, 0, 0, o) END IF CASE "Z": OPEN "NWSzones.txt" FOR INPUT AS #3 DO UNTIL EOF(3) INPUT #3, N$, LA, LO, RN x = Xval(-LO): y = Yval(LA) CIRCLE (x, y), 175 * RN / RS, 15 LOOP: CLOSE #3 END SELECT END IF END SUB FUNCTION Xval (Lon) es$ = "in Xval" DX = CDX - Lon div = DX / RS IF div > 2 THEN Xval = 20000 ELSEIF div < -2 THEN Xval = -20000 ELSE Xval = 320 + Sfac * DX * Hfac END IF END FUNCTION FUNCTION Yval (Lat) es$ = "in Yval" 'Sfac=10000/RS dy = CDY - Lat div = dy / RS IF div > 2 THEN Yval = 20000 ELSEIF div < -2 THEN Yval = -20000 ELSE Yval = Ycen + Sfac * dy * yfg END IF END FUNCTION