USBマウス・USBキーボードをPC-9801に接続する変換器の製作 2017.9.10

    1.はじめに

     PC-8801やPC-9801のレトロPCに関するある開発プロジェクトを進めていく中で、実機が一台も手元に無く、これでは試作品の検証もままならないと、仕方なくジャンクのPC-8801mkIIやPC-9801VM、PC-9801RXをヤフオクで入手しました。いずれも電源が入らないなどの不具合がありましたが、うまく修理できました。

     ところが、9801専用のキーボードがありません。これでは全く何も出来ません。そこで、手持ちのUSBキーボードやUSBマウスを接続するための変換器を製作してみることにしました。


    2.キーボード変換器の製作

    2−1.ハードウエア

     キーボード変換器の製作には、USBマイコンのPIC24FJ64GB002を使いました。3.3Vのマイコンですが、5Vトレラントピンを使えば、PC-9801のキーボードインタフェースに直接繋ぐことが出来ます。

     回路図と完成品の写真です。
    部品点数も少なくブレッドボードなら簡単に製作出来ます。 完成した変換器です。miniDIN8ピンコネクタはケーブルで接続しています。 基板裏面です。部品点数は少なくても半田付けするのは結構大変です。

     USBマイコンを使いましたので回路は簡単です。3.3Vのレギュレータと抵抗1本、コンデンサ5個とシンプルです。3.3Vのレギュレータ部は、ダイオード2本(あるいは3本)を直列につないだものに置き換えれば、更に部品点数を減らすことが出来ます。

     マイコンから外部に引き出す回路、今回の場合はPC-98のキーボードインタフェースとの接続ですが、通常は100Ω程度の低抵抗を通して引き出すものなのですが省略しています。

     さらに、RB8のUARTのTX端子はオープンドレインに設定しましたので+5V のプルアップが本来なら必要なのですが、今回はこれも行っていません。キーボードインタフェースのRXD端子は、PC-9801側で+5Vにプルアップされているようですので省略しました。全ての98機がどうなっているかは判りませんので、プルアップした方が良かったのかも知れません。

     以上のように、正常に動けば良いとばかりに大いに手抜きしています。


    2−2.ファームウエア

     PICマイコンのファームウエアは、MPLAB-X-IDE で XC16 コンパイラを使いC言語で作成しました。USBドライバー部分については、マイクロチップ提供のドライバーソフトやそれをハブ対応に改造したものを使うのではなく、プログラムサイズが小さなシンプルなホストドライバーを別途作成しました。このため、ハブを内蔵したキーボードを接続することは出来ません。

     変換器のメインとなる処理は次のようになります。

      ・USBキーボードからキーデータを読み出します。

      ・キーデータは、8バイトのパケットになっており、先頭の1バイトに shift, ctrl, alt, window の修飾キーのオンオフ情報がビットに割り付けて格納されています。
       2バイト目は空きです。3バイト目から8バイト目までの6バイトに、今押されているキーのスキャンコードが格納されています。これで、最大6つまでのキーの同時押しが判るようになっています。

      ・ キーデータには、押されているキーのスキャンコードのみが格納されています。キーを押した、離したの情報はありません。そのため、前回に読み出したキーデータと今回読み出したキーデータを比較して新たに押されたキーは何で、離されたキーは何かを調べます。

      ・ 押されたキーが、リピート処理の対象であれば、リピート処理のための準備を行います。具体的には、リピート開始までの遅延タイマーの起動などです。shift キーや caps キーなどはリピート対象外となります。更に、押されたキーが caps や kana の場合には、caps lock や kana lock のロック開始やロック解除の処理を行います。

      ・ 離されたキーについては、リピート処理の対象キーであれば、既に行っているリピート処理の解除を行います。

      ・ 最後に、押されたキーや離されたキーのスキャンコードを98機のキーコードに変換し98に送信します。キーの読み出し、変換処理の合間に、リピートキーの処理を行います。

      ・ これらの処理の他に、98機から下りコマンドが送信されて来た場合には、その処理も行います。

     上記の処理を行っているプログラムがこちらのソースコード(main.c)になります。コメントを追いかければ大体の動きが判って頂けると思います。


    3.バスマウス変換器の製作

    3−1.ハードウエア

     マウス変換器についても、回路は、キーボード変換器とほぼ同じです。なお、この変換器は、バスマウスへの変換のみでシリアルマウスへの変換は出来ません。またバスマウスでは元々ホィールの機能はありません。

     回路図と完成品の写真です。

    キーボード変換器とほぼ同じです。接続するピンの数が異なるだけです。 完成した変換器です。DSUB9ピンコネクタはケーブルで接続しています。 基板裏面です。こちらも半田付けするのは結構面倒ですね。

     こちらの回路でもXa,Xbなどの出力端子のプルアップ抵抗を省略しています。RB5,RB7,RB8,RB9,RB14,RB15は、オープンドレインに設定していますので本来ならプルアップが必要ですが、幸い98機側でプルアップされているようですので省略しても問題なく動作します。

     本回路で問題があるとすれば、LEFT/RIGHT ボタン信号の RB14,RB15 です。このピンは、5Vトレラントピンではありません。Xa,Xb,Ya,Ybに割り当てたRB5〜RB9は5Vトレラントピンですので、マウスインタフェースに直結しても問題ありません。RB14,RB15 の出力は、3.3V/5Vのレベル変換回路(トランジスタなど)を通すべきですが、本作では、直結しています。

     動かして見た所、PIC側の端子が壊れるかと思いましたが特に支障なく動作しています。ですので、何も対策せずに使っています。マイコンチップが熱くなるようなことも全くありません。


    3−2.ファームウエア

     こちらのファームウエアも、MPLAB-X-IDE で XC16 コンパイラを使いC言語で作成しました。USBドライバー部分については、キーボード変換器と同じです。

     変換器のメインとなる処理です。

     まず、初めにバスマウスのプロトコルについてです。これについては、こちらのページに詳しい説明があります。

     右の図は、このページから一部引用させて頂いたものです。

     USBマウスから読み取ったX方向の移動量について、その移動量に応じたカウントパルスをマウスインタフェースのXa,Xb端子に出力すればよいことが判ります。Y方向についても同じです。

     USBマウスからの信号は、一般的なマウスでは、4バイトのパケットで送られてきます。1バイト目には、左右のボタン、ホィールのボタンの押下状態が、ビット1からビット3までに割り当てて格納されてきます。該当ビットが0ならボタンオフ、1ならボタンオンとなります。これに従って、LEFT/RIGHTの出力ピンをオンオフすればいい訳です。

     2バイト目は、X方向の移動量、3バイト目はY方向の移動量、4バイト目はホィールの回転量が、符号付き8ビット整数で格納されてきます。マウスを動かさずにじっとしていると、それぞれ0が送られて来ます。左右に動かすと、プラスの値やマイナスの値が送られてきます。その値は、その時マウスを動かした移動量を示しています。プラスの値は、X方向では右へ、Y方向では下へマウスを動かしたことを示します。マイナスの値は、この逆です。

     USBマウスからのデータは、インタラプト転送で、10msec間隔で読み出すことになります。読み出した各方向の移動量に応じたカウントパルスを出力するのですが、このパルスを出力する時間は、10msecです。次の10msec後には、マウスから次のデータを読み出さねばなりません。

     今読み込んだ値が5カウントだったとします。すると10msecの間に5カウントを出力するとすれば1カウント当たり2msecで出力すれば良い事になります。先の図で示すパルスの位相差の幅が2msecということです。

     次に読み込んだ値が20カウントだったとすると、次の10msecでは、1カウント当たり0.5msecで出力しないといけません。つまり、図で示すカウントパルスは、パルス間隔を一定で出力するのではなく、常に変化させなければなりません。

     バスマウスはホィールに対応していませんので、扱うのは、XとYの2つです。10msecの間には、XもYもカウントされますので、Xについては、10msecではなく5msecの間に、Yについても同様に5msecの間にカウントパルスを出力するようにします。

     では、カウントパルスの1カウント当たりの最も短い時間はどれぐらいでしょうか。符号付き8ビット整数では、+127〜-128ですので、最大値を128カウントとすると、5msec÷128カウント=39μsecということになります。ソフトウエアのループ処理で時間を正確にカウントするのは大変です。そこで、PICに内蔵のタイマーを使ってこの時間を作ることにしました。

     以上のような考えを元に作成したのがこちらのソースコード(main.c)となります。キーボード変換器に比べると非常に簡単なプログラムとなっています。


    4.その他

     製作した変換器を、それぞれケースに収納してみました。

    秋月電子で販売しているポリカーボネイトの小ケースに収納しました。 製作した変換機をPC-9801RXに接続しています。

     PICマイコンに書き込むファームウエア(HEXファイル)は次のとおりです。

     変換機は、どちらもハブには対応していません。

     全ての98機で動作確認した訳ではありません。動かない98機があるかもしれません。

     キーボードやマウスをUSBコネクタに接続した時、HIDのレポートディスクリプタを読まずに、一般的なキーボード、マウスのデータパケットを元にハードコーディングしています。そのため、接続しても動かないキーボードやマウスがあるかと思います。

     本ページを参考に製作される場合には、自己責任で行ってください。

      ===== 2018.2.2 =====================================================================
       マウス変換器について基板化しました。詳細は、こちらを参照ください。

      ===== 2019.3.25 =====================================================================
       キーボード変換器について基板化しました。詳細は、こちらを参照ください。