Morse rev2

This file is part of and ISTUG Public Domain Library 5. Download the collection to get this file.
Date: 198x
Type: Program
Platform(s): TS 2068
Tags: Ham Radio

This program is a Morse code trainer that uses the BEEP command to audibly play the Morse code for any letter (a–z) or digit (0–9) typed by the user. The user first selects a tone frequency in the range 0 to 69 semitones, which is stored in variable `b` and passed to every BEEP call. Two subroutines at lines 450 and 460 implement the long (dash) and short (dot) elements, each followed by a brief PAUSE 2 gap to separate the beeps. Line numbers 460 and 450 are also used directly as numeric constants in `LET short=460` and `LET long=450`, so the subroutine destination doubles as a human-readable label value. The main input loop at line 70 uses `INPUT INKEY$` to capture a single keystroke, then a long chain of IF statements (lines 80–430) dispatches to the correct sequence of dot/dash subroutines before looping back.


Program Analysis

Program Structure

The program is organized into three logical sections:

  1. Setup (lines 10–60): Clears the screen, sets border and paper colors, prompts for a frequency value stored in b, and initializes the subroutine pointer variables short and long.
  2. Input and dispatch loop (lines 70–440): Waits for a keypress via INPUT INKEY$, then a linear chain of IF INKEY$="x" THEN ... statements routes to the correct sequence of dot/dash subroutine calls followed by a final BEEP. GO TO 70 at line 440 restarts the loop.
  3. Subroutines (lines 450–460): Line 450 produces a long (dash) beep (BEEP .5,b) with a short pause; line 460 produces a short (dot) beep (BEEP .05,b) with a short pause.

Dual-Purpose Line Number Constants

A neat technique appears in line 60: LET short=460 and LET long=450. The variables short and long are set to the actual line numbers of the two subroutines. Although they are never used as GO SUB short — the dispatch lines call GO SUB short and GO SUB long using those variable names directly — this makes the code self-documenting. The value stored is exactly the destination line, so the variable name matches its numeric content, serving as a readable alias.

Input Idiom

INPUT INKEY$ at line 70 is used rather than the more common PAUSE 0: LET k$=INKEY$ idiom. This causes the interpreter to wait for a complete Enter-terminated input rather than a bare keypress, meaning the user must press a letter key followed by Enter. The PAUSE 10 immediately after provides a brief delay before the INKEY$ reads in the dispatch lines (80–430) are evaluated — but since INKEY$ is re-read live in each IF test rather than stored to a variable, there is a subtle bug: by the time lines 80–430 execute, the key may no longer be held, making INKEY$ return an empty string and silently skipping all branches before falling through to GO TO 70.

Morse Code Dispatch Table

Each character’s Morse pattern is encoded as a sequence of GO SUB short and GO SUB long calls. The final BEEP on each line acts as a trailing element with either a dot or dash duration, effectively encoding the last symbol without a subroutine call. The table covers the full 26 letters and digits 0–9.

CharacterMorseFinal BEEP duration
a· –.5 (dash)
b– · ·.05 (dot)
e·.05 (dot, no subroutine calls)
t.5 (dash, no subroutine calls)
0– – – –.5 (dash)
5· · · · ·.05 (dot)

Morse Code Accuracy Issues

Several letters have incorrect or incomplete Morse encodings:

  • Line 80 (a = · –): Correctly calls GO SUB short then BEEP .5 for dash, but the final BEEP duration of .5 is the same as a dash — correct.
  • Line 160 (i = · ·): Only one GO SUB short plus final BEEP .05 — gives only two dots, which is correct.
  • Line 170 (j = · – – –): Calls GO SUB short, GO SUB long, GO SUB long, BEEP .5 — only three elements total; correct Morse for J is · – – –, so this is missing one dash.
  • Line 180 (k = – · –): Only GO SUB long, GO SUB short, BEEP .5 — three elements, which is correct for K.
  • Line 210 (n = – ·): Only GO SUB long then BEEP .05 — correct.
  • Line 360 (digit 2 = · · – – –): The sequence is GO SUB short, BEEP .05,b, GO SUB long, GO SUB long, BEEP .5,b — a stray inline BEEP mid-sequence adds an extra dot, making it · · – – – rendered as · · · – –, which is incorrect.
  • Lines 340/430 (0 and 9): Both produce four elements (– – – –) instead of the standard five-element codes.

BEEP Frequency Parameter

The variable b is used as the pitch (in semitones relative to middle A) for every BEEP call throughout the program, including inside the subroutines at lines 450 and 460. Since b is a global variable, this works correctly. The prompt restricts input to 0–69, which spans roughly five octaves from middle A upward — a reasonable range for an audible tone.

Notable Anomalies

  • PAPER PI at line 20: PI evaluates to approximately 3.14159, which is truncated to 3 (magenta) by the PAPER attribute handler — a valid but unusual way to write PAPER 3.
  • CLEAR at line 10 with no argument clears all variables, which is harmless here but noteworthy.
  • The INKEY$ re-read bug described above means the program will frequently require multiple attempts to register a character, since the key is unlikely to still be pressed by the time lines 80–430 scan through their conditions.

