LOCATE 11,10:INPUT "Enter last two digits of contest year ";yr$
IF yr$ = "" THEN year.agn
mode: LOCATE 13,34:PRINT " "
LOCATE 13,10:INPUT "Enter mode - SSB or CW ";mode$
mode$=UCASE$(mode$)
IF mode$ <> "SSB" AND mode$ <> "CW" THEN GOTO mode
IF mode$="CW" THEN my.report$="599"
IF mode$="SSB" THEN my.report$="59"
my.msg$ = my.report$ + my.zone$
get.ans:CLS
LOCATE 6,16
INPUT "Is this the beginning of the Contest Y/N ";ans$
ans$ = UCASE$(ans$)
IF ans$ <> "Y" AND ans$ <> "N" THEN get.ans
IF ans$ = "N" THEN GOSUB part.fill ELSE GOSUB full.fill
GOSUB sign.in
GOSUB prt.header
her.cal$="START":GOTO ctrycheck 'False start. Expedites startup time
GOTO his.call.in
band.in: band$=""
LINE (0,80)-(399,87),0,bf
LOCATE 11,1:INPUT "Enter Band ";band$
IF band$ = "1.8" OR band$ = "3.5" OR band$ = "7.0" OR band$ = "14" OR band$ = "21" OR band$ = "28" THEN GOSUB bandit:GOTO his.call.in
COLOR 5,0:LOCATE 12,3:PRINT band$;" is not a valid band, please Re-Enter."
BEEP:BEEP: COLOR 1,0
GOTO band.in
his.call.in:LINE (0,80)-(399,183),0,bf
his.call.in2:
my$ = "":her.cal$=""
LOCATE 12,1:PRINT "His Call or Band (-1 to quit): "; 'her.cal$
row = 12:col = 32:GOSUB gk
her.cal$ = my$
IF her.cal$ = "" THEN LOCATE 13,5:PRINT "Get a Call or part of call!":GOTO his.call.in2
LOCATE 13,5:PRINT STRING$(27," ")
IF her.cal$ = "-1" THEN GOSUB sign.out:GOTO wrap.today
IF her.cal$ = "1.8" OR her.cal$ = "3.5" OR her.cal$ = "7.0" OR her.cal$ = "14" OR her.cal$ = "21" OR her.cal$ = "28" THEN band$ = her.cal$:GOSUB bandit:GOTO his.call.in
her.cal$ = UCASE$(her.cal$)
i = 0
dup.loop:i = i + 1
IF i > qso.ptr THEN GOTO his.nr 'Call sign is not a duplicate
IF q$(i,1) = band$ AND q$(i,4) = her.cal$ THEN GOSUB f6 ELSE GOTO dup.loop
IF ckpfx$ = pfx$(l) THEN thisctry$=ctry$(l):cntint$=cnt$(l):inlist = true
IF ckpfx$ =< pfx$(l) THEN high=l-1 ELSE low=l+1
WEND
k=k-1
WEND
multcheck:
IF qso.ptr <> 0 THEN GOTO ckmore
IF qso.ptr = 0 THEN mult$=thisctry$
GOTO prt.it
ckmore: m=0
ckit:
m=m+1
IF m = qso.ptr+1 THEN mult$=thisctry$: GOTO prt.it
IF q$(m,1) = band$ AND q$(m,8) = thisctry$ THEN mult$ = " " :GOTO prt.it
GOTO ckit
prt.it:
IF her.cal$ = "START" THEN GOTO band.in
IF thisctry$ = "W" THEN mult$="": pt$ = "0":GOTO prt.it1
IF thisctry$ <> "W" AND cntint$ = "NA" THEN pt$="2" ELSE pt$="3"
prt.it1:
GOSUB prt.this.contact
GOSUB correct
GOSUB gk
GOTO put.routine
gk:i$= INKEY$: IF i$="" THEN gk
i = ASC(i$)
IF i = 13 AND sw$ = "CM" THEN GOTO exit1
IF i = 28 THEN GOSUB key28:GOSUB calc.speed:GOTO gk
IF i = 29 THEN GOSUB key29:GOSUB calc.speed:GOTO gk
IF i = 33 AND sw$ = "CM" THEN GOSUB s1:GOTO gk 's1 his corrected call + r
IF i = 35 AND sw$ = "CM" THEN GOSUB s3:GOTO gk 's3 qrl?
IF i = 36 AND sw$ = "CM" THEN GOSUB s4:GOTO gk 's4 qrl pse qsy
IF i = 37 AND sw$ = "CM" THEN GOSUB s5:GOTO gk 's5 ?
IF i = 64 AND sw$ = "CM" THEN GOSUB s2:GOTO gk 's2 r + msg
IF i = 127 AND sw$ = "CM" THEN GOTO delet
IF i = 129 AND sw$ = "CM" THEN GOSUB f1:GOTO gk 'F1 cq
IF i = 130 AND sw$ = "CM" THEN GOSUB f2:GOTO gk 'F2 msg
IF i = 131 AND sw$ = "CM" THEN GOSUB f3:GOTO gk 'F3 r + call
IF i = 132 AND sw$ = "CM" THEN GOSUB f4:GOTO gk 'F4 my call
IF i = 133 AND sw$ = "CM" THEN GOSUB f5:GOTO gk 'F5 his call
IF i = 134 AND sw$ = "CM" THEN GOSUB f6:GOTO gk 'F6 qso b4
IF i = 135 AND sw$ = "CM" THEN GOSUB f7:GOSUB ff7:GOSUB zonecheck1:GOSUB correct:GOTO gk 'F7 nr?
IF i = 136 AND sw$ = "CM" THEN GOSUB f8:GOTO gk 'F8 my nr
IF i = 11 AND sw$ = "CC" THEN COLOR 2,6:LOCATE 13,56:PRINT "Contest Mode ":PALETTE 0,.1,.3,.6:COLOR 1,0:sw$ = "CM":GOTO his.call.in
IF i = 11 AND sw$ = "CM" THEN COLOR 2,6:LOCATE 13,56:PRINT "Chit Chat Mode":PALETTE 0,0,0,0:sw$ = "CC":GOTO gk
IF sw$ = "CC" THEN GOSUB 1000:LOCATE 15,5:COLOR 1,2:my$ = my$ + i$:i$ = "":GOTO gk 'PRINT my$:
my$ = my$ + i$:i$ = ""
LOCATE row,col:PRINT my$:GOTO gk
exit1:RETURN
f1:LINE (0,168)-(279,175),0,bf:COLOR 1,0
f$ = "cq test " + my.call$ + my.call$ + "test"
LOCATE 22,10:PRINT f$
ctr2 = LEN(f$)
FOR loop = 1 TO ctr2
i$ = MID$(f$,loop,1)
GOSUB 1000
NEXT:RETURN
f2:LINE (0,168)-(335,175),0,bf:COLOR 1,0
IF mode$="CW" THEN my.report$="599" ELSE my.report$="59"
f$ = her.cal$ + " " +"5nn" + my.zone$
LOCATE 22,10:PRINT f$
ctr2 = LEN(f$)
FOR loop = 1 TO ctr2
i$ = MID$(f$,loop,1)
GOSUB 1000
NEXT:RETURN
f3:LINE (0,168)-(399,183),0,bf:COLOR 1,0
f$ = " r " + my.call$ + "test"
LOCATE 22,10:PRINT f$
ctr2 = LEN(f$)
FOR loop = 1 TO ctr2
i$ = MID$(f$,loop,1)
GOSUB 1000
NEXT:RETURN
f4:LINE (0,168)-(279,175),0,bf:COLOR 1,0
f$ = my.call$
LOCATE 22,10:PRINT f$
ctr2 = LEN(f$)
FOR loop = 1 TO ctr2
i$ = MID$(f$,loop,1)
GOSUB 1000
NEXT:RETURN
f5:LINE (0,168)-(279,175),0,bf:COLOR 1,0
f$ = her.cal$
LOCATE 22,10:PRINT f$
ctr2 = LEN(f$)
FOR loop = 1 TO ctr2
i$ = MID$(f$,loop,1)
GOSUB 1000
NEXT:RETURN
f6:
f$ = her.cal$ + " qso b4 " + my.call$ + "test"
ctr2 = LEN(f$)
FOR loop = 1 TO ctr2
i$ = MID$(f$,loop,1)
GOSUB 1000
NEXT:RETURN
f7:LINE (0,160)-(279,167),0,bf:COLOR 1,2
f$ = "nr? "
ctr2 = LEN(f$)
FOR loop = 1 TO ctr2
i$ = MID$(f$,loop,1)
GOSUB 1000
NEXT:RETURN
f8:LINE (0,160)-(279,167),0,bf:COLOR 1,2
f$ = "5nn" + my.zone$
ctr2 = LEN(f$)
FOR loop = 1 TO ctr2
i$ = MID$(f$,loop,1)
GOSUB 1000
NEXT:RETURN
s1:
f$ = her.cal$ + " r " + my.call$ + "test"
ctr2 = LEN(f$)
FOR loop = 1 TO ctr2
i$ = MID$(f$,loop,1)
GOSUB 1000
NEXT:RETURN
s2:LINE (0,168)-(279,175),0,bf:COLOR 1,0
f$ = "r " + "5nn" + my.zone$
LOCATE 22,10:PRINT f$
ctr2 = LEN(f$)
FOR loop = 1 TO ctr2
i$ = MID$(f$,loop,1)
GOSUB 1000
NEXT:RETURN
s3:
f$ = "qrl? "
ctr2 = LEN(f$)
FOR loop = 1 TO ctr2
i$ = MID$(f$,loop,1)
GOSUB 1000
NEXT:RETURN
s4:
f$ = "qrl pse qsy "+ my.call$
ctr2 = LEN(f$)
FOR loop = 1 TO ctr2
i$ = MID$(f$,loop,1)
GOSUB 1000
NEXT:RETURN
s5:
f$ = "?"
ctr2 = LEN(f$)
FOR loop = 1 TO ctr2
i$ = MID$(f$,loop,1)
GOSUB 1000
NEXT:RETURN
ff7:my$ = "":LINE (0,80)-(399,183),0,bf
LOCATE 14,20:PRINT "His report: "; 'her.msg$
row = 14:col = 32:GOSUB gk
mes$=my$
rst$=LEFT$(mes$,3)
her.zone$=RIGHT$(mes$,2)
her.msg$=rst$+her.zone$
GOSUB prt.this.contact:LINE (0,80)-(399,183),0,bf
RETURN
zonecheck1:
IF qso.ptr = 0 THEN nu.zone$=her.zone$:GOTO loop1
zonecheck2: u=0
zonecheck: u = u + 1
IF q$(u,1) = band$ AND q$(u,7) = her.zone$ THEN nu.zone$=" " :GOTO loop1
IF q$(u,1) = band$ AND q$(u,7) <> her.zone$ THEN zonecheck
IF u > qso.ptr THEN nu.zone$=her.zone$:GOTO loop1
GOTO zonecheck
ret3: LINE (63,72)-(640,79),0,bf
GOSUB prt.this.contact:LINE (0,80)-(399,183),0,bf
RETURN
ptr=0
delet:LINE (0,80)-(399,183),0,bf
LINE (63,72)-(640,79),0,bf
GOTO his.call.in2
bandit:LINE (63,72)-(640,79),0,bf
LOCATE 10,11:PRINT band$
IF band$="1.8" THEN b = 1
IF band$="3.5" THEN b = 2
IF band$="7.0" THEN b = 3
IF band$="14" THEN b = 4
IF band$="21" THEN b = 5
IF band$="28" THEN b = 6
fillzones:
LOCATE 5,10:line.ptr=0
FOR y = 1 TO 40
line.ptr=line.ptr +1
IF line.ptr > 20 THEN LOCATE 7,10:line.ptr=1
PRINT bz$(b,y);" ";
NEXT y
RETURN
crossout: LOCATE 5,10:line.ptr=0:COLOR 3,0
FOR y = 1 TO 40
line.ptr=line.ptr +1
IF line.ptr > 20 THEN LOCATE 7,10:line.ptr=1
IF bz$(b,y) = nu.zone$ THEN bz$(b,y) = " "
NEXT y
GOSUB fillzones
COLOR 1,0
RETURN
prt.this.contact:LINE (63,72)-(640,79),0,bf
COLOR 3,0
LOCATE 10,11:PRINT band$
LOCATE 10,16:PRINT my.date$
LOCATE 10,26:PRINT my.time$
LOCATE 10,33:PRINT her.cal$
LOCATE 10,45:PRINT my.msg$
LOCATE 10,53:PRINT her.msg$
LOCATE 10,62:PRINT nu.zone$
LOCATE 10,67:PRINT mult$
LOCATE 10,76:PRINT pt$
RETURN
prt.this.contact1:LINE (63,72)-(640,79),0,bf
COLOR 3,0
LOCATE 10,11:PRINT band$
RETURN
1000 'Code Generator
c$=CHR$(ASC(i$) OR 32)
IF c$="a" THEN b$=".-":GOTO 2000
IF c$="b" THEN b$="-...":GOTO 2000
IF c$="c" THEN b$="-.-.":GOTO 2000
IF c$="d" THEN b$="-..":GOTO 2000
IF c$="e" THEN b$=".":GOTO 2000
IF c$="f" THEN b$="..-.":GOTO 2000
IF c$="g" THEN b$="--.":GOTO 2000
IF c$="h" THEN b$="....":GOTO 2000
IF c$="i" THEN b$="..":GOTO 2000
IF c$="j" THEN b$=".---":GOTO 2000
IF c$="k" THEN b$="-.-":GOTO 2000
IF c$="l" THEN b$=".-..":GOTO 2000
IF c$="m" THEN b$="--":GOTO 2000
IF c$="n" THEN b$="-.":GOTO 2000
IF c$="o" THEN b$="---":GOTO 2000
IF c$="p" THEN b$=".--.":GOTO 2000
IF c$="q" THEN b$="--.-":GOTO 2000
IF c$="r" THEN b$=".-.":GOTO 2000
IF c$="s" THEN b$="...":GOTO 2000
IF c$="t" THEN b$="-":GOTO 2000
IF c$="u" THEN b$="..-":GOTO 2000
IF c$="v" THEN b$="...-":GOTO 2000
IF c$="w" THEN b$=".--":GOTO 2000
IF c$="x" THEN b$="-..-":GOTO 2000
IF c$="y" THEN b$="-.--":GOTO 2000
IF c$="z" THEN b$="--..":GOTO 2000
IF c$="1" THEN b$=".----":GOTO 2000
IF c$="2" THEN b$="..---":GOTO 2000
IF c$="3" THEN b$="...--":GOTO 2000
IF c$="4" THEN b$="....-":GOTO 2000
IF c$="5" THEN b$=".....":GOTO 2000
IF c$="6" THEN b$="-....":GOTO 2000
IF c$="7" THEN b$="--...":GOTO 2000
IF c$="8" THEN b$="---..":GOTO 2000
IF c$="9" THEN b$="----.":GOTO 2000
IF c$="0" THEN b$="-----":GOTO 2000
IF c$="." THEN b$=".-.-.-":GOTO 2000
IF c$="?" THEN b$="..--..":GOTO 2000
IF c$="," THEN b$="--..--":GOTO 2000
IF c$="-" THEN b$="-...-":GOTO 2000
IF c$="/" THEN b$="-..-.":GOTO 2000
IF i$=" " THEN b$=" ":GOTO 2000
IF i$=CHR$(8) THEN 'BACKSPACE FOR SENDING ERROR
b$="........"
LOCATE ,POS(0)
PRINT"";
GOTO 2000
END IF
IF i$=":" THEN b$="---...":GOTO 2000
IF i$=";" THEN b$="-.-.-.":GOTO 2000
IF i$="(" OR c$=")" THEN b$="-.--.-":GOTO 2000
IF i$="=" THEN b$="...-.-":GOTO 2000 'USE = FOR SK
IF i$="]" THEN b$=".-.-.":GOTO 2000 'USE ] FOR AR
IF i$="[" THEN b$="-...-.-":GOTO 2000 'USE [ FOR BK
IF i$="\" THEN b$=".-...":GOTO 2000 'USE \ FOR AS
c$="" :b$="":i$=""
2000 'SOUND ROUTINES
FOR E = 1 TO LEN(b$)
IF MID$(b$,E,1) ="." THEN
SOUND f,s!,200
ELSEIF MID$(b$,E,1)="-" THEN
SOUND f,s!*3,200
ELSE
SOUND f,s!*5,0
END IF
SOUND f,s!,0 'SPACE AFTER DOT OR DASH
NEXT E 'GET THE NEXT DOT OR DASH IN THE CHAR
SOUND f,s!*2.5,0 'SPACE AFTER CHAR
RETURN 'GET THE NEXT CHAR
key29:
IF wpm < 6 THEN getout
wpm = wpm - 1
getout:
LOCATE 16,73:COLOR 2,6:PRINT USING "#####";wpm:COLOR 1,0
RETURN
key28:
IF wpm > 59 THEN getout2
wpm = wpm + 1
getout2:
LOCATE 16,73:COLOR 2,6:PRINT USING "#####";wpm:COLOR 1,0
RETURN
calc.speed:
IF wpm < 13 THEN cwpm=13 ELSE cwpm = wpm
s!=21.84/cwpm 'sets code element timing
IF wpm >= 13 THEN ELE=s! ELSE ELE = (43.68 -1.68 * wpm) / wpm
RETURN
full.fill:
OPEN "CQWW"+yr$+mode$ AS #2 LEN = 75
FIELD #2,3 AS bn$,8 AS dayt$,5 AS tyme$,12 AS his.ca$,6 AS my.nr$,6 AS his.nr$,2 AS nu.zo$,6 AS nu.mul$,1 AS poynt$,6 AS na$,5 AS time.prev$,5 AS time.on$,5 AS sign.in$,5 AS sign.out$
qso.ptr=0
FOR b = 1 TO 6:RESTORE
FOR y = 1 TO 40
READ bz$(b,y)
NEXT y
NEXT b
OPEN "bandzones"+yr$+mode$ AS #3 LEN=2
FIELD #3,2 AS zn$
zctr=0
RETURN
sign.in:
LINE (0,80)-(399,87),0,bf
LOCATE 11,1:INPUT "Sign ON!:",sig$ 'starts keeping track of
sig$=UCASE$(sig$) 'operating time
IF sig$ <> "ON" AND sig$ <> "OFF" THEN sign.in
IF sig$="ON" THEN in.sign$ = LEFT$(TIME$,5)
qctr=0 'session qso counter
prev.time$ = in.sign$ 'establishes start time
RETURN
sign.out:
LINE (0,80)-(399,87),0,bf
LOCATE 11,1:INPUT "Sign OFF!:",sig$
sig$=UCASE$(sig$)
IF sig$ <> "ON" AND sig$ <> "OFF" THEN sign.out
IF sig$="OFF" THEN out.sign$=LEFT$(TIME$,5)
IF qctr=0 THEN GOSUB no.qsos:GOSUB prt.header
GOSUB calc.time 'convert out.sign time to mins
GOSUB re.calc.time
temp.mins=on.time.mins:GOSUB convert.mins 'convert mins to hrs:mins
on.time$=hm$
dup.ptr = dup.ptr
LSET sign.out$ = out.sign$ 'brings time in last entry up to signoff
LSET time.on$ = on.time$ 'for proper timekeeping
PUT #2, qso.ptr
zctr=1
FOR b = 1 TO 6
FOR y = 1 TO 40
LSET zn$ = bz$(b,y)
PUT #3, zctr
zctr = zctr + 1
NEXT y
NEXT b
RETURN
no.qsos:
GOSUB calc.time
GOSUB re.calc.time
temp.mins=on.time.mins:GOSUB convert.mins
on.time$=hm$
qso.ptr = qso.ptr
LSET time.on$ = on.time$
PUT #2 , qso.ptr
RETURN
part.fill:
LOCATE 11,18:COLOR 5,0:PRINT "Be patient - building arrays":COLOR 1,0
OPEN "CQWW"+yr$+mode$ AS #2 LEN = 75
FIELD #2,3 AS bn$,8 AS dayt$,5 AS tyme$,12 AS his.ca$,6 AS my.nr$,6 AS his.nr$,2 AS nu.zo$,6 AS nu.mul$,1 AS poynt$,6 AS na$,5 AS time.prev$,5 AS time.on$,5 AS sign.in$,5 AS sign.out$
qso.ptr=LOF(2)/75
FOR i = 1 TO qso.ptr 'builds QSO array containing all info
'in the file
GET #2, i
q$(i,1) = bn$
IF q$(i,1)= "1.8" OR q$(i,1)="3.5" OR q$(i,1)="7.0" THEN GOTO jumpover1
ctr=INSTR(bn$," ")
q$(i,1)=LEFT$(bn$,ctr-1)
jumpover1:
q$(i,2) = dayt$
q$(i,3) = tyme$
ctr = INSTR(his.ca$," ") 'Enter this contact into q$ array
q$(i,4) = LEFT$(his.ca$,ctr-1) 'with no trailing blanks
q$(i,5) = my.nr$
q$(i,6) = his.nr$
q$(i,7) = nu.zo$
IF nu.zo$ = " " THEN zctr%=0 ELSE zctr%=1 'counts zone multipliers
ctr=INSTR(nu.mul$," ")
q$(i,8) = LEFT$(nu.mul$,ctr-1)
IF nu.mul$ = " " THEN incr%=0 ELSE incr% = 1 'counts country multipliers
q$(i,9) = poynt$
pts=VAL(poynt$)
ctr = INSTR(na$," ")
q$(i,10) = LEFT$(na$,ctr-1)
q$(i,11) = time.prev$
q$(i,12) = time.on$
q$(i,13) = sign.in$
q$(i,14) = sign.out$
temp$ = time.on$:GOSUB re.calc.time
time.prev$=sign.out$:GOSUB calc.time
ctryctr = ctryctr + incr%
zonectr = zonectr + zctr%
ptsctr = ptsctr + pts
NEXT
tot! = ptsctr * (ctryctr+zonectr) 'using tot! gets around defint
OPEN "bandzones"+yr$+mode$ AS #3 LEN=2 'builds band zone array of zones not worked
FIELD #3,2 AS zn$
zctr = 1
FOR b=1 TO 6
FOR x = 1 TO 40
GET #3, zctr
zctr= zctr + 1
bz$(b,x) = zn$
NEXT x
NEXT b
RETURN
prt.header:CLS
COLOR 5,0
LOCATE 2,5:PRINT "Continental US contacts valid for Zone multipliers only"
LOCATE 3,5:PRINT "Portable prefix precedes station call e.g. OH2/K6SG, CE0A/CE3AAA"
COLOR 1,0:LOCATE 4,32:PRINT "Zones NOT Worked"
LOCATE 9,1:PRINT "Prev. QSO Band Date Time Station Sent Recd Zone Ctry Pts