忍者ブログ



JO3GBD

JO3GBDアマチュア無線局長のブログ。無線、UD、IT、家電、電子工作、IchigoJam、IchigoHAM、その他もろもろ。

カレンダー

04 2024/05 06
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

ブログ&サイト内検索

最近の記事

最近の動画

リンク

hamlife.jp

にほんブログ村

にほんブログ村 その他趣味ブログ アマチュア無線へ
にほんブログ村

人気ブログランキング


楽天で探す
楽天市場

FacebookのIchigoJam-FANグループで、モールス符号変換プログラムの符号変換データについて、一符号を1バイト(8ビット)以内であらわす方式があったとか、昔のZ80のCWトレーナーでは・・・とかの書込みを拝見して、「あ、それ知ってる!! 昔にやったことがある。」と・・・

という訳で、FacebookのIchigoJam-FANグループでSHIROさんが公開されいてたSHIROのIchigoJam日記 モールス符号変換のプログラムをベースにさせていただいて、8ビットコードの変換方式をご紹介します。

・記憶を辿って

四十数年前、8ビットマイコンのハンドアセンブルの時代のこと、TK-80の16進キーでASCIIコードで打った文字がモールス符号に変換されて、脇に置いたAMラジオから決して澄んだ音ではないツートツートを聞こえて喜んだ時の記憶が甦りました。
確かTK-80にはブザーが無かったので、マシン語ループ作ったノイズ音をブザー代わりにAMラジオで聞いていたのです。
更に、ふと「"bit"という雑誌があったなあ」を思い出したので、プログラムはそれを参考にしたのかもそれませんが、さすがにこれは定かではありません。
TK-80でしたのでZ-80より以前の8080。8Bit演算しかないので、モールス符号変換は8ビットで処理をしていました。

・符号変換データー

前置きが長くなりましたが、当時を思い出しつつご説明します。
(この方式は私のオリジナルではありません、出典は四十数年前の当時の雑誌か書籍の記事だったと記憶しています。)

まず、モールス符号は 単点(ドット)と長点(ダッシュ)の組み合わせで構成されていて、最小1要素から最大6要素で構成されます。(※1一部の例外があります。)、
従い、単点を0、長点を1とビット単位で構成すれば最大6ビットであらわすことができますが、モールス符号は可変長なので、はじめと終わりがわかるようにしなければばりません。そこで1バイトの変換データーの(頭=MSB=から0で埋めて)符号データの前にスタートビット1を付加し、その後が符号データ(1~6ビット)としてあらわします。 

例えば、
 ”A”は・ー(単点と長点) なので”01”。それに頭にスタートビットの”1”を付加して”101”(二進数)。”101”を十進数表記して"5"になります。

 ”?”は・・--・・なので”001100”、頭に”1”を付加して”1001100”で十進数で”76”
といった具合です。

参考)符号変換表(抜粋)
文字 モールス符号 2進数 10進数
E 00000010 2
00000011 3
A ・ー 00000101 5
1 ・ーーーー 00101111 47
9 ーーーー・ 00111110 62
? ・・ーー・・ 01001100 76
: ーーー・・・ 01111000 120

訂正符号(HH(--------)

・・・・・・・・ 100000000 256 ※1

※1)訂正符号(HH(--------))の”・・・・・・・・”は例外で8要素あり、データー9ビット長になります。

・符号化プログラム

目的文字のデータからモールス符号に変換するには、まず、データーを左にビットシフトしてスタートビットの1が来るまでシフトを続けます。

その次から左シフトして0が出れば単点、1が出れば長点、所定の回数(ビット数)になればおしまいとします。

ここでちょっと問題が。8ビットデータを左シフト(RAL)してキャリー(あふれたビット)で判定(JC)とイメージしていたのですが、IchigoJam BASICのデータは16ビットですしキャリー有無の条件判断がありません。(左シフトは”<<"の演算子があります。)

代わりに、左シフト後に十進数の256(二進数では0000000100000000)でビット論理積(&)を取って(マスクして)ビット8(下=LSB=から9ビット目)が1か0かの判断をしています。
(ビット8で判断することで、訂正符号(HH(--------))の符号化も対応ができます。)

参考)符号化プログラムの例:キー入力した文字データをモールス符号に変換して表示する
40 INPUT "MOJI DATA?=",M
60 L=9
80 IF!(M&256):M=M<<1:L=L-1:CONT
90 M=M<<1:L=L-1
100 IF !L ?:GOTO 40
120 IF !(M&256) ?"・";ELSE ?"-";
130 GOTO 90


・IchigoJamのプログラム

FacebookのIchigoJam-FANグループでも公開されてたSHIROのIchigoJam日記 モールス符号変換のIchigoJamプログラムをベースにさせていただいて、8ビットコード方式にしてみましした。

また、変換データの定義が減った分プログラムサイズに余裕ができたので、下記の追加をしました。
 - モールス符号をブザー音で鳴るようにした
 - 訂正符号(HH(--------) も個別対応し、バックスペースとDELキーに割り当てた
なお、(バックスペースを対応した結果論ではありますが)カタカナの変換時の振る舞いが(正しくはないが)モールス符号的に間違いではない動きになりました。

以降にSHIROのIchigoJam日記 モールス符号変換にならった符号変換表と、IchigoJamプログラムを記します。

・符号変換表

文字 文字
コード
内部
コード
モールス符号 2進数 10
進数
アド
レス
! 33 0 ー・ー・ーー 1101011 107 700
" 34 1 ・ー・・ー・ 1010010 82 701
# 35 2 (N/A) 0 0 702
$ 36 3 (N/A) 0 0 703
% 37 4 (N/A) 0 0 704
& 38 5 ・ー・・・ 101000 40 705
' 39 6 ・ーーーー・ 1011110 94 706
( 40 7 ー・ーー・ 110110 54 707
) 41 8 ー・ーー・ー 1101101 109 708
* 42 9 ・・・ー・ 100010 34 709
+ 43 10 ・ー・ー・ 101010 42 70A
, 44 11 ーー・・ーー 1110011 115 70B
- 45 12 ー・・・・ー 1100001 97 70C
. 46 13 ・ー・ー・ー 1010101 85 70D
/ 47 14 ー・・ー・ 110010 50 70E
0 48 15 ーーーーー 111111 63 70F
1 49 16 ・ーーーー 101111 47 710
2 50 17 ・・ーーー 100111 39 711
3 51 18 ・・・ーー 100011 35 712
4 52 19 ・・・・ー 100001 33 713
5 53 20 ・・・・・ 100000 32 714
6 54 21 ー・・・・ 110000 48 715
7 55 22 ーー・・・ 111000 56 716
8 56 23 ーーー・・ 111100 60 717
9 57 24 ーーーー・ 111110 62 718
: 58 25 ーーー・・・ 1111000 120 719
; 59 26 (N/A) 0 0 71A
< 60 27 (N/A) 0 0 71B
= 61 28 ー・・・ー 110001 49 71C
> 62 29 (N/A) 0 0 71D
? 63 30 ・・ーー・・ 1001100 76 71E
@ 64 31 ・ーー・ー・ 1011010 90 71F
A 65 32 ・ー 101 5 720
B 66 33 ー・・・ 11000 24 721
C 67 34 ー・ー・ 11010 26 722
D 68 35 ー・・ 1100 12 723
E 69 36 10 2 724
F 70 37 ・・ー・ 10010 18 725
G 71 38 ーー・ 1110 14 726
H 72 39 ・・・・ 10000 16 727
I 73 40 ・・ 100 4 728
J 74 41 ・ーーー 10111 23 729
K 75 42 ー・ー 1101 13 72A
L 76 43 ・ー・・ 10100 20 72B
M 77 44 ーー 111 7 72C
N 78 45 ー・ 110 6 72D
O 79 46 ーーー 1111 15 72E
P 80 47 ・ーー・ 10110 22 72F
Q 81 48 ーー・ー 11101 29 730
R 82 49 ・ー・ 1010 10 731
S 83 50 ・・・ 1000 8 732
T 84 51 11 3 733
U 85 52 ・・ー 1001 9 734
V 86 53 ・・・ー 10001 17 735
W 87 54 ・ーー 1011 11 736
X 88 55 ー・・ー 11001 25 737
Y 89 56 ー・ーー 11011 27 738
Z 90 57 ーー・・ 11100 28 739
163 58 ・ー・ー・・ 1010100 84 73A
164 59 ・ー・ー・ー 1010101 85 73B
165 60 (N/A) 0 0 73C
166 61 ・ーーー 10111 23 73D
167 62 ーー・ーー 111011 59 73E
168 63 ・ー 101 5 73F
169 64 ・・ー 1001 9 740
170 65 ー・ーーー 110111 55 741
171 66 ・ー・・・ 101000 40 742
172 67 ・ーー 1011 11 743
173 68 ー・・ーー 110011 51 744
174 69 ーー 111 7 745
175 70 ・ーー・ 10110 22 746
176 71 ・ーー・ー 101101 45 747
177 72 ーー・ーー 111011 59 748
178 73 ・ー 101 5 749
179 74 ・・ー 1001 9 74A
180 75 ー・ーーー 110111 55 74B
181 76 ・ー・・・ 101000 40 74C
182 77 ・ー・・ 10100 20 74D
183 78 ー・ー・・ 110100 52 74E
184 79 ・・・ー 10001 17 74F
185 80 ー・ーー 11011 27 750
186 81 ーーーー 11111 31 751
187 82 ー・ー・ー 110101 53 752
188 83 ーー・ー・ 111010 58 753
189 84 ーーー・ー 111101 61 754
190 85 ・ーーー・ 101110 46 755
ソ 191 86 ーーー・ 11110 30 756
192 87 ー・ 110 6 757
193 88 ・・ー・ 10010 18 758
194 89 ・ーー・ 10110 22 759
195 90 ・ー・ーー 101011 43 75A
196 91 ・・ー・・ 100100 36 75B
197 92 ・ー・ 1010 10 75C
198 93 ー・ー・ 11010 26 75D
199 94 ・・・・ 10000 16 75E
200 95 ーー・ー 11101 29 75F
201 96 ・・ーー 10011 19 760
202 97 ー・・・ 11000 24 761
203 98 ーー・・ー 111001 57 762
204 99 ーー・・ 11100 28 763
205 100 10 2 764
206 101 ー・・ 1100 12 765
207 102 ー・・ー 11001 25 766
208 103 ・・ー・ー 100101 37 767
209 104 11 3 768
210 105 ー・・・ー 110001 49 769
211 106 ー・・ー・ 110010 50 76A
212 107 ・ーー 1011 11 76B
213 108 ー・・ーー 110011 51 76C
214 109 ーー 111 7 76D
215 110 ・・・ 1000 8 76E
216 111 ーー・ 1110 14 76F
217 112 ー・ーー・ 110110 54 770
218 113 ーーー 1111 15 771
219 114 ・ー・ー 10101 21 772
220 115 ー・ー 1101 13 773
221 116 ・ー・ー・ 101010 42 774
222 117 ・・ 100 4 775
223 118 ・・ーー・ 100110 38 776

・プログラム

10 '190427 Morse Encode 3
20 CLS:?"*Morse Encode 3"
30 CLV:S=5:POKE#700,107,82,0,0,0,40,94,54,109,34,42,115,97,85,50,63,47,39,35,33,32,48,56,60,62,120,0,0,49,0,76,90,5,24,26,12,2,18,14,16,4,23,13,20,7,6,15,22,29,10,8,3,9,17,11,25,27,28
40 POKE#73A,84,85,0,23,59,5,9,55,40,11,51,7,22,45,59,5,9,55,40,20,52,17,27,31,53,58,61,46,30,6,18,22,43,36,10,26,16,29,19,24,57,28,2,12,25,37,3,49,50,11,51,7,8,14,54,15,21,13,42,4,38
50 ?"CHR?=";
60 K=INKEY():IF !(K=8 OR (K>32 AND K<91) OR K=127 OR (K>162 AND K<224)) CONT
70 L=9
80 IF K=8 OR K=127 M=256:? "xx";:GOTO 140
90 IF K>161 A=K-105 ELSE A=K-33
100 M=PEEK(#700+A)
110 IF !M GOTO 60
120 ? CHR$(K);" ";
130 IF!(M&256) M=M<<1:L=L-1:CONT
140 M=M<<1:L=L-1
150 IF !L ?:WAIT 2*S:GOTO 50
160 BEEP 13,99:LED 1
170 IF !(M&256) ?"・";:WAIT S:ELSE?"-";:WAIT S*3
180 BEEP 0:LED 0:WAIT S:GOTO 140

プログラムの残りバイトは200バイトあり、更に機能アップができます。

なお、今回使用したIchigoJamのファームウェアはVer. 1.3.1です。


-・・・-


IchigoJamでモールスの記事の目次を こちら にまとめましたのでご覧ください。

「IchigoJamってなに?」って方は、こちらのコラムをご参照ください。


なお、IchigoJamは(株)jig.jpの登録商標です。

#IchigoHam #IchigoJam #IchigoJamでモールス #CW #自作室

PR
    



コメント

コメントのタイトル
お名前/コールサイン
メールアドレス
URL
文字色
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字
コメントは承認制にさせて頂いております。
投稿頂いてから公開までお時間を頂きますのでご了承をお願いします。


にほんブログ村
にほんブログ村 その他趣味ブログ アマチュア無線へ
にほんブログ村 アマチュア無線へ

このブログのTopへ


------こちらもよろしく!------

ハム川柳.詠み人知らず.com
ハム川柳.
詠み人知らず.com

カムバック・ハム・
ハンドブック

JO3GBD
ホームページ


最近の記事


  • 本ページに掲載されている全てのコンテンツの無断転載を禁止します。
  • 本ページの内容を予告なく変更する場合があります。
  • 本ページに掲載されている内容のご利用に関してはご自身の判断と自己責任でお願い致します。
  • このホームページはリンクフリーです。
  • Copyright (C) 2005-2018 JO3GBD.  All rights reserved.

<トピックス>

便利な検索窓集

Yahoo! JAPAN

  • ウェブ全体を検索
  • このブログを検索


無線局等
情報検索


Callsign lookup:

Provided by QRZ.com

楽天で探す
楽天市場

IchigoJam





















  • 本ページに掲載されている全てのコンテンツの無断転載を禁止します。
  • 本ページの内容を予告なく変更する場合があります。
  • 本ページに掲載されている内容のご利用に関してはご自身の判断と自己責任でお願い致します。
  • このホームページはリンクフリーです。
  • Copyright (C) 2005-2019 JO3GBD.  All rights reserved.
  • 忍者ブログ
  • [PR]
  • CQ ハム アマチュア無線