2012-02-04
最新版Quckey2はこちら
遠い昔、いにしえのPC-9800シリーズが日本を席巻していた頃、jfkeyというプログラム(手前味噌^^;)がありました。これはキーボードの操作性を細かくカスタマイズするデバイスドライバで、その目玉機能としてキーのオートリピートを高速化することができました。時は過ぎ、PC/AT(互換機)の時代になりましたが、いろいろ面倒くさいPS/2キーボードの仕様に圧倒され(ちょっと誇張)、BIOSを乗っ取って実装するだけの技量を欠いており、さらには、Windows時代の到来についていけず、VxDの学習もままならず、PC/AT版jfkeyを作ることはできませんでした。それでもやはり、キーリピート速度の高速化の野望は持ち続けていました。今となっては、DOS/Win95系/WinNT系/Linux/BSD/Solaris等々OSの選択肢も多岐にわたり、ソフトウェアで実現するには無理な状況になってしまいました。そこで、ワンチップマイコンを使ってハードウェアキーボードアクセラレータを作ることにしました。
言うまでもないかもしれませんが、オートリピートについて一応おさらいしておきます。キーを押しっぱなしにして少し待つと、その文字が連続して入力される仕組みです。IBM用語で「タイプマチック」とも呼ばれます。オートリピートの速度は、Windowsではコントロールパネルのキーボードのプロパティで設定できます。Linuxならkbdrateコマンドで設定できます。
リピート速度を決定する値にはディレイとレートがあります。ディレイは1文字目が入力されてから2文字目が入力されるまでの待ち時間で、単位はms(ミリ秒)です。250msから1000msの範囲で4段階で指定します。レートは2文字目以降が入力される速度で、単位はcps(毎秒n文字)です。2cpsから30cpsの範囲で32段階で指定します。PC-9800シリーズでは、ディレイは500msレートは25cpsに固定されており、設定を変更することはできません。
PC互換機のキーボードにおける最高速設定にしても250ms/30cpsしかありません。PC-9800の標準より速いとはいえ、私個人的には超高速リピートが好きなので、200ms/75cpsくらいが理想ですので、まだまだもの足りません。今回制作したQuckey!はPC本体とキーボードを仲介し、キーボードが生成したオートリピートを無視し、Quckey!が内部でリピート処理を行います。
Quckey!のハードウェアキーボードアクセラレータの特性を生かして、もう一つの目玉機能として、「IBM 5576-002 → 106キーボードエミュレーション」があります。詳しくはこちらをお読みください。
マイコンは日立H8/3664を使用します。その他、主な部品は、ミニDIN6ピンコネクタ、キーボード延長ケーブル(のオス側)、NPNトランジスタ4個、抵抗4.7kΩ8本、発光ダイオード(お好み)、470Ωなどです。
H8/3664キットを組み立てます。と言っても、基板は完成品ですので、ピンヘッダをハンダ付けするだけです。親基板には裏返して装着しますので、ピンヘッダは部品面に取り付けます。
親基板の加工は少し面倒です。ケースにあわせて不要な部分をハンドニブラで切除します。キーボードコネクタの取り付け穴は電動ルータやダイヤモンドヤスリを使いました。
配線図 (PDF)
(Revision 2)
ちなみに古い設計は参考までにこちらに置いてあります。rev.1とrev.2の違いは、配線を見直して、ウレタン線の使用を極力減らしたことです。rev.2の方が、ほとんどの部分を錫メッキ線だけで配線できます。また、rev.2ではリセットスイッチを省略しました。
ケーブルはナイロン結束バンドで基板にしっかり固定します。
ケーブルの基板用コネクタはシングルラインICソケットにハンダを流し込んで作った、お手軽コネクタです。
ケースの板厚が3mmもあるので、これにぴったり合うゴムブッシュが入手困難かもしれません。2010/01現在、千石電商で入手できます。
タカチ電気工業製のSS-90(SS-N90)がちょうどいい大きさです。
組み上がった様子です。
quckey/quckey.motというファイルがコンパイル済みファームウェアです。これをH8/3664に書き込んでください。改造する場合には再コンパイルのためにh8300-hms-gcc一式が必要となります。同梱のMakefileはDebian GNU/Linuxでコンパイルする場合しか考慮していませんので、それ以外では修正が必要だと思います。Debianなら binutils-h8300-hms と gcc-h8300-hms と、関連パッケージをインストールしておけばコンパイルできると思います。
開発環境はLinuxを使用します。コンパイルと書き込みに使う開発用PCのほかに、書き込み中に電源を供給するため、PS/2コネクタを有したPCが必要です。1台しか無い場合は別途電源を用意する必要があります。
ファームウェアの書き込み時に、ジャンパピンをショートするのを忘れずに。書き込み終わったら、ジャンパピンを外すのを忘れずに。
初めて使うと、猛烈な違和感を感じると思いますが、1~2時間も使っているうちに、これ無くては生きていけない体質になってしまいます。とても中毒性が高いので、自宅用と会社用の2台を作らざるを得なくなります。それが嫌ならこんなものはに手を出すべきではありません。(笑)
とりあえず現バージョンのファームウェアでは、ディレイ200msレート77cps固定になっています。ファームウェアを再コンパイルして書き込まない限り、リピート速度を変更することはできません。コントロールパネル等で設定した値を(例えば)3倍するなどして、ホストPCから24cpsにするという要求を受け取ったとき72cpsで処理するといった方法も考えましたが、しばらく使ってみた結果、速度を可変にする必要を感じないという結論に達しました。
活線挿抜も何とか動いているようですが、たまに動かなくなることもあります。こればかりは本物のキーボードでも時々動かなくなることがあるので、仕方ないのかもしれません。
それにしてもPS/2インターフェース。どんな歴史的事情があったのか知りませんが、過剰にインテリジェント化されていて面倒臭すぎます。可変長スキャンコードのデコードやエンコード、制御コマンドのハンドリングなど。まぁ、適当に手を抜く実装はできるんですが、少しでも本物のキーボードの動きに近づけたいと思ったので、プログラムやテーブルが長めになってしまいました。クロック線とデータ線で半二重通信する方式も、賢いと言えば賢いのかもしれないけど、PC-9800やSunのように調歩同期式シリアル通信のほうが制御は簡単です。これではマザーボードやBIOSやキーボードの相性問題が発生しそうな予感がします。実際にキーボードやマウスの切り替え機で問題を抱えたものが結構あるようで、開発者の皆さん苦労しているのかもしれません。過去の遺物との互換性を保つのも大変です。