あなたが現在見ているのは Raspi Zero 2W ベアメタル開発 9 (キー入力の基礎知識 編)

Raspi Zero 2W ベアメタル開発 9 (キー入力の基礎知識 編)

MZ80K のキーボードの実装を進めていきたいと思う。

キーボードの実装に当たっては、MZ80K がマップドI/O方式について理解する必要がある。

今、この瞬間に押されてるキーボードは何か? あのキーボードは押されているのか押されていないのか? リアルタイムなゲームを作るうえでは欠かせない情報である。MZ80KのBASICでは、キーの状態をリアルタイムに検知する機能はない。

MZ80KのBASIC ( SP-5030等) の場合、INKEY$ でキー入力が発生するまで、ループして押された瞬間を検知することはできるが、今どんな状態かを知ることができない。しかしマシン語を使えば、簡単である。
メモリの $E000 と $E001 に接続された Intel 8255 ( Programmable Peripheral Interface ) PPI の対して、操作を行えばいいのである。

具体的には、メモリの$E000 の 上位4ビットは常に1111B として、下位4ビットには下図の知りたいキーがある場所のKEYSTROBE番号をセットして、$E0001 のDATAビットの状態をしらべれば良い。 MZ700やMZ1500のキーマトリクスはネットでもちらほら散見するが、今となっては MZ80Kのキーマトリクスの情報が無いと思われるので、ここに情報を公開しておこう。だれかの役に立つかもしれないので。

例えば、【V】キーが押されているかどうか知りたかったら、$E000 に F7h (11110111B) をセットして、$E000 の値が FDh (1111 1101B) ならば、Vキーがおされているということになる。

Z80のマシン語だとこんな感じ。BITの状態を調べて条件分岐。

LD ($E000),$F7
LD A,($E001)
BIT 2,A
JP Z,V_KEY_PRESSED

もしくは、AND (論理積) を使って明示的に下記のようにするのも良い。

LD ($E000),$F7
LD A,($E001)
AND %00000100 ; Bit2だけマスク(0b00000100)
JP Z,V_KEY_PRESSED

鋭い人であれば、これが複数キーの状態も検知できそうだと気づくだろう。つまり同時押しも検知できるのである。

ただし、キーマトリクスの回路の弱点として、ある特定のパターンで3つ以上のキーを押すと回路のショートルートができ、違うキーが押された誤検知するという現象があり、ゴーストキーと呼ばれています。

エミュレータでどのように組み込むか

エミュレータでは、マップされたI/O $E000~$E008 のメモリに対して読み書きがあったら、上記処理をすれば良い。

コメントを残す

CAPTCHA