10 ' A BASIC CODE TRAINER - KH6FHN/4 BOX 3292, MCLEAN VA 22103 20 ' TAKEN FROM "COMPUTER TRADER" ISSUE OF JULY, 1984 30 ' MODIFICATIONS BY N6MPP (GILLMANN@ISIB.ARPA) 40 ' PROGRAM SPEED VARIES AMONG BASIC BASICA BASCOM AND AMONG PC/AT/PCJR 45 ' SET CONSTANT M5 TO ADJUST FOR THIS 50 RANDOMIZE TIMER 60 O=VAL(MID$(TIME$,7,2))+10*VAL(MID$(TIME$,4,2)) 70 FOR I=1 TO O : R=RND : NEXT I 80 DIM A$(100) 90 HBNDA = 44 100 REM SINGLE 110 A$(1) = "E." 120 A$(2) = "T-" 130 REM DOUBLE 140 A$(3) = "A.-" 150 A$(4) = "I.." 160 A$(5) = "M--" 170 A$(6) = "N-." 180 REM TRIPLE 190 A$(7) = "D-.." 200 A$(8) = "G--." 210 A$(9) = "K-.-" 220 A$(10) = "O---" 230 A$(11) = "R.-." 240 A$(12) = "S..." 250 A$(13) = "U..-" 260 A$(14) = "W.--" 270 REM QUADRUPLE 280 A$(15) = "B-..." 290 A$(16) = "C-.-." 300 A$(17) = "F..-." 310 A$(18) = "H...." 320 A$(19) = "J.---" 330 A$(20) = "L.-.." 340 A$(21) = "P.--." 350 A$(22) = "Q--.-" 360 A$(23) = "V...-" 370 A$(24) = "X-..-" 380 A$(25) = "Y-.--" 390 A$(26) = "Z--.." 400 REM QUINTUPLE 410 A$(27) = "0-----" 420 A$(28) = "1.----" 430 A$(29) = "2..---" 440 A$(30) = "3...--" 450 A$(31) = "4....-" 460 A$(32) = "5....." 470 A$(33) = "6-...." 480 A$(34) = "7--..." 490 A$(35) = "8---.." 500 A$(36) = "9----." 510 A$(37) = "/-..-." ' DN 520 A$(38) = "=-...-" ' BT 530 A$(39) = "a.-.-." ' AR 540 REM SEXTUPLE 550 A$(40) = "..-.-.-" 560 A$(41) = ",--..--" 570 A$(42) = "?..--.." 580 A$(43) = "s...-.-" ' SK 590 REM SPECIAL (NOT ON GENERAL TEST) 600 A$(44) = "~.-...-" ' NEW LINE 610 REM START OF CODE TRAINER PROGRAM 620 CLS 630 M5 = 20 ' BASIC SPEED CONSTANT = MAX WPM, BASICA=13 BASIC=15 BASCOM=20 640 F = 837 ' TONE FREQ. IN HZ. FCC SAYS 700 TO 1000 HZ. 650 PRINT "KH6FHN CODE SENDER, MODIFIED BY N6MPP 1985" 660 PRINT "ENTER T FOR TABLE, M FOR MEMORY TEST, P FOR PRACTICE"; 670 INPUT S$ 680 IF (S$ = "P") OR (S$ = "P") GOTO 930 690 IF (S$ = "M") OR (S$ = "m") GOTO 1820 700 PRINT 710 PRINT "A .- S ... . .-.-.-" 720 PRINT "B -... T - , --..--" 730 PRINT "C -.-. U ..- ? ..--.." 740 PRINT "D -.. V ...- / -..-. (DN)" 750 PRINT "E . W .-- = -...- (BT = DOUBLE DASH)" 760 PRINT "F ..-. X -..- a .-.-. (AR = END OF MESSAGE)" 770 PRINT "G --. Y -.-- s ...-.- (SK = END OF CONTACT)" 780 PRINT "H .... Z --.. ~ .-...- (NEW LINE)" 790 PRINT "I .. 0 -----" 800 PRINT "J .--- 1 .----" 810 PRINT "K -.- 2 ..---" 820 PRINT "L .-.. 3 ...--" 830 PRINT "M -- 4 ....-" 840 PRINT "N -. 5 ....." 850 PRINT "O --- 6 -...." 860 PRINT "P .--. 7 --..." 870 PRINT "Q --.- 8 ---.." 880 PRINT "R .-. 9 ----." 890 PRINT 900 PRINT "(PRESS ANY KEY TO CONTINUE)" 910 IF INKEY$ = "" THEN 910 920 GOTO 610 930 REM PRACTICE 940 PRINT USING "ENTER DESIRED CODE SPEED 5-##";M5; 950 INPUT T1 960 IF T1 < 5 THEN 930 970 IF T1 > M5 THEN 930 980 T = M5 / T1 990 IF T1 <= 12 THEN T = M5 / (T1 - 1) 1000 IF T1 <= 11 THEN T = M5 / (T1 - 2) 1010 IF T1 <= 9 THEN T = M5 / (T1 - 3) 1020 T13 = T 1030 IF T1 < 13 THEN T13 = M5 / 13 1040 REM HERE WE CAN ALSO ENTER TONE FREQ. F (HZ) 1050 PRINT "ENTER K TO SEND FROM KBD, F TO SEND A FILE, R FOR RANDOM"; 1060 INPUT S$ 1070 IF (S$ = "K") OR (S$ = "k") THEN GOSUB 1460 1080 IF (S$ = "F") OR (S$ = "f") THEN GOSUB 1110 1090 IF (S$ = "R") OR (S$ ="r") THEN GOSUB 1530 1100 GOTO 620 1110 REM FILE SEND 1120 PRINT "ENTER THE FILE TO SEND"; 1130 INPUT DSNAME$ 1140 OPEN DSNAME$ FOR INPUT AS 1 1142 PRINT "(PRESS ANY KEY WHEN READY)" 1143 T = 1.4*T ' MORE FUDGE 1144 GOSUB 2190 : T0 = O ' TIME IN SECONDS 1146 S = 0 1148 IF INKEY$ = "" THEN 1144 1150 IF EOF(1) THEN 1250 1160 LINE INPUT # 1, REC$ 1170 LL = LEN(REC$) 1180 FOR L1 = 1 TO LL 1190 C$ = MID$(REC$, L1, 1) 1195 S = S + 1 : IF C$ > "Z" THEN S = S + 1 1200 GOSUB 1270 ' GEN MORSE 1210 NEXT L1 1220 C$ = " " : GOSUB 1270 1230 PRINT 1240 GOTO 1150 1250 CLOSE # 1 : PRINT 1252 GOSUB 2190 : O = O - T0 1255 PRINT USING "ACTUAL WPM BY FCC STANDARDS = ##.#";(S/O)*12 1257 PRINT "(PRESS ANY KEY TO CONTINUE)" 1258 IF INKEY$ = "" THEN 1258 1260 RETURN ' FILE LIST 1270 REM GENERATE MORSE FOR CHARACTER C$ AT RATE T. 1280 FOR J = 1 TO HBNDA 1290 IF MID$(A$(J), 1, 1) = C$ THEN GOSUB 1360 ' MAKE SOUND 1300 NEXT J 1310 IF F = 838 THEN RETURN 1320 IF C$ = " " THEN SOUND 32767, T*4 1330 IF C$ = "~" THEN PRINT " " 1340 IF C$ <> "~" THEN PRINT C$; 1350 RETURN ' END GENERATE MORSE 1360 REM MAKE SOUND 1370 K = LEN(A$(J)) 1380 FOR L = 2 TO K 1390 SL = 1 1400 IF MID$(A$(J), L, 1) = "-" THEN SL = 3 1410 SOUND F, T13*SL 1420 SOUND 32767, T13 ' SPACE 1430 NEXT L 1440 SOUND 32767,3*T-T13 1450 RETURN 1460 REM KEYBOARD 1470 PRINT "ENTER * TO END KEYBOARD MODE" 1480 C$ = INKEY$ 1490 IF C$ = "" THEN 1480 1500 IF C$ = "*" THEN RETURN 1510 GOSUB 1270 1520 GOTO 1480 1530 REM RANDOM 1540 PRINT "TEST WILL LAST 5 MINUTES" 1550 PRINT "STRIKE ANY KEY WHEN READY" 1560 PRINT 1570 T0=RND : IF INKEY$ = "" THEN 1570 1580 GOSUB 2190 : T0 = O ' TIME IN SECONDS 1590 S = 0 : S0 = 0 1600 Z = 7 1610 GOSUB 2110 1620 I = 0 1630 C$ = INKEY$ 1640 IF C$ <> "" THEN 1780 1650 GOSUB 2190 : IF O > T0+300 THEN 1760 1660 I = I + 1 1670 C$ = " " 1680 IF I = INT(I/6)*6 THEN 1730 ' GROUPS OF FIVE 1690 K = INT(RND*Z1)+1 1700 IF K>26 THEN IF VAL(MID$(TIME$,7,2))<15 THEN K = INT(RND*26)+1 1710 C$ = MID$(A$(K), 1, 1) 1720 S0 = S0 + 1 : S = S + 1 : IF K > 26 THEN S = S + 1 1730 GOSUB 1270 ' TOOT TOOT! 1740 IF I = INT(I/24)*24 THEN PRINT ' FOUR GROUPS 1750 GOTO 1630 1760 PRINT : IF I <> INT(I/24)*24 THEN PRINT 1770 PRINT USING "### CHARS AT ACTUAL WPM BY FCC STANDARDS OF ##.#";S0,S/25 1780 PRINT "(PRESS ANY KEY TO CONTINUE)" 1790 C$ = INKEY$ 1800 IF C$ = "" THEN 1790 1810 RETURN[ 1820 REM MEMORY TEST 1830 T1=13 ' WPM 1840 T=M5/T1 1850 T13=T 1860 F = 838 1870 Z=4 ' INITIAL MAX LENGTH OF SYMBOLS 1880 S=0 1890 FOR J9=1 TO 10 1900 E=0 1910 GOSUB 2110 1920 FOR I=1 TO 10 1930 K9 = INT(RND*Z1)+1 1940 B$ = A$(K9) 1950 C$ = MID$(B$, 1, 1) 1960 GOSUB 1270 1970 PRINT USING "### : ";10*(J9-1)+I; 1980 S$ = INKEY$ : IF S$ = "" THEN 1980 1990 PRINT S$; 2000 IF S$=C$ THEN S=S+1 : PRINT " RIGHT!" 2010 IF S$<>C$ THEN E=E+1 : PRINT " WRONG, IT'S ",B$ 2020 NEXT I 2030 IF E=0 THEN Z=Z+1 2040 IF Z>6 THEN Z=6 2050 IF E>1 THEN Z=Z-1 2060 NEXT J9 2070 PRINT "YOUR SCORE WAS ",S 2080 PRINT "(PRESS ANY KEY TO CONTINUE)" 2090 IF INKEY$ = "" THEN 2090 2100 GOTO 610 2110 REM SUBR TO GET MAX CHAR LEN --- Z1 2120 IF Z>= 6 THEN Z1 = 43 2130 IF Z = 5 THEN Z1 = 39 2140 IF Z = 4 THEN Z1 = 26 2150 IF Z = 3 THEN Z1 = 14 2160 IF Z = 2 THEN Z1 = 6 2170 IF Z<= 1 THEN Z1 = 2 2180 RETURN 2190 REM TIMER SUBROUTINE 2200 X$=TIME$ 2210 O1$=MID$(X$,1,2) 2220 O2$=MID$(X$,4,2) 2230 O3$=MID$(X$,7,2) 2240 O=VAL(O1$)*3600+VAL(O2$)*60+VAL(O3$) 2250 RETURN 2260 END