25 Years of Programming
An open source source for C, C++, OWL, BASIC, MDB, XLS, DOT, and more...
Home   Projects   Up   Sitemap   Search   Blog   Forum+Chat   About Us   Privacy   Terms of Use   Feedback   FAQ   Images   Services   Payments   Humor   Music

Play text as audible Morse code through a Hayes Smartmodem 300, Microsoft MBASIC, Heathkit H-89 computer

These two Microsoft MBASIC programs for the Heathkit H-89 computer translate the text from a disk file to Morse code strings that are sent to a Hayes Smartmodem 300 modem which plays the Morse code as audible sounds through its built-in speaker. The Hayes Smartmodem 300 is the only modem I know of that had this feature.

The programs allow setting the speed of transmission. The second program looks like it adds the option of using the Smartmodem's maximum send rate of 20 words per minute.

10 'H89MORSE.BAS  8/28/93 INPUTS FROM FILE AND OUTPUTS MORSE CODE TO Hayes Smartmodem 300 modem.
11 'Commands are sent to the modem using LPRINT. You must configure CP/M so that the serial 
12 'port your modem is connected to is defined as the printer port.  
15 'Copyright (C)1991 Steven Whitney.    
16 'Initially published by http://25yearsofprogramming.com.
17 'Published under GNU GPL (General Public License) Version 3,with ABSOLUTELY NO WARRANTY.
20 'IN DELAY LOOP, MINIMUM VALUE IS 350, MAYBE 400, TO AVOID DROPPING CHARACTERS
30 PRINT:PRINT
40 PRINT "This program takes a disk file and translates it into morse code"
50 PRINT "so that you can listen to it on the Hayes Smartmodem 300 modem."
60 PRINT:PRINT
70 INPUT "NAME OF INPUT FILE";INFILE$
80 PRINT
90 PRINT "DELAY RANGE:  0-FASTEST TO 800-VERY SLOW"
91 PRINT "DELAY=300, NO PAUSE FOR BLANKS = ABOUT 6.3 WPM"
92 PRINT "WITH DELAY=0, NO PAUSE = ABOUT 11 WPM."
93 PRINT "TO GO ANY FASTER WILL REQUIRE SENDING MULTIPLE CHARS TO MODEM"
94 PRINT "IN EACH COMMAND."
100 PRINT
110 INPUT "LENGTH OF DELAY";DELAY
120 INPUT "NUMBER OF CHARACTERS TO SKIP OVER (INCLUDES SPACES, ETC.)";SKIP
130 INPUT "NUMBER OF CHARACTERS TO ENCODE (INCLUDES SPACES, ETC.)";CCOUNT
140 INPUT "PAUSE FOR BLANK SPACES ENCOUNTERED (Y/N)";PAUSE$
150 IF PAUSE$="y" THEN PAUSE$="Y"
160 PRINT
170 '-----quiet mode, echo off, dial using answer mode carrier
180 '-----FOR HIGHER FREQUENCY, USE ATDR;.  FOR LOWER, USE ATD;
190 LPRINT "ATQ1E0DR;"
200 OPEN "I",1,INFILE$
210 '-----SKIP TO DESIRED LOCATION IN FILE
220 FOR I=1 TO SKIP
230 C$=INPUT$(1,1)
240 PRINT C$;
250 NEXT I
260 PRINT:PRINT
270 '-----START LOOP 
280 ACTUALS=0  : 'WILL COUNT TRUE NUMBER OF CHARACTERS, EXCLUDING SPACES, ETC.
290 WHILE ((NOT EOF(1)) AND (COUNT <= CCOUNT))
300 COUNT=COUNT+1
310 OUTSTR$="ATC1"
320 C$=INPUT$(1,1)
330 '----- must map out high-bits that are often present in modem files
340 IF ASC(C$) > 127 THEN C$=CHR$(ASC(C$)-128)
350 PRINT C$;
360 IF C$="A" OR C$="a" THEN C$=".-" : GOTO 910
370 IF C$="B" OR C$="b" THEN C$="-..." : GOTO 910
380 IF C$="C" OR C$="c" THEN C$="-.-." : GOTO 910
390 IF C$="D" OR C$="d" THEN C$="-.."  : GOTO 910
400 IF C$="E" OR C$="e" THEN C$="."    : GOTO 910
410 IF C$="F" OR C$="f" THEN C$="..-." : GOTO 910
420 IF C$="G" OR C$="g" THEN C$="--."  : GOTO 910
430 IF C$="H" OR C$="h" THEN C$="...." : GOTO 910
440 IF C$="I" OR C$="i" THEN C$=".."   : GOTO 910
450 IF C$="J" OR C$="j" THEN C$=".---" : GOTO 910
460 IF C$="K" OR C$="k" THEN C$="-.-"  : GOTO 910
470 IF C$="L" OR C$="l" THEN C$=".-.." : GOTO 910
480 IF C$="M" OR C$="m" THEN C$="--"   : GOTO 910
490 IF C$="N" OR C$="n" THEN C$="-."   : GOTO 910
500 IF C$="O" OR C$="o" THEN C$="---"  : GOTO 910
510 IF C$="P" OR C$="p" THEN C$=".--." : GOTO 910
520 IF C$="Q" OR C$="q" THEN C$="--.-" : GOTO 910
530 IF C$="R" OR C$="r" THEN C$=".-."  : GOTO 910
540 IF C$="S" OR C$="s" THEN C$="..."  : GOTO 910
550 IF C$="T" OR C$="t" THEN C$="-"    : GOTO 910
560 IF C$="U" OR C$="u" THEN C$="..-"  : GOTO 910
570 IF C$="V" OR C$="v" THEN C$="...-" : GOTO 910
580 IF C$="W" OR C$="w" THEN C$=".--"  : GOTO 910
590 IF C$="X" OR C$="x" THEN C$="-..-" : GOTO 910
600 IF C$="Y" OR C$="y" THEN C$="-.--" : GOTO 910
610 IF C$="Z" OR C$="z" THEN C$="--.." : GOTO 910
620 'rem end alphabet
630 IF C$="1" THEN C$=".----" : GOTO 910
640 IF C$="2" THEN C$="..---" : GOTO 910
650 IF C$="3" THEN C$="...--" : GOTO 910
660 IF C$="4" THEN C$="....-" : GOTO 910
670 IF C$="5" THEN C$="....." : GOTO 910
680 IF C$="6" THEN C$="-...." : GOTO 910
690 IF C$="7" THEN C$="--..." : GOTO 910
700 IF C$="8" THEN C$="---.." : GOTO 910
710 IF C$="9" THEN C$="----." : GOTO 910
720 IF C$="0" THEN C$="-----" : GOTO 910
730 'rem end numbers
740 IF C$="," THEN C$="--..--": GOTO 910
750 IF C$="." THEN C$=".-.-.-": GOTO 910
760 IF C$="?" THEN C$="..--..": GOTO 910
770 IF C$=";" THEN C$="-.-.-.": GOTO 910
780 IF C$=":" THEN C$="---...": GOTO 910
790 IF C$="'" THEN C$=".----.": GOTO 910
800 IF C$="-" THEN C$="-....-": GOTO 910
810 IF C$="=" THEN C$="-...-": GOTO 910
820 IF C$="/" THEN C$="-..-." : GOTO 910
830 IF C$="(" OR C$="[" OR C$="{" THEN C$="-.--.": GOTO 910
840 IF C$=")" OR C$="]" OR C$="}" THEN C$="-.--.-": GOTO 910
850 IF C$=CHR$(34) THEN C$=".-..-.": GOTO 910
860 IF C$="$" THEN C$="...-..-": GOTO 910
870 IF C$="_" THEN C$="..--.-": GOTO 910
880 IF C$="+" THEN C$=".-.-.": GOTO 910
890 'rem end punctuation
900 C$=""   : 'REM DEFAULT IF IT IS NONE OF THE ABOVE
910 IF C$="" THEN OUTSTR$="" ELSE OUTSTR$=OUTSTR$+C$
920 IF C$>"" THEN ACTUALS=ACTUALS+1
930 LPRINT OUTSTR$
940 IF PAUSE$<>"Y" AND C$="" THEN 960
950 GOSUB 1190    : 'PAUSE
960 WEND
970 C$=".....-----.....-----..."
980 LPRINT "ATC1"+C$
990 GOSUB 1190
1000 LPRINT "ATH"
1010 CLOSE
1020 PRINT
1030 PRINT
1040 PRINT "SKIPPED OVER ";SKIP;" CHARACTERS."
1050 PRINT "OUTPUT ";CCOUNT;" CHARACTERS."
1060 PRINT "THEREFORE, STOPPED AT CHARACTER NUMBER ";SKIP+CCOUNT;" IN FILE."
1070 PRINT "(OR AT END OF FILE, WHICHEVER CAME FIRST)."
1080 PRINT
1090 PRINT "DELAY USED FOR THIS SESSION WAS ";DELAY
1100 PRINT "BLANK SPACES DID ";
1110 IF PAUSE$<>"Y" THEN PRINT "NOT ";
1120 PRINT "INCUR A ONE-CHARACTER PAUSE."
1130 PRINT "NUMBER OF ACTUAL CHARACTERS TRANSLATED WAS ";ACTUALS
1140 PRINT "WHICH WOULD BE ";ACTUALS/5;" WORDS"
1150 END
1160 '-----DELAY LOOP PAUSES BETWEEN MODEM COMMANDS (CHARACTERS)
1170 '-----100 * LEN(C$) IS MINIMUM DELAY. MODEM NEEDS TIME TO OUTPUT STRING.
1180 '-----USER-DEFINED DELAY IS ADDED TO THAT
1190 FOR I=1 TO 100 * LEN(C$) + DELAY
1200 NEXT I
1210 RETURN

