はじめに
以前入手したPC-8801FHはキーボードがありません。88は本体は良くオークションに出品されますが、キーボードは滅多に出品されません。幸いにも、PC-8801FH以降のキーボードプロトコルを解析して公開してくださっている神のような方がいらっしゃるので、それを参考に作ってみることにしました。
まずは流行りのraspberry pi picoのmicroPyhonでチャレンジしましたが2080pbpsを作れず挫折しました。そこでジャンク箱に入っていたArduino Mega2560でやってみることにしました。
構成
下記のような構成を想定します。
PC-8801FH <----- arduino mega2560 <----- ps/2 キーボード
まずはPC-8801FHとArduinoを繋いで、プロトコル通りに波形を送り、問題無いか確認します。
PC-8801FHのキーボードコネクタのピンアウト
PC-8801FHのキーボードプロトコル
PC-8801FHは、PS/2と同じでキーを押したときにmake信号が送られ、キーを離したときにbreak信号が送られます。そのmake信号のコードは以下の通りです(このページよりほかの人のページの方がはるかに詳しいです)。
例えば、Qキーを押したときは、001010111111(パリティビットとして最後に0が付く)が送られます。Qキーを離したときは、001011111111(パリティビットとして最後に1が付く)が送られます。
・調歩同期式、制御信号なし
・スタートビット1、12ビットデータ、偶数パリティ、ストップビット1
・20800bps
・キーが押された時にデータ送信(make 信号)、キーが離れた時にデータ送信(break信号)
・データとデータの間は100msは空ける
偶数パリティとは、R0~D7の"1"を全部足し算し、奇数であるならパリティビットを"1"に、偶数なら"0"とする符号のこと。
最後のデータとデータの間隔に最もハマりました。これは、上述のプロトコルのページには、最短でも2.3ms空けると書いてあるのですが、私の環境では100msは空けないと無反応かおかしなことになりました。
次にハマったのが、2080pbpsの送信速度です。これはデータ間隔にハマっていることに気付かず、送信速度が悪いのだと言う見当の元、色々なことをやって全てダメでした。最後にはファンクションジェネレータを持ち出して、やりましたがやはりダメ。結局、データ間隔の問題だと言うことが判明して、送信速度は目論見通り正しかったことが判明しました。
20800bpsなので、1ビットの保持時間は1/20800 ≒ 4.808㎲です。
今回、ファンクションジェネレータで10.4kHzを作って、割り込みをかけましたが、実際にはArduinoはdelay関数と、nopを入れることで、比較的良好なタイミングを作れるので、外部部品は必要ありません。