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