キーボードからの入力

 MZ-700では、キーボードのスキャンはすべてCPUが自分で行います。サブCPUや割り込みといった面倒なことを考慮する必要はなく、単純にメモリマップドI/O経由でキーボードの状態を読み取るだけでOKです。
 キーボード関連のメモリマップドI/Oは、E000h, E001h です。

アドレスR/W説明
E000hW 8255 ポートA
Bit76543210
R/WW
W
信号556RST
KEYSTROBE

556RSTカーソル点滅用タイマーのリセット0: リセット
1: 何もしない
KEYSTROBEキーボードマトリクスのストローブ出力
E001hR8255 ポートB
キーボードマトリクスのデータ入力
\Strobe
Data\
0123456789
D7カナ YQIA1* INSTBREAKF1
D6GRAPHZRJB2+ DEL CTRL F2
D5= @SKC3- F3
D4英数 (TLD4SPACE F4
D3 )UME50 F5
D2; VNF69
D1: WOG7, ?
D0CR XPH8. / SHIFT

 キーボード上の各キーは、8×10の格子状に配列され、キーボードマトリクスを構成しています。E000h への書き込みで0~9のどの行を読み込むかを指定し、E001h を読むことでその行のキーの状態8個分が取得できます。読み込んだ値のうち、対応するビットが 0 のキーが押されており、1 のキーは押されていません。

 たとえば、カーソルキーの状態を調べるなら、E000h に F7h を書き込み、E001h を読みます。読んだ値のビット5が 0 なら[↑]キーが、ビット4が 0 なら[↓]キーが押されている…という具合です。

 E000h に書き込む値のうち、上位4ビットは 1111b にしておきましょう。

BASIC上でのキースキャン

 BASIC上でもメモリマップドI/Oを直接POKE/PEEKでアクセスすればキースキャンができそうに思えますが、実はうまくいきません。 これは、BASICが1命令実行するごとに[SHIFT]+[BREAK]のチェックを行っているため、POKE命令でE000h に書いたキーストローブがPEEKで読み取る前に上書きされてしまうからです。

 面倒ですが、キー入力ルーチンの部分だけマシン語にするしかないようです。

オーナーズマニュアルのキーマトリクス表

 MZ-700のオーナーズマニュアルに載っているキーマトリクス表では、行に 1~10 の番号が振ってあります。これは、E000h に書く値ではなく、キーボードコネクタのピン番号です。まぎらわしいですが、間違えないように注意。


戻る