DIFFERENT VERSION THAT APPEARS TO ALLOW A 20 WPM SEND SPEED:

10 'NEWCODE.BAS 8/31/93 
11 'COPYRIGHT (C)1993 STEVEN WHITNEY.  
12 'Initially published by http://25yearsofprogramming.com.
13 'Published under GNU GPL (General Public License) Version 3,with ABSOLUTELY NO WARRANTY.
15 'INPUTS FROM FILE AND OUTPUTS MORSE CODE TO MODEM
20 PRINT "THIS PROGRAM TAKES A DISK FILE AND TRANSLATES IT INTO MORSE CODE"
30 PRINT "SO THAT YOU CAN LISTEN TO IT ON THE HAYES 300 MODEM."
40 PRINT:PRINT
50 INPUT "NAME OF INPUT FILE";INFILE$
60 PRINT
70 PRINT "While program is running, press any key to quit early."
80 PRINT
90 PRINT "500 DELAY = 5  WPM"
100 PRINT "300 DELAY = 7  WPM"
110 PRINT "200 DELAY = 8  WPM"
120 PRINT "0   DELAY = 11 WPM"
130 PRINT
140 INPUT "DO YOU WANT 20 WPM?";Z$
150 IF Z$="Y" OR Z$="y" THEN DELAY=0 : BITE=5 : GOTO 190
160 PRINT
170 BITE = 1
180 INPUT "LENGTH OF DELAY";DELAY
190 INPUT "NUMBER OF CHARACTERS TO SKIP OVER (INCLUDES SPACES, ETC.)";SKIP
200 INPUT "NUMBER OF CHARACTERS TO ENCODE (INCLUDES SPACES, ETC.)";CCOUNT
210 PRINT
220 '-----quiet mode, echo off, dial using answer mode carrier
230 '-----FOR HIGHER FREQUENCY, USE ATDR;.  FOR LOWER, USE ATD;
240 LPRINT "ATQ1E0DR;"
250 OPEN "I",1,INFILE$
260 '-----SKIP TO DESIRED LOCATION IN FILE
270 FOR I=1 TO SKIP
280 C$=INPUT$(1,1)
290 PRINT C$;
300 NEXT I
310 PRINT:PRINT
320 '-----START LOOP 
330 ACTUALS=0  : 'WILL COUNT TRUE NUMBER OF CHARACTERS, EXCLUDING SPACES, ETC.
340 WHILE ((NOT EOF(1)) AND (COUNT <= CCOUNT))
350 D$=INPUT$(BITE,1)
370 FOR J = 1 TO LEN(D$)
380 C$=MID$(D$,J,1)
390 '----- must map out high-bits that are often present in modem files
400 IF ASC(C$) > 127 THEN C$=CHR$(ASC(C$)-128)
410 IF C$="A" OR C$="a" THEN C$=".-" : GOTO 960
420 IF C$="B" OR C$="b" THEN C$="-..." : GOTO 960
430 IF C$="C" OR C$="c" THEN C$="-.-." : GOTO 960
440 IF C$="D" OR C$="d" THEN C$="-.."  : GOTO 960
450 IF C$="E" OR C$="e" THEN C$="."    : GOTO 960
460 IF C$="F" OR C$="f" THEN C$="..-." : GOTO 960
470 IF C$="G" OR C$="g" THEN C$="--."  : GOTO 960
480 IF C$="H" OR C$="h" THEN C$="...." : GOTO 960
490 IF C$="I" OR C$="i" THEN C$=".."   : GOTO 960
500 IF C$="J" OR C$="j" THEN C$=".---" : GOTO 960
510 IF C$="K" OR C$="k" THEN C$="-.-"  : GOTO 960
520 IF C$="L" OR C$="l" THEN C$=".-.." : GOTO 960
530 IF C$="M" OR C$="m" THEN C$="--"   : GOTO 960
540 IF C$="N" OR C$="n" THEN C$="-."   : GOTO 960
550 IF C$="O" OR C$="o" THEN C$="---"  : GOTO 960
560 IF C$="P" OR C$="p" THEN C$=".--." : GOTO 960
570 IF C$="Q" OR C$="q" THEN C$="--.-" : GOTO 960
580 IF C$="R" OR C$="r" THEN C$=".-."  : GOTO 960
590 IF C$="S" OR C$="s" THEN C$="..."  : GOTO 960
600 IF C$="T" OR C$="t" THEN C$="-"    : GOTO 960
610 IF C$="U" OR C$="u" THEN C$="..-"  : GOTO 960
620 IF C$="V" OR C$="v" THEN C$="...-" : GOTO 960
630 IF C$="W" OR C$="w" THEN C$=".--"  : GOTO 960
640 IF C$="X" OR C$="x" THEN C$="-..-" : GOTO 960
650 IF C$="Y" OR C$="y" THEN C$="-.--" : GOTO 960
660 IF C$="Z" OR C$="z" THEN C$="--.." : GOTO 960
670 'rem end alphabet
680 IF C$="1" THEN C$=".----" : GOTO 960
690 IF C$="2" THEN C$="..---" : GOTO 960
700 IF C$="3" THEN C$="...--" : GOTO 960
710 IF C$="4" THEN C$="....-" : GOTO 960
720 IF C$="5" THEN C$="....." : GOTO 960
730 IF C$="6" THEN C$="-...." : GOTO 960
740 IF C$="7" THEN C$="--..." : GOTO 960
750 IF C$="8" THEN C$="---.." : GOTO 960
760 IF C$="9" THEN C$="----." : GOTO 960
770 IF C$="0" THEN C$="-----" : GOTO 960
780 'rem end numbers
790 IF C$="," THEN C$="--..--": GOTO 960
800 IF C$="." THEN C$=".-.-.-": GOTO 960
810 IF C$="?" THEN C$="..--..": GOTO 960
820 IF C$=";" THEN C$="-.-.-.": GOTO 960
830 IF C$=":" THEN C$="---...": GOTO 960
840 IF C$="'" THEN C$=".----.": GOTO 960
850 IF C$="-" THEN C$="-....-": GOTO 960
860 IF C$="=" THEN C$="-...-": GOTO 960
870 IF C$="/" THEN C$="-..-." : GOTO 960
880 IF C$="(" OR C$="[" OR C$="{" THEN C$="-.--.": GOTO 960
890 IF C$=")" OR C$="]" OR C$="}" THEN C$="-.--.-": GOTO 960
900 IF C$=CHR$(34) THEN C$=".-..-.": GOTO 960
910 IF C$="$" THEN C$="...-..-": GOTO 960
920 IF C$="_" THEN C$="..--.-": GOTO 960
930 IF C$="+" THEN C$=".-.-.": GOTO 960
935 IF C$=" " THEN C$="/" : GOTO 960
940 'rem end punctuation
950 C$=""   : 'REM DEFAULT IF IT IS NONE OF THE ABOVE
955 GOTO 980
960 IF C$>"" THEN OUTSTR$=OUTSTR$+C$+"/"
970 IF C$>"" THEN ACTUALS=ACTUALS+1
980 NEXT J
990 IF OUTSTR$>"" THEN LPRINT "ATC1"+OUTSTR$
995 PRINT D$;
1010 COUNT = COUNT + LEN(D$)
1020 GOSUB 1280
1025 OUTSTR$=""
1030 A$=INKEY$
1040 IF A$ > "" THEN GOTO 1060
1050 WEND
1060 C$=".....-----.....-----..."
1070 LPRINT "ATC1"+C$
1080 GOSUB 1280
1090 LPRINT "ATH"
1100 CLOSE
1110 PRINT
1120 PRINT
1130 PRINT "SKIPPED OVER ";SKIP;" CHARACTERS."
1140 PRINT "OUTPUT ";CCOUNT;" CHARACTERS."
1150 PRINT "THEREFORE, STOPPED AT CHARACTER NUMBER ";SKIP+CCOUNT;" IN FILE."
1160 PRINT "(OR AT END OF FILE, WHICHEVER CAME FIRST)."
1170 PRINT
1180 PRINT "DELAY USED FOR THIS SESSION WAS ";DELAY
1190 PRINT "BLANK SPACES DID ";
1200 IF PAUSE$<>"Y" THEN PRINT "NOT ";
1210 PRINT "INCUR A ONE-CHARACTER PAUSE."
1220 PRINT "NUMBER OF ACTUAL CHARACTERS TRANSLATED WAS ";ACTUALS
1230 PRINT "WHICH WOULD BE ";ACTUALS/5;" WORDS"
1240 END
1250 '-----DELAY LOOP PAUSES BETWEEN MODEM COMMANDS (CHARACTERS)
1260 '-----100 * LEN(C$) IS MINIMUM DELAY. MODEM NEEDS TIME TO OUTPUT STRING.
1270 '-----USER-DEFINED DELAY IS ADDED TO THAT
1280 FOR I=1 TO 80 * LEN(OUTSTR$) + DELAY
1290 NEXT I
1300 RETURN

 

Valid HTML 4.01 Transitional Valid CSS
Yahoo! Search
Search the web Search this site
View content labeling at ICRA.