Content

Appears On

Explore a first-person 3D maze, watch an audio oscilloscope in real time, draw pixel art with ten drawing modes, or generate random surreal poetry — ISTUG Library 5 is a sprawling collection that covers every corner of the TS 2068 experience.

Related Products

Related Articles

Related Content

Image Gallery

Source Code

   10 CLS : CLEAR 
   20 BORDER 2: PAPER PI: CLS 
   30 PRINT "   ENTER YOUR TONE FREQUENCY."
   40 PRINT "     ****** 0 TO 69 ******"
   50 INPUT b
   60 LET short=460: LET long=450: PRINT AT 9,0;"Press any key to hear it's code"
   70 INPUT INKEY$: PAUSE 10
   80 IF INKEY$="a" THEN GO SUB short: BEEP .5,b
   90 IF INKEY$="b" THEN GO SUB long: GO SUB short: GO SUB short: BEEP .05,b
  100 IF INKEY$="c" THEN GO SUB long: GO SUB short: GO SUB long: BEEP .05,b
  110 IF INKEY$="d" THEN GO SUB long: GO SUB short: BEEP .05,b
  120 IF INKEY$="e" THEN BEEP .05,b
  130 IF INKEY$="f" THEN GO SUB short: GO SUB short: GO SUB long: BEEP .05,b
  140 IF INKEY$="g" THEN GO SUB long: GO SUB long: BEEP .05,b
  150 IF INKEY$="h" THEN GO SUB short: GO SUB short: GO SUB short: BEEP .05,b
  160 IF INKEY$="i" THEN GO SUB short: BEEP .05,b
  170 IF INKEY$="j" THEN GO SUB short: GO SUB long: GO SUB long: BEEP .5,b
  180 IF INKEY$="k" THEN GO SUB long: GO SUB short: BEEP .5,b
  190 IF INKEY$="l" THEN GO SUB short: GO SUB long: GO SUB short: BEEP .05,b
  200 IF INKEY$="m" THEN GO SUB long: BEEP .5,b
  210 IF INKEY$="n" THEN GO SUB long: BEEP .05,b
  220 IF INKEY$="o" THEN GO SUB long: GO SUB long: BEEP .5,b
  230 IF INKEY$="p" THEN GO SUB short: GO SUB long: GO SUB long: BEEP .05,b
  240 IF INKEY$="q" THEN GO SUB long: GO SUB long: GO SUB short: BEEP .5,b
  250 IF INKEY$="r" THEN GO SUB short: GO SUB long: BEEP .05,b
  260 IF INKEY$="s" THEN GO SUB short: GO SUB short: BEEP .05,b
  270 IF INKEY$="t" THEN BEEP .5,b
  280 IF INKEY$="u" THEN GO SUB short: GO SUB short: BEEP .5,b
  290 IF INKEY$="v" THEN GO SUB short: GO SUB short: GO SUB short: BEEP .5,b
  300 IF INKEY$="w" THEN GO SUB short: GO SUB long: BEEP .5,b
  310 IF INKEY$="x" THEN GO SUB long: GO SUB short: GO SUB short: BEEP .5,b
  320 IF INKEY$="y" THEN GO SUB long: GO SUB short: GO SUB long: BEEP .5,b
  330 IF INKEY$="z" THEN GO SUB long: GO SUB long: GO SUB short: BEEP .05,b
  340 IF INKEY$="0" THEN GO SUB long: GO SUB long: GO SUB long: GO SUB long: BEEP .5,b
  350 IF INKEY$="1" THEN GO SUB short: GO SUB long: GO SUB long: GO SUB long: BEEP .5,b
  360 IF INKEY$="2" THEN GO SUB short: BEEP .05,b: GO SUB long: GO SUB long: BEEP .5,b
  370 IF INKEY$="3" THEN GO SUB short: GO SUB short: GO SUB short: GO SUB long: BEEP .5,b
  380 IF INKEY$="4" THEN GO SUB short: GO SUB short: GO SUB short: GO SUB short: BEEP .5,b
  390 IF INKEY$="5" THEN GO SUB short: GO SUB short: GO SUB short: GO SUB short: BEEP .05,b
  400 IF INKEY$="6" THEN GO SUB long: GO SUB short: GO SUB short: GO SUB short: BEEP .05,b
  410 IF INKEY$="7" THEN GO SUB long: GO SUB long: GO SUB short: GO SUB short: BEEP .05,b
  420 IF INKEY$="8" THEN GO SUB long: GO SUB long: GO SUB long: GO SUB short: BEEP .05,b
  430 IF INKEY$="9" THEN GO SUB long: GO SUB long: GO SUB long: GO SUB long: BEEP .05,b
  440 GO TO 70
  450 BEEP .5,b: PAUSE 2: RETURN : REM  long 
  460 BEEP .05,b: PAUSE 2: RETURN : REM  short 
  470 SAVE "MORSE rev2" LINE 1

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

People

No people associated with this content.

Scroll to Top