10 CLS : PRINT "BEACON MESSAGE GENERATOR by Lyle Koehler" 20 WPM = 12' code speed 30 M$ = "test" ' message string (0 to 255 characters) 40 ID$ = "de lek lek lek" ' identifier string (0 to 255 characters) 50 PORT = &H2FC ' set output port address 60 DN = 1: UP = 2 ' set port bit patterns for keydown and keyup conditions 70 IF M$ <> "" THEN M$ = M$ + " " 80 IF ID$ <> "" THEN ID$ = ID$ + " " 90 GOSUB 160 ' calibrate PC speed 100 DIM Q$(52) ' number of code characters 110 GOSUB 760 ' read code conversion array 120 GOSUB 250 ' calculate element timing 130 TEXT$ = M$: GOSUB 300 ' send message string 140 TEXT$ = ID$: GOSUB 300 ' send ID string 150 GOTO 130 160 X1 = TIMER: X2 = 1 'calibrate loop time 170 FOR N = 1 TO 1000: NEXT 180 IF TIMER - X1 > 1 THEN 200 190 X2 = X2 + 1: GOTO 170 200 LPTIME = (TIMER - X1) / X2 210 X3 = TIMER: ' calibrate code conversion time 220 FOR N = 1 TO 10: GOSUB 540: NEXT 230 T1 = (TIMER - X3) / 10 240 RETURN 250 ' calculate element timings 260 J = INT(1200 / (LPTIME * WPM)) ' dit length 270 K = 2 * J - INT(1000 * T1 / LPTIME) ' character space - code conv time 280 L = K + 2 * J ' word space 290 RETURN 300 IF TEXT$ = "" THEN RETURN ' skip if null string 310 FOR Y = 1 TO LEN(TEXT$) ' main loop 320 C$ = MID$(TEXT$, Y, 1) 330 PRINT C$; 340 GOSUB 540 350 Q$ = Q$(QN) 360 FOR Z = 1 TO LEN(Q$) 370 V$ = MID$(Q$, Z, 1) 380 IF V$ = "x" THEN GOSUB 510 390 IF V$ = " " THEN GOSUB 480 400 IF V$ = "." THEN GOSUB 520 410 IF V$ = "-" THEN GOSUB 530 420 NEXT Z 430 GOSUB 500 440 IF Y = LEN(TEXT$) THEN RETURN 450 NEXT Y 470 ' key the output port 480 OUT PORT, UP: FOR P = 1 TO J * 2: NEXT: RETURN 490 OUT PORT, UP: FOR P = 1 TO J: NEXT: RETURN 500 OUT PORT, UP: FOR P = 1 TO K: NEXT: RETURN 510 OUT PORT, UP: FOR P = 1 TO L: NEXT: RETURN 520 OUT PORT, DN: FOR P = 1 TO J: NEXT: GOTO 490 530 OUT PORT, DN: FOR P = 1 TO 3 * J: NEXT: GOTO 490 540 ' Character to Morse conversions 550 QN = 36 ' any character not in the list will be sent as a space 560 IF "a" <= C$ AND C$ <= "z" THEN QN = ASC(C$) - 97: RETURN 570 IF "A" <= C$ AND C$ <= "Z" THEN QN = ASC(C$) - 65: RETURN 580 IF "0" <= C$ AND C$ <= "9" THEN QN = ASC(C$) - 22: RETURN 590 IF C$ = " " THEN QN = 36: RETURN 600 IF C$ = "." THEN QN = 37 610 IF C$ = "," OR C$ = "\" THEN QN = 38 620 IF C$ = ";" THEN QN = 39 630 IF C$ = "?" THEN QN = 40 640 IF C$ = "/" THEN QN = 41 650 IF C$ = "=" THEN QN = 42 660 IF C$ = "-" THEN QN = 43 670 IF C$ = ":" THEN QN = 44 680 IF C$ = "'" THEN QN = 45 690 IF C$ = "(" OR C$ = ")" THEN QN = 46 700 IF C$ = "+" THEN QN = 47 710 IF C$ = "]" THEN QN = 48 720 IF C$ = "[" THEN QN = 49 730 IF C$ = "&" THEN QN = 50 740 IF C$ = "!" THEN QN = 51 750 RETURN 760 ' code conversion array initialization 770 FOR I = 0 TO 51 ' 52 code characters are provided (including space) 780 READ Q$(I) 790 NEXT 800 ' code strings for: ABCDEFGHIJKLM NOPQRSTUV1234567890 .,;?/=-:')+][&! 810 DATA ".-", "-...", "-.-.", "-..", ".", "..-.", "--." 820 DATA "....", "..", ".---", "-.-", ".-..", "--" 830 DATA "-.", "---", ".--.", "--.-", ".-.", "...", "-" 840 DATA "..-", "...-", ".--", "-..-", "-.--", "--.." 850 DATA "-----", ".----", "..---", "...--", "....-", "....." 860 DATA "-....", "--...", "---..", "----." 870 DATA "x", ".-.-.-", "--..--", "-.-.-.", "..--..", "-..-.", "-...-", "-....-" 880 DATA "---...", ".----.", "-.--.-", ".-.-.", "...-.-", ".-...", ". ...", "-.-. --.-" 890 RETURN 900 END