雑記帳

電子計算機の"明後日"から、他愛もない話まで。

"呪い"の、キーボードマイコン

事の発端

学生の頃にH8マイコン基板を使ってFMR(TOWNS)/OASYS用キーボードをPS/2に変換するアダプタを作って以来、そのリニューアル版にあたる「FMR to PS/2 キーボード変換器」に移行しつつも、長らくFMR60KB201(初代FMR-50/60/70系の親指シフトキーボード)とFACOM6140KA1(88年モデルからのOASYS-100系親指シフトキーボード)をメインキーボードとして使ってきたのですが、一貫して一つの不満がありました。

「なんとなく反応が鈍い(気がする)」

全般的にどのキーに対しても言えることではあったのですが、特にカーソルキーを派手に使ったりした場合は露骨で、ギリギリ許容できる範囲でありつつ、確実にやる気を削ぐ絶妙な遅延がずっと気になっていました。

カーソル操作といえば、FMR系のキーボードはこれらのキー操作に限って、なぜか無駄にインテリジェントな通知をして来ます。こういったことから、変換アダプタの方でキー解析に時間がかかっているせいでトロく感じるのではないか? と考え、今のFMR to PS/2 キーボード変換器に至るまで高速化を目指して改良してきた訳です。

しかしながら、

  • カーソルキーの解析は200μsもかからず実行できている(実測)
  • キーコード2バイト目受信完了~PS/2側送信完了までの実測は約2ms程度(PS/2側0xE0プリフィクス付きの場合)

という状況まで追い込んだところで件の遅延が体感上改善しないことから、

「遅延を生み出している張本人はキーボードに乗っているマイコン / 通信プロトコルではなかろうか」

という疑惑が生まれました。

 

そもそも、キーボードからの通信仕様を眺めたり、実際に信号を観察したりすると、

  • ボーレートが9600bpsと、PS/2での最速通信速度(約16.6kbps)の約半分程度
  • 2バイト目のデータを受信しないとキーコードが得られない(1バイト目はフラグ類なので)
  • しかも、1バイト送信毎に約4.5ms程の間隔を空けて送って来る
  • 全キーのマトリクススキャン自体に16msかかっている

という素敵な設計になっており、既にこの時点で変換器よりも遥かに大きな遅延が生み出されています*1

プロトコルやキーボードマイコンの問題となると、さすがに外からはどうしようもないので途方に暮れていた訳ですが、親指の友 Mk-2ドライバに零遅延モードを追加する実験等を通して、益々キー操作の応答性を意識するようになったところで、さすがになんとかしたいと考えていた矢先、重要な存在を思い出しました。

 

FACOM6130KF1

イメージ 1

こちらもOASYS-100系親指シフトキーボードなのですが、FACOM6140KA1よりも前のモデルです。

神田さんのところのカタログやビジネスOASYSの型番・製造時期を見る限り、86年の100F2や、87年モデルの100HX・100N辺りで使われたのではないかと推測されます。

何が重要かと言うと、このキーボード、エンコード用のマイコンが乗っておらず、標準ロジックICで組まれた行列選択回路を直接外部から叩けるI/Fになっています。ようは「直接キーマトリクススキャンをしてください」ということですね。もし件の遅延がプロトコルマイコンのファームに起因しているのであれば、このキーボード用の変換アダプタを作った際には遅延が発生しなくなるはずです。

 

ということで、早速作ってみました。「OASYS(13ピン) to PS/2 キーボード変換器」です。

イメージ 2

 

本当は「FACOM6130KF1 to PS/2変換器」とすべきなのですが、OASYS-100系用キーボードのうち、他の型番を持つDIN13ピン*2接続のものならキーテーブルさえ見直せば使えるんじゃないかと淡い期待を寄せた為、こういうネーミングになりました。尚、キーボード自体にファントムキー対策(ダイオード)が入っていますので、ソフト的な工夫は一切無くともnキーロールオーバ対応です。

ただ、写真のブツは手持ち部品を使って作った関係上、キーボード基板側のフラットケーブルコネクタ(MIL規格 2.54ピッチ20ピン)から信号線を引き出しており、DIN13コネクタ側の結線については調べてません。ざっと調べてみた限り、こいつのメスコネクタは入手が難しそうだったので(オスの方なら秋葉原のヒロセテクニカルとかにもあったんですが…)、キーボードをOASYS実機に繋ぎかえる必要が無く、かつビジュアルを多少犠牲にしても良ければ、どこでも買えるフラットケーブルコネクタ経由にするのも手かと思います。

 

さて、この変換アダプタを使った結果ですが、結論から言うと非常に良好でして、遅延は殆ど感じられず、丸5年を経てやっと普通のキーボード生活に戻れたような感じです。これならキーを押す度にやる気を削がれることもありません。

以上の結果より、やはり遅延の主たる原因は、キーボードマイコン(か、通信プロトコル)にあったと言えそうです。

 

話の続き

個人的な問題として、とりあえずOASYS配列のキーボードについては、FACOM6140KA1に代わってFACOM6130KF1を使うことで遅延問題は解決しました。

しかし、FMR系の配列を持つキーボードはいずれもマイコン内蔵になるため、こっちの配列で使えるキーボードが無くなってしまいます…。最悪、パターンカットして元々のキーボードマイコンを切り離し、マトリクススキャン版の自作アダプタを仕込む作戦が考えられますが、我が家ではFM-TOWNSが現役であり、キーボードをこちらに繋いで使う場面があるため、元のマイコンを使えなくするのは抵抗があります…。

