GBCの赤外線通信ポートの秘密

GBCの赤外線通信ポートの制御レジスタ(0xFF56)には未使用とされていたBit2〜Bit5のうち、Bit4にシリアルポートのP14入力が繋がっていることをKen Kaarvik氏により発見されました。

赤外線通信ポートレジスタの仕様
アドレス:FF56(初期値:00)
 Bit7&6:データ読み出し許可フラグ
     00:Disable
     11:Enable
 Bit5-2:未使用--->Bit4:P14入力(シリアルポート)
 Bit1:受信データ
 Bit0:送信データ
     0:LED-On
     1:LED-Off

Ken Kaarvik氏はこの赤外線通信ポートレジスタのBit4を利用してPCのATキーボードをGBCに繋げるドライバを開発されました。ATキーボードはPS/2キーボードとピンアサインのみが異なります。つまりピンアサインをPS/2用に変更すれば、PS/2キーボードにもこのドライバがそのまま使えるのです。


PS/2キーボード変換ケーブルの製作
PS/2キーボードをGBCに繋げるためには、GBC用通信ケーブルのプラグとPS/2キーボードのプラグの変換ケーブルを製作します。用意するものは、GBC用の通信ケーブル(全ピン結線のもの:任天堂純正品はpin1とpin4が結線されていないので不可)とミニDIN6ピンメスプラグです。
ピンアサインは以下の通りです。一応ATキーボードを使われる方のためにATキーボード(DIN5ピン)のピンアサインも載せておきます。
GBC serial port | PS/2 keyboard (AT keyboard) GBCとPS/2のプラグの図

pin1 +5v| pin4 +5v (pin5 +5v)
pin2 Sout| nc (nc)
pin3 Sin| pin1 Data (pin2 Data)
pin4 (was P14)| pin5 Clock (pin1 Clock)
pin5 Clock| pin5 Clock (pin1 Clock)
pin6 GND| pin3 GND (pin4 GND)

GBCのシリアルとPS/2キーボードの通信仕様
GBCのシリアルとPS/2キーボードの通信仕様を以下に整理しました。
  GBCのシリアル PS/2キーボード
通信方式同期式シリアル同期式シリアル
通信速度8KHz/256KHz(内部クロック)
または外部クロック
???(内部クロック)
送信ビットData bit(8bit)のみData bit(8bit)
Start/Stop/Parity bit(各1bit)
先頭ビットMSBLSB
双方ともクロックによる同期式通信方式です。通信速度はPS/2キーボードが内部クロック(固定)に対して、GBCのシリアルは外部クロックが選択できるので、キーボード側のクロックに合わせることができます。
データは以下の1から順に送受信されます。双方のデータのビット列の向きが逆になっているので、受信後に向きを入れ替える必要があります。
  GBCのシリアル
(受信)
PS/2キーボード
(送信)
1Data bit7(MSB)Start bit(0)
2Data bit6Data bit0(LSB)
3Data bit5Data bit1
4Data bit4Data bit2
5Data bit3Data bit3
6Data bit2Data bit4
7Data bit1Data bit5
8Data bit0(LSB)Data bit6
9Data bit7(MSB)
10Parity bit(odd)
11Stop bit(1)
双方の通信仕様の大きな違いは送信ビット数です。GBCシリアルはデータビット8ビットのみに対し、PS/2キーボードの通信データはデータビット8ビット、スタート/ストップ/パリティビットが各々1ビットの計11ビットです。クロックによる同期式通信方式なのに非同期式通信方式のようにスタート/ストップビットがあるんですね。このPS/2キーボードの信号をGBCシリアルで受信するにはスタートビットの処理が重要ポイントとなります。GBCで新設された赤外線通信ポート用レジスタに繋がっているシリアルのpin4にPS/2キーボードのクロック線を繋ぎ、クロック線の信号を監視することができるようになったことにより、GBで初めてPCのキーボードを繋げることが可能となったのです。

Ken Kaarvik氏のキーボードドライバのしくみ
プログラムの流れを以下に示します。無信号時のクロックはHighレベルとなっています。
(1) スタートビットのクロックパルス開始の検出
  クロックがLowレベルになるのを待つ。Lowレベルになれば(2)に進む。
(2) スタートビットのクロックパルス終了の検出
  クロックがHighレベルになるのを待つ。Highレベルになれば(3)に進む。
(3) データビットのクロックパルス開始の検出
  クロックがLowレベルになるのを待つ。Lowレベルになれば(4)に進む。
(4) GBCのシリアル8ビットデータの受信開始
  シリアルポート制御レジスタ(0xFF02)に以下の値を書込むことにより受信開始となる。
   0x80(10000000b)
    Bit0:0・・・外部クロックを指定
    Bit7:1・・・8ビットデータの受信開始
(5) 8ビットデータ受信完了チェック
  受信が完了すればシリアルポート制御レジスタ(0xFF02)のBit7が 0になるのでこれをチェックする。
  Bit7が 0になれば(6)に進む。
(6) 受信データの取り込み
  受信したデータはシリアルポートデータレジスタ(0xFF01)に格納されている。
  このデータを作業レジスタに取り込む。
(7) 受信データのLSBとMSBを変更
  作業レジスタに取り込んだ受信データのLSBとMSBのビット列の向きを変更する。
  作業レジスタのデータをメモリに書き込む。
(8) ストップビットのクロックパルス終了の検出
  クロックがHighレベルになるのを待つ。Highレベルになればリターン。
                             (1)   (3)
                High ---------+  +--+  +--+  +--+  +--//--+  +--+  +--+  +----------
Keyboard Clock                |  |  |  |  |  |  |  |      |  |  |  |  |  |
                Low           +--+  +--+  +--+  +--+      +--+  +--+  +--+
                                (2)                                     (8)

                              |Start|Data0|Data1|Data2・・|Data7|Party|Stop |

                High ---------+     +-----+-----+-----//--+-----+-----+-------------
Keyboard Data                 |     |     |     |         |     |     |
                Low           +-----+-----+-----+-----//--+-----+-----+
                                     (4)                       (5)(6)(7)

GB-KEY
RGBASMで書かれていたKen Kaarvik氏のキーボードドライバのプログラムソースをGBDK用に書き直しました。また日本語キーボードにも対応させました。

GB-BAR
GB-KEYドライバを流用してIBM製のパーコードスキャナを利用できるようにしました。これはPS/2インターフェイスですが、キーボード互換データではなく直接アスキーコードが出力されるものでした。

GB-CAT
米国で話題のバーコードスキャナ「キューキャット」を利用できるようにしました。詳細はこちら--->:Cue:C.A.T.リーダ「GB-CAT」


上記のソフトはTeamKNOxのWebサイトからダウンロード下さい。

INDEXに戻る

Copyright(C) 2000-2001 Kiyoshi Izumi