編集履歴一覧に戻る
mikecatのアイコン画像

mikecat が 2022年12月20日20時21分34秒 に編集

アドベントカレンダーのリンク忘れを修正

本文の変更

+

++[自作CPU Advent Calendar 2022](https://qiita.com/advent-calendar/2022/diycpu) 20日目++

[TD4の命令を実行できる自作CPU「Kageki」](https://elchika.com/article/9ac9fd67-86c5-4b1b-a355-4f662e8af794/)で、パドルの操作でモールス信号を出力するやつを作ってみた。 # 仕様 入力ポートのビット2に短点 (左)、ビット3に長点 (右) のスイッチの信号を入力する。 (押されている→HIGH、押されていない→LOW) 出力ポートのビット0にモールス信号が出力される。 (`OUT 0001` を `OUT 1000` に置き換えればビット3に出力できる) (ビットの表記は0-origin) # プログラム ``` 位置 機械語 アセンブリ言語 --------------------------------- 0 00100000 FIRST: IN A 1 00000100 ADD A, 0100 2 11101010 JNC NOBOTH 3 00010000 SOUND: MOV A, B 4 10110001 WAIT: OUT 0001 5 00000001 ADD A, 0001 6 11100100 JNC WAIT 7 10110000 OUT 0000 8 01011000 ADD B, 1000 9 11110000 JMP FIRST A 01110100 NOBOTH: MOV B, 0100 B 00000100 LOOP: ADD A, 0100 C 11101110 JNC NOTON D 11110011 JMP SOUND E 01011000 NOTON: ADD B, 1000 F 11101011 JNC LOOP ``` # 動作 0番地で入力を読み込んだ後、以下の動作をする。 * ビット2・ビット3の両方が1の場合 1. 1番地の加算ででキャリーが発生し、2番地の条件分岐を通過する 2. 現在のBレジスタの値を用いて信号出力処理を行う * ビット3 (長点) のみ1の場合 1. 1番地の加算でAレジスタの上位2ビットは `11` となり、2番地からA番地に飛ぶ 2. A番地でBレジスタを `0100` に設定する 3. B番地の加算でキャリーが発生し、C番地の条件分岐を通過する 4. Bレジスタの値 `0100` を用いて信号出力処理を行う * ビット2 (短点) のみ1の場合 1. 1番地の加算でAレジスタの上位2ビットは `10` となり、2番地からA番地に飛ぶ 2. A番地でBレジスタを `0100` に設定する 3. B番地の加算でAレジスタの上位2ビットは `11` となり、C番地からE番地に飛ぶ 4. E番地の加算でBレジスタの値は `1100` となり、F番地からB番地に飛ぶ 3. B番地の加算でキャリーが発生し、C番地の条件分岐を通過する 4. Bレジスタの値 `1100` を用いて信号出力処理を行う * ビット2・ビット3の両方が0の場合 1. 1番地の加算でAレジスタの上位2ビットは `01` となり、2番地からA番地に飛ぶ 2. A番地でBレジスタを `0100` に設定する 3. B番地の加算でAレジスタの上位2ビットは `10` となり、C番地からE番地に飛ぶ 4. E番地の加算でBレジスタの値は `1100` となり、F番地からB番地に飛ぶ 5. B番地の加算でAレジスタの上位2ビットは `11` となり、C番地からE番地に飛ぶ 6. E番地の加算でキャリーが発生し、F番地の条件分岐を通過する 7. 0番地の入力の読み込みに戻る * 信号出力処理 (共通) 1. 3番地でBレジスタの値をAレジスタにコピーする 2. 4番地で信号をHIGHにする 3. 4~6番地で、Aレジスタに1を足していき、キャリーが発生するまで待つ 4. 7番地で信号をLOWにする 5. 8番地でBレジスタに `1000` を加える。これは同時押し時に短点と長点を交互に出すための切り替えである 6. 9番地で、0番地の入力の読み込みに戻る # パドル接続基板 |![パドル接続基板 表面](https://camo.elchika.com/e8acc8f1951503d2050e36ea26debe0c95402666/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34323336376365652d363839362d346364612d396134612d3433343133383638326635342f62363439643334652d643862642d343562322d623837312d323332313333383262373063/)|![パドル接続基板 裏面](https://camo.elchika.com/9a4286619aeded7d4f841bb94b85303d1b159c95/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34323336376365652d363839362d346364612d396134612d3433343133383638326635342f66373333306636662d656432332d346438382d616662652d303365363934393839323436/)| |---|---| KagekiにCW用のパドルを接続するため、3.5mmステレオジャックのLをビット2、Rをビット3、GNDをVCCに接続し、ビット2とビット3をプルダウンする基板を作成した。 # 実行結果 入力ポートに前述のパドル接続基板を介して [CW-ONE](https://www.cqcqde.com/fs/cqohm/20026) を、出力ポートに [2-way Buzzer Board](https://elchika.com/article/c55891ed-5a5f-4355-bf36-8a9f5ca6cd37/#h_2-way%20Buzzer%20Board) を接続し、200Hz のクロックで実行した。 @[youtube](https://www.youtube.com/watch?v=sQAkOIIz1AA)