,{t},{BSIZE:1 0|SIZE:100%} ,{BSIZE:0}←[[2章 カセット I/F|2章 カセット・インターフェイス]] ,{BSIZE:0|RIGHT}[[4章 プリンタ I/F|4章 プリンタ・インターフェイス]] →  MSX2のキーボードはMSX1と同じ構造をしていますが、カナの入力時にローマ字カナ変換方式が使えるようになり、機能的にはたいへん便利になりました。本章ではMSX2のキーボードインターフェイスについて説明します。  なお、キーの配列などについては日本仕様のキーボードをもとに説明しますが、海外仕様のMSXではデータが少し異なる部分もあります。 !!3.1 キー配列  MSXのキーボードの配列は、英数字はJIS標準配列を採用しており、カナはJIS標準配列と五十音順配列をジャンパ線により切り換えています。ただし、このジャンパ線による設定はシステム起動時にどちらの配列を選ぶか決めているだけであり、ワークエリアKANAMDの値で任意に変更可能です。 '''【KANAMD (FCADH, 1)】''' キー配列 (0=五十音配列、0以外=JIS配列) !!3.2 キースキャン  MSXは図6.15のようなキーマトリクスを持っています。このキーマトリクスを調べることによって、キーの押されている状況をリアルタイムに得ることが可能であり、ゲームなどの入力に使用できます。  キーマトリクスのスキャンは、次のBIOSルーチンを用いて行います。 ::SNSMAT (0141H,MAIN) ,{SIZE:100|CENTER}機能 キーマトリクスの指定行を読み出します。 ,{SIZE:100|CENTER}コール手順 ,{t},{BSIZE:0} ,{c},{BSIZE:0|SIZE:70},{BSIZE:0} ,A,読み出すキーマトリクスの行 (0〜10) ,{SIZE:100|CENTER}戻り値 ,{t},{BSIZE:0} ,{c},{BSIZE:0|SIZE:70},{BSIZE:0} ,A,指定したキーマトリクスの行の状態(押されているキーのビットが0になる) ,{SIZE:100|CENTER}変更レジスタ AF、C ,{SIZE:100|CENTER}解説 図6.15のキーマトリクスの1行を指定し、その状態をAレジスタに返します。このとき、押されているキーに対応するビットが「0」、押されていないキーに対応するビットは「1」になります。 サンプルプログラム「KEYSCAN.MAC」を参照して下さい。 {{svg 図6.15.svg}} '''図6.15 キーマトリクス''' !!3.3 文字の入力  MSXは、タイマ割り込みにより1/60秒ごとにキーマトリクスをスキャンしており、キーが押されていれば、その文字コードを図6.16のようなリング状のキーボードバッファに格納します。なお、MSXのキー入力は、一般にこのキーボードバッファを読むことによって行っています。 {{svg 図6.16.svg}} '''図6.16 リング状のキーボードバッファ'''  このキーボードバッファを使用したキー入力およびそれに関連する機能を持ったBIOSを以下に示します。タイマ割り込みを禁止すると、当然これらは使用できなくなります。 ::CHSNS (009CH/MAIN) ,{SIZE:100|CENTER}機能 キーボードバッファの残りをチェックします。 ,{SIZE:100|CENTER}コール手順 なし ,{SIZE:100|CENTER}戻り値 バッファが空なら、ZフラグON ,{SIZE:100|CENTER}変更レジスタ AF ,{SIZE:100|CENTER}解説 キーボードバッファに文字が残っているかどうかを調べます。キーボードバッファが空であればZフラグを立てます。 ::CHGET (009FH/MAIN) ,{SIZE:100|CENTER}機能 キーボードバッファから文字を1文字入力します。 ,{SIZE:100|CENTER}コール手順 なし ,{SIZE:100|CENTER}戻り値 ,{t},{BSIZE:0} ,{c},{BSIZE:0|SIZE:70},{BSIZE:0} ,A,文字コード ,{SIZE:100|CENTER}変更レジスタ AF ,{SIZE:100|CENTER}解説 キーボードバッファから1文字読み出してAレジスタに格納します。バッファに文字が入っていない場合には、カーソルを表示してキー入力があるまで待ちます。キー入力待ちの間、CAPロック、カナロック、ローマ字カナ変換ロックも有効です。関係のあるワークエリアは以下に示すとおりです。このうち、SCNCNTとREPCNTはCHGETルーチン実行後に初期化されてしまうので、オートリピートの時間間隔を変えるためにはCHGETコールのたびにこのワークを設定する必要があります。 ,{t},{BSIZE:0} ,{c},{BSIZE:0|SIZE:140},{BSIZE:0} ,"【CLIKSW(F3DBH,1)】",キークリック音 (0=OFF、0以外=ON) ,"【SCNCNT(F3F6H,1)】",キースキャンの時間間隔 (通常は1) ,"【REPCNT(F3F7H,1)】",オートリピート開始までの時間 (通常は50) ,"【MODE (FAFCH,1)】",ローマ字カナ変換のモード (図6.17参照) ,"【CSTYLE(FCAAH,1)】",カーソルの形 (0=■、0以外=_) ,"【CAPST (FCABH,1)】",CAPSロック (0=OFF、0以外=ON) ,"【KANAST(FCACH,1)】",カナロック (0=OFF、0以外=ON) {{svg 図6.17.svg}} '''図6.17 ローマ字カナ変換モードの設定''' ::KILBUF (0156H/MAIN) ,{SIZE:100|CENTER}機能 キーボードバッファを空にします。 ,{SIZE:100|CENTER}コール手順 なし ,{SIZE:100|CENTER}戻り値 なし ,{SIZE:100|CENTER}変更レジスタ HL ,{SIZE:100|CENTER}解説 キーボードバッファを空にします。 サンプルプログラム「GETKEY.MAC」を参照して下さい。 ::CNVCHR (00ABH/MAIN) ,{SIZE:100|CENTER}機能 グラフィック文字を処理します。 ,{SIZE:100|CENTER}コール手順 ,{t},{BSIZE:0} ,{c},{BSIZE:0|SIZE:70},{BSIZE:0} ,A,文字コード ,{SIZE:100|CENTER}戻り値 ,{t},{BSIZE:0} ,{c},{BSIZE:0|SIZE:70},{BSIZE:0|SIZE:200},{BSIZE:0} ,A,グラフィック文字は変換される (通常文字ならば変換されない){COLS:2}, ,CYフラグ=OFF {COLS:2},,(入力はグラフィックヘッダバイト01Hだった) ,CYフラグ=ON、Zフラグ=ON {COLS:2},,(入力はグラフィック文字なので変換された) ,CYフラグ=ON、Zフラグ=OFF {COLS:2},,(入力は通常の文字なので変換されなかった) , ,, ,{SIZE:100|CENTER}変更レジスタ AF ,{SIZE:100|CENTER}解説 CHGETの後にこのCNVCHRを実行すると、グラフィック文字は図5.19のような1バイトコードに変換し、グラフィック文字以外は無変換でそのまま返します。グラフィック文字はグラフィックヘッダバイト(01H)を伴う2バイトの変則的なコードで表されるため文字処理の時にめんどうな手続きが必要ですが、このルーチンによって多少は手間が省けます。 ::PINLIN (00AEH/MAIN) ,{SIZE:100|CENTER}機能 文字列を1行入力します。 ,{SIZE:100|CENTER}コール手順 なし ,{SIZE:100|CENTER}戻り値 ,{t},{BSIZE:0} ,{c},{BSIZE:0|SIZE:80},{BSIZE:0|SIZE:80},{BSIZE:0|SIZE:250} ,HL ,F55DH ,F55EH ,入力した文字列 (行末は00Hで示される){COLS:2}, ,CYフラグ,ON ,STOPで終了した , ,OFF,RETURNで終了した '''表6.5 グラフィック文字のコード変換表''' ,{t},{BSIZE:2 0} ,{c},{BSIZE:0|SIZE:110},{BSIZE:0|SIZE:100},{BSIZE:0|SIZE:110},{BSIZE:0|SIZE:100} ,変換前,変換後,変換前,変換後 ,0141H (月),41H,0151H ({{svg 表6.5.51H.svg}}),51H ,0142H (火),42H,0152H ({{svg 表6.5.52H.svg}}),52H ,0143H (水),43H,0153H ({{svg 表6.5.53H.svg}}),53H ,0144H (木),44H,0154H ({{svg 表6.5.54H.svg}}),54H ,0145H (金),45H,0155H ({{svg 表6.5.55H.svg}}),55H ,0146H (土),46H,0156H ({{svg 表6.5.56H.svg}}),56H ,0147H (日),47H,0157H ({{svg 表6.5.57H.svg}}),57H ,0148H (年),48H,0158H ({{svg 表6.5.58H.svg}}),58H ,0149H (円),49H,0159H ({{svg 表6.5.59H.svg}}),59H ,014AH (時),4AH,015AH ({{svg 表6.5.5AH.svg}}),5AH ,014BH (分),4BH,015BH ({{svg 表6.5.5BH.svg}}),5BH ,014CH (秒),4CH,015CH ({{svg 表6.5.5CH.svg}}),5CH ,014DH (百),4DH,015DH (大),5DH ,014EH (千),4EH,015EH (中),5EH ,014FH (万),4FH,015FH (小),5FH ,0150H (π),50H, , ,{SIZE:100|CENTER}変更レジスタ すべて ,{SIZE:100|CENTER}解説 入力した文字列をラインバッファ【BUF(F55DH,258)】に格納します。文字列の入力時にはスクリーンエディットのすべての機能が有効です。RETURNキーまたはSTOPキーを押すと入力動作を終了します。なお、ワークエリアは以下に示すとおりです。 ,{t},{BSIZE:0} ,{c},{BSIZE:0|SIZE:200},{BSIZE:0} ,"【BUF (F55DH,258)】 ",文字列が格納されるラインバッファ ,"【LINTTB (FBB2H,24)】",物理的1行が、上の行の継続であれば00H ::INLINE (00B1H/MAIN) ,{SIZE:100|CENTER}機能 文字列を1行入力します(プロンプト使用可)。 ,{SIZE:100|CENTER}コール手順 なし ,{SIZE:100|CENTER}戻り値 PINLINと同じ ,{SIZE:100|CENTER}変更レジスタ すべて ,{SIZE:100|CENTER}解説 PINLINルーチンと同様に、入力した文字列をラインバッファ【BUF(F55DH,258)】に格納します。ただし、こちらはルーチン実行開始時のカーソル位置より前の部分は入力されません。 両者の違いは、サンプルプログラム「INPIN.MAC」を参照して下さい。 !!3.4 ファンクションキー  MSXには10個のファンクションキーがあり、ユーザーが自由に定義して使うことができます。ファンクションキーの定義を行うために、ワークエリアが各キーについて16バイトずつ割り当てられています。そのアドレスを以下に示します。 ,{t},{BSIZE:0} ,{c},{BSIZE:0|SIZE:140},{BSIZE:0} ,"【FNKSTR(F87FH,16)】",F1キーの定義用領域 ,"【+10H (F88FH,16)】",F2キーの定義用領域 ,"【+20H (F89FH,16)】",F3キーの定義用領域 ,"【+30H (F8AFH,16)】",F4キーの定義用領域 ,"【+40H (F8BFH,16)】",F5キーの定義用領域 ,"【+50H (F8CFH,16)】",F6キーの定義用領域 ,"【+60H (F8DFH,16)】",F7キーの定義用領域 ,"【+70H (F8EFH,16)】",F8キーの定義用領域 ,"【+80H (F8FFH,16)】",F9キーの定義用領域 ,"【+90H (F90FH,16)】",F10キーの定義用領域  1つのファンクションキーを押すと、それぞれの領域に定義された文字列が[KEYBUF]に格納されます。文字列の最後は00Hで示され、最大15文字まで定義可能です(16文字を超えた分は、複数のファンションキー定義領域にまたがって定義される)。ファンクションキーを初期設定の状態に戻すには、次のBIOSルーチンを利用するとよいでしょう。 ::INIFNK (003EH/MAIN) ,{SIZE:100|CENTER}機能 ファンクションキーを初期化します。 ,{SIZE:100|CENTER}コール手順 なし ,{SIZE:100|CENTER}戻り値 なし ,{SIZE:100|CENTER}変更レジスタ すべて ,{SIZE:100|CENTER}解説 ファンクションキーの定義をBASICスタート時の設定に戻します。 !!3.5 割り込み中のSTOPキー  3.3で説明した1文字入力ルーチンCHGETは、どのキーが押されているかの判断をタイマ割り込みの処理ルーチン内で行っています。したがって、たとえば、カセットデータの入出力時などタイマ割り込みが禁止されている状態では、どんなキーが押されていても読み取ることができません。しかし、次に述べるBIOSルーチンを使用すると、割り込みが禁止されている場合でも、[CTRL]+[STOP]キーが押されていることを判定できます。 ::BREAKX (00B7H/MAIN) ,{SIZE:100|CENTER}機能 [CTRL]+[STOP]キーが押されているかどうかを判定します。 ,{SIZE:100|CENTER}コール手順 なし ,{SIZE:100|CENTER}戻り値 [CTRL]+[STOP]が押されていれば、CYフラグON ,{SIZE:100|CENTER}変更レジスタ AF ,{SIZE:100|CENTER}解説 キースキャンを行い、[CTRL]キーと[STOP]キーが同時に押されているか否かを判定します。もし両方のキーが押されていれば、CYフラグを「1」にセットして戻る。[CTRL]+[STOP]が押されていなければ、CYフラグを「0」にリセットして戻ります。このルーチンは、割り込みが禁止された状態でコールしてください。 ,{t},{BSIZE:1 0|SIZE:100%} ,{BSIZE:0}←[[2章 カセット I/F|2章 カセット・インターフェイス]] ,{BSIZE:0|RIGHT}[[4章 プリンタ I/F|4章 プリンタ・インターフェイス]] →