Vermutlich existieren für die C-Control 1.1 unter CCBASIC Dutzende individuelle Programme zur akustischen Ausgabe
vonMorsezeichen. Beispielsweise auch hier im Forum.


Auch bei den Demoprogrammen zum OCBASIC-Kompiler habe ich zwei Quelltexte gefunden: "MORSE.BAS", sowie "MORSETRA.BAS".

Nachfolgend meine Abwandlung, welche sich in erster Linie durch den Aufbau der Tabelle, in welcher die Morsecode-
symbole enthalten sind, unterscheidet.

Es konnte eine Tabellenspalte eingespart werden, weil jedes Morsezeichen jetzt direkt über dessen jeweiligen ASCII-
Wert direkt im Tabellenindex adressiert wird. Die Platzoptimierung ist dabei umso besser, je mehr Morsezeichen mit
aufsteigenden ASCII-Werten nahtlos folgend in der Tabelle stehen.

Derzeit bietet die Tabelle Platz für 64 Zeichen , von denen 12 nicht belegt sind (jedoch als Platzhalter vorhanden
sein müssen) und belegt 128 Bytes Speicher.

Vorher: 48 Zeichen in 144 + 1 Bytes
Jetzt: 52 (+12 weitere moeglich) Zeichen in 128 Bytes

Funktionsweise:

Der
Procedure morse(byte) den ASCII-Wert des gewünschten Morsezeichens übergeben. Dieser kann aus einer
Variable, einer "K" onstante, oder einer Berechnung (Funktionsergebnis) stammen. Bei Verwendung innerhalb
von verschachtelten Funktionsaufrufen sollte man die max. Verschachtelungstiefe beachten (max. 4 verschachtelte
zur Zeit bei der C-Control Version 1.1). Ansonsten ist die
Procedure recht robust; Nicht in der Tabelle vorhandene
Morsezeichen, oder ASCII-Werte unterhalb 32 bzw. oberhalb 95 werden übersprungen "Skipping..".

Andere Taktfrequenzen (Overclocking), C-Control (Version 1.1), Open-Maxi:

C-Control (Version 1.1):

Lediglich die Konstanten für die Tonhöhe brauchen in der define-Sektion des Quelltextes angepaßt werden,
wenn mann den 'Lbit'-Kombitreiber verwendet.

Open-Maxi:

Auch hier brauchen nur die Konstanten für die Tonhöhe angepaßt werden
.



'*******************************************************************************
'* Programm MorseL02.BAS.ocb - Erstellt mit L-Distribution: *
'* *
'* http://ccintern.dharlos.de/forum/lesen.php?eintrag=16636 *
'* *
'* Anregungen und Fragen zum Programm bitte in das Forum stellen: *
'* *
'* http://ccintern.dharlos.de/forum/lesen.php?eintrag=17365 *
'* *
'* Von: "das |_ Team" (ein Hobbyprojekt), keine Haftung, experimentell!*
'*******************************************************************************

'Konstantenliste: Tonhoehe fuer den BEEP-Befehl (SLOWMODE=OFF) zur Anpassung an die jeweiligen Quarzfrequenzen '[Quarzwerte:]
'define T781Hz 295 : define T1000Hz 230 : define T1250Hz 184 : define T1667Hz 138 : define T2083Hz 111 : define T2500Hz 92 : define T1750Hz 132'~ ' 3,6864
'define T781Hz 320 : define T1000Hz 250 : define T1250Hz 200 : define T1667Hz 150 : define T2083Hz 120 : define T2500Hz 100 : define T1750Hz 143'~ ' 4,0000
'define T781Hz 590 : define T1000Hz 461 : define T1250Hz 369 : define T1667Hz 276 : define T2083Hz 221 : define T2500Hz 184 : define T1750Hz 263'~ ' 7,3728
'define T781Hz 640 : define T1000Hz 500 : define T1250Hz 400 : define T1667Hz 300 : define T2083Hz 240 : define T2500Hz 200 : define T1750Hz 286'~ ' 8,0000
'define T781Hz 800 : define T1000Hz 625 : define T1250Hz 500 : define T1667Hz 375 : define T2083Hz 300 : define T2500Hz 250 : define T1750Hz 357'~ '10,000.000.000.000
'define T781Hz 885 : define T1000Hz 691 : define T1250Hz 553 : define T1667Hz 415 : define T2083Hz 332 : define T2500Hz 276 : define T1750Hz 395'~ '11,0592
'define T781Hz 960 : define T1000Hz 750 : define T1250Hz 600 : define T1667Hz 450 : define T2083Hz 360 : define T2500Hz 300 : define T1750Hz 429'~ '12,0000
define T781Hz 1180: define T1000Hz 922 : define T1250Hz 737 : define T1667Hz 553 : define T2083Hz 442 : define T2500Hz 369 : define T1750Hz 527'~ '14,7456
'define T781Hz 1200: define T1000Hz 938 : define T1250Hz 750 : define T1667Hz 562 : define T2083Hz 450 : define T2500Hz 375 : define T1750Hz 536'~ '15,0000
'define T781Hz 1280: define T1000Hz 1000 : define T1250Hz 800: define T1667Hz 600 : define T2083Hz 480 : define T2500Hz 400 : define T1750Hz 571'~ '16,0000
'define T781Hz 1419: define T1000Hz 1108 : define T1250Hz 887: define T1667Hz 665 : define T2083Hz 532 : define T2500Hz 443 : define T1750Hz 633'~ '17,734475
'define T781Hz 1600: define T1000Hz 1250 : define T1250Hz 1000: define T1667Hz 750 : define T2083Hz 600 : define T2500Hz 500 : define T1750Hz 714'~ '20,0000
'define T781Hz 400 : define T1000Hz 313 : define T1250Hz 250 : define T1667Hz 187 : define T2083Hz 150 : define T2500Hz 125 : define T1750Hz 179'~ 'Open-Maxi(20MHz-Bustakt)



define PTT port[4]

DIM TABREAD, ton word
DIM mcode byte[1] of TABREAD
DIM len byte[2] of TABREAD

DIM ASCII_idx, dit, dit_len, dah, dah_len, space_len, intersymbol_len , i byte

option ccbasic 'Open-Control/BASIC-Compiler erzeugt C-Control Code
'define End2Host ivar [88] '/- diese beiden Zeilen aktivieren, wenn das Programm
'End2Host=ON '\- nur mit den Open-Controllern verwendet werden soll

PRINT " MorseL02.bas.ocb" 'Erste PRINT-Anweisung in der 'Lbit' Slotliste ausgeben (geplant).


ton = T2500Hz 'Tonhoehe als Konstante definiert fuer unterschiedliche Taktfrequenzen, siehe oben.


dit_len = 2 'Zeitdauer der Punkte * 20ms
dah_len = 6 'Zeitdauer der Striche * 20ms
space_len=dit_len 'Pause zwischen Punkten und/oder Strichen
*20ms
intersymbol_len=dit_len*7 'Pause nach einzelnen Morsezeichen



RANDOMIZE timer 'Neuer Startwert fuer Zufallsgenerator

WHILE not RxD 'Mit L-Taste beenden


IF second MOD 4 = 0 THEN

morse(RAND/4+1)
morse(RAND/8+1)
morse(second /10)

'morse("A")
'morse("B")
'morse("C")
'morse("1")
'morse("2")


ELSE

'...nichts
END IF


WEND

#Ende
?:?"QRT"
END



Procedure morse(ASCII_idx) 'Das Unterprogramm zur Ausgabe der Morzezeichen

IF (ASCII_idx<32) OR (ASCII_idx>95) THEN PRINT "Skipping ASCII ";ASCII_idx : RETURN : PRINT "RETURN-Fehler" : END
ASCII_idx = ASCII_idx -32 ' <-- Hinweis:
'Um Platz zu sparen startet unsere Morse-Tabelle bei ASCII Zeichen 32 (" ")
'und endet mit ASCII 95 ("_"). Die Tabelle ist im Byte-Format und belegt 128 Bytes.

LOOKTABWORD LEN_MORSECODE, ASCII_idx, tabread

?:? "[Tab.idx ";ASCII_idx ; ", Len " ; len ; "] ASCII ";ASCII_idx+32; " '"; : PUT (ASCII_idx +32) : Print"' ";


mcode=mcode SHL (7-len) 'Anzahl der Punkte und Striche

IF len > 6 OR len < 1 THEN PRINT "(Zeichen nicht in Tabelle, Skipping)" : RETURN

FOR i=1 TO len

mcode
=mcode SHL 1
IF mcode >=128
PUT "-"
PTT=ON
BEEP ton,dah_len,0
PTT=OFF
ELSE

PUT "."
PTT=ON
BEEP ton,dit_len,0
PTT=OFF

END IF

PAUSE space_len

NEXT i

PRINT:PRINT

PAUSE
intersymbol_len

IF rxd THEN GOTO Ende 'Mit L-Taste beenden.

RETURN


TABLE LEN_MORSECODE BYTE 'Man lese die Nullen als "Punkt" die Einsen als "Strich" (Inspiration: MORSE.BAS fuer Open-Micro von Dietmar Harlos)
'LEN MORSE ASCII 'Index
-1 0 '32 " " 0
6 &b101011 '33 "!" 1 'not in ITU-R recommodation, gemaess https://morsecode.world/international/morse.html
6 &b010010 '34 """ 2
-1 0 '35 "#" 3
-1 0 '36 "$" 4
-1 0 '37 "%" 5
5 &b01000 '38 "&" 6 'Quelle: https://morsecode.world/international/morse.html
6 &b011110 '39 "'" 7 'Quelle: https://morsecode.world/international/morse.html
5 &b10110 '40 "(" 8 'Ab 1960, gemaess de.scoutwiki.org/Morsen (war 6 &b101101)
6 &b101101 '41 ")" 9 'Ab 1960, gemaess de.scoutwiki.org/Morsen (war 6 &b101101)
-1 0 '42 "*" 10
5 &b01010 '43 "+" 11
6 &b110011 '44 "," 12 'Quelle: Wikipedia (war 5, &b11011)
6 &b100001 '45 "-" 13 'Quelle: Wikipedia (war 5, &b10001)
6 &b010101 '46 "." 14
5 &b10010 '47 "/" 15 'Quelle: https://morsecode.world/international/morse.html
5 &b11111 '48 "0" 16
5 &b01111 '49 "1" 17
5 &b00111 '50 "2" 18
5 &b00011 '51 "3" 19
5 &b00001 '52 "4" 20
5 &b00000 '53 "5" 21
5 &b10000 '54 "6" 22
5 &b11000 '55 "7" 23
5 &b11100 '56 "8" 24
5 &b11110 '57 "9" 25
6 &b111000 '58 ":" 26
6 &b101010 '59 ";" 27
-1 0 '60 "<" 28
5 &b10001 '61 "=" 29 'Quelle: https://morsecode.world/international/morse.html
-1 0 '62 ">" 30
6 &b001100 '63 "?" 31
6 &b011010 '64 "@" 32 'Quelle: https://morsecode.world/international/morse.html
2 &b01 '65 "A" 33
4 &b1000 '66 "B" 34 Der Morsecode ist ohne Gewaehr!
4 &b1010 '67 "C" 35
3 &b100 '68 "D" 36
1 &b0 '69 "E" 37
4 &b0010 '70 "F" 38
3 &b110 '71 "G" 39
4 &b0000 '72 "H" 40
2 &b00 '73 "I" 41
4 &b0111 '74 "J" 42
3 &b101 '75 "K" 43
4 &b0100 '76 "L" 44
2 &b11 '77 "M" 45
2 &b10 '78 "N" 46
3 &b111 '79 "O" 47
4 &b0110 '80 "P" 48
4 &b1101 '81 "Q" 49
3 &b010 '82 "R" 50
3 &b000 '83 "S" 51
1 &b1 '84 "T" 52
3 &b001 '85 "U" 53
4 &b0001 '86 "V" 54
3 &b011 '87 "W" 55
4 &b1001 '88 "X" 56
4 &b1011 '89 "Y" 57
4 &b1100 '90 "Z" 58
-1 0 '91 "[" 59
-1 0 '92 "\" 60
-1 0 '93 "]" 61
-1 0 '94 "^" 62
-1 0 '95 "_" 63
TABEND

' TABLE Prosign BYTE ' Quelle: https://morsecode.world/international/morse.html
' '==========================
' 4 &b0101 ' <AA> 0 New line
' 5 &b01010 ' <AR> 1 End of message
' 5 &b01000 ' <AS> 2 Wait
' 7 &b1000101 ' <BK> 3 Break
' 5 &b10001 ' <BT> 4 New paragraph
' 8 &b10100100 ' <CL> 5 Going off the air ("clear")
' 5 &b10101 ' <CT> 6 Start copying
' 6 &b100111 ' <DO> 7 Change to wabun code
' 5 &b10110 ' <KN> 8 Invite a specific station to transmit
' 6 &b000101 ' <SK> 9 End of transmission
' 5 &b00010 ' <SN> 10 Understood (also VE)
' ' 9 &000111000 <SOS> Distress message (passt nicht in ein Byte)
' ' ==========================
' TABEND




'Stand:

 1. Überarbeitung am 1.Juli 2021: Hyperlinks klickbar gemacht; weniger Rechtschreibfehler;
Korrektur in Zeile 89: Untere ASCII-Grenze -> 32 (war 20); Tonhöhenkonstanten für Open-Maxi berechnet;
End2Host für die Open-Controller hinzugefügt.