目次

モールス符号変換

 出力する文字列が確定したなら、文字列を構成
 する各文字を、モールス符号に変換します。

 モールス符号の対応は、次のようになります。

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出力には、次のシーケンスを使います。
  1. 数字のASCIIコードを取り出す
  2. テーブルからパラメータ取得
  3. パラメータの下2桁を取り出して、CWを出力
  4. パラメータを右に2桁シフト
  5. 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
目次

inserted by FC2 system