ということで、こんな仕組みを考えてみました。

 

パラサイトキーボードマイコン

ようは、マイコンからマトリクスに対する出力が衝突しなければ(Hi-Z固定にさえなってくれれば)、追加マイコン側からの走査出力が繋がっていても影響はない訳です(逆に、元マイコンに走査させる場合は、追加マイコン側の出力線を入力ポートに設定すればOKです)。

ということで、2つのキースキャンマイコンを同居させ、接続状況に応じていずれか一方のマイコンだけがマトリクススキャンを行うような構成を組んでみました。元マイコン側が動作すれば今まで通りですし、追加マイコン側が動けば高速なPS/2キーボードに早変わり…という訳です。

FMR/TOWNSシリーズのキーボードマイコンにはi8049(又はそのCMOS版であるi80C49)が使われており、マトリクススキャン用の線はこれのバスポート(DB0~6又は7)に繋がっています。このポートは名前から推測できるように、丁度初期出力がHi-Zになっています。よって、追加マイコン側から元マイコンのリセットピンを制御すれば、元マイコンのキースキャンを制御できる…ということになります。

接続先の判断についても、FMR側ではキーボードからのTx線がオープンコレクタ出力になっており、受信端でプルアップするようになっています。よって、プルアップの有無(予め高抵抗でプルダウンしておき、アイドル時電位のH/L)を判断すれば、FMR側が接続されているのかの判断は可能です。

 

以上のことより、起動時にこの信号状態を見て、i8049側のリセットを制御する機能を「OASYS(13ピン) to PS/2 キーボード変換器」に追加してしまえば、当初の目的を達成することができます。というわけで、早速組み込んでみました。

イメージ 3

 

こちらを使ってみた結果ですが、やはり大変良好で、いかにタッチの好みを遅延で相殺していたか思い知りました。先月からブログの更新ペースが上がっているのですが、冗談抜きにこのアダプタを作ったことで遅延問題が解決したことが原因です。だって、よくよく考えたら超好みのキーボードだったはずなのに、今まで家帰ってから全然触る気がしなかったんだもんなぁ。今の反応であれば時間が許す限り触っていたいので、そりゃアウトプットも増えますよね。

 

尚、こちらの機能も「OASYS(13ピン) to PS/2 キーボード変換器」の公開版に含まれていますが、あくまでもオマケ機能であり、デフォルトは無効にしています(ソース中のコメントを外してリビルドする必要があります)。また、(完成して暫く使ってから気付いたのですが)PAUSEキーやEXT1キー等が増えているタイプ(FMR60KB211)ではマトリクスの制御線が1本増えているため、これらのキーボードを使う場合はアダプタとの接続やファームの制御を一部変更する必要があります。

 

しまいに

さて、自分としては、大昔にFMR60KB101を触ったことで始まった「キーボード熱」が、紆余曲折を経てやっと満足いく着地点にたどり着いたかな…というところです。我ながら大変長い脱線だったと思いますが、これでようやっと、快適な環境で集中して「作りたいものを作る」作業に戻ることができます*3

ということで、もし期待して頂いていた方が居られたら申し訳ないのですが、今後キーボード周りのハード製作やソフト・資料の更新を行う予定はありません。勿論、(今回のように)突発的に何か思いついて、急遽作ったりチューニングしたりということはあるかもしれませんが、基本的には新規で何か作ったりすることはないとお考えください。

一応こちらの製作物は全てソースコードを同封してありますので、必要な機能が欲しい方は、是非ご自分で改造するなりして対応して下さい。

 

この記事までで、とりあえずブログ用に書こうと思っていたネタも消費したので、今後は電脳文庫プロジェクトの開発を進めつつ、ブログの方にはそっちに関連するネタ(OS設計に関するネタ、関係するハードのネタとか)や作り事全般に関する話を書いていこうかと思います。

 

オチ

ノロいの、キーボードマイコン…。

…うん、つまらん。

 

まぁやる気削ぐって意味では立派な呪いでしたがね。

*1:でも、TOWNSに繋いで使っているときは、そんなにトロくは感じないんだよなぁ…。
そもそもシステム全体がトロいから気にならないだけなのか、ソフト側のステップ数やハードの経路段数が少ない分、割り込み応答性がV機よりも良いのか…。

*2:ACOM6130KF1入手当時に調べた際、「これはDIN13ピンと呼ぶらしい(呼ばれているらしい)」と判断したため、以降この名前で呼んできたのですが、実はDIN規格とは関係ないコネクタのようで(DIN規格は8ピンまでしかない)、正しくはホシデンの丸型多極コネクタ(13ピン)という代物のようです(コネクタにホシデンのロゴが入ってました…)。
まぁ確かに外形はDINコネクタと同じ位ですし、一応世間的にもDIN13ピンで通っているようなので以降もこの名前で呼びますが、お買い求めの際等はお間違えの無いようご注意下さい。

*3:まぁまたPS/2が絶滅する頃に一悶着やるのでしょうが…。でも、USB HIDが現役ならOyayusbyとコレをニコイチするだけですから、はっきりいって大した作業じゃないですねぇ。