TD4の命令を実行できる自作CPU「Kageki」 でUART通信をしてみた。
今回は、「受信したバイトのビットNOTを送信する」という処理を行う。
プログラム
位置 機械語 アセンブリ言語
--------------------------------
0 10111000 FIRST: OUT 1000
1 01100000 IN B
2 01011000 ADD B, 1000
3 11100101 JNC START
4 11110000 DELAY: JMP FIRST
5 10110000 START: OUT 0000
6 00111000 MOV A, 1000
7 00000000 ADD A, 0000
8 01100000 LOOP: IN B
9 01011000 ADD B, 1000
A 00000000 ADD A, 0000
B 10010000 OUT B
C 00000001 ADD A, 0001
D 11101000 JNC LOOP
E 00000000 ADD A, 0000
F 11110100 JMP DELAY
0番地~4番地で、受信スタートビット検出のポーリングを行う。
5番地で、スタートビットを送信する。
6番地で、送信するビット数を設定する。
8番地で、ビットを受信する。
9番地で、受信したビットを反転する。
B番地で、ビットを送信する。
C番地~D番地で、ビットのカウントを進める。
F番地で、時間を稼ぎつつポーリングに戻る。
ポーリングの間隔は5クロック、
ポーリングでスタートビットを検出してから最初のビットを受信するまでの時間は6クロック、
1ビットあたりの時間は6クロックとなっている。
実行方法
- Kagekiをセットアップする (ROMの書き込み、接続など)
- Kagekiのクロック速度とUARTの通信速度を適切に設定する
- UARTの通信速度をクロック速度の1/6に設定する
- 例えば、クロック50kHz、UART 8333bps
- UARTでデータを送信すると、ビットNOTをとったデータが送り返されてくる
実行結果
Kagekiのクロックを50kHzに設定し、
USB-シリアル変換器 TTL-232R (秋月電子通商 M-05841) および Tera Term を用いて8333bps設定で通信を行った。
また、USBロジックアナライザを用いて通信の状況を確認した。
適当なメッセージをCyberChefでビット反転してファイルに保存し、Tera Term の「ファイル送信」機能で送信した。
すると、Tera Term でビット反転前のメッセージを受信できた。
(ビット反転したメッセージをKagekiがビット反転したため、もとに戻った)
ロジックアナライザで確認すると、タイミングによってストップビットが仕様より短くなってしまっている。
ただし、今回の構成では受信への支障はなかったようである。
D0がパソコンからKagekiに送信した信号 (TX)、D1がKagekiからパソコンに送信した信号 (RX) である。