MZ-700では、キーボードのスキャンはすべてCPUが自分で行います。サブCPUや割り込みといった面倒なことを考慮する必要はなく、単純にメモリマップドI/O経由でキーボードの状態を読み取るだけでOKです。
キーボード関連のメモリマップドI/Oは、E000h, E001h です。
アドレス | R/W | 説明 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
E000h | W | 8255 ポートA
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
E001h | R | 8255 ポートB キーボードマトリクスのデータ入力
|
キーボード上の各キーは、8×10の格子状に配列され、キーボードマトリクスを構成しています。E000h への書き込みで0~9のどの行を読み込むかを指定し、E001h を読むことでその行のキーの状態8個分が取得できます。読み込んだ値のうち、対応するビットが 0 のキーが押されており、1 のキーは押されていません。
たとえば、カーソルキーの状態を調べるなら、E000h に F7h を書き込み、E001h を読みます。読んだ値のビット5が 0 なら[↑]キーが、ビット4が 0 なら[↓]キーが押されている…という具合です。
E000h に書き込む値のうち、上位4ビットは 1111b にしておきましょう。
BASIC上でもメモリマップドI/Oを直接POKE/PEEKでアクセスすればキースキャンができそうに思えますが、実はうまくいきません。 これは、BASICが1命令実行するごとに[SHIFT]+[BREAK]のチェックを行っているため、POKE命令でE000h に書いたキーストローブがPEEKで読み取る前に上書きされてしまうからです。
面倒ですが、キー入力ルーチンの部分だけマシン語にするしかないようです。
MZ-700のオーナーズマニュアルに載っているキーマトリクス表では、行に 1~10 の番号が振ってあります。これは、E000h に書く値ではなく、キーボードコネクタのピン番号です。まぎらわしいですが、間違えないように注意。