目次
前
次
モールス符号変換
出力する文字列が確定したなら、文字列を構成
する各文字を、モールス符号に変換します。
モールス符号の対応は、次のようになります。
A . -
B - . . .
C - . - .
D - . .
E .
F . . - .
G - - .
H . . . .
I . .
J . - - -
K - . -
L . - . .
M - -
N - .
O - - -
P . - - .
Q - - . -
R . - .
S . . .
T -
U . . -
V . . . -
W . - -
X - . . -
Y - . - -
Z - - . .
1 . - - - -
2 . . - - -
3 . . . - -
4 . . . . -
5 . . . . .
6 - . . . .
7 - - . . .
8 - - - . .
9 - - - - .
0 - - - - -
文字と数字では、短点と長点の組合わせ方が
異なるので、変換処理を別にして考えます。
数字は、5符号の固定長になっています。
文字は、1から4符号の任意長です。
文字が最大4符号になることに注目して
1バイトの中に、短点と長点を2進数の
01、11で表現してまとめます。
短点の時間を1とすると、長点の時間は3倍と
規定さているので、01(1)、11(3)として
おきます。
次のように符号を反転して、下位桁に符号を
表現するビットパターンを構成します。
A . - → - . → 00 00 11 01 (0D)
B - . . . → . . . - → 01 01 01 11 (57)
C - . - . → . - . - → 01 11 01 11 (77)
D - . . → . . - → 00 01 01 11 (17)
E . → . → 00 00 00 01 (01)
F . . - . → . - . . → 01 11 01 01 (75)
G - - . → . - - → 00 01 11 11 (1F)
H . . . . → . . . . → 01 01 01 01 (55)
I . . → . . → 00 00 01 01 (05)
J . - - - → - - - . → 11 11 11 01 (FD)
K - . - → - . - → 00 11 01 11 (37)
L . - . . → . . - . → 01 01 11 01 (5D)
M - - → - - → 00 00 11 11 (0F)
N - . → . - → 00 00 01 11 (07)
O - - - → - - - → 00 11 11 11 (3F)
P . - - . → . - - . → 01 11 11 01 (7D)
Q - - . - → - . - - → 11 01 11 11 (DF)
R . - . → . - . → 00 01 11 01 (1D)
S . . . → . . . → 00 01 01 01 (15)
T - → - → 00 00 00 11 (03)
U . . - → - . . → 00 11 01 01 (35)
V . . . - → - . . . → 11 01 01 01 (D5)
W . - - → - - . → 00 11 11 01 (3D)
X - . . - → - . . - → 11 01 01 11 (D7)
Y - . - - → - - . - → 11 11 01 11 (F7)
Z - - . . → . . - - → 01 01 11 11 (5F)
()の中は、16進数で表現した数値なので
テーブル参照でモールス符号を取り出せる
ようにします。
配列に16進数の値を格納してテーブルの内容
を確定しておきます。
300 ' store morse code (alphabet)
310 LET [#41],#0D,#57,#77,#17,#01,#75,#1F,#55,#05,#FD,#37,#5D,#0F
320 LET [#4E],#07,#3F,#7D,#DF,#1D,#15,#03,#35,#D5,#3D,#D7,#F7,#5F
330 RETURN
文字'A'は、ASCIIコードでは#41(16進数)=65(10進数)です。
文字列の中で英字を見つけたなら、テーブル参照で
対応するモールス符号を取り出せるよう工夫して
います。
具体的には、英字のモールス符号を16進数表現した
テーブルの中から取り出します。
変数Xに英字が格納されていれば、次の処理で
モールス符号を表現する16進数を取得できます。
LET P,[X]
変数Pを下位桁から2ビットずつ取り出していくと
00、01、11のどれかが出てきます。
01であれば短点を出力し、11であれば長点を出力します。
00では、指定時間だけ何も出力しません。
4回モールス符号を出力するサブルーチンを
コールすれば、英字のCW出力は終了です。
LET P,[X]
FOR J=1 TO 4
LET A,(P & 3):GOSUB 500:LET P,(P>>2)
NEXT
サブルーチンをラベル指定していますが、処理が
確定してから行番号を入れます。
IchigoJamの変数は、16ビットなので5符号分の10ビットに
長点、短点を11、01で並べて格納します。
10ビットは、5符号を逆順にしてから、2ビットの
組み合わせにします。
1 . - - - - → - - - - . → 11 11 11 11 01 → #3FD
2 . . - - - → - - - . . → 11 11 11 01 01 → #3F5
3 . . . - - → - - . . . → 11 11 01 01 01 → #3D5
4 . . . . - → - . . . . → 11 01 01 01 01 → #355
5 . . . . . → . . . . . → 01 01 01 01 01 → #155
6 - . . . . → . . . . - → 01 01 01 01 11 → #157
7 - - . . . → . . . - - → 01 01 01 11 11 → #15F
8 - - - . . → . . - - - → 01 01 11 11 11 → #17F
9 - - - - . → . - - - - → 01 11 11 11 11 → #1FF
0 - - - - - → - - - - - → 11 11 11 11 11 → #3FF
配列に格納します。
300 ' store morse code (alphabet and digit)
310 LET [#41],#0D,#57,#77,#17,#01,#75,#1F,#55,#05,#FD,#37,#5D,#0F
320 LET [#4E],#07,#3F,#7D,#DF,#1D,#15,#03,#35,#D5,#3D,#D7,#F7,#5F
330 LET [#30],#3FD,#3F5,#3D5,#355,#155,#157,#15F,#17F,#1FF,#3FF
340 RETURN
数字のCW出力には、次のシーケンスを使います。
- 数字のASCIIコードを取り出す
- テーブルからパラメータ取得
- パラメータの下2桁を取り出して、CWを出力
- パラメータを右に2桁シフト
- 5回出力していないときは、3にもどる
シーケンスで書くと面倒ですが、コードにすると単純です。
LET P,[X]
FOR J=1 TO 5
LET A,(P & 3):GOSUB 500:LET P,(P>>2)
NEXT
行番号400以降のサブルーチンで、数字と英字を区別して
CW出力するようにコードを作成します。
400 ' send CW
410 IF X=#20 RETURN
420 LET P,[X]
430 FOR J=1 TO 5
440 LET A,(P & 3):GOSUB 500:LET P,(P >> 2)
450 NEXT
460 WAIT 100
470 RETURN
ここからは、文字のモールス符号を8ビットの中に
入れるための作業に関する備忘録です。
モールス符号を逆に並べてコード化
AWKのスクリプトで、モールス符号を逆順にします。
{
printf("%s ",$1)
# define signal
last = NF
result = 0
stmp = ""
for ( i = last ; i > 1 ; i-- ) {
if ( $i == "." ) {
result = 4 * result + 1
stmp = stmp " 01"
}
if ( $i == "-" ) {
result = 4 * result + 3
stmp = stmp " 11"
}
}
printf("%s #%3X\n",stmp,result)
}
CUIでの操作は、以下。
gawk -f m0.awk m0.txt
スクリプトで、得られた内容。
A 11 01 #00D
B 01 01 01 11 #057
C 01 11 01 11 #077
D 01 01 11 #017
E 01 #001
F 01 11 01 01 #075
G 01 11 11 #01F
H 01 01 01 01 #055
I 01 01 #005
J 11 11 11 01 #0FD
K 11 01 11 #037
L 01 01 11 01 #05D
M 11 11 #00F
N 01 11 #007
O 11 11 11 #03F
P 01 11 11 01 #07D
Q 11 01 11 11 #0DF
R 01 11 01 #01D
S 01 01 01 #015
T 11 #003
U 11 01 01 #035
V 11 01 01 01 #0D5
W 11 11 01 #03D
X 11 01 01 11 #0D7
Y 11 11 01 11 #0F7
Z 01 01 11 11 #05F
1 11 11 11 11 01 #3FD
2 11 11 11 01 01 #3F5
3 11 11 01 01 01 #3D5
4 11 01 01 01 01 #355
5 01 01 01 01 01 #155
6 01 01 01 01 11 #157
7 01 01 01 11 11 #15F
8 01 01 11 11 11 #17F
9 01 11 11 11 11 #1FF
0 11 11 11 11 11 #3FF
13個ごとに1行にまとめる
Basicの配列に格納するには、英字26文字を13個ごとに
並べておいた方が楽になります。
最後の16進数コードを取出し、レコード番号を利用して
改行します。
{
last = NF
printf(",%s",$last)
if ( (NR % 13) == 0 ) {
printf("\n")
}
}
CUIでの操作は、以下。
gawk -f m0.awk m0.txt | gawk -f
スクリプトで、得られた内容。
,#0D,#57,#77,#17,#01,#75,#1F,#55,#05,#FD,#37,#5D,#0F
,#07,#3F,#7D,#DF,#1D,#15,#03,#35,#D5,#3D,#D7,#F7,#5F
,#3FF,#3FD,#3F5,#3D5,#355,#155,#157,#15F,#17F,#1FF
ここまで作れば、Basicのコードにするのは簡単。
配列への代入を追加するだけ。
LET [#41],#0D,#57,#77,#17,#01,#75,#1F,#55,#05,#FD,#37,#5D,#0F
LET [#4E],#07,#3F,#7D,#DF,#1D,#15,#03,#35,#D5,#3D,#D7,#F7,#5F
LET [#30],#3FF,#3FD,#3F5,#3D5,#355,#155,#157,#15F,#17F,#1FF
目次
前
次