DECLARE SUB CkPts (Pos$) DECLARE SUB DoLabels (x!, y!, a$, F!, c!) DECLARE SUB DoXX (x!, AB, a!, B!, c!) DECLARE SUB GScalc (B$, a!, Lat!, Lon!, Good!) DECLARE SUB PIRNT (a$) DECLARE SUB DoTel (a$, PreKey$) DECLARE SUB PL4 (a$, c!) DECLARE SUB TimeFix (HRz!, DA!) DECLARE SUB InitTNC (All!) DECLARE SUB DX2pos (a$, k!) DECLARE SUB PRa (a$, p$) DECLARE SUB PR2N (a!, p$) DECLARE SUB NewScrn (d$, c!, d!) DECLARE SUB Vicinity (a$, j!, k!, Xpos!) DECLARE SUB Dphg (PHG$, d!, r!, w) DECLARE FUNCTION V91! (a$, i!) DECLARE SUB KillMsg () DECLARE SUB Decode (c$, a$, k!, LA!, LO!) DECLARE SUB Format (Pos$, fs$) DECLARE SUB NTSdisp (B, N, T) DECLARE FUNCTION Tdeg$ (a$, L!) DECLARE SUB RightCall (Call$) DECLARE SUB OverlayPos () DECLARE SUB TraTr () DECLARE SUB GridCap (mmx) DECLARE SUB GetFeatures (a!, MapA) DECLARE SUB RangeRings (r, rng) DECLARE SUB GridSQ (x, y, GdSq$, p) DECLARE SUB DXall () DECLARE SUB FadePlot (MyID$) DECLARE SUB ViewBox (c!) DECLARE SUB StatusLine () DECLARE SUB Pnmea (a$, p) DECLARE SUB HEXDEC (a$, a!, N!, d!) DECLARE SUB PL2 (a$, c!) DECLARE SUB Gamebox () DECLARE SUB SetSubDir (SbDr$, e$) DECLARE SUB HookedDisp (p!) DECLARE SUB AskLL (LL$) DECLARE SUB PosChange (p$, a$) DECLARE SUB PL25 (a$, c!) DECLARE SUB AllHdr () DECLARE SUB SetPage (StrtX!, LineX!, EndX!) DECLARE SUB DispALL (a$) DECLARE SUB PHrdLN (i!, d$, a) DECLARE SUB Bline (c!) DECLARE SUB DoDFpos (AZ!, nQ!, Q!, DF$, Pos$) DECLARE SUB Gfield (a!, a$, B$, N!) DECLARE FUNCTION M2$ (a$, a!) DECLARE SUB PlotCur (LL$) DECLARE FUNCTION LzN$ (a!, N) DECLARE SUB GetChar (a$) DECLARE SUB PL118 (z$, c!) DECLARE SUB PR23 (a$, B$, p$, N) DECLARE SUB Noise (a!) DECLARE SUB HSPsw (a!) DECLARE SUB ControLine () DECLARE SUB WXalarms () DECLARE SUB RcvMsgAdd (a$, Rmsg$, Resp$, LineNo$, Rack$, Call$) DECLARE SUB Xmit (a, a$) DECLARE SUB Telm (F) DECLARE SUB OutGGA (pp!, a) DECLARE SUB PL1 (z$, c!) DECLARE SUB PL24 (a$, c!) DECLARE SUB BoxTOline (c!, p$, N) DECLARE SUB ReadPage (Lin) DECLARE SUB ClrScn () DECLARE SUB MIC (ToCall$, a$, k!, TLM$, STS$, MicE$) DECLARE SUB InitVGA (a$) DECLARE SUB ToGo () DECLARE SUB NxtComma (a$, k!, B$) DECLARE SUB PR (a$, T$) DECLARE SUB SymDo (a$, B$, c$, d$, Tmp$) DECLARE SUB ParseVel (a$, sym$, CSE!, CSE$, SPD!, SPD$, BRG$, QAL$, CMTS!, PHG$) DECLARE SUB BeamHeading (Pos$) DECLARE SUB BLTNSin (a$, k!, Call$, Tcall$) DECLARE FUNCTION Xval (x) DECLARE FUNCTION Yval (x) DECLARE SUB SendMsgs (a$) DECLARE SUB AckedMSG (Call$, LineNo$, Resp$) DECLARE SUB RawUII (Call$, a$, L!, k!, Pos$, a) DECLARE SUB XYtoLL (Lat!, Lon!, a$, LALO$) DECLARE SUB TooBad () DECLARE SUB RdMail (a$, k!, Call$, Tcall$) DECLARE SUB SendCW (a$) DECLARE SUB DXcalls (a$, LALO$) DECLARE SUB ParseTime (a$, kv!, tme$) DECLARE SUB FindComma (a$, kv!, abort!) DECLARE SUB Pause (T!) DECLARE SUB Clearbuf () DECLARE SUB ParseWX (p, WX$, WXrpt$, RainC!, Rmt) DECLARE SUB DoNMEA (a$, k, Call$, Pos$) DECLARE SUB ManPos (Call$, TY$, a$, k!) DECLARE SUB Drawunit (r!, p, Tmp$, CC!, Live!, O) DECLARE SUB Print25th (a!, a$) DECLARE SUB CheckCW () DECLARE SUB PRMC (a$, kv!, tme$, LL$, CSpd$, abort!) DECLARE SUB Qresp (a$, k!, Call$, B!) DECLARE SUB ParseLL (a$, kv!, LL$, abort!) DECLARE SUB OverWrite (a$, B$, FirstLine!) DECLARE SUB AllList (EndB!, a!) DECLARE SUB AddBL (a$) DECLARE SUB REPORT (a$, j!, k!, Call$, Rpt, N) DECLARE SUB AddP (a$) DECLARE SUB AddL (a$) DECLARE SUB ReCntr (r!, LA!, LO!) DECLARE SUB DispWX (j!) DECLARE SUB ParseGdSq (a$, k!, Call$, LALO$, c$) DECLARE SUB FindL (a$) DECLARE SUB FindP (a$) DECLARE SUB WXcheck (a$, c!) DECLARE SUB ParseA (a$, TY$, LA!, LO!, sym$) DECLARE SUB CommTNC (z$, Astr$, c$) DECLARE SUB RcvMsgCK (a$, k!, Call$, AddFlg!) 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 AckedMSG (Call$, LineNo$, Resp$) 'LineNo$ must have XX} FOR i = 1 TO nsl ' Search for matching line number and callsign 'IF Call$ = MID$(Mst$(i), 4, 9) AND ... IF MID$(Mst$(i), 13, 6) <> "*ACK* " THEN IF LineNo$ = RIGHT$(Mst$(i), LEN(LineNo$)) THEN MID$(Mst$(i), 13, 6) = "*" + Resp$ + "* " IF Doz = 0 AND RIGHT$(Display$, 4) = "READ" THEN CALL ReadPage(Lin) CALL SendCW("R") REM Now, start with nxt MSG to same guy REM set timer to 0 to send NOW. Do once! FOR j = i + 1 TO nsl IF Call$ = MID$(Mst$(j), 4, 9) THEN NxMSG(j) = TIMER - 1: DecayM(j) = 8 j = nsl: i = j: CALL SendMsgs("") END IF NEXT j i = nsl END IF END IF NEXT i END SUB SUB AddPos (LL$, Pos$, a) a = 0 IF LEFT$(Display$, 3) = " MP" THEN CALL AskLL(LL$) p$ = "Enter callsign or object name to add" CALL PR23("", a$, p$, 0) IF a$ <> "" THEN a$ = LEFT$(p$ + " ", 9) Pos$ = a$ + " +" + ZTG$ + LL$ + "/object" + SPACE$(30) PM = -1: CALL PosChange(Pos$, a$) IF a$ = "Y" THEN a = -1: CALL AddP(LEFT$(Pos$, 9))' Creates PM END IF END IF END SUB SUB AllHdr CALL NewScrn("ALL", 2, 4) PRINT " LOG of new STATUS, MSGS and BLTNS Chronologically" CALL StatusLine LOCATE 4, 33 IF LogF = 0 THEN CALL Noise(1) PRINT "[ LOG is off. This will NOT be saved to disk ]"; END IF CALL Bline(0) END SUB SUB AllList (EndB, a) REM used in ALL,Alt-F,CkPage,DXall IF a THEN CALL AllHdr CALL SetPage(StrtB, LineB, EndB) IF Hooked > -1 THEN CALL DispALL(PS(Hooked)) ELSE FOR i = StrtB TO EndB PRINT LEFT$(BL(i), 80) NEXT i: PRINT SPACE$(80); END IF END SUB SUB Bline (c) IF c THEN LOCATE Bln - 1, 1 PRINT " Move cursor down and hit ENTER for more options. "; LINE (0, L23)-(639, L24), c, B END IF CALL PL25(" DISPLAYS: B,D,H,L,P,V,F1-H | MENUS: Cntrls File Input Map Ops WX @Setup ", 12) END SUB SUB BLTNSin (a$, k, Call$, Tcall$) STATIC QST ms1 = mss + 1 H = LEN(RTRIM$(Call$)): IF H > 9 THEN H = 9 IF H > 6 THEN B$ = "B" ELSE B$ = " " B$ = B$ + RIGHT$(Tcall$, 10 - H) x = 99 IF LEN(Tcall$) > 4 THEN B$ = MID$(Tcall$, 4) s = 1: x = 1 DO UNTIL x = 0 x = INSTR(s, GRP$, ","): L = x: IF x = 0 THEN L = LEN(GRP$) + 1 IF MID$(GRP$, 5, L - s) = MID$(GRP$, s, L - s) THEN x = 99: EXIT DO s = x + 1 LOOP END IF IF x = 99 THEN HDR$ = LEFT$(RTRIM$(Call$) + ">" + B$ + " ", 12) L = LEN(a$) i = INSTR(k + 10, a$, "{"): IF i <> 0 THEN L = i BN(ms1) = HDR$ + MID$(a$, k + 10, L - k - 10) M = 0: j = 1: k = 0 LEFBN$ = LEFT$(BN(ms1), 12) FOR i = 1 TO LinB IF BN(ms1) = BN(i) THEN M = i: i = LinB'DUPE. Ignore IF BN(ms1) > BN(i) THEN j = i + 1 'Save last ordrd loc IF LEFBN$ = LEFT$(BN(i), 12) THEN k = i: j = i: i = LinB NEXT i IF M = 0 THEN ' Its not a dupe NewBltn = -1 CALL AddBL(LEFT$(BN(ms1), 12) + " " + MID$(BN(ms1), 13)) IF k = 0 THEN ' Its not a changed line so ADD it LinB = LinB + 1 IF LinB > mss THEN LinB = mss FOR i = LinB TO j + 1 STEP -1 BN(i) = BN(i - 1) NEXT IF ABS(TIMER - QST) > 10 THEN QST = TIMER: CALL SendCW("QST") IF Doz = 0 AND MID$(BN(ms1), 14, 3) = "NS\" THEN CALL NTSdisp(1, j, -1) END IF BN(j) = BN(ms1): IF Pon AND 1 THEN LPRINT BN(ms1) END IF k = 0'to force NOT saving as traffic END IF END SUB SUB CheckCW IF CWon THEN CALL Print25th(6, BL(LineB)) CALL SendCW("de " + LEFT$(BL(LineB), 9) + RTRIM$(MID$(BL(LineB), 25))) END IF END SUB SUB CkFilter (Pos$, LA, LO, acf) s$ = MID$(Pos$, 37, 1) Px$ = MID$(PS(PM), 10, 1) acf = 0 r = .0007 IF Filoff THEN r = .0001: IF INSTR("_W\", s$) THEN acf = -1'Save WX,DF CALL ParseA(PS(PM), TY$, LApm, LOpm, sym$) IF ABS(LA - LApm) > r THEN acf = -1 ELSEIF ABS(LO - LOpm) > r THEN acf = -1 ELSEIF MID$(RTRIM$(Pos$), 45, 31) <> MID$(RTRIM$(PS(PM)), 45, 31) THEN IF LogW OR s$ <> "_" THEN acf = -1 END IF IF acf THEN IF Px$ = "A" THEN Alarm = PM IF (Pon AND 64) THEN LPRINT Pos$ ELSEIF s$ = "_" AND (Pon AND 32) THEN LPRINT Pos$ 'new ELSEIF MID$(PS(PM), 11, 1) = "*" AND (Pon AND 4) THEN LPRINT Pos$ END IF END IF END SUB SUB Clearbuf IF TNCon THEN Pause (.02) IF LOC(1) <> 0 THEN a$ = INPUT$(LOC(1), #1) END IF END SUB SUB D3andCUR LOCATE 1, 2 IF Metric THEN PRINT "KiloM"; IF RS > 4 THEN rng = INT(RS * 1.875048) ELSE rng = RS * 2 ELSE rng = RS: PRINT "Range"; END IF PRINT RIGHT$(" " + STR$(rng), 4); LINE (0, 0)-(82, L03), 12, B TZ = HR - UTC - INT((CPX + 7.5) / 15) 'always local CALL TimeFix(TZ, DA) CALL PL4("TZ = " + LzN$(TZ * 100, 4), 14) IF In3D THEN REM 175 * Yft is Horizon YY = yft * 14 / yfc LOCATE 21, 74: PRINT " 000"; LINE (584, 14)-(640, 340), 8, BF LOCATE 3, 74: PRINT "ALT(ft)"; LOCATE 23 * YY, 75: PRINT "[ =UP" LOCATE 24 * YY, 75: PRINT "] =DN"; FOR i = 0 TO 4 LOCATE (21 * YY) - (i * 4 * YY), 74 y = yft * (294 - i * 56) LINE (0, y)-(639, y), 7 a = i * MapSize * 250: REM was *1000 IF a < 999999 THEN PRINT USING "###,###"; a NEXT i END IF END SUB SUB Decode (cf$, a$, k7, LA, LO) 'k!123456z/YYYYXXXX$csT IF cf$ > "`" AND cf$ < "k" THEN cf$ = CHR$(ASC(cf$) - 49) LA = 0: LO = 0 FOR i = 0 TO 2 c9 = 91 ^ (2 - i) LA = LA + c9 * V91(a$, k7 + 3 + i) LO = LO + c9 * V91(a$, k7 + 7 + i) NEXT i LA = 90 - LA / 4186 '75351/180 to .014 min LO = 180 - LO / 2093 '75351/90 to .028 min 'DOS only CALL XYtoLL(LA, LO, cf$, LL$) c = V91(a$, k7 + 12) s = V91(a$, k7 + 13) T = V91(a$, k7 + 14) Bt$ = "/" ctx$ = MID$(a$, k7 + 15) IF c < 0 THEN cs$ = "": Bt$ = "" 'it was a SPACE char or less ELSEIF c < 90 THEN cs$ = LzN$(c * 4, 3) + "/" + LzN$((1.08 ^ s) - 1, 3) ELSEIF c = 92 THEN cs$ = "Rng" + LzN$((2 * 1.08 ^ s), 4) END IF O = T AND 7 N = T AND 24 O$ = MID$("/0000/BTxt/APRS/3333/KPC3/Pico/Trkr/Cngd/", O * 5 + 1, 6) IF T > 63 THEN G$ = "Good " ELSE G$ = "Last " IF O > 3 AND N > 0 THEN ctx$ = O$ + G$ + MID$("GLL fix8GGA fix6RMC fix", N - 7, 7) IF N = 16 THEN cs$ = "/A=" + LzN$((1.0023 ^ (c * 91 + s)), 6) + " " a$ = LEFT$(a$, k7 + 1) + LL$ + MID$(a$, k7 + 11, 1) + cs$ + Bt$ + ctx$ END SUB SUB Do3D (x, y) IF y > 360 THEN y = 360 y1 = Cy1 + Cy2 / (Cy3 - y) x1 = 640 - y1 * Cx1 + x * (y1 - Ycen) / Ycen y = y1 x = x1 END SUB SUB DoNMEA (a$, k, Call$, Pos$) es$ = "In NMEA" REM gets PM from FindP REM returns Pos$ with GotP for posits, and PDone for RMC and VTG REM if GotP then posit is in Ptemp with Ptime =TIMER tme$ = "@" + ZTG$ B$ = MID$(a$, k + 4, 3): kv = k + 7 'Pointing at first comma IF B$ = "WPL" THEN Call$ = LEFT$(RIGHT$(a$, 9), 6) + " " 'IF k > 4 THEN Raw$ = "/raw*" ELSE Raw$ = "/APRS" 'APRS means its mine in SPM IF k > 4 THEN Raw$ = "/NMEA*" ELSE Raw$ = "/APRS*" 'APRS means its mine in SPM CALL FindP(Call$) IF PM = -1 THEN CALL AddP(Call$) IF PM >= 0 OR SPM = 99 THEN 'CALL CkSSID(sym$) '0 / dot 8 s Ship 'REQUIRED for MIM NMEA mode '1 a amblnc 9 > car '2 U Bus 10 < Motorcycle '3 f firetk11 O Balloon '4 b Bikes 12 j Jeep '5 Y Yachts13 R RV '6 X Helo 14 k truck '7 ' Air 15 v Van 'Call$ = LEFT$(PS(PM), 9) not needed now sym$ = "//" 'had been /0 SSID = VAL(MID$(Call$, INSTR(Call$, "-") + 1, 2)) IF SSID > 0 THEN sym$ = "/" + MID$("aUfbYX's> 0 AND MID$(ToAd$, 4, 1) <> " " THEN alt$ = "/" '123456789-123456789=123456789% was 26, now 30 x$ = "B-33,P00,M-24,H08,L32,J74,C00,O-33,A00,N-24,D08,S32,Q74,C00,E00" L = INSTR(x$, MID$(ToAd$, 4, 1)) IF L > 30 THEN alt$ = "\" IF ToAd$ = "" THEN ELSEIF L = 57 OR L = 27 THEN sym$ = alt$ + CHR$(32 + VAL(MID$(ToAd$, 5, 2)))'Brents way ELSEIF L THEN 'IF l > 26 THEN alt$ = "\" IF MID$(ToAd$, 6, 1) <> " " THEN alt$ = MID$(ToAd$, 6, 1) c = ASC(MID$(ToAd$, 5, 1)) + VAL(MID$(x$, L + 1, 3)) sym$ = alt$ + CHR$(c) END IF END IF IF PM = 0 THEN sym$ = MID$(PS(0), 27, 1) + MID$(PS(0), 37, 1) END IF' endof ckssid 'B$ = MID$(a$, k + 4, 3): kv = k + 7 'Pointing at first comma IF s25$ <> "LN2:" THEN s25$ = B$ + ":" Process = 0 Raw = 0 IF NOT Vusr THEN FOR i = 1 TO LineP x$ = UCASE$(MID$(PS(i), 45, 5)) IF INSTR("/NMEA/MIC-/TH-D/D-70", x$) THEN Raw = Raw + 1 NEXT i END IF IF Raw > 4 AND Raw > .4 * LineP THEN CALL TooBad CALL PRa("", " Sorry, No more GPS units permitted for unregistered commercial systems. ") CALL Noise(2): abort = -1 ELSEIF B$ = "RMZ" OR B$ = "GLB" THEN REM $PGRMZ,xxxx,f,D*CS REM $PMGLB,02,xxxxxx,M*CS IF B$ = "GLB" THEN k = k + 3: kv = kv + 3 kv = kv + 1: CALL FindComma(a$, kv, abt) IF abt = 0 THEN alt = VAL(MID$(a$, k + 8, kv - (k + 9))) IF UCASE$(MID$(a$, kv, 1)) = "M" THEN alt = alt * 3.2804 alt$ = RIGHT$("00000" + MID$(STR$(alt), 2), 6) MID$(PS(PM), 63) = "/A=" + alt$ + " " END IF ELSEIF B$ = "GGA" AND GotP = 0 AND (DGGA >= 0 OR PM <> 0) THEN GotP = -1: Process = -1 Pause (.2)' time for VTG c$ = a$: CSpd$ = "GGA/NUL" abort = 0 CALL ParseTime(a$, kv, tme$) CALL ParseLL(a$, kv, LL$, abort) IF abort THEN GotP = 0 Eqip$ = "/Bad Lat/Long" ELSE Eqip$ = "/Last gps fix": IF MID$(a$, kv + 2, 1) = "1" THEN Eqip$ = "/good GGA" kv = kv + 7 IF LEN(a$) > kv THEN CALL FindComma(a$, kv, Tbort) 'skip to comma after hdop a = kv: CALL FindComma(a$, kv, Tbort) 'Temporary abort symbol IF kv - 1 - a > 0 AND Tbort = 0 THEN alt = VAL(MID$(a$, a, kv - 1 - a)) 'Fixed posn from W IF MID$(a$, kv, 1) = "M" THEN alt = alt * 3.2804 alt$ = LTRIM$(STR$(alt)) L = LEN(alt$): LD = INSTR(alt$, ".") IF LD THEN L = LD - 1 alt$ = "/A=" + RIGHT$("000000" + LEFT$(alt$, L), 6) + " " REM Alt$ = "/A=" + LzN$(Alt, 6) END IF ELSE Eqip$ = "/PACCOMM 3.1" END IF IF Nlog THEN PRINT #4, Call$; a$ END IF ELSEIF B$ = "GLL" AND GotP = 0 AND (DGGA >= 0 OR PM <> 0) THEN GotP = -1: Process = -1: Pause (.2) Eqip$ = "/Last GLL" 'tme$ = "@" + ZTG$ CSpd$ = "GLL/NUL" abort = 0: CALL ParseLL(a$, kv, LL$, abort) IF MID$(a$, k + 2, 2) = "LC" THEN Eqip$ = "/Last LOR fix": s25$ = "LOR:" IF abort THEN GotP = 0 ELSEIF B$ = "VTG" AND GotP AND (DGGA >= 0 OR PM <> 0) THEN Pdone = -1'or with VTG REM Hold GGA/GLL's for 3 sec for VTG IF PM > -1 AND TIMER - Ptime < 2.2 AND PpmT = PM THEN abort = 0 CALL FindComma(a$, kv, abort): CSE$ = MID$(a$, kv, 3) CALL FindComma(a$, kv, abort) 'skip T CALL FindComma(a$, kv, abort) 'skip MagCse CALL FindComma(a$, kv, abort) 'skip M CALL FindComma(a$, kv, abort): SPD$ = MID$(a$, kv, 3) IF NOT abort THEN IF PM = 0 AND VAL(SPD$) > 2 THEN DFhdg = VAL(CSE$) CSpd$ = CSE$ + "/" + SPD$ IF NoSPD AND PM = 0 THEN CSpd$ = LEFT$(CSpd$, 4) + "QRT" ELSE CSpd$ = "VTG/ERR" END IF MID$(Ptemp$, 38, 7) = CSpd$ DoTEMP = -1 END IF ELSEIF B$ = "RMC" AND (DGGA <= 0 OR PM <> 0) THEN Process = -1: Pdone = -1 abort = 0 Eqip$ = "/good RMC": alt$ = "" CALL ParseTime(a$, kv, tme$) CALL FindComma(a$, kv, abort) IF MID$(a$, kv, 1) = "V" THEN Eqip$ = "/old RMC" CALL ParseLL(a$, kv, LL$, abort) CALL FindComma(a$, kv, abt): SPD$ = MID$(a$, kv, 3) CALL FindComma(a$, kv, abt): CSE$ = MID$(a$, kv, 3) IF NOT abt THEN IF PM = 0 AND VAL(SPD$) > 2 THEN DFhdg = VAL(CSE$) CSpd$ = CSE$ + "/" + SPD$ ELSE CSpd$ = "NUL/NUL" END IF ELSEIF B$ = "WPL" AND Wpts AND PM <> 0 THEN Process = -1: Pdone = -1 abort = 0 Eqip$ = "/good WPL": alt$ = "" CALL ParseLL(a$, kv, LL$, abort) CALL FindComma(a$, kv, abt): WPT$ = MID$(a$, kv, 6) 'WPT$ not used 'IF NOT abt THEN CSpd$ = "" ELSEIF B$ = "HDM" THEN CALL FindComma(a$, kv, abt): DFhdg$ = MID$(a$, kv, 3) MID$(PS(0), 38) = DFhdg$: DFhdg = VAL(DFhdg$) END IF IF Nlog AND (Process OR Pdone) THEN PRINT #4, Call$; a$ IF Process AND abort = 0 THEN IF NoSPD AND PM = 0 THEN CSpd$ = LEFT$(CSpd$, 4) + "QRT" IF Raw$ = "/NMEA*" THEN MID$(tme$, 1, 1) = "/" MID$(LL$, 9) = LEFT$(sym$, 1) Pos$ = Call$ + " " + tme$ + LL$ + SPACE$(36) MID$(Pos$, 37) = RIGHT$(sym$, 1) + CSpd$ + Raw$ + Eqip$ + alt$ REM IF sym$ = "/\" THEN Pos$ = LEFT$(Pos$, 44) ' Rem=DO zero old DF IF B$ = "RMC" THEN DoPos = -1 ELSE IF Ptime AND PpmT > -1 THEN Pnow$ = Ptemp$: PpmN = PpmT 'Store previous! Ptemp$ = Pos$ Ptime = TIMER: PpmT = PM'hold 2.2 secs for VTG END IF NewUser = 0: LastGPS = TIMER CALL PL1("Got good " + B$ + " fix...", 10) END IF IF HSP THEN IF (Pdone) THEN CALL HSPsw(0) CALL PL1("Got complete " + B$ + " fix...", 10) CALL Clearbuf END IF END IF CALL ViewBox(3) IF Pdone AND PM = 0 THEN s = INT(VAL(SPD$) * 1.151): x$ = "MPH" IF Metric THEN s = s * 1.609: x$ = "KPH" IF s > 0 THEN 'LOCATE 4, 2: PRINT CSE$; " @"; s; x$ 'LINE (0, L03)-(99, 4 * yfc), 14, B CALL PL4(CSE$ + "o" + LzN$(s, 3) + x$, 14) END IF END IF es$ = "Finished NMEA" END SUB SUB DoRcvPkt (a$, Pos$, EndB) STATIC LPg, cmd, NoWin, LastAZ, LastDF, LastOne, LastCall$, LTY$, dxp es$ = "In DoRcvPkt" s25$ = "Hrd:": Xpos = 0: Pn$ = " " IF INSTR("p1 p2 ", LEFT$(a$, 3)) <> 0 THEN Pn$ = MID$(a$, 2, 1): a$ = MID$(a$, 4) FOR i = 1 TO LEN(a$) - 1 SELECT CASE LEFT$(a$, 1) CASE " ": IF MID$(a$, 46, 2) = "Z " THEN i = 999'for DX mail CASE "$", "%", "*": i = 999 CASE "@" TO "Z": i = 999 CASE "0" TO "9": i = 999 CASE ELSE: a$ = MID$(a$, 2) END SELECT NEXT IF Palias$ <> "" THEN 'original stuff is now in astkv a = INSTR(4, a$, Palias$) - 1 aa = INSTR(4, a$, ">AIR:") 'for backwards compatibilty... IF aa THEN a = aa + 3 IF a THEN B = INSTR(a, a$, ":") PRINT #1, "}"; LEFT$(a$, a); ","; RTRIM$(Uid$); "*"; MID$(a$, B); CHR$(13); END IF END IF IF Display$ = "VIEW" THEN LOCATE Bln - 1, 2 k = INSTR(7, a$, ":") IF ViewD AND k THEN PRINT LEFT$(a$, 9); MID$(a$, k, 70) ELSE PRINT LEFT$(a$, 79) ELSE ViewD = 0 END IF L = LEN(a$): IF L > 12 AND (HSP = 0 OR (INP(hspp) AND 1)) THEN CALL Print25th(6, a$) k = 0: a7$ = LEFT$(a$, 7) IF a7$ = "*** CON" AND Doz = 0 THEN CALL CommTNC("T", Astr$, a$): GOTO XtRcv IF L > 165 THEN s25$ = "Long": GOTO XtRcv ex = 0 IF SPM <> 0 AND Trial AND NoGPS = 0 THEN IF Ptime = 0 AND LEFT$(a$, 1) = "$" AND MID$(a$, 7, 1) = "," THEN 'non-header GLL,GGA,RMC must be mine PM = 0: Pdone = 0: GotP = 0' If none pending, then VTG is mine too Call$ = LEFT$(PS(0), 9): CALL DoNMEA(a$, 0, Call$, Pos$) ex = -1: a7$ = "" END IF ELSEIF Wval AND LEFT$(a$, 2) = "!!" THEN PM = 0: CALL RawUII("na", a$, 42, 1, PS(0), Keep): ex = -1 END IF IF DFSP = 66 THEN 'was and Dval a = INSTR(a$, "%") 'L%BBB%Q%MMM IF a AND a < 3 AND L < 12 THEN AZ = VAL(MID$(a$, a + 1, 3)) Q = VAL(MID$(a$, a + 5, 1)) DelAz = ABS(AZ - LastAZ) IF DelAz THEN IF ABS(TIMER - LastDF) > ppp THEN NxPOS = TIMER: LastDF = TIMER LastAZ = AZ PM = 0: Pos$ = PS(0) CALL DoDFpos(AZ, 1, Q, "/DFjr", Pos$) DoPos = -1 END IF ex = -1 END IF END IF IF PpmT > -1 THEN IF MID$(a7$, 4, 4) = "VTG," THEN s25$ = "LN2:": PM = PpmT Call$ = LEFT$(PS(PM), 9) CALL DoNMEA(a$, 0, Call$, Pos$) ex = -1 END IF END IF: IF ex OR LEFT$(a$, 1) = "$" THEN GOTO GoodRcv REM nothing prior to this has a PKT HEADER so dont know WHO? fdx = INSTR(46, a$, "Z "): fdy = INSTR(37, a$, "-")'DX Mail IF fdx = 46 AND fdy = 37 THEN a$ = LastCall$ + ">DXmail:" + a$ 'PARSEPAK had been a subroutine 'had been static mycall$ Keep = 0: s25$ = "To?" re: j = INSTR(4, a$, ">") - 1 k = INSTR(7, a$, ":") IF j < 3 OR j > 10 THEN s25$ = "No>:": GOTO XtRcv PktCall$ = LEFT$(a$, j) Astx = INSTR(a$, "*") IF Astx = j THEN PktCall$ = LEFT$(a$, j - 1) IF Astx <= j THEN Pn$ = "*" IF MID$(a$, k + 1, 1) = "}" THEN nk = INSTR(k + 9, a$, ":") IF nk THEN ph$ = MID$(a$, k + 2, nk - k - 2)'pseudo header 'lh$ = LEFT$(a$, k) 'Inserts full header (my way) lh$ = MID$(a$, j + 1, k - j) 'Sprouls way '840 had xtra -1 a$ = ph$ + "," + lh$ + MID$(a$, nk + 1) L = LEN(a$) Recurse = -1 END IF END IF IF Recurse THEN Recurse = 0: GOTO re: Call$ = LEFT$(PktCall$ + " ", 9) IF Call$ = LEFT$(PS(0), 9) THEN ' was AND Direct=0 s25$ = "My:": HrdMe = TIMER IF SPM = 99 AND MID$(a$, k + 1, 1) = "$" THEN s25$ = "MY$"'fools exit below IF Space AND Astx > j + 2 AND Astx < k THEN Success = -1: SucTime = TIMER z$ = " YOUR PACKET WAS DIGIPEATED!! EVERYONE ELSE SHOULD SEE YOU TOO! " CALL PL24(z$, 13) CALL SendCW("HI HI HI") DecayP = Maxtime: NxPOS = TIMER + DecayP DecayB = Maxtime: NxBCN = TIMER + DecayB END IF END IF IF s25$ = "My:" THEN GOTO XtRcv jj = j IF k < 7 OR k < j + 3 OR (k > L - 3 AND Space = 0 AND MScat = 0) THEN s25$ = "Hdr?": GOTO XtRcv IF LocFil AND Astx > j + 8 + LocFil AND Astx < k THEN s25$ = ">>>*" w = INSTR(a$, "WIDE") IF w AND MID$(a$, w + 5, 1) = "-" THEN N1 = VAL(MID$(a$, w + 4, 1)): N2 = VAL(MID$(a$, w + 6, 1)) IF N1 - N2 > LocFil / 10 THEN s25$ = ">>>*" IF s25$ = ">>>*" AND MID$(a$, k + 1, 1) <> ":" THEN GOTO GoodRcv '(not msg) IF INSTR(j, a$, "GATE") > 0 THEN Pn$ = "g": IF Gfltr THEN s25$ = "GFL*": CALL ViewBox(12): GOTO GoodRcv IF MID$(a$, k - 2, 2) = "/H" THEN Pn$ = "h" IF TNC = -1 THEN DO UNTIL jj = -1 OR jj >= k j = jj: jj = INSTR(j + 3, a$, ">") - 1 LOOP ' finds last > before K so that we have the TO call END IF jl = j + 8: IF jl > k THEN jl = k FOR i = j + 4 TO jl - 1 IF MID$(a$, i, 1) < "0" THEN jl = i: i = j + 7 NEXT ToAd$ = LEFT$(MID$(a$, j + 2, jl - j - 2) + " ", 9) IF ToAd$ = "DGPS " THEN CALL PL1("DGPS ACTIVE ON FREQ", 11) IF GPSon AND DGPSon THEN PRINT #2, MID$(a$, k + 1); IF MID$(a$, k + 20, 1) = "." THEN Keep = 1'Keep BText END IF To2$ = LEFT$(ToAd$, 2) 'removed AC,AI,AN,JA,QT,PH,RA,SA,SI,SK IF INSTR("AP,BE,ID,CQ,DF,DR,DX,GP,MA,MI,NE,NA", To2$) THEN Keep = 1 IF INSTR("QS,QT,SP,SY,TC,TE,TR,WI,WX,ZI", To2$) THEN Keep = 1 IF ToAd$ = "CQ " THEN GinV = INSTR(j, a$, "*,") 'this is weak! IF Ignore OR Altnet$ <> "" OR Game THEN Keep = 1 loa = LEN(Altnet$) IF loa AND MID$(a$, j + 2, loa) = Altnet$ THEN ELSEIF To2$ = "SP" THEN 'SPCL or GPS ELSEIF INSTR(k, a$, LEFT$(PS(0), 9)) THEN 'cncted pkt to you ELSEIF INSTR(k + 10, UCASE$(a$), ":ACK") THEN 'ACKS fm others thru ELSEIF LEFT$(ToAd$, 2) = "GA" THEN HisMove = VAL(MID$(a$, k + 34, 4)) CALL Gamebox ELSE Keep = 0 END IF END IF 'IF INSTR("GP,SP,SY", To2$) OR .. IF MID$(a$, k + 1, 2) = "DX" THEN Keep = 1 IF OnlyBCNS = 0 OR Space OR MScat OR MID$(a$, k + 1, 1) = "]" THEN Keep = 1 'IF Keep THEN S25$ = "OK-" 'es$ = "a1 k+1" MicE$ = "": NewE = 0 IF k + 8 <= L THEN a1 = ASC(MID$(a$, k + 1, 1)) IF a1 = 29 THEN MicE$ = "Mic-b" IF a1 = 96 THEN MicE$ = "Mic-E": NewE = -1 IF a1 = 28 THEN MicE$ = "Old-b" IF a1 = 39 THEN MicE$ = "Old-E": NewE = -1 IF MID$(a$, k + 10, 1) = ">" THEN MicE$ = "TH-D7": NewE = -1 IF MID$(a$, k + 10, 1) = "]" THEN MicE$ = "D-700": NewE = -1 IF MicE$ <> "" THEN CALL MIC(MID$(a$, j + 2, 6), a$, k, TLM$, STS$, MicE$) Keep = 1: L = LEN(a$) END IF END IF '******************************* end of old PARSEPAK IF Keep = 1 THEN s25$ = "OK-" ELSE GOTO XtRcv IF fdx = k + 46 AND fdy = k + 37 THEN CALL RdMail(a$, k - 10, Call$, "DXmail"): GOTO XtRcv 'DUPE CHECK K1 = k + 1: TY$ = MID$(a$, K1, 1) IF TIMER - LastOne > 8 THEN LTY$ = "" IF LastCall$ = Call$ AND INSTR(":; " + LTY$, TY$) = 4 THEN s25$ = "DUP:": GOTO XtRcv LTY$ = TY$: LastCall$ = Call$: LastOne = TIMER CALL FindP(Call$) IF PM = -1 AND TY$ = "-" THEN s25$ = "Kll:" 'DoNT add a KILLED posit! ELSEIF PM = -1 THEN CALL AddP(Call$) CALL Vicinity(a$, j, k, Xpos): Xpos = 0 'it may still be a good pos ELSE IF INSTR(j, a$, "BOX") THEN CALL Vicinity(a$, j, k, Xpos) END IF IF LEFT$(ToAd$, 4) = "SPCL" THEN MID$(PS(PM), 10, 1) = "S" 'IF MID$(a$, K1, 8) = " "" THEN MID$(PS(PM), 10, 1) = x$: GOTO GoodRcv '832 Mic-E was here as2$ = MID$(a$, K1, 2): IF as2$ = "**" THEN MID$(a$, K1, 1) = ">" as4$ = MID$(a$, K1, 4) as6$ = MID$(a$, K1, 6) IF UCASE$(as6$) = "?APRS?" THEN CALL Qresp(a$, k, Call$, 1): Keep = 0 IF as4$ = "?WX?" AND MID$(PS(0), 37, 1) = "_" THEN Keep = 0: NxPOS = TIMER + 30 * RND(1) 'QRX code went here IF (as6$ = "Ping! " OR as4$ = "?CQ?") AND TIMER - LPg > 10 THEN Keep = 0: LPg = TIMER: CALL SendCW("CQ") ELSEIF as6$ = "DX de " THEN dxp = dxp + 1 IF dxp > 9 THEN dxp = 1 DX(dxp) = MID$(a$, k + 7) IF INSTR(k + 70, a$, "SATS") = 0 THEN CALL DX2pos(a$, k) Keep = 0 END IF lgth = 0 IF TY$ = "*" THEN TY$ = "#" SELECT CASE L - k CASE 42, 46, 50: IF as2$ = "!!" THEN lgth = 42 CASE 49, 53, 57: IF as4$ = "$ULT" THEN lgth = 49: k = k + 3 CASE 14: IF TY$ = "#" THEN lgth = 14 END SELECT 'IF lgth = 14 AND TY$ = "#" THEN CALL RawUII(Call$, a$, lgth, k, Pos$, keep) 'IF lgth = 49 AND as4$ = "$ULT" THEN CALL RawUII(Call$, a$, lgth, k + 3, Pos$, keep) 'IF lgth = 42 AND aS2$ = "!!" THEN CALL RawUII(Call$, a$, lgth, k, Pos$, keep) IF lgth THEN CALL RawUII(Call$, a$, lgth, k, Pos$, Keep) IF Keep = 0 THEN GOTO GoodRcv IF Auto THEN IF INSTR(R0MIR$, LEFT$(Call$, 5)) THEN SAREXtime = TIMER TY2$ = MID$(a$, k + 10, 1) IF TY2$ = "_" THEN MID$(a$, k + 10, 1) = "-"'Do Kills to KILLED REM TY2$ still has _ Kill char in it 'HEARD WAS HERE TY2N$ = MID$(a$, k + 11, 1)'ck for new format IF TY2N$ = "_" THEN MID$(a$, k + 11, 1) = "-"'new to avoid error due to WX below OK = 0: Rpt = 0 IF TY$ = ":" AND TY2N$ = ":" THEN TY2$ = ":": OK = 1: k = k + 1 td = INSTR(k + 4, a$, "-")'Makes sure it is an APRS MSG IF MID$(a$, k + 7, 3) = " " OR (td AND td < k + 8) THEN OK = 1 IF MID$(a$, k + 1, 3) = "BLN" THEN OK = 1' needed for longer BLN's REM ID stuff was here IF TY2$ = ":" AND OK THEN CALL RcvMsgCK(a$, k, Call$, AddFlg): GOTO GoodRcv es$ = "report" IF TY$ = ")" THEN 'cnvrts item to OBJ a = INSTR(a$, "!") IF a THEN TY$ = ";": MID$(a$, k + 1) = TY$: TY2N$ = "*" a$ = LEFT$(a$, a - 1) + SPACE$(11 - (a - k)) + "*" + ZTG$ + MID$(a$, a + 1) END IF END IF IF TY$ = ";" AND (TY2N$ = "*" OR TY2N$ = "_") THEN TY2$ = TY2N$: MID$(a$, k + 1) = MID$(a$, k + 2) + " " CALL REPORT(a$, j, k, Call$, Rpt, -1) ELSEIF INSTR("*_", TY2$) THEN CALL REPORT(a$, j, k, Call$, Rpt, 0) END IF IF TY2$ = "_" AND PM = -1 THEN s25$ = "Kld:": GOTO GoodRcv TY$ = MID$(a$, k + 1, 1) ' This TY$ DOES contain the - for killed IF TY$ = "$" THEN CALL DoNMEA(a$, k, Call$, Pos$): GOTO GoodRcv 'IF TY$ = "_" AND PM > 0 THEN CALL DoWxConv(a$, k, Pos$): GOTO GoodRcv IF TY$ = "_" AND PM > 0 THEN 'convert WinAPRS posless WX '_03311945wWWWsSSS MID$(PS(PM), 12) = MID$(a$, k + 4, 6) a$ = LEFT$(a$, k) + MID$(PS(PM), 11, 26) + "_" + MID$(a$, k + 11, 3) + "/" + MID$(a$, k + 15) 'MID$(Pos$, 10) = "%" L = LEN(a$): s25$ = "WX:": TY$ = "@" END IF REM normal beacon, ManPos, or FixPos 'S25$ = "APR:" Comment$ = MID$(a$, k + 1, 63) DoLtst = -1 x = k: a = INSTR(k, a$, "!") 'IF a AND a < k + 40 AND MID$(a$, a + 5, 1) = "." THEN TY$ = "!" ELSE a = 0 IF a AND a < k + 40 AND MID$(a$, a + 5, 1) = "." THEN TY$ = "!" ELSE a = k + 1 'IF INSTR("=!", TY$) THEN a = k + 1 IF INSTR("=!", TY$) THEN a$ = LEFT$(a$, k) + TY$ + ZTG$ + MID$(a$, a + 1): L = L + 7 END IF IF INSTR("@=*-/!", TY$) THEN 'its a posit! cf$ = MID$(a$, k + 9, 1) IF (cf$ < "0" OR cf$ > "9") AND L >= k + 21 THEN CALL Decode(cf$, a$, k + 7, LA, LO) CK$ = UCASE$(MID$(a$, x + 16, 1)) + UCASE$(MID$(a$, x + 26, 1)) TZ$ = MID$(a$, x + 8, 1) IF INSTR("NE,NW,SE,SW", CK$) <> 0 AND INSTR("/zhZH", TZ$) <> 0 THEN Tx = 28: DTGt$ = MID$(a$, k + 1, 8) IF MID$(a$, k + 27, 1) = "/" THEN 'waypoint symbol adj$ = MID$(a$, k + 17, 1) IF adj$ <> "/" THEN i = INSTR(Call$, "-"): IF i = 0 THEN i = 7 IF adj$ = "\" THEN adj$ = "P" MID$(Call$, i) = "-W" + adj$ WPS = PM: CALL FindP(Call$) IF PM = -1 THEN CALL AddP(Call$) MID$(a$, k + 28) = "waypoint " WPP = PM END IF END IF Pos$ = Call$ + " " + TY$ + MID$(a$, k + 2) c = 0 IF INSTR("/1@", MID$(Pos$, 41, 1)) > 0 THEN Tx = 36' Or /@1or s$ = MID$(Pos$, 37, 1) IF s$ = "_" OR s$ = "W" THEN s$ = MID$(Pos$, 45, 1) IF PM < 1 OR INSTR("tgG", s$) THEN '>825 fix CALL WXcheck(SPACE$(9) + MID$(a$, k), c) IF c = 12 THEN Alarm = PM: MID$(PS(PM), 10) = "A" ELSE Pos$ = LEFT$(Pos$, 37) END IF END IF IF MID$(Pos$, 28, 5) = "04000" THEN CALL CkPts(Pos$) IF MID$(Pos$, 19, 7) = "0000.00" THEN CALL Vicinity(a$, j, k, Xpos) IF Xpos = 0 THEN DoPos = -1: s25$ = "Pos:" IF STS$ = "" THEN DoLtst = 0 ELSE Comment$ = STS$: L = LEN(STS$) + k END IF ELSEIF INSTR("[]>", TY$) OR GinV OR Space OR MScat THEN 'GridSquare 'IF INSTR("] ", MID$(a$, k + 8, 1)) THEN Tx = 1 ELSE Tx = 0 'IF INSTR("] ", MID$(a$, k + 6, 1)) THEN Tx = 1 'IF Tx = 0 AND TY$ = ">" AND MID$(a$, k + 10, 1) = " " THEN Tx = 1: NewGD = -1'was 9 and NG for GRID! IF MID$(a$, k + 8, 2) = "] " THEN Tx = 1 ELSE Tx = 0 IF MID$(a$, k + 6, 1) = "] " THEN Tx = 1 IF Tx = 0 AND TY$ = ">" AND MID$(a$, k + 10, 1) = " " THEN Tx = 1: NewGD = -1'was 9 and NG for GRID! IF MID$(a$, k + 2, 2) < "AA" THEN Tx = 0 IF TY$ = "]" AND MID$(a$, k + 3, 1) = "[" THEN GSfmt = 3 IF GSfmt OR Space OR MScat THEN Tx = 1: Kpos = j ELSE Kpos = k IF GinV THEN Kpos = GinV IF Tx THEN CALL ParseGdSq(a$, Kpos, Call$, LALO$, c$) 'GS$ = MID$(a$, Kpos + 1, 8) IF LALO$ <> "" THEN sm$ = MID$(a$, Kpos + 8, 1) IF GinV THEN sm$ = "G" IF sm$ = " " THEN sm$ = "/" 'for 4 char grids IF NewGD THEN MID$(LALO$, 9, 1) = MID$(a$, k + 8): sm$ = MID$(a$, k + 9, 1) Pos$ = Call$ + " /" + ZTG$ + LALO$ + sm$ + MID$(a$, k + 1 + GSfmt) IF GSfmt THEN MID$(Pos$, 37, 1) = MID$(a$, k + 2, 1) DoPos = -1: DoLtst = 0: s25$ = "GdSq" END IF END IF END IF es$ = "doltst" IF DoLtst AND NOT Rpt THEN CALL FindL(Call$) IF lm = -1 THEN CALL AddL(Call$) IF LEFT$(ToAd$, 2) = "ID" THEN Id = Id + 1 IF s25$ = "Add:" THEN MID$(LS(lm), 18) = ".TNC ID:" + Comment$ CALL ViewBox(6) ELSE Dupe = 0: IF RTRIM$(Comment$) = RTRIM$(MID$(LS(lm), 18)) THEN Dupe = -1 s25$ = "BCN:" LS(lm) = Call$ + " " + DTGs$ + Comment$ TY$ = LEFT$(Comment$, 1): IF TY$ = ">" THEN s25$ = "STA:" IF Dupe = 0 THEN IF Space OR MScat THEN TY$ = ">": x$ = a$ ELSE x$ = LS(lm) IF INSTR("@:T", TY$) THEN TY$ = ">" IF NOT OnlyBCNS OR TY$ = ">" THEN CALL AddBL(x$): CALL CheckCW IF MID$(BL(LineB), 18, 2) = "T#" AND Display$ = "TLM" THEN CALL Telm(0) END IF s25$ = "New:" END IF CALL OverWrite(LS(lm), " Bcn", StrtL) 'was if not dupe END IF END IF ' IF MID$(BL(LineB), 18, 2) = "T#" AND Display$ = "TLM" THEN CALL Telm(0) ' line above moved in 845 to fix tlm GoodRcv: IF PM > 0 THEN IF TY2$ <> "_" THEN DG(PM) = Pn$ + LEFT$(a$, k) + SPACE$(30) MID$(HL(PM), 1) = CHR$(ASC(HL(PM)) + 1) IF ASC(HL(PM)) > 127 THEN MID$(HL(PM), 1) = CHR$(127) END IF XtRcv: IF L > 12 THEN CALL Print25th(2, s25$) IF NxWx >= 0 AND PM = NxWx THEN CALL DispWX(PM) es$ = "Finished RcvPkt" END SUB SUB DoXX (x, AB, a, B, c) MID$(PCT$(AB), a) = MID$(BL(x), B, c) 'Voltages END SUB SUB DShell (a$) SCREEN 0 PRINT Bln = 25: WIDTH 80, Bln LOCATE 25, 1: PRINT "To return to APRS, be sure you are in APRS directory and type EXIT..."; SHELL ("") SCREEN ScrnType IF ScrnType = 9 THEN PALETTE 6, 6 yfc = 14 * yft CALL InitVGA(a$) CALL ToGo END SUB SUB EL2alt CALL RangeRings(0, d) rng = d * 1.1508 'in miles CALL PR2N(EL, "Elevation Angle") alt = TAN(EL / 57.3) * rng * 528 '(10ft) MID$(PS(Hooked), 71) = " /A=" + LzN$(alt, 5) + "0" END SUB SUB FindComma (a$, kv, abort) IF kv > 0 AND kv < 139 THEN i = INSTR(kv, a$, ","): IF i >= kv THEN kv = i + 1 ELSE abort = -1 IF MID$(a$, kv, 1) = "," THEN abort = -1 ' Aborts on null field ELSE abort = -1: s25$ = "NoComma?": kv = 1 END IF END SUB SUB Format (Pos$, fs$) CALL ParseA(Pos$, TY$, LA, LO, sym$) YR = 4186 * (90 - LA) 'inverted to avoid alphabet XR = 2093 * (180 - LO) 'DOS only FOR i = 2 TO 0 STEP -1 c9 = 91 ^ i y$ = y$ + CHR$(33 + INT(YR / c9)): YR = YR MOD c9 x$ = x$ + CHR$(33 + INT(XR / c9)): XR = XR MOD c9 NEXT i CALL ParseVel(Pos$, sym$, CSE, CSE$, SPD, SPD$, BRG$, QAL$, CMTS, PHG$) CALL Dphg(PHG$, d, r, w) cs$ = "!!!" IF CMTS = 38 THEN cs$ = " !" ELSEIF CSE + SPD > 0 THEN cs$ = CHR$(CSE / 4 + 33) + CHR$(LOG(SPD + 1) / LOG(1.08) + 33) + "!" ELSEIF r <> 10 THEN cs$ = "{" + CHR$(LOG(r / 2) / LOG(1.08) + 33) + "!" END IF fs$ = LEFT$(sym$, 1) + y$ + "!" + x$ + "!" + RIGHT$(sym$, 1) + cs$ fs$ = fs$ + MID$(Pos$, CMTS) END SUB SUB FPrint CALL PR(a$, "PRINT: All(BMOT), Blns, Msgs, Objects, Status, Traffic, Posits, Wx, None") a = INSTR("BMOSTWP", a$) IF a THEN Pon = Pon XOR INT(2 ^ (a - .9999)) IF a$ = "A" THEN Pon = 1 + 2 + 4 + 16 'BMOT 'IF a$ = "W" THEN Pon = 1 + 2 + 32 IF a$ = "N" THEN Pon = 0: CALL PL2("", 0) CALL ToGo END SUB SUB Gamebox CALL PL2("My Move #" + STR$(MyMove) + " His #" + STR$(HisMove), 14) END SUB SUB Gfield (a, a$, B$, N) B = INSTR(a + 1, a$, ",") IF B >= a + 1 THEN B$ = MID$(a$, a + 1, B - (a + 1)) ELSE B = 1: B$ = "" END IF a = B N = VAL(B$) END SUB SUB GScalc (B$, a, Lat, Lon, Good) x$ = MID$(B$, a, 1) y$ = MID$(B$, a + 1, 1) IF x$ >= "0" AND x$ <= "9" AND y$ >= "0" AND y$ <= "9" THEN Lon = Lon - (ASC(x$) - 48) * 2 Lat = Lat + ASC(y$) - 48 Good = -1 ELSE Good = 0 END IF END SUB SUB HkMap CP = 360 FOR i = LineP TO 0 STEP -1 CALL ParseA(PS(i), TY$, LA, LO, sym$) d = ABS(LA - CPY) + ABS(LO - CPX) IF d < CP THEN CP = d: PT = i NEXT i IF PT = Hooked THEN Hooked = -1: Alarm = -1 ELSE Hooked = PT END IF CALL HookedDisp(PT) END SUB SUB IncPrd (Decay, F, M, k, Nxt) L = INSTR(PBvia$, "/") IF L = 0 THEN L = LEN(PBvia$) a = 1: c = 0 DO UNTIL a = 0 OR a > L + 1 'c = count hops in path c = c + 1 a = INSTR(a + 1, PBvia$, ",") d = INSTR(a + 1, PBvia$, "-") IF d THEN nn = VAL(MID$(PBvia$, d - 1, 1)): IF nn THEN c = c + nn - 1 LOOP IF ZipLan = -1 THEN c = 3 max = 600 IF c > 1 THEN max = c * 450 IF max > Maxtime THEN max = Maxtime Decay = 2 + Decay * ((F - .25) + RND(TIMER) / 2) IF Decay > M * max AND k THEN Decay = M * max 'k means limit it to max 'M appears to be always 1. '862 modified Objects to die...after 30 minutes Nxt = TIMER + Decay END SUB FUNCTION M2$ (a$, a) v = ASC(MID$(a$, a, 1)) - 28 M2$ = RIGHT$("0" + MID$(STR$(v), 2), 2) END FUNCTION SUB MapMenu (Drings, Fill, New, MapA, LockM, MyID$, Ovrly, RingSel, B$, GoToN) STATIC Iu$ GoToN = 0 CALL PR(a$, "MAPS: Config, Features, Lock, Mrkrs, Overlays, Plots, Show, Up,Dn,Home, <^>") B$ = RIGHT$(a$, 1) SELECT CASE a$ CASE IS < " ": GoToN = 1: IF B$ = "M" THEN x = -1 IF B$ = "K" THEN x = 1 IF B$ = "H" THEN y = 1 IF B$ = "P" THEN y = -1 CDX = CDX + x * RS / 30: CDY = CDY + y * RS / 60 CASE "D": B$ = "Q": GoToN = 4 CASE "U": B$ = "I": GoToN = 4 CASE "H": B$ = "G": GoToN = 4 CASE "F": CALL GetFeatures(GoToN, MapA) CASE "L": IF LockM = -1 THEN LockM = MapA: c = 15 ELSE LockM = -1: c = 0 LINE (1, 1)-(639, 336 * Yfg), c, B 'CASE "C": CALL PR(a$, "MAP-CONFIG: Background, ChangeMplist, Distros, ListMplists, OffsetDatum, Save") CASE "C": CALL PR(a$, "MAP-CONFIG: Background, ChangeMplist, Distros, ListMplists, Save") SELECT CASE a$ CASE "B" IF ScrnType > 2 THEN CALL PR2N(BGC, "BACKground Color") CALL PR2N(FGC, "Forground") COLOR FGC, BGC END IF CASE "C": 'p$ = "Using MAPLIST." + MapFile$ CALL PR23(MapFile$, a$, " Enter MAPLIST extension (USA,EAS,WES,MID,CEN,SE,NW,etc)", 0) IF LEN(a$) < 4 AND LEN(a$) > 0 THEN MapFile$ = a$: Fault = 0 GoToN = 9 CASE "S": GoToN = 8 CASE "D": CLS : PRINT "MAP DISTRO's LOADED:": LOCATE 5, 1: FILES "MAPS\*.TXT" CASE "L": CALL ClrScn: FILES "MAPLISTS\*.*" ' CASE "O": CALL PR2N(Ofn, "Offset map UP or DOWN(-). Enter offset in yards") ' CALL PR2N(Ofw, "Offset map LEFT or RIGHT(-). Enter offset in yards") ' GoToN = 1 END SELECT CASE "M": CALL PR23(Iu$, a$, "State-Interstate (SSNN) or (SS?)", 0): Iu$ = a$ 'CALL PR2N(Mk, "MileMarker") IF RIGHT$(Iu$, 1) = "?" THEN nm = -1 ELSE nm = 0 OPEN "SYSTEM\MM-DATA.DAT" FOR INPUT AS #3 LINE INPUT #3, a$ SS = 2: IF RS > 2 THEN SS = 5: IF RS > 16 THEN SS = 10: IF RS > 32 THEN SS = 20 DO UNTIL Id1$ = "END" INPUT #3, Id1$, K1, LA1, LO1 IF nm THEN IF LEFT$(Iu$, 2) = LEFT$(Id1$, 2) THEN PRINT Id1$; K1 ELSEIF Iu$ = Id1$ THEN INPUT #3, Id2$, K2, LA2, LO2 FOR Mk = 0 TO 900 STEP SS IF Mk > K2 THEN Id1$ = Id2$: K1 = K2: LA1 = LA2: LO1 = LO2 INPUT #3, Id2$, K2, LA2, LO2 END IF IF Iu$ <> Id2$ THEN EXIT FOR LA = LA2 - (K2 - Mk) * (LA2 - LA1) / (K2 - K1) LO = LO2 - (K2 - Mk) * (LO2 - LO1) / (K2 - K1) y = Yval(LA) 'plot it from below x = Xval(LO) r = 175 / RS: IF r < 6 THEN r = 6 CIRCLE (x, y), r, 15 CALL DoLabels(x, y, LTRIM$(STR$(Mk)), 0, 7) 'was F=1 NEXT END IF LOOP CLOSE #3 CASE "O": CALL OverlayPos CASE "S": CALL PR(a$, "SHOW: Alternate(Map under this one), Calls, Format(compressed), MapOverlaps") IF a$ = "C" THEN CALL DXall IF a$ = "M" THEN Borders = -1: Fill = -1: GoToN = 6 IF a$ = "A" THEN Tmp$ = "": Ovrly = 99: GoToN = 7'xnrml=-1 IF a$ = "F" THEN CALL PlotCur(LL$) CALL Format(SPACE$(18) + LL$ + "$", fs$)'new CALL PL4(MID$(fs$, 2, 8), 11) END IF CASE "P": CALL PR(a$, "PLOTS: Borders, CAPgrids, DF>, Gd-sq, FixedPHG, PwrHtGn, RngRngs, Traffic") RingSel = -1 SELECT CASE a$ CASE "B": Borders = -1: Fill = 0: MapSize = RS / 2: GoToN = 6 CASE "C": CALL PR(a$, "Automatic, Enable, Disable") CapGd = INSTR("AED", a$) - 1 '0=A, 1=E, D=2 IF CapGd <> 2 THEN CALL GridCap(64) IF CapGd = 2 THEN GoToN = 1 CASE "D": CALL PR(a$, "DF PLOTS: Fadeplot, Omni, Heard, Notheard") IF a$ = "F" THEN CALL FadePlot(MyID$) ELSEIF a$ <> "" THEN 'assumed O IF a$ = "H" THEN RingSel = 1 IF a$ = "N" THEN RingSel = 0 Drings = -1: Ovrly = 1: GoToN = 1 END IF CASE "G": CALL GridSQ(CPX, CPY, GdSq$, 1) CASE "R": CALL RangeRings(1, rng) CASE "F": Drings = 0: Ovrly = 1: Prings = -1: GoToN = 1 CASE "P": Drings = 0: Ovrly = 1: Prings = 99: GoToN = 1 CASE "T": GoToN = 10: 'CALL TraTr END SELECT END SELECT END SUB SUB MIC (ToCall$, a$, k, TLM$, STS$, MicE$) REM ToCall$ = "S8UY1Q" REM 385911N 07629.11W 123/045> REM mmmN0W REM 385911 ^721134 REM ]691205 REM These digits are n+28 ^^^^ CFg = 0: s25$ = MicE$ FOR i = 1 TO 6 'Lat B%(i) = 0: c = ASC(MID$(ToCall$, i, 1)) ': CFg = 0 SELECT CASE c CASE 90: c = 32 'Z = _ CASE 75: c = 32: B%(i) = 1 'K = _ CASE 76: c = 32: B%(i) = 1: IF i < 4 THEN CFg = -1 'L = _ Custom MSG CASE 80 TO 89: c = c - 32 'P-Y = Posit CASE 65 TO 74: c = c - 17: CFg = -1 'A-J = Custom Msg CASE ELSE: B%(i) = 1 END SELECT LA$ = LA$ + CHR$(c) NEXT i IF B%(4) THEN N$ = "S" ELSE N$ = "N" IF B%(5) THEN O$ = "0" ELSE O$ = "1" IF B%(6) THEN w$ = "E" ELSE w$ = "W" LA$ = LEFT$(LA$, 4) + "." + MID$(LA$, 5, 2) + N$ LO$ = O$ + M2$(a$, k + 2) + M2$(a$, k + 3) + "." + M2$(a$, k + 4) + w$ IF LEFT$(LO$, 2) = "18" THEN MID$(LO$, 1) = "10" 'Mic-2 tests IF LEFT$(LO$, 2) = "19" THEN MID$(LO$, 1) = "00" IF MID$(LO$, 4, 1) = "6" THEN MID$(LO$, 4, 1) = "0" a = ASC(MID$(a$, k + 5, 1)) IF a > 107 THEN MID$(a$, k + 5, 1) = CHR$(a - 80) 'fixes SPD+800 SC2$ = M2$(a$, k + 6) cs$ = RIGHT$(SC2$, 1) + M2$(a$, k + 7) + "/" + M2$(a$, k + 5) + LEFT$(SC2$, 1) a = VAL(LEFT$(cs$, 1)) IF a > 3 THEN MID$(cs$, 1) = MID$(STR$(a - 4), 2, 1) 'fixes CSE+400 sm$ = MID$(a$, k + 8, 1): adj$ = "/" IF NewE THEN adj$ = MID$(a$, k + 9, 1) M = 4 * B%(1) + 2 * B%(2) + B%(3) IF M = 7 THEN Alarm = PM: MID$(PS(PM), 10, 1) = "A": c$ = MID$("Off duty..Enroute...In ServiceReturning.Committed.Special...Priority..EMERGENCY!", 10 * M + 1, 10) 'SELECT CASE M '0 "Off duty.." '1 "Enroute..." '2 "In Service" '3 "Returning." '4 "Committed." '5 "Special..." '6 "PRIORITY.." '7 "EMERGENCY!" M$ = "/M": IF CFg THEN c$ = "Custom " + STR$(M): M$ = "/C" M$ = "/" + MicE$ + M$ + MID$(STR$(M), 2) + "/" + c$'Pos Comment cmt = 9: T = 0 ' had been cmt=14 and mid$(...4) IF NewE THEN cmt = 10 IF MID$(a$, k + 9, 1) = CHR$(29) THEN T = 10: s = 1: N = 5 IF MID$(a$, k + 10, 1) = "'" THEN T = 11: s = 2: N = 10 IF MID$(a$, k + 10, 1) = "`" THEN T = 11: s = 2: N = 4 IF T THEN cmt = T + N: TLMt$ = MID$(a$, k + T, N) STS$ = MID$(a$, k + cmt) '+ SPACE$(54) removed in 824 TY$ = "/": typ$ = ">Mic-E: " IF LEFT$(STS$, 1) = ">" THEN TY$ = "@": typ$ = ">TH-D7:" IF LEFT$(STS$, 1) = "]" THEN TY$ = "@": typ$ = ">D-700:" IF MID$(STS$, 5, 1) = "}" THEN a& = 8192 * V91(STS$, 2) + 91 * V91(STS$, 3) + V91(STS$, 4) - 10000 IF a& > 32700 THEN a& = 32700 a! = a& alt$ = "/A=" + LzN$(a!, 6) STS$ = LEFT$(STS$, 1) + MID$(STS$, 6) END IF STS$ = typ$ + STS$ IF LEN(STS$) = 8 THEN STS$ = "" p$ = LA$ + adj$ + LO$ + sm$ + cs$ + M$ + alt$ a$ = LEFT$(a$, k) + TY$ + ZTG$ + p$ + SPACE$(16) 'BL(LineB) = "N3MIM 222326 T#101,232,114,215,075,255,00110101" IF LEN(TLMt$) = 4 THEN TLMt$ = TLMt$ + CHR$(0) 'for pre-beta's IF T THEN TLM$ = "T#MIC" FOR i = 1 TO N STEP s IF T = 10 THEN a = ASC(MID$(TLMt$, i, 1)) IF T = 11 THEN CALL HEXDEC(TLMt$, i, 2, a) TLM$ = TLM$ + "," + LzN$(a, 3) IF N = 4 AND i = 1 THEN TLM$ = TLM$ + ",---" NEXT i: IF N = 4 THEN TLM$ = TLM$ + ",---,---" IF RTRIM$(MID$(BL(LineB), 18, 25)) <> TLM$ THEN CALL AddBL(Call$ + " " + DTGs$ + TLM$) END IF END IF END SUB SUB MouseB (BX%, cx%, DX%, ZOOM, a$, LL$, CYT) REM Changes in Page to pass thru HOME on L and P lists REM Change in CkPage: if C then gosub CenterNdrw STATIC CUMx%, CUMy%, NewPt, NewX, NewY, Last REM CurInc = 0 IF cx% <> CUMx% OR DX% <> CUMy% THEN CUMx% = cx% CUMy% = DX% CPX = CDX - (CUMx% - 320) / Sfac * Hfac CPY = CDY - (CUMy% - Ycen) / Sfac * Yfg CALL PlotCur(LL$) END IF IF BX% AND 2 AND Doz = 0 THEN ' RIGHT button IF LEFT$(Display$, 3) = " MP" THEN ZOOM = -1 LOCATE 1 + INT(Bln / 2), 26: PRINT "ZOOM .1 .2 .5 1 2 4 8 16" LINE (186, 168 * Yfg)-(440, 182 * Yfg), 14, B IF NewPt = 0 THEN NewX = CPX: NewY = CPY: NewPt = 1 a$ = "c" ELSE CYT = DX%: a$ = CHR$(0) + "G"'HOME END IF ELSEIF BX% AND 1 THEN 'LEFT button a$ = CHR$(13): IF LEFT$(Display$, 3) <> " MP" THEN CYT = DX% IF ZOOM THEN ZOOM = 0 Zfac = INT((CUMx% - 312) / 24) RS = RS * 2 ^ Zfac NewPt = 0: CPX = NewX: CPY = NewY a$ = CHR$(0) + "G"'HOME to redraw ELSEIF CUMx% < 104 AND CUMy% < 42 * Yfg AND LEFT$(Display$, 3) = " MP" THEN a$ = "P" END IF END IF IF a$ <> "" THEN IF ABS(TIMER - Last) > .2 THEN Last = TIMER ELSE a$ = "" END IF END SUB SUB NewScrn (d$, c, d) CALL ClrScn IF d$ <> "" THEN Display$ = d$ LINE (0, 0)-(639, 2.3 * yfc), c, BF LINE (5, 5)-(634, 2.3 * yfc - 5), d, BF LOCATE 2, 3 END SUB SUB NxtComma (a$, k, B$) 'k is start of field coming in 'returns Field value in B$ s = k L = LEN(a$): a = INSTR(L - 6, a$, "{"): IF a THEN L = a - 1 a = INSTR(k, a$, ",") IF a >= k THEN k = a + 1: L = a - 1 IF s <= L THEN B$ = MID$(a$, s, L - s + 1) ELSE B$ = "" END SUB SUB OutGGA (pp, OWPL) IF Oprt THEN Prt = 2 tme$ = MID$(ZTG$, 3, 4) + MID$(TIME$, 7, 2) + "," Lat$ = MID$(PS(pp), 19, 7) IF Lat$ <> "0000.00" AND INSTR(PS(pp), "vicinity") = 0 THEN Lat$ = Lat$ + "," + MID$(PS(pp), 26, 1) + "," Lon$ = MID$(PS(pp), 28, 8) + "," + MID$(PS(pp), 36, 1) + "," alt$ = "": a = INSTR(PS(pp), "/A=") IF a > 44 THEN alt$ = MID$(PS(pp), a + 3, 6) IF OWPL AND TNCon THEN 'Pnmea needs global TC, HkPos menu, LogP CLL$ = RIGHT$(RTRIM$(LEFT$(PS(pp), 9)), 6) a$ = "GPWPL," + Lat$ + Lon$ + CLL$ CALL Pnmea(a$, 1) ELSE a$ = "GPGGA," + tme$ + Lat$ + Lon$ + "4,,," + alt$ + ",F,,,," CALL Pnmea(a$, Prt) 'a$ = "GPGSA,A,3,02,07,15,19,,,,,,,,,2.9,1.9,1.9" 'CALL Pnmea(a$,Prt) 'a$ = "GPGSV,1,1,04,02,38,303,44,07,20,245,42,15,53,115,42,19,48,179,43" 'CALL Pnmea(a$,Prt) IF MID$(PS(pp), 41, 1) = "/" AND MID$(PS(pp), 45, 1) = "/" THEN 'w48&52 or /@1or CSE$ = MID$(PS(pp), 38, 3) SPD$ = MID$(PS(pp), 42, 3) Pause (.2) a$ = "GPVTG," + CSE$ + ",T,,M," + SPD$ + ",N,,K" CALL Pnmea(a$, Prt) END IF END IF END IF END SUB SUB OverlayPos STATIC OF$ max = 128 CALL PR(a$, "ATV, Crashes, Digis, Freqs, Gates, NWS, Other, RShcks, Stores, Voice, WX, Zips") F$ = "" SELECT CASE a$ CASE "A": Prings = -1: F$ = "ATV": max = 256 CASE "C": F$ = "CRASHES." + MapFile$ CASE "D": Prings = -1: F$ = "DIGIS": max = 256 CASE "F": Prings = -1: F$ = "FREQS": max = 1024 CASE "G": F$ = "GATES": max = 512 CASE "N": F$ = "NWSPOSNS" CASE "O": F$ = "O" CASE "R": F$ = "RSHACKS." + MapFile$ CASE "S": F$ = "STORES" CASE "V": F$ = "VOICE." + MapFile$ CASE "W": F$ = "NWR." + MapFile$ CASE "Z": F$ = "ZIPCODES." + MapFile$ END SELECT IF F$ <> "" THEN IF F$ = "O" THEN IF MSp THEN CALL ClrScn: FILES "POS\*.*" ELSE CALL PL24("Do FILES-DOS then DIR POS for list", 14) END IF CALL PR23(OF$, F$, "Enter Other filename", 0) OF$ = F$ END IF IF MSp THEN SCREEN , , 1, 1: Csp = 1 CALL SetSubDir("POS", "POS") OPEN F$ FOR INPUT AS #3 CALL PR(z$, "[A] Add to p-list or Onetime-Overlay [O]") IF RS > max THEN TagsON = 0 DO UNTIL EOF(3) LINE INPUT #3, a$ a = INSTR(a$, "!") IF LEFT$(a$, 1) = "*" THEN CALL PRa("", a$) ELSEIF a > 0 THEN LP = LineP + 1: PS(LP) = LEFT$(a$, a - 1) + " " MID$(PS(LP), 11) = "*" + ZTG$ + MID$(a$, a + 1)'was DTGs+ CALL Drawunit(0, LP, Tmp$, 0, 0, ons) 'new 825 IF ons AND z$ = "A" AND LP < Pmax THEN LineP = LineP + 1 END IF LOOP CLOSE #3 Prings = 0 TagsON = -1 END IF END SUB SUB ParseGdSq (a$, k, Call$, LALO$, c$) REM ............:[FM18sv] where : is at position K REM W3XYZ>FM18SV:]$[...where $ is symbol REM W3XYZ>FM18SV:]$[...^HP where Heading= 0-Z * 10: P=SQR(P/100) REM W3XYZ>FM18sv/1:]${...^HP (for KAMS) REM W3XYZ>APRS :>GG##gg/$ comments REM K is ^12345678901 B$ = "[JJ55LL]" MID$(B$, 1) = UCASE$(MID$(a$, k + 1)) Lon = 180 - (ASC(MID$(B$, 2, 1)) - 65) * 20 Lat = (ASC(MID$(B$, 3, 1)) - 65) * 10 - 90 CALL GScalc(B$, 4, Lat, Lon, Good) es$ = "Inside parseGdSq" Rndo = ASC(MID$(Call$, 4, 1)) - 65 '0 to 26 always positive Rnda = ASC(MID$(Call$, 2, 1)) - 48 '0 to 43 IF INSTR("] ", MID$(B$, 6, 1)) THEN ' its 4 digit 'Since only 4 digit, add some randomness and sym$="q" Lon = Lon - Rndo / 27 Lat = Lat + Rnda / 44 c$ = "q" + MID$(a$, k + 7) MinRange = 128 ELSE 'its 6 digits IF MID$(B$, 6, 2) < "AA" THEN Good = 0 Lon = Lon - (ASC(MID$(B$, 6, 1)) - 65) * 5 / 60 - .005 '.02 adds 1/4 sq Lat = Lat + (ASC(MID$(B$, 7, 1)) - 65) * 2.5 / 60 + .005 Lon = Lon - Rndo / 600 Lat = Lat + Rnda / 1300 L = LEN(a$): ct = INSTR(a$, "^") 'MScat pkts /p:...^HP (/p is port in KAM) IF L = ct + 2 THEN H = ASC(MID$(a$, ct + 1, 1)) - 48: IF H > 16 THEN H = H - 7 p = ASC(MID$(a$, ct + 2, 1)) - 48 IF p > 0 AND p < 10 THEN p = 100 * p ^ 2 ELSE p = 0 IF H > 0 AND H < 37 THEN H = H * 10 ELSE H = 0 c$ = "G" + LzN$(H, 3) + "/" + LzN$(p, 3) + " watts Meteor Scatter!" ELSE c$ = "G" + MID$(a$, k + 9) END IF MinRange = 8 END IF IF Good AND ABS(Lat) < 90 AND ABS(Lon) < 180 THEN CALL XYtoLL(Lat, Lon, "/", LALO$) IF CWon THEN CALL SendCW(MID$(a$, k + 2, 4)) IF MinRange = 128 THEN MID$(LALO$, 4, 4) = " . ": MID$(LALO$, 14, 4) = " . " ELSE MID$(LALO$, 6, 2) = " ": MID$(LALO$, 16, 2) = " " END IF c$ = c$ + "...................................." ELSE LALO$ = "": c$ = "c" END IF es$ = "GS done" END SUB SUB ParseLL (a$, kv, LL$, abort) CALL FindComma(a$, kv, abort): LL$ = MID$(a$, kv, 7) CALL FindComma(a$, kv, abort): LL$ = LL$ + MID$(a$, kv, 1) + "/" CALL FindComma(a$, kv, abort): LL$ = LL$ + MID$(a$, kv, 8) CALL FindComma(a$, kv, abort): LL$ = LL$ + MID$(a$, kv, 1) IF abort AND PM = 0 THEN CALL PL118("BAD NMEA L/L: " + LEFT$(LL$ + " ", 19), 11) END IF END SUB SUB ParseTime (a$, kv, tme$) abort = 0 i = INSTR(kv, a$, ","): IF i >= kv THEN kv = i + 1 ELSE abort = -1 DA$ = LEFT$(ZTG$, 2) 'IF Zulu = 0 AND val(mid$(a$, kv, 2)) + UTC < 0 THEN 'a new day ' DA$ = LzN$(VAL(DA$) + 1, 2) ' IF DA$ = "32" THEN DA$ = "01" 'END IF tme$ = LEFT$("@" + DA$ + MID$(a$, kv, 4) + "z ", 8)'Buoy? IF GetGPStime THEN GetGPStime = 0 HR$ = LEFT$(TIME$, 3) TIME$ = HR$ + MID$(a$, kv + 2, 2) + ":" + MID$(a$, kv + 4, 2) CALL PL118("* PC now locked to GPS mins & secs *", 14): CALL SendCW("OK") END IF IF abort THEN tme$ = "*******/" END SUB SUB Pnmea (a$, Prt) FOR i = 1 TO LEN(a$) cs% = cs% XOR ASC(MID$(a$, i, 1)) NEXT i Lb = INT(cs% / 16) Rb = INT(cs% - Lb * 16) IF Lb < 10 THEN Lb$ = CHR$(Lb + 48) ELSE Lb$ = CHR$(Lb + 55) IF Rb < 10 THEN Rb$ = CHR$(Rb + 48) ELSE Rb$ = CHR$(Rb + 55) IF Prt THEN PRINT #Prt, "$"; a$; "*"; Lb$; Rb$; CHR$(13); CHR$(10); END SUB SUB Qresp (a$, k, Call$, B) CALL ViewBox(4) REM B=0 means ASAP, B=1 means later MID$(HL(Pmax + 2), 1) = CHR$(ASC(HL(Pmax + 2)) + 1) Qrng = 8192: LA = CDY: LO = CDX REM W3XYZ....:?APRS$ W3ABC TY$ = MID$(a$, k + 14, 3) x$ = RTRIM$(MID$(a$, k + 18, 9)) Rack$ = "}" + ACK$ SELECT CASE TY$ CASE "RSP": Qpo = -1: B = 0 CASE "RSM": Qms = -1: B = 0 CASE "RSO": Qob = -1: B = 0 CASE "RSS": QST = -1: B = 0 CASE "RSD": x$ = "" FOR i = 1 TO LineP IF LEFT$(DG(i), 1) = "*" THEN j = INSTR(DG(i), ">"): IF j < 3 OR j > 10 THEN j = 10 x$ = x$ + MID$(DG(i), 2, j - 2) + " " END IF NEXT i x$ = LEFT$(x$, 62) CALL Xmit(3, ":" + Call$ + ":Dir= " + x$ + Rack$)' + "{:") CASE "RSH" FOR i = 1 TO LineP IF x$ = LEFT$(PS(i), LEN(x$)) THEN CALL Xmit(3, ";" + LEFT$(PS(i), 9) + "*" + MID$(PS(i), 12)) CALL PHrdLN(i, d$, 12) CALL Xmit(3, ":" + Call$ + ":Hrd " + x$ + " " + d$ + Rack$)'+"{:") END IF NEXT i CASE "RST" CALL Xmit(3, ":" + Call$ + ":PATH= " + RTRIM$(DG(PM)) + Rack$)'+"{:") CASE ELSE: Qpo = -1: Qob = -1: Qms = -1: QST = -1 END SELECT CALL ParseA(PS(0), TY$, LA, LO, sym$): Laq = LA: Loq = LO IF LEN(a$) > k + 19 THEN 'CALL ParseA(PS(0), TY$, LA, LO, sym$) Laq = VAL(MID$(a$, k + 7, 6)): Loq = -VAL(MID$(a$, k + 14, 7)) Qrng = VAL(MID$(a$, k + 22, 4)) IF Qrng < 8 ^ Bfac THEN B = 0 END IF a = (Bfac * 5) + B * INT(60 * RND(1) * (Bfac)) 'randomly IF ABS(LA - Laq) < Qrng / 70 AND ABS(LO - Loq) < Qrng / 70 * Lfac THEN REM randomly in 1 min (or 2 for HF) IF Qpo THEN NxPOS = TIMER + a IF QST THEN NxBCN = TIMER + a + 4 a = a + 4' spread things out a little... FOR i = 1 TO LineP IF Qob AND NxOBJ(i) > TIMER + a THEN NxOBJ(i) = TIMER + a: a = a + 2 NEXT i FOR i = 1 TO nsl IF Qms AND NxMSG(i) > TIMER + a THEN NxMSG(i) = TIMER + a + i NEXT i END IF END SUB SUB RawUII (Call$, a$, lgth, k, Pos$, Keep) es$ = "rawuii" s25$ = "WX:" ' 123456789-12345 'QRX is commanded by :*wHR7XXXDDrYYY 'Where HR is hour, DD is day, XXX*YYY=2304 WX$ = MID$(a$, k): REM no leading linefeed... so k=k+1-1 CALL ParseWX(-1, WX$, WXrpt$, r, lgth) IF PM = -1 THEN CALL AddP(Call$) MID$(PS(PM), 37, 1) = "_" Pos$ = PS(PM): DoPos = -1 MID$(Pos$, 10) = "%@" + ZTG$ MID$(Pos$, 37) = WXrpt$ Keep = 0 END SUB SUB RcvMsgAdd (a$, Rmsg$, Resp$, LineNo$, Rack$, Call$) Dupe = 0 FOR i = 1 TO nmg IF Rmsg$ = msg$(i) THEN Dupe = i NEXT i 'a = INSTR(LEN(a$) - 5, a$, "{") '845 removed 'IF a THEN LineNo$ = MID$(a$, a + 1) 'new in 845 '{MM}AK ACK$ = LEFT$(LineNo$, 2)'lineMM to ack ACall$ = Call$ 'IF MID$(LineNo$, 3, 1) = "}" THEN IF Rack$ <> "" THEN CALL AckedMSG(Call$, Rack$ + "}", "ACK") CALL PL1("REPLY ACK" + LineNo$, 10) END IF Resp$ = ":ack" + LineNo$ 'Tagn$ = ":" + LEFT$(Call$, 9) + Resp$ 'new in 843 moved to RcvMsgCk IF Dupe = 0 THEN NewMsg = -1 IF nmg + 1 > UBOUND(msg$) - (nsl + 1) THEN Resp$ = ":rej" + LineNo$ 'ELSEIF nmg + 1 + nsl > 23 AND Mbln = 43 THEN Bln = 43: yfc = 8 * yft ELSE nmg = nmg + 1: msg$(nmg) = Rmsg$: Dup(nmg) = 0 CALL AddBL(LEFT$(Rmsg$, 9) + " " + DTGs$ + MID$(Rmsg$, 10, LEN(Rmsg$) - 12)) 'was -13 'line above now they say is printing too short? Why did I make it -12? IF Doz THEN ELSEIF MID$(Rmsg$, 11, 3) = "NS\" THEN NR$ = LEFT$(Rmsg$, 10) + "NR\" + LEFT$(BL(LineB), 9) NR$ = NR$ + "\" + ZTG$ nmg = nmg + 1: msg$(nmg) = NR$ IF Doz = 0 THEN CALL NTSdisp(0, nmg, -1) ELSE CALL ReadPage(Lin) END IF CALL CheckCW END IF: CALL SendCW("K") ' and QUIT ELSE Dup(Dupe) = Dup(Dupe) + 1 s25$ = "DUPE[" + MID$(STR$(Dup(Dupe)), 2) + "] " + LEFT$(a$, 70) Twn = 1: ' Tagn$ = ":" + LEFT$(Call$, 9) + Resp$ IF Dup(Dupe) > 3 AND MScat = 0 THEN z$ = " Your ACKS to " + RTRIM$(Call$) z$ = z$ + " may not be routed correctly. Check your digipeater path" CALL PL24(z$, 12) CALL SendCW("?") END IF END IF END SUB SUB RcvMsgCK (a$, k, Call$, AddFlg) AddFlg = 0: s25$ = "Msg:" a = INSTR(k + 3, a$, " ") B = INSTR(k + 3, a$, "-"): IF B = 0 OR B > k + 6 THEN B = k + 7 IF a > k + 9 OR a < 2 THEN a = k + 10 ' call=9chrs Tcall$ = UCASE$(MID$(a$, k + 1, a - k - 1)) L = LEN(a$) '845 IF L > 20 THEN '845 Ln = INSTR(L - 5, a$, "{")' new in 845 LineNo$ = "": IF Ln THEN LineNo$ = MID$(a$, Ln + 1)'845 xxxxx or MM}AK RLn = INSTR(L - 3, a$, "}"): IF RLn = 0 THEN RLn = L ELSE Rack$ = RIGHT$(a$, 2) Rmsg$ = Call$ + MID$(a$, k + 10, RLn - k - 9)'845 a = 0: IF Tcall$ = RTRIM$(LEFT$(PS(0), 9)) THEN a = 1'its to me IF a OR LEFT$(Tcall$, B - k - 1) = LEFT$(PS(0), B - k - 1) THEN 'or my SSID's Resp$ = UCASE$(MID$(a$, k + 11, 3)) IF Resp$ = "?AP" THEN CALL Qresp(a$, k, Call$, 0) ELSEIF Resp$ = "ACK" THEN AckNo$ = MID$(a$, k + 14) IF MID$(AckNo$, 3, 1) = "}" THEN AckNo$ = LEFT$(AckNo$, 3) '845 CALL AckedMSG(Call$, AckNo$, Resp$) 'Following code was a SUB 'reinstitute this sub, and remove MLC=10 in NTS '845 'new lines in rcvmsgadd {MM}AK 'SendMSGs, put in ak$=ACK$ on end at XMIT 'sendline adds "}" adn removes Message number from NTS 'Read page Rmsg$ devoid of ACK# now 'temp display of Line # in READPAGE ELSEIF Resp$ = "REJ" THEN CALL SendCW("NAK") ELSE REM msg to me, so Ack, (or reject) IF a <> 0 AND (Pon AND 2) <> 0 AND nsl + nmg > 20 THEN CALL KillMsg CALL RcvMsgAdd(a$, Rmsg$, Resp$, LineNo$, Rack$, Call$)'845 IF MID$(a$, k - 1, 1) = ":" THEN x$ = ":" 'IF RIGHT$(Resp$, 1) <> ":" THEN 'removed in 801. Donno what it was IF a AND LEN(Resp$) > 4 THEN IF Ln < k + 19 THEN B$ = MID$(a$, k + 11, 4): Parm = VAL(MID$(a$, k + 15)) was = INP(888) IF B$ = "SET " THEN OUT 888, was OR Parm IF B$ = "OFF " THEN OUT 888, was AND (255 - Parm) IF B$ = "READ" THEN Resp$ = ":I/O =" + STR$(was) END IF Tagn$ = x$ + Call$ + Resp$ 'new 843 CALL Xmit(3, Tagn$) IF nsl AND MID$(Mst$(1), 4, 5) = "REPLY" THEN CALL Xmit(3, ":" + Call$ + ":AA:" + MID$(Mst$(1), 14) + "}" + ACK$)'new END IF END IF END IF ELSE 'Its NOT mine IF Tcall$ = "HELP!" THEN Alarm = PM: MID$(PS(PM), 10, 1) = "A": IF MID$(a$, k + 1, 3) = "BLN" THEN CALL BLTNSin(a$, k, Call$, Tcall$) ELSEIF INSTR(Mgrp$, Tcall$) OR Alarm = PM THEN Rmsg$ = LEFT$(Tcall$ + ":" + Call$ + MID$(a$, k + 10), 80) CALL RcvMsgAdd(a$, Rmsg$, Resp$, "LN", "", Call$)'Rmsg$ includes LN$, but so? Twn = 0 ELSE CALL RdMail(a$, k, Call$, Tcall$) END IF CALL ViewBox(5) END IF ELSE 'it was too short END IF END SUB SUB ReadHdr CALL NewScrn("", 13, 5) PRINT " MESSAGES TO/FROM YOU and MSGgroups "; Mgrp$ LOCATE 4, 1 PRINT "APRS has one page for FROM/TO messages. More msgs will be rejected. Use S to" PRINT "send, E to erase your lines or K to kill old msgs. Use F2 to REPLY to last msg" PRINT "To copy a msg, enter a single digit line#. Send shorterm Bulletins to BLN# and" PRINT "longterm announcements to BLNA, or to groups as BLN#GRP. Msgs are saved on the" PRINT "LIST-LOG page & LOGS directory if LOG is on. Messgs to LOG & MSG are saved but" PRINT "not sent. If 1st msg is to REPLY, APRS AutoAnswers incoming msgs. W shows WHEN" PRINT "is next xmission" PRINT PRINT "Hit N to see NTS traffic and ALT-N to send NTS traffic." CALL Bline(0) END SUB SUB ReadPage (Lin) es$ = "READ" NewMsg = 0 'IF Display$ <> "READ" AND ScrnType > 2 THEN 'was <>CGA Lin = Bln - 2 - nmg - nsl 'was -1 Strt = (Lin - 1) * L01 IF Lin < 1 THEN Lin = 1 LOCATE Lin, 1 FOR i = 1 TO nsl L = LEN(Mst$(i)) IF L > 5 THEN Ln = INSTR(L - 5, Mst$(i), "{") IF Ln THEN L = Ln - 1 PRINT LEFT$(LEFT$(Mst$(i), L) + SPACE$(80), 80); NEXT i: 'IF Display$ = "VIEW" THEN 'new ' CALL ViewBox(13) 'ELSE Display$ = Display$ + "READ" NewRead = -1 FOR i = 1 TO nmg L = LEN(msg$(i)) 'new in 845 IF L > 5 THEN Ln = INSTR(L - 5, msg$(i), "{") ELSE Ln = 0 IF Ln THEN L = Ln - 1 'PRINT "Fm "; LEFT$(LEFT$(msg$(i), L) + SPACE$(67), 76); RIGHT$(msg$(i), 1); PRINT "Fm "; LEFT$(LEFT$(msg$(i), L) + SPACE$(67), 77); NEXT LINE (0, Strt)-(638, L22), 13, B LINE (0, Strt)-(639, Strt + L01 * nsl), 13, B 'END IF END SUB SUB ReCntr (r, LA, LO) r = 0 ' r=> REDRAW ZA = CDY - LA: ZO = CDX - LO: REM 75 is 60*1.25=70 Statute mi plus a little IF ABS(ZO) < 1 AND ABS(ZO) < 1 THEN RsX = RS / (50 * Lfac): RsY = .7 * RS / 50 'was 75 ef = .8 ' was ef = .8 for normal T and 1 fo replays IF ABS(ZO) > RsX THEN Zon = ef * RsX * SGN(ZO): r = -1 IF ABS(ZA) > RsY THEN Zan = ef * RsY * SGN(ZA): r = -1 IF r THEN CDX = LO - Zon: CDY = LA - Zan CALL OutGGA(PM, 0) END IF END SUB SUB Resource (sw) STATIC Rsrc$ IF sw THEN CALL PR23("", Fr$, "NAME (10)", 0) CALL PR23("", F1$, "1st (10)", 0) CALL PR23("", F2$, "2nd (10)", 0) CALL PR23("", F3$, "3rd (10)", 0) CALL PR23("", F4$, "4th ( 5)", 0) Rsrc$ = LEFT$(PS(0), 9) + ">" + SPACE$(61) MID$(Rsrc$, 11) = F1$ MID$(Rsrc$, 21) = Fr$ MID$(Rsrc$, 34) = F2$ MID$(Rsrc$, 44) = F3$ MID$(Rsrc$, 65) = F4$ END IF KpIt$ = Altnet$ Altnet$ = "RESORC": CALL InitTNC(0) CALL Pause(2) CALL Xmit(1, "DX de " + Rsrc$) CALL Pause(4) DX(0) = Rsrc$ Altnet$ = KpIt$: CALL InitTNC(0) END SUB SUB SavPos (Pos$, TY$) STATIC DFnum CALL RightCall(Call$) DFnum = DFnum + 1: Call$ = Call$ + MID$(STR$(DFnum) + " ", 2, 6) CALL AddP(Call$) 'gets new PM too Pos$ = Call$ + TY$ + MID$(Pos$, 12)'w17&19 'MID$(PS(0), 46) = "000/000" MID$(Pos$, 42, 3) = "000" END SUB SUB StatusLine LOCATE 4, 1: PRINT "CALL/NAME RECVED @"; ZTG$; "STATUS TEXT " PRINT "--------- ------ ---------------------------------------------------------------" END SUB FUNCTION Tdeg$ (a$, L) T = INT(VAL(MID$(a$, L, 3)) * 9 / 5) IF MID$(a$, L, 1) = "M" THEN T = -T T = 32 + T T$ = LzN$(T, 3) IF T < 0 THEN MID$(T$, 1) = "-" Tdeg$ = T$ END FUNCTION SUB Telm (Flag) STATIC GotPCsat, AB$ DIM Parm$(13), UNIT$(13), Co(3, 5), CB(8) Lents$ = "7655454333222" 'Total 52 PARMs$ = "Battery,DIGI>1,Temp ,Rate ,AD-4,Bit 1,Bit2,Bit,Bit,Bit,X ,Y ,Z " UNITs$ = ".1volts,SSID=0,Deg F,Pot ,unit, , , , , , , , " EQNSs$ = "0,1,0,0,1,0,0,1,0,0,1,0,0,1,0" BITSs$ = "11111111,the APRS Mic-Encoder" IF GotPCsat AND Flag = 99 THEN Lents$ = "7655454333222" Lents$ = "5555533333343" '50 PARMs$ = "Bat-A,Bat-B,I-Bat,T-Stk,T-Bat,U-A,U-B,GPS,Rst,C72,H/M,LEDS,SYN" UNITs$ = "Volts,Volts,mAmps,Deg C,Deg C,off,off,ON,ON,ON,TBD,ON,ON" EQNSs$ = "0,.0983,0,0,.0983,0,-.0028,-1.076,219.6,0,.3414,-19.71,0,.3414,-19.71" 'For A side BITSs$ = "00000000,PCsat Side-" + AB$ 'A*.72 for B side Current END IF IF Flag THEN CALL NewScrn("TLM", 10, 5) LOCATE 2, 3: PRINT " APRS TELEMETRY FOR "; MID$(BITSs$, 10) LOCATE 4, 1: PRINT "CALL SER TIME "; LOCATE 6, 1: PRINT "------ --- ----"; FOR x = 1 TO mss ' Look in Messages a$ = MID$(Mail(x), 13, 4) B$ = MID$(Mail(x), 18) IF a$ = "BITS" THEN BITSs$ = B$ IF a$ = "PARM" THEN PARMs$ = B$ IF a$ = "UNIT" THEN UNITs$ = B$ IF a$ = "EQNS" THEN EQNSs$ = B$ NEXT x FOR x = 1 TO nsl ' Look in my messages a$ = MID$(Mst$(x), 14, 4) B$ = MID$(Mst$(x), 19) IF a$ = "BITS" THEN BITSs$ = B$ IF a$ = "PARM" THEN PARMs$ = B$ IF a$ = "UNIT" THEN UNITs$ = B$ IF a$ = "EQNS" THEN EQNSs$ = B$ NEXT x L = LEN(BITSs$) IF MID$(BITSs$, L - 1, 1) = "{" THEN BITSs$ = LEFT$(BITSs$, L - 2) 'LOCATE 2, 3: PRINT " APRS TELEMETRY FOR "; MID$(BITSs$, 10) 'LOCATE 4, 1: PRINT "CALL SER TIME "; 'LOCATE 6, 1: PRINT "------ --- ----"; k = 1: FOR i = 1 TO 13: CALL NxtComma(PARMs$, k, Parm$(i)): NEXT i k = 1: FOR i = 1 TO 13: CALL NxtComma(UNITs$, k, UNIT$(i)): NEXT i k = 1: FOR i = 1 TO 5 FOR j = 1 TO 3 CALL NxtComma(EQNSs$, k, coef$) Co(j, i) = VAL(coef$) NEXT j NEXT i FOR i = 1 TO 8: CB(i) = VAL(MID$(BITSs$, i, 1)): NEXT i clm = 17 FOR i = 1 TO 13 N = VAL(MID$(Lents$, i, 1)) LOCATE 4, clm: PRINT LEFT$(Parm$(i) + " ", N + 1); LOCATE 5, clm: PRINT LEFT$(UNIT$(i) + " ", N + 1); LOCATE 6, clm: PRINT LEFT$("--------", N) clm = clm + N + 1 NEXT i ' 123456789-123456789=123456789.123456789.1234 'Data$(1) = "N3MIM 222326 T#101,232,114,215,075,255,00110101" Cntr = 0 FOR x = LineB TO 1 STEP -1 IF MID$(BL(x), 18, 2) = "T#" AND MID$(BL(x), 23, 1) = "," THEN TLM$ = RTRIM$(BL(x)) Cntr = Cntr + 1 IF Cntr > Lm9 THEN EXIT FOR Cal$ = RIGHT$(" " + RTRIM$(LEFT$(TLM$, 9)), 6) Fb = 0 'Begin here to do special PCsat stuff IF Flag = 99 THEN AB = 99 'Cal$ = RIGHT$(RTRIM$(LEFT$(TLM$, 9)), 6) IF Cal$ = "3ADO-1" OR Cal$ = "3ADO-2" THEN AB = 0: AB$ = "A": Cal$ = "PCsatA" IF Cal$ = "SAT-11" OR Cal$ = "SAT-12" THEN AB = 1: AB$ = "B": Cal$ = "PCsatB" IF AB <> 99 THEN 'AND x = LineB THEN '******* GOt a PCSAT Packet GotPCsat = -1 RT$ = RIGHT$(TLM$, 6) '0000,0 MID$(PCT$(AB), 1) = "PCSAT-" + AB$ + "*" MID$(PCT$(AB), 11) = MID$(TLM$, 11, 12) MID$(PCT$(AB), 44) = MID$(TLM$, 44, 15) XX$ = MID$(RT$, 3, 2) 'LOCATE 18, 50: PRINT XX$ IF XX$ = "11" THEN CALL DoXX(x, AB, 24, 24, 7)'Voltages IF XX$ = "10" THEN CALL DoXX(x, AB, 32, 36, 3): IF AB$ = "B" THEN Fb = -1 IF XX$ = "10" THEN CALL DoXX(x, AB, 36, 28, 3)'tempStack IF XX$ = "01" THEN CALL DoXX(x, AB, 40, 28, 3)'tempBat 'CALL AddBL(PCT$(AB)) dont put in array anymore... TLM$ = PCT$(AB) END IF 'end of special PCSat stuff END IF IF Flag <> 99 OR (Flag = 99 AND AB <> 99) THEN PRINT Cal$; " "; 'PRINT LEFT$(TLM$, 6); " "; PRINT MID$(TLM$, 20, 3); " "; MID$(TLM$, 13, 4); FOR j = 1 TO 5 N = VAL(MID$(Lents$, j, 1)) + 1 v = VAL(MID$(TLM$, 20 + j * 4, 3)) IF j = 3 AND Fb THEN v = 1.18 * v - 17.5 'PCsat Bat-B current factor vv = Co(1, j) * v ^ 2 + Co(2, j) * v + Co(3, j) PRINT LEFT$(" " + STR$(vv) + " ", N); NEXT j: PRINT " "; FOR j = 1 TO 8 N = VAL(MID$(Lents$, 5 + j, 1)) IF VAL(MID$(TLM$, 43 + j, 1)) = CB(j) THEN a$ = UNIT$(5 + j) ELSE a$ = "... " END IF PRINT LEFT$(a$ + " ", N + 1); NEXT j: PRINT END IF END IF NEXT x END SUB SUB UnCmprs (a$, x%, y%) 'abc where c = .xxxxyyy ' x = 16*a + xxxx and y = 8*b +yyy c$ = RIGHT$(a$, 1): B$ = MID$(a$, 2, 1): d$ = LEFT$(a$, 1) cx% = INT((ASC(c$) - 27) / 8): cy% = (ASC(c$) - 27) - cx% * 8 x% = 16 * (ASC(d$) - 27) + cx% y% = Yfg * (8 * (ASC(B$) - 27) + cy%) END SUB FUNCTION V91 (a$, i) V91 = ASC(MID$(a$, i, 1)) - 33 END FUNCTION SUB Vicinity (a$, j, k, Xpos) 'Called on new ADD-P, if via BOX, or if 0000 'Xpos=0 at top 'ELSEIF PM = -1 THEN ' CALL AddP(Call$) ' CALL Vicinity(a$, j, k, Xpos): Xpos = 0 'it may still be a good pos 'ELSE IF INSTR(j, a$, "BOX") THEN CALL Vicinity(a$, j, k, Xpos) 'Later just before DoPos=-1 'if mid$(Pos$,19,7)="0000.00" THEN CALL Vicinity(a$, j, k, Xpos) 'if Xpos=0 then DoPos=-1.... IF Vcnty = 0 THEN Xpos = 0 x = 0: cma = INSTR(j, a$, ",") + 1 'Find FIRST digi IF cma = 0 OR cma > j + 11 THEN cma = INSTR(j + 1, a$, ">") + 1 FOR i = cma + 3 TO cma + 9 IF INSTR(",:*/>", MID$(a$, i, 1)) THEN x = i: i = cma + 9 NEXT IF x THEN Digi$ = LEFT$(MID$(a$, cma, x - cma) + " ", 9) FOR lc = 1 TO LineP IF LEFT$(PS(lc), 9) = Digi$ THEN x = INSTR(38, PS(lc), "{") mi = 6: IF x THEN mi = VAL(MID$(PS(lc), x + 1, 3)) / 1600 mi = mi * (RND(1) - .5) / 60 CALL ParseA(PS(lc), x$, LA, LO, x$) LA = LA + mi ' adds random +/- mi miles LO = LO + mi CALL XYtoLL(LA, LO, "\", LALO$) MID$(LALO$, 6) = " " MID$(LALO$, 16) = " " IF ABS(LA + LO) > 10 THEN MID$(PS(PM), 19) = LALO$ + ".vicinity" lc = LineP Xpos = -1 END IF NEXT END IF END IF END SUB SUB ViewBox (c) IF Display$ = "VIEW" THEN LINE (0, L22 - 1)-(639, L23), c, B END SUB SUB Xmit (a, a$) IF Doz = 0 AND TNCon THEN CALL PL1("Sending to TNC ", 14) CALL Noise(13) IF a = 2 THEN Pause (.2) e = INSTR(PBvia$, "ECHO") r = INSTR(PBvia$, "RELAY") GA = INSTR(PBvia$, "GATE,") w = INSTR(PBvia$, "WIDE,WIDE,WIDE") IF w THEN a1$ = " 3 WIDE's is not good amateur practice on APRS! " ELSEIF HF THEN IF e > 0 THEN a1$ = " ECHO is in your HF path! PLEASE RE-CONSIDER! " ELSEIF GA > 9 THEN a1$ = " Your HF path includes a digi. It DOUBLES QRM! " END IF ELSEIF (KAM AND GA > 22) OR (NOT KAM AND GA > 9) THEN a1$ = " Please don't GATE from VHF to HF! " END IF IF a1$(1) <> "" THEN LINE (120, 5.5 * yfc)-(540, 9.5 * yfc), 12, BF LOCATE 8, 17: PRINT a1$ CALL SendCW("?") END IF END IF END IF a$ = RTRIM$(a$) Pbit$ = "": Pth$ = ">APRZIP,ZDIGI:" IF CmpFmt = 3 THEN Pbit$ = "}": Pth$ = ">APR860,NOGATE:" IF ZipLan = -1 OR CmpFmt = 3 THEN PRINT #1, Pbit$; RTRIM$(LEFT$(PS(0), 9)); Pth$; CALL PIRNT(a$) IF Dual AND a > 1 THEN IF KAM = 2 THEN chf$ = "|0" ELSE chf$ = "~a" IF HF THEN PRINT #1, "|A"; ELSE PRINT #1, chf$; CALL PIRNT(a$) IF HF THEN PRINT #1, chf$; ELSE PRINT #1, "|A"; END IF LastPkt = TIMER END SUB SUB Xmscat a = 1: a$ = RIGHT$(TIME$, 2) IF a$ < "30" AND a$ > "14" THEN a = 2 IF a$ < "45" AND a$ > "29" THEN a = 3 IF a$ > "44" THEN a = 4 r1 = 100 / (MS + 1): IF r1 > 3 THEN r1 = 3 IF a = MSectr AND INT(r1 * RND(TIMER)) = 0 THEN IF Doz = 0 THEN CALL PL2(" TRANSMITTING MSCATTER", 14): CALL Noise(1) CALL ParseA(PS(0), TY$, LA, LO, sym$) 'Tx$ = ">" + Grid$ + sym$ + " " + RTRIM$(MID$(LS(0), 26)) Tx$ = "[" + Grid$ + "]" + RTRIM$(MID$(LS(0), 26)) FOR i = 1 TO 8 + MS / 8 CALL PIRNT(Tx$) NEXT END IF 'LastOne = a END SUB