§４．２　基本パッケージファイル（VIL_BAS.BAS）


◎ENV（アプリ環境ファイルパッケージ）
○必要パッケージ
　なし
○パッケージ変数
  ENV_ENV$      : アプリ環境ファイル名（パス付）
　ENV_ORG$      : 初期アプリ環境ファイル名（パス付）
○説明
  環境ファイルのオープン／クローズ処理を行います。
  環境ファイルとは，変数値をファイルに書き出すことによりアプリケーション
の状態を保存し，次にこのアプリケーションを立ち上げた時に前の状態を再現で
きるようにするためのものです。本パッケージにより環境ファイルをオープンし
た後，各パッケージの環境ファイル入出力モジュール（ENVR,ENVW ）を呼び出す
ことで，ＶＩＬパッケージの状態を保存・復元することができます。また，プロ
グラマが定義した変数を保存・復元することも可能です。
  読み込みにおいては，
    １．ENV_ENV$の内容（環境変数APPLIENVで指定可能）で示されるファイルを
        オープン
    ２．１．が存在しなければ，ENV_ORG$の内容（環境変数APPLIORGで指定可能）
        で示されるファイルをオープン
　書き込みにおいては，
    １．ENV_ENV$の内容（環境変数APPLIENVで指定可能）で示されるファイルを
        オープン
という形をとります。つまり，アプリ環境ファイルの初期設定版を用意してこの
ファイル名をAPPLIORGに，別のファイル名をAPPLIENVに指定しておけば，最初の
立ち上げで初期設定版を読み込んだあと書き込みによりAPPLIENVのファイルを作
成し，次の立ち上げからはこれを使うようになります。 
  これを利用すると，ＣＤＲＯＭから初期設定を読み込んで保存はＦＤに行った
りできます。

○モジュール一覧

１．ENV_INITM           初期化モジュール
●入力変数
　なし
●出力変数
　ENV_ENV$      : アプリ環境ファイル名（パス付）
　ENV_ORG$      : 初期アプリ環境ファイル名（パス付）
●説明
  "VIL.CNF"で環境変数APPLIENV を設定していれば，その内容を（パスを含めた）
アプリ環境ファイル名とみなします。
  "VIL.CNF"で環境変数APPLIORG を設定していれば，その内容を（パスを含めた）
初期アプリ環境ファイル名とみなします。

２．ENV_ROP             アプリ環境ファイル入力オープン
●入力変数
　ENV_ENV$      : アプリ環境ファイル名（パス付）
　ENV_ORG$      : 初期アプリ環境ファイル名（パス付）
●出力変数
　E%            : 0      : 正常終了
                　その他 : オープン失敗
●説明
  アプリ環境ファイルをリードモードでオープンします。
  ENV_ENV$で示されるファイルをオープンしますが，これが読めないときはENV_
ORG$で示されるファイルをオープンします。どちらも読めなければ，E%に0 以外
（エラー番号）を返します。

３．ENV_RCL             アプリ環境ファイル入力クローズ
●入力変数
　なし
●出力変数
　なし
●説明
　リードモードでオープンしたアプリ環境ファイルをクローズします。

４．ENV_WOP             アプリ環境ファイル出力オープン
●入力変数
　ENV_ENV$      : アプリ環境ファイル名（パス付）
●出力変数
　E%            : 0      : 正常終了
                　その他 : オープン失敗
●説明
  環境ファイルをライトモードでオープンします。
  ENV_ENV$で示されるファイルをオープンします。失敗すれば，E%に0 以外
（エラー番号）を返します。
  すでに同名ファイルが存在していた場合は上書きします。

５．ENV_WCL             アプリ環境ファイル出力クローズ
●入力変数
　なし
●出力変数
　なし
●説明
　ライトモードでオープンした環境ファイルをクローズします。

６．ENV_ERR             アプリ環境ファイルエラー
●入力変数
　なし
●出力変数
　なし
●説明
　各パッケージのアプリ環境ファイル入出力モジュール（ENVR,ENVW）中
でエラーが発生した場合，このモジュールが呼び出されます。
　現バージョンでは，環境ファイル中のエラー行を表示して，アプ
リケーションを強制終了します。


◎BEEP（ブザー音パッケージ）
○必要パッケージ
　なし
○パッケージ変数
　BEEP_F%       : ブザーフラグ（-1:ON / 0:OFF）
○説明
　受理時/エラー時のブザー音を鳴らします。

○モジュール一覧

１．BEEP_INITM          初期化モジュール
●入力変数
　なし
●出力変数
　BEEP_F%       : ブザーフラグ（-1:ONに設定）
●説明
　ブザーはデフォルトでオンです。

２．BEEP_ENVR           アプリ環境ファイル読み込み
●入力変数
　なし
●出力変数
　BEEP_F%       : ブザーフラグ（-1:ON / 0:OFF）
●説明
  ブザーフラグをアプリ環境ファイルに保存します。
  本モジュール呼び出し前に，ENV_ROP を呼び出してアプリ環境ファイルを入力
オープンしておいてください。

３．BEEP_ENVW           アプリ環境ファイル書き込み
●入力変数
　BEEP_F%       : ブザーフラグ（-1:ON / 0:OFF）
●出力変数
　なし
●説明
  ブザーフラグをアプリ環境ファイルから読み込みます。
  本モジュール呼び出し前に，ENV_WOP を呼び出してアプリ環境ファイルを出力
オープンしておいてください。

４．BEEP_G              受理ブザー音
●入力変数
　BEEP_F%       : ブザーフラグ（-1:ON / 0:OFF）
●出力変数
　なし
●説明
　正常入力時などに鳴らすためのブザー音です。
　BEEPコマンドの隠し機能を利用しているので，このモジュール使用後は"BEEP"
を実行しても通常の音は出なくなります。

５．BEEP_B              エラー・ブザー音
●入力変数
　BEEP_F%       : ブザーフラグ（-1:ON / 0:OFF）
●出力変数
　なし
●説明
　異常入力時などに鳴らすためのブザー音です。
　BEEPコマンドの隠し機能を利用しているので，このモジュール使用後は"BEEP"
を実行しても通常の音は出なくなります。


◎WIN（ウィンドウ・パッケージ）
○必要パッケージ
　なし
○パッケージ変数
　WIN_X%,WIN_Y%     : アクティブウィンドウ左上隅座標
　WIN_W%,WIN_Z%     : アクティブウィンドウ右下隅座標
  WIN_UB%,WIN_DB%   : ウィンドウ枠の上部・下部幅
  WIN_LB%,WIN_RB%   : ウィンドウ枠の左部・右部幅
  WIN_AN%           : 現在のアクティブウィンドウ番号
                      （0:ウィンドウなし / 1..W1%）
　WIN_PM%           : 座標モード（0:絶対座標 / -1:相対座標）
  WIN_BFMAX&        : 画面退避バッファサイズ
  WIN_ANMAX%        : 最大ウィンドウ番号
  WIN_BF%()         : 画面退避バッファ
  WIN_BFO&()        : WIN_BF%() オフセット
  WIN_X%(),WIN_Y%() : ウィンドウ左上隅座標
  WIN_W%(),WIN_Z%() : ウィンドウ右下隅座標
○説明
  マルチウィンドウ表示を行うための，基本機能を提供します。
  画面は16色モードのページ０を使用します。GET ・PUT でウィンドウを実現す
るためテキスト表示は使えません（表示はできるがウィンドウに隠れない）。文
字表示はSYMBOL文を使用してください。
　ページ１は本パッケージで使用しないので，アプリケーション側で壁紙表示な
どに利用できます。この場合，ページ１は３万色モードにすることも可能です。
ただし，入力パッケージにおいて全角入力を行うためには，ページ１はテキスト
画面にしておく必要があります。半角文字しか入力を行わないのであれば，ペー
ジ１はグラフィック画面としてアプリケーションで使用できます。
  本パッケージでは最小限の機能のみ提供されており，ウィンドウの枠描画や移
動・サイズ変更などのウィンドウマネージャ機能は用意されていません。実際に
アプリケーションを作成する場合は，こうした処理を行うルーチンを本パッケー
ジの上に被せて使用するとよいでしょう。ＶＩＬの現バージョンではウィンドウ
マネージャ・パッケージ（VWM ）が用意されており，本パッケージのモジュール
の代わりにVWM のモジュールを呼ぶことで，枠描画などを含めた処理を行わせる
ことができます。
  現在のバージョンでは次の機能が実現されます。

    ・ウィンドウ領域の退避・復元処理
      指定した範囲の画面情報をGET@A 命令で退避し，その位置にウィンドウを
      描くことでウィンドウのオープンを，PUT@A 命令で画面情報を戻すことで
      ウィンドウのクローズを実現します。
      処理自体は充分高速ですが，退避用に巨大な配列を必要とするのでフリー
      エリアの残りに注意してください。
      ウィンドウ枠などを描く領域として
        WIN_UB%,WIN_DB%     : ウィンドウ枠の上部・下部幅
        WIN_LB%,WIN_RB%     : ウィンドウ枠の左部・右部幅
      で指定したドット数分，ウィンドウ左上隅・右下隅座標の上下左右が余分
      に退避されます。

    ・退避データの管理
      各ウィンドウの情報は配列上のスタックとして管理されます。したがって，
      このパッケージではマルチウィンドウはウィンドウのスタックとして実現
      されており，一番最後に開かれたウィンドウ（以後一番上のウィンドウ，
      またはアクティブウィンドウと呼びます）に対してのみ，操作が許されて
      います。つまり，ウィンドウＡに続きウィンドウＢを開いた場合，Ｂを閉
      じ（Ａが一番上のウィンドウにな）るまで，Ａに表示したりＡを閉じたり
      することはできません。
      各ウィンドウは早く開かれたものから順に１，２，……と番号がつけられ，
      この番号によって管理されます。以後これをウィンドウ番号と呼びます。
      各ウィンドウの情報はこの番号を添え字として，以下の配列変数から読み
      出すことができます。
 　     WIN_X%(),WIN_Y%()   : ウィンドウ左上隅グラフィック座標
   　   WIN_W%(),WIN_Z%()   : ウィンドウ右下隅グラフィック座標
        WIN_BF%(WIN_BFO&()) : 画面情報
      また，アクティブウィンドウに関しては，
        WIN_AN%             : 現在のアクティブウィンドウ番号
     　 WIN_X%,WIN_Y%       : 左上隅グラフィック座標
     　 WIN_W%,WIN_Z%       : 右下隅グラフィック座標
      が利用できます。

    ・絶対座標／相対座標モードの切替
      通常グラフィック命令を使用する場合は，画面の左上隅を(0,0),右下隅を
      (639,479) とする座標系で指定します。本パッケージではこれを絶対座標
      と呼び，アクティブウィンドウの左上隅を(0,0) とする座標系を相対座標
      として，両者を切り換えるモジュールが用意してあります。
      相対座標モードではワールド座標とオリジナルスクリーン座標との対応が
      変更されているため，グラフィック命令の座標指定が相対座標で行えます。
      また，アクティブウィンドウからはみ出す描画は，自動的にクリッピング
      されます。
      現在の座標モードは
        WIN_PM%             : 0:絶対座標 / -1:相対座標
      に格納されています。初期化パッケージ呼出し直後は絶対座標モードです。
        《注意》ウィンドウのオープン／クローズ時には絶対座標モードにして
                ください。

○モジュール一覧

１．WIN_INITM           初期化モジュール
●入力変数
　W0&           : 画面退避バッファサイズ
　W1%           : 最大ウィンドウ番号
●出力変数
　なし
●説明
  W0& には，開いているウィンドウの総面積が最大になるとき必要な大きさを指
定してください。ウィンドウ枠幅が0 でないときは，その分も必要になります。
  W1% には，最大何枚まで同時にウィンドウを開くかを指定してください。
  WIN_X(0)〜WIN_Z(0)には(0,0)-(639,479) が格納されますので，アクティブ番
号が０，つまりウィンドウを１枚も開いてないとき，相対座標＝絶対座標となり
ます。

２．WIN_ENVR            アプリ環境ファイル読み込み
●入力変数
　なし
●出力変数
　なし
●説明
  現バージョンではダミーです。
  本モジュール呼び出し前に，ENV_ROP を呼び出してアプリ環境ファイルを入力
オープンしておいてください。

３．WIN_ENVW           アプリ環境ファイル書き込み
●入力変数
　なし
●出力変数
　なし
●説明
  現バージョンではダミーです。
  本モジュール呼び出し前に，ENV_WOP を呼び出してアプリ環境ファイルを出力
オープンしておいてください。

４．WIN_OP              ウィンドウ・オープン
●入力変数
　WIN_X%,WIN_Y% : ウィンドウ左上隅座標
　WIN_W%,WIN_Z% : ウィンドウ右下隅座標
●出力変数
　E%            : 0 : 正常終了
                  5 : オープン失敗（退避領域不足）
　WIN_X%,WIN_Y% : オープン失敗時のみ，現在の
　WIN_W%,WIN_Z%   アクティブウィンドウの値を設定
●説明
  ウィンドウを開きます。実際には指定した矩形領域の画面情報を退避するだけ
です。相対座標モードに切り換えた後CLS を実行することで，ウィンドウ内をク
リアできます。
  WIN_X%〜WIN_Z%に新しく開くウィンドウの座標を設定してください。ただしこ
れらの変数値は現在のアクティブウィンドウ座標として各モジュールで参照され
ますので，新しい値を設定してから本モジュールを呼び出すまでに，他のモジュー
ルを呼ばないようにしてください。
  座標モードは絶対座標モードにしておいてください。
  正常終了のときはアクティブウィンドウ番号が1 増やされ，E%に0 が返されま
すが，退避バッファが足りない時は画面退避は行われません。このときはE%に5
を返し，WIN_X%〜WIN_Z%に元のアクティブウィンドウ座標を書き戻して終了しま
す。

５．WIN_CL              ウィンドウ・クローズ
●入力変数
　なし
●出力変数
　WIN_X%,WIN_Y% : 新アクティブウィンドウ左上隅座標
　WIN_W%,WIN_Z% : 新アクティブウィンドウ右下隅座標
●説明
  退避した矩形領域を復元し，ウィンドウを閉じます。
  アクティブウィンドウ番号は1 減らされ，新しいアクティブウィンドウ（旧ア
クティブウィンドウの一つ下のウィンドウ）の座標がWIN_X%〜WIN_Z%に書き戻さ
れます。
  座標モードは絶対座標モードにしておいてください。
  また，ウィンドウ枠幅WIN_UB%,WIN_DB%,WIN_LB%,WIN_RB% は各ウィンドウ毎に
保存されていません。したがって枠幅の違うウィンドウを混在させる時は，本モ
ジュールを呼ぶときに対象アクティブウィンドウが開かれた時の値がWIN_UB% 〜
WIN_RB% に格納されているよう，アプリケーションが責任を持つ必要があります。

６．WIN_CLDMY           ウィンドウ・クロ−ズダミー
●入力変数
　なし
●出力変数
　WIN_X%,WIN_Y% : 新アクティブウィンドウ左上隅座標
　WIN_W%,WIN_Z% : 新アクティブウィンドウ右下隅座標
●説明
  画面情報を書き戻さずにアクティブウィンドウに関する情報を放棄します。つ
まり，実際には画面を変更せずにウィンドウを閉じたつもりになるモジュールで
す。
  ゲームのメインマップなど，クローズされることのないウィンドウは退避した
画面情報を取っておく必要がありません。この場合は本モジュールを呼び出して
この情報を捨ててしまうことにより，退避領域を節約できます。

７．WIN_CLALL           ウィンドウ全クロ−ズ
●入力変数
　なし
●出力変数
　WIN_X%,WIN_Y% : (0,0)
  WIN_W%,WIN_Z% : (639,479)
●説明
  開かれているウィンドウをすべて閉じます。
  アクティブウィンドウ番号は0 になり，WIN_X%〜WIN_Z%には(0,0)-(639,479)
が格納されます。
  座標モードは絶対座標モードにしておいてください。

８．WIN_PMR             相対座標モード
●入力変数
　なし
●出力変数
　WIN_PM%       : -1 (相対座標モード)
●説明
  相対座標モードに切り換えます。
  以後グラフィック命令での座標は，画面の(WIN_X%,WIN_Y%) を(0,0) とする相
対座標となります。また，ウィンドウからはみ出すような描画はクリッピングさ
れます。
  WIN_PM% には-1が格納されます。

９．WIN_PMA             絶対座標モード
●入力変数
　なし
●出力変数
　WIN_PM%       : 0 (絶対座標モード)
●説明
  絶対座標モードに切り換えます。
  以後グラフィック命令での座標は，画面左上隅を(0,0) ，右下隅を(639,479)
とする絶対座標となります。
  WIN_PM% には0 が格納されます。


◎MSEL（メニュー選択パッケージ）
○必要パッケージ
　なし
○パッケージ変数
　MSEL_MN%              : メニュー番号（0のとき無効）
  MSEL_BB%              : ボックス番号ＭＩＮ
  MSEL_BE%              : ボックス番号ＭＡＸ
  MSEL_BN%              : ボックスカーソル（ＢＣ）位置(ボックス番号)
  MSEL_BC%              : -1:ＢＣ表示済 / 0:ＢＣ未表示
  MSEL_BD%              : ボックスの並べ方
                            1:Ｙ方向優先で並べる(省略時Ｘ方向優先)
                            2:左方向に並べる    (省略時右方向)
                            4:上方向に並べる    (省略時下方向)
                    　    これらの和を指定
　MSEL_KY%　            : 選択キーコード
                              0..    : 番号選択キー
                             -1      : 取消キー
                             -2      : 決定キー
                             -3      : 非対応キー
                             -4      : ヌル入力
                             -5..-8  : 移動キー（→←↑↓）
                             -9..-12 : 拡張移動キー（→←↑↓）
                             -13     : ウィンドウマネージャ起動キー
  MSEL_WT%              : リピート開始までのウェイト
　MSEL_MRM%　           : マウスボタン リピートモード
　MSEL_PRM%　           : パッドボタン リピートモード
　MSEL_MKM%             : 移動キー・モード
                            0 : 上下／左右ともそのメニュー内
                            1 : 上下キーが押されたらその旨返して終了
                            2 : 左右キーが押されたらその旨返して終了
　MSEL_CMN%             : 設定メニュー番号 (0 以外を指定)
　MSEL_CMR%             : 設定メニュー行数
  MSEL_CR%              : 設定メニュー現在行(0 〜 MSEL_CMR%)
  MSEL_CRB%             : MSEL_CR%保存用
　MSEL_SC$              : ショートカットキー定義文字列
　MSEL_SCB$             : SC$設定時のKB%()退避用
  MSEL_BCM%             : ＢＣ描画モード（0:矩形枠 ／　1:矩形反転）
　MSEL_X%(),MSEL_Y%()   : ボックス左上隅座標保存
　MSEL_W%(),MSEL_Z%()   : ボックス右下隅座標保存
  MSEL_BN%()            : ＢＣ位置保存
  MSEL_KB%()            : キー割当テーブル（アスキーコード）
　MSEL_PAD%()           : パッド割当テーブル（PAD(1)+PTRIG(1)*9）
　MSEL_CX%(),MSEL_CY%() : 設定メニュー各行の基準ボックス左上隅座標
　MSEL_CW%(),MSEL_CZ%() : 設定メニュー各行の基準ボックス右下隅座標
  MSEL_CN%()            : 設定メニュー各行のボックス個数
  MSEL_CL%()            : 設定メニュー各行のボックス間隔(左上隅座標間隔)
  MSEL_CBB%()           : 設定メニュー各行のボックス番号ＭＩＮ
  MSEL_CBE%()           : 設定メニュー各行のボックス番号ＭＡＸ
  MSEL_CBN%()           : MSEL_BN%()保存用（変更取消時に使用）
○説明
  マウス／パッド／キーボードによるメニュー選択入力を行います。
  一般的なメニューの形式として，項目が縦横に並べられたものを想定し，この
中から特定の項目を選択するインタフェースを提供します。ここでは１つの項目
を画面上の長方形の領域とし，以下ボックスと呼びます。そしてボックスがマト
リクス上に並べられたものでメニューが構成されるとします。
  実際のメニュー選択は，以下のいずれかの方法によりボックスの一つを選択す
ることで行われます。ボックスには順に番号（ボックス番号）が付けられており，
アプリケーションには選択されたボックス番号が返されます。

    ・マウスにより，目的のボックス内を左クリック

    ・画面に表示される矩形枠（ボックスカーソル）を移動キーで動かして目的
      のボックスに合わせ，決定キーを押す

    ・目的のボックスに対応した番号選択キーを押す

  移動／決定／選択キーなどは初期化モジュールによりキーボードやパッドのボ
タンに割り当てられます。この割り当て設定はアプリ設定ファイルを書き換える
ことにより変更可能です。
  通常のメニュー選択はボックスのマトリクスから１つだけ選択しますが，スイ
ッチやパラメータ類の設定メニューなどでは各行毎に１つずつ選択する形式がよ
く用いられます。これ（以下設定メニュー）を実現するためのモジュールも用意
されています。
  相対座標モードのとき，本パッケージにおける座標指定はすべて相対座標とな
ります。

○モジュール一覧

１．MSEL_INITM          初期化モジュール
●入力変数
　W0%           : 最大メニュー番号
  W1%           : 最大ボックス数
  W2%           : 設定メニュー最大行数
●出力変数
　なし
●説明
  W0% にはメニュー番号の最大値を指定します。メニュー番号とはアプリケーシ
ョン全体における各メニューの通し番号であり，各メニューに違う番号を付けて
おくことにより，前回そのメニューを呼び出したときのボックスカーソル位置が
保存されます。
  W1%には全メニューのうち，最大のボックス数を指定します。
  W2%には全設定メニューのうち，最大の行数を指定します。
  本モジュールを呼び出すことにより，マウス機能の初期化および位置の設定が
行われます（MOUSE 0 およびMOUSE 1 ）。ただしマウスカーソルは表示されませ
ん。
  ボックスカーソルは，矩形枠と矩形反転の２種類から選択できます。これはア
プリ設定ファイルに0 または1 を記述することで指定できます。アプリケーショ
ン中でMSEL_BCM% に値を設定することでも指定できますが，両者を混在して表示
することはできません。
  本パッケージでは，メニュー操作に使用するキーを仮想的な機能番号で管理し
（以下これを選択キーコードと呼びます），キーボードやパッドボタンとの任意
の対応づけができるようにしています。現バージョンにおいて選択キーコードは
以下のようになっています。
     0..    : 番号選択キー
    -1      : 取消キー
    -2      : 決定キー
    -3      : 非対応キー
    -4      : ヌル入力
    -5..-8  : 移動キー（→←↑↓）
    -9..-12 : 拡張移動キー（→←↑↓）
    -13     : ウィンドウマネージャ起動キー
各選択キーコードが入力されたときの動作については，各モジュールの説明を参
照してください。
　この選択キーコードとキーボード／パッドボタンとの対応づけは以下の形式で
アプリ設定ファイルに記述します。

    ・キーボード対応テーブル
    　各アスキーコードに対応する選択キーコードを順に並べます。
    　ただし，１行に１６個ずつ計１６行の形で並べてください。
    　また，１行内のコードは"," で区切ってください。

    ・パッド対応テーブル
    　キーボード対応テーブルと同様に選択キーコードを並べますが，
      アスキーコードの代わりに(PAD(1)+PTRIG(1)*9）が返す値の順に並べます。
    　つまり，１行に「方向入力なし」＋「方向ボタン８方向」の９個を"," で
    　区切って並べ，これを[A][B][RUN][SELECT] ボタンの組み合わせで１２行
    　並べます。

　本モジュールではこれを読み込んで対応テーブルの設定を行います。
  なお，アプリケーション中で
    MSEL_KB%() =選択キーコード
　  MSEL_PAD%() = 選択キーコード
などとすることで，一時的なキー割当の変更も可能です。

２．MSEL_ENVR           アプリ環境ファイル読み込み
●入力変数
　なし
●出力変数
　MSEL_WT%      : リピート開始までのウェイト
●説明
  リピート開始までのウェイトをアプリ環境ファイルから読み込みます。
  本モジュール呼び出し前に，ENV_ROP を呼び出してアプリ環境ファイルを入力
オープンしておいてください。

３．MSEL_ENVW           アプリ環境ファイル書き込み
●入力変数
　MSEL_WT%      : リピート開始までのウェイト
●出力変数
　なし
●説明
  リピート開始までのウェイトをアプリ環境ファイルに保存します。
  本モジュール呼び出し前に，ENV_WOP を呼び出してアプリ環境ファイルを出力
オープンしておいてください。

４．MSEL_M              メニュー選択
●入力変数
　X%,Y%         : 基準ボックス左上隅座標
　W%,Z%         : 基準ボックス右下隅座標
　XN%,YN%       : ボックス縦横個数
　XL%,YL%       : ボックス縦横間隔(左上隅座標の間隔)
　C%            : ボックスカーソル（ＢＣ）色
　MSEL_MN%      : メニュー番号 (0 のとき無効)
　MSEL_BB%      : ボックス番号ＭＩＮ
　MSEL_BE%      : ボックス番号ＭＡＸ
　MSEL_BN%      : ＢＣ位置 (ボックス番号)
                  MSEL_MN%>0のときは無効
　MSEL_BC%      : -1:ＢＣ表示済 / 0:ＢＣ未表示
　MSEL_BD%      : ボックスの並べ方(属性の和を指定)
                    1:Ｙ方向優先で並べる(省略時Ｘ方向優先)
                    2:左方向に並べる(省略時右方向)
                    4:上方向に並べる(省略時下方向)
                　これらの和を指定
　MSEL_WT%      : リピート開始までのウェイト
　MSEL_MKM%     : 移動キー・モード
                    0 : 上下／左右ともそのメニュー内
                    1 : 上下キーが押されたらその旨返して終了
                    2 : 左右キーが押されたらその旨返して終了
●出力変数
　KN%           : 入力番号
                    MSEL_BB%..MSEL_BE% :左クリック/決定/直接選択
                    -1                 :右クリック/取消
                    -2                 :ボックス外を左クリック
                    -3                 :非対応キー入力
　KY%           : 入力キーのアスキーコード
                　（入力なし:0 ）
　K$            : 入力キー
                　（入力なし:""）
　MX%,MY%       : 左クリック位置(絶対座標)
　MW%,MZ%       : 左クリック位置(相対座標)
                　(ともにKN%=-2 の時有効)
                　ただしウィンドウ外クリックの時 MW%=-1
　MSEL_KY%      : 選択キーコード
　MSEL_BN%      : 最後のＢＣ位置 (KN%<1のときも有効)
　MSEL_BC%      : -1 （ＢＣ表示済） 
●説明
  MSEL_BCMK によりボックスを作成した後MSEL_IN を呼び出してメニュー選択入
力を行います。入出力変数の意味や動作などは各モジュールの項を参照してくだ
さい。

５．MSEL_BCMK           ボックス座標作成
●入力変数
　X%,Y%         : 基準ボックス左上隅座標
　W%,Z%         : 基準ボックス右下隅座標
　XN%,YN%       : ボックス縦横個数
　XL%,YL%       : ボックス縦横間隔(左上隅座標の間隔)
　MSEL_BB%      : ボックス番号ＭＩＮ
　MSEL_BE%      : ボックス番号ＭＡＸ
　MSEL_BD%      : ボックスの並べ方(属性の和を指定)
                    1:Ｙ方向優先で並べる(省略時Ｘ方向優先)
                    2:左方向に並べる(省略時右方向)
                    4:上方向に並べる(省略時下方向)
●出力変数
　MSEL_X%(),MSEL_Y%() : 各ボックス左上隅座標
  MSEL_W%(),MSEL_Z%() : 各ボックス右下隅座標
●説明
  MSEL_IN で使用するボックス座標を作成します。ただし本モジュールでは同形
同サイズで等間隔に並んだものしか作れません。より複雑なボックスが必要な場
合は，アプリケーションでボックス座標を作成してください。
  最も番号の若い（ボックス番号MSEL_BB%の）ボックスを基準ボックスと呼びま
す。これの座標を(X%,Y%)-(W%,Z%) で指定し，これと同形同サイズのボックスを
縦横いくつずつ並べるかをXN%,YN% で指定します。また，XL%,YL% でボックス縦
横間隔(左上隅座標の間隔)を指定します。これを図にすると下のようになります
（MSEL_BB%=1,MSEL_BE%=6,MSEL_BD%=0とする）。

                 ←──── XN%=3 ────→        
            (X%,Y%)                                 
                ↓         │← XL% →│            
    　          ┌─┐     ┌─┐     ┌─┐─      
    　     ↑   │１│     │２│     │３│↑      
    　     │   └─┘     └─┘     └─┘        
           │       ↑                      YL%     
         YN%=2    (W%,Z%)                   ↓      
    　     │   ┌─┐     ┌─┐     ┌─┐─      
    　     ↓   │４│     │５│     │６│        
    　          └─┘     └─┘     └─┘        

  MSEL_BB%には基準ボックスの番号，MSEL_BE%には最後のボックス番号を指定し
ます。この値により，４番から８番までを選択するメニューなどというものも可
能です。ただし，

  0 ≦ MSEL_BB% ≦ MSEL_BE%
  MSEL_BE% − MSEL_BB% ＋ 1 = XN% × YN%

を満たしていなければなりません。
  MSEL_BD%にはボックスの並べ方を指定します。指定可能な属性には

    1:Ｙ方向優先で並べる(省略時Ｘ方向優先)
    2:左方向に並べる(省略時右方向)
    4:上方向に並べる(省略時下方向)

が用意されており，これらの和をMSEL_BD%に設定します。例えば XN%=YN%=3の場
合，次のようになります。

    MSEL_BD%=0    MSEL_BD%=1    MSEL_BD%=2    MSEL_BD%=4

    １２３        １４７        ３２１        ７８９
    ４５６        ２５８        ６５４        ４５６
    ７８９        ３６９        ９８７        １２３

    MSEL_BD%=1+2  MSEL_BD%=1+4  MSEL_BD%=2+4  MSEL_BD%=1+2+4

    ７４１      　３６９     　 ９８７   　   ９６３
    ８５２      　２５８     　 ６５４     　 ８５２
    ９６３      　１４７     　 ３２１      　７４１

６．MSEL_IN             メニュー選択入力
●入力変数
　XN%,YN%       : ボックス縦横個数
　C%            : ボックスカーソル（ＢＣ）色
　MSEL_MN%      : メニュー番号 (0 のとき無効)
　MSEL_BB%      : ボックス番号ＭＩＮ
　MSEL_BE%      : ボックス番号ＭＡＸ
　MSEL_BN%      : ＢＣ位置 (ボックス番号)
　                MSEL_MN%>0のときは無効
　MSEL_BC%      : -1:ＢＣ表示済 / 0:ＢＣ未表示
　MSEL_BD%      : ボックスの並べ方(属性の和を指定)
                    1:Ｙ方向優先で並べる(省略時Ｘ方向優先)
                    2:左方向に並べる(省略時右方向)
                    4:上方向に並べる(省略時下方向)
　MSEL_WT%      : リピート開始までのウェイト
　MSEL_MKM%     : 移動キー・モード
                    0 : 上下／左右ともそのメニュー内
                    1 : 上下キーが押されたらその旨返して終了
                    2 : 左右キーが押されたらその旨返して終了
　MSEL_X%(),MSEL_Y%() : 各ボックス左上隅座標
　MSEL_W%(),MSEL_Z%() : 各ボックス右下隅座標
●出力変数
　KN%           : 入力番号
　                MSEL_BB%..MSEL_BE% :左クリック/決定/直接選択
　                -1                 :右クリック/取消
　                -2                 :ボックス外を左クリック
　                -3                 :非対応キー入力
　KY%          : 入力キーのアスキーコード
                （入力なし:0 ）
　K$            : 入力キー
                （入力なし:""）
　MX%,MY%       : 左クリック位置(絶対座標)
  MW%,MZ%       : 左クリック位置(相対座標)
                  (ともにKN%=-2 の時有効)
                  ただしウィンドウ外クリックの時 MW%=-1
　MSEL_KY%      : 選択キーコード
  MSEL_BN%      : 最後のＢＣ位置 (KN%<1のときも有効)
  MSEL_BC%      : -1 （ＢＣ表示済） 
●説明
　メニュー選択入力を行います。本モジュール呼出しの前に，以下
の設定を行ってください。

    ・MSEL_BB%,MSEL_BE% に入力可能なメニュー番号の下限・上限を設定します。
      ただし，
          0 ≦ MSEL_BB% ≦ MSEL_BE%
      でなければなりません。

    ・MSEL_X%()〜MSEL_Z%()の添字MSEL_BB%〜MSEL_BE%の要素に，各番号に対応
      したボックスの座標を格納します。
      同形同サイズ等間隔のボックスなら，モジュールMSEL_BCMK により作成で
      きます。
      アプリケーションで作成するなら，より複雑なボックスも可能です。ただ
      し，マウスクリック時に選択されたボックスの判定は，
        １．MSEL_BB%番からMSEL_BB% + XN% - 1番までのボックスとクリック位
            置のＸ座標を比較。
        ２．I番にクリック位置が含まれたなら，
            I番，I+XN%番，…，I + XN% * (YN% - 1) 番のボックスとクリ
            ック位置のＹ座標を比較。
        ３．J 番にクリック位置が含まれたなら，J 番が選択された
            と判定。
      という手順で行っています。そのため，
        I番，I+XN%番，…，I + XN% * (YN% - 1) 番
      のボックスのMSEL_X%(),MSEL_W%() は同じ値でなければなりません。つま
      り，マトリックス上に並んだボックスの縦の列は，座標が揃っていなけれ
      ばならないということです。横の列は座標がずれていても構いません。
    　MSEL_BB%番からMSEL_BB% + XN% - 1番までのボックスは座標が小さいもの
    　から順に並んでいる必要はないので，YN% を1にして全ボックスを１列に
    　してしまえば，各ボックスの座標はどのような位置でも構いません。ただ
    　し，パッド／キーボードで選択する際に移動キー↑↓は使えなくなります。

    ・XN%,YN%にボックスの縦横個数を設定します。ただし
        MSEL_BE% − MSEL_BB% ＋ 1 = XN% × YN%
      を満たさなければなりません。

    ・MSEL_BD%にボックスの並べ方を設定します。
        1:Ｙ方向優先で並べる（省略時Ｘ方向優先）
        2:左方向に並べる    （省略時右方向）
        4:上方向に並べる    （省略時下方向）
      の属性の和を指定します。詳しくはMSEL_BCMKの項を参照してください。

    ・C%にボックスカーソルのパレット番号（0 〜15）を設定します。

    ・メニューにはアプリケーション全体で通し番号を付けることができます。
      これをメニュー番号と呼び，MSEL_MN%に設定します。1 以上の値を設定す
      ると，前回そのメニュー番号で本モジュールを呼び出した時の最終的なボ
      ックスカーソル位置が，今回のボックスカーソル位置初期値となります。
      つまり，メニュー毎に違う値を設定するようにアプリケーションを作成す
      れば，各メニューのカーソル位置が次回そのメニューを開くときまで保存
      されます。カーソル位置の保存をしないのであれば，MSEL_MN%に0 を設定
      してください。このときはMSEL_BN%に，ボックスカーソル位置の初期値を
      ボックス番号で設定します。

    ・ボックスカーソルが既に表示済であれば-1，未表示であれば0 を設定して
      ください。

  以上の設定を行った後，本モジュールを呼び出すと，ボックスカーソル（現在
位置のボックス座標と同位置の矩形枠）とマウスカーソルが表示されます。ボッ
クス自体は具体的に表示されるわけではないので，番号や選択項目などの表示は
アプリケーションが行ってください。
  この状態で入力に対して次の処理を行います。ただし，以下の記述におけるキー
の名前は，前述した仮想的な選択キーです。

    ・マウスを右クリックか取消キーを押す
    　KN%に-1（取消入力）を格納して終了します。

    ・マウスを左クリック
      クリック位置がボックスの一つの中なら，KN% にそのボックス番号を格納
      して終了します。この判定は前記した手順で行われるため，ボックス座標
      の設定には注意が必要です。クリック位置がどのボックスにも含まれてい
      なければ，KN% には-2（ボックス外を左クリック）が格納されます。
      また，このときのクリック位置は，絶対座標で(MX%,MY%) に格納されます。
      相対座標モードでクリック位置がアクティブウィンドウ内なら，相対座標
      が(MW%,MZ%) に格納されます（この他の場合，MW%は-1）。
    　左ボタンが押されっぱなしの場合，本モジュールでは
　      １回目の呼び出し    ：クリックと同じ扱い
　      ２回目の呼び出し    ：VIL_MSEL_WT%で示された時間（単位1/100 秒）
　                          　だけウェイトを入れた後，クリックと同じ扱い
        ３回目以降の呼び出し：クリックと同じ扱い
      となります。一度ボタンを放すと，この回数は初期化されます。
      したがって，ボタンを押しっぱなしにすると，一度入力が起きた後ちょっ
      と間をおいて連続入力が起こるというリピート機能が実現されます。
      リピート開始までの時間はアプリケーションでVIL_MSEL_WT%に値をセット
      することで変更できます。

    ・番号選択キーを押す
      KN% にその番号を格納して終了します。また，ボックスカーソルはその番
      号のボックスへと移動します。
      ただし，ボックス番号の上限および下限を越えている場合は，非対応キー
      が押されたとします。

    ・決定キーを押す
      そのときのボックスカーソル位置のボックス番号をKN% に格納して終了し
      ます。

    ・非対応キーを押す。
　    KN%に-3を格納して終了します。

    ・ウィンドウマネージャ起動キーを押す
　    KN%に-13を格納して終了します。

    ・移動キー（→←↑↓）を押す
      それぞれの方向にボックスカーソルを移動します。MSEL_BD%の値にかかわ
      らず，画面上での移動方向は移動キーの方向と同じです。また，上下左右
      の端のボックスから先に移動しようとすると，反対側の端に移動します。
      ただし，MSEL_MKM% の値が
        1 のとき：↑，↓キーが押されたらそれぞれ-7,-8 をKN% に格納して終了
        2 のとき：→，←キーが押されたらそれぞれ-5,-6 をKN% に格納して終了
      となります。

いずれの場合でも，終了時にボックスカーソルは最終位置（ボックスが選択され
た時はそのボックス）に表示されたまま残り，MSEL_BC%は-1に設定されます。都
合が悪い場合はモジュールMSEL_BC を一度呼び出すと，ボックスカーソルは消去
されます。
  メニュー番号MSEL_MN%に1 以上が設定されている場合は，ボックスカーソル位
置はMSEL_BN%(MSEL_MN%)に保存されます。
  マウスカーソルは本モジュールの終了時に非表示になります。
  本モジュール終了直前の選択キーコードはMSEL_KY%に格納されています。アス
キーコードおよび入力文字はKY%およびK$に格納されています。

７．MSEL_BCCHK          指定座標がボックスに含まれるかをチェック
●入力変数
　MX%,MY%       : ボックスに含まれるかを調べる座標
　MSEL_BB%      : ボックス番号ＭＩＮ
　MSEL_BE%      : ボックス番号ＭＡＸ
　MSEL_X%(),MSEL_Y%() : 各ボックス左上隅座標
　MSEL_W%(),MSEL_Z%() : 各ボックス右下隅座標
●出力変数
　KN%           : 入力番号
                    MSEL_BB%..MSEL_BE% :指定座標がボックス内
                    -2                 :指定座標がボックス外
　MSEL_BN%      : ＢＣ位置 (ボックス番号)
                　（指定座標がボックス内のとき）
●説明
　指定座標(MX%,MY%) が含まれるボックスの番号を返します。どのボックスにも
含まれない場合は-2を返します。

８．MSEL_CNFM           設定メニュー選択
●入力変数
  MSEL_CX%(),   : 各行の基準ボックス左上隅座標
  MSEL_CY%()
  MSEL_CW%(),   : 各行の基準ボックス右下隅座標
  MSEL_CZ%()
  MSEL_CN%()    : 各行のボックス個数
  MSEL_CL%()    : 各行のボックス間隔(左上隅座標間隔)
  MSEL_CBB%()   : 各行のボックス番号ＭＩＮ
　MSEL_CBE%()   : 各行のボックス番号ＭＡＸ
　C%            : ボックスカーソル（ＢＣ）色
　MSEL_CMN%     : 設定メニュー番号 (0 以外を指定)
　MSEL_CMR%     : 設定メニュー行数
                　(MN% は CMN%〜CNB%+CMR% までが使用される)
                　(MSEL_BN%(MSEL_CMN%) にはアクティブ行番号を格納)
　MSEL_BC%      : -1:ＢＣ表示済 / 0:ＢＣ未表示
　MSEL_BD%      : ボックスの並べ方(0 に設定)
　MSEL_BN%      : ＢＣ位置 (ボックス番号)
　MSEL_MKM%     : 移動キー・モード(0 に設定)
　MSEL_CR%      : 現在行(0 〜 MSEL_MRN%)
　MSEL_CRB%     : MSEL_CR%保存用
　MSEL_MN%      : メニュー番号
　MSEL_X%(),MSEL_Y%() : 各ボックス左上隅座標
　MSEL_W%(),MSEL_Z%() : 各ボックス右下隅座標
●出力変数
　KN%           : 入力番号
                    MSEL_BB%..MSEL_BE% :左クリック/決定/直接選択
                    -1                 :右クリック/取消
                    -2                 :ボックス外を左クリック
                    -3                 :非対応キー入力
                   -13                 : ウィンドウマネージャ起動キー
　KY%           : 入力キーのアスキーコード
                　（入力なし:0 ）
　K$            : 入力キー
                　（入力なし:""）
　MX%,MY%       : 左クリック位置(絶対座標)
　MW%,MZ%       : 左クリック位置(相対座標)
                　(ともにKN%=-2 の時有効)
                　ただしウィンドウ外クリックの時 MW%=-1
　MSEL_KY%      : 選択キーコード
　MSEL_BC%      : -1 （ＢＣ表示済） 
●説明
  スイッチやパラメータ類の設定メニューなどを実現するための，メニュー選択
モジュールです。全ボックスが１行に並ぶようなメニューを複数使用することに
より，各行毎に１つずつ選択することができるようなメニューを実現しています。
  本モジュール呼出しの前に，以下の設定を行ってください。

    ・MSEL_CX%(),MSEL_CY%(),MSEL_CW%(),MSEL_CZ%() に，各行の基準ボックス
      左上隅座標・右下隅座標を，MSEL_CN%()に各行のボックス個数を，MSEL_C
      L%()に各行のボックス間隔（左上隅座標間隔）を，それぞれ格納します。
      意味はMSEL_BCMK におけるX%〜Z%,XN%,YL%と同じです。

    ・MSEL_CBB%(),MSEL_CBE%() に，入力可能なメニュー番号の下限・上限を設
      定します。ただし，
          0 ≦ MSEL_CBB% ≦ MSEL_CBE%
      でなければなりません。

    ・C%にボックスカーソルのパレット番号（0 〜15）を設定します。

    ・MSEL_CMN% に設定メニュー番号，MSEL_CMR% に設定メニュー行数を指定し
      ます。
      設定メニューでは，実際には行数分だけの個数のメニューを作成します。
      このため，各行のボックス番号を保存するためにメニュー番号をMSEL_CMN%
      〜 MSEL_CMN% + MSEL_CMR%まで使用します（MSEL_BN%(MSEL_CMN%) にはア
      クティブ行番号が格納されます）。この範囲が他のメニューと重ならない
      ようにしてください。また，設定メニュー番号に0 を指定することはでき
      ません。

    ・ボックスカーソルが既に表示済であれば-1，未表示であれば0 を設定して
      ください。

  以上の設定を行った後，本モジュールを呼び出すと，以下のものが表示されま
す。

    ・マウスカーソル

    ・ボックスカーソル
      アクティブ行（現在選択を行っている行）の現在のボックス番号位置に表
      示されます。

    ・ラインカーソル（ボックスカーソルの底辺部分に相当する線分）
      アクティブ行以外の各行には，現在のボックス番号を示すマーカーとして，
      これが表示されます。

  この状態で入力に対して処理を行います。基本的にはMSEL_Mと同じですが，以
下の点が異なります。

    ・マウスを左クリック
      クリック位置がボックスの１つの中なら，ボックス番号およびボックスカ
      ーソルがそこに移動し，KN% にボックス番号を格納して終了します。もし
      非アクティブ行のボックス内なら，アクティブ行もその行に移動します。
      クリック位置がすべての行のどのボックスにも含まれていなければ，KN%
      に-2（ボックス外を左クリック）を格納して終了します。

    ・移動キー（→←↑↓）を押す
      →←キーのとき，MSEL_Mと同様にボックスカーソルの移動を行います。
      ↑↓キーのとき，アクティブ行を上下に移動します。これも最上・最下行
      を越えようとすると，反対側の端に移動します。ボックスカーソル位置は，
      新アクティブ行の保存されていた位置になります。
      どちらの場合も，モジュールを終了しません。

いずれの場合でも，終了時にボックスカーソル・ラインカーソルは最終位置に表
示されたまま残り，MSEL_BC%は-1に設定されます。各行の最終ボックス番号およ
び最終アクティブ行は保存されます。

９．MSEL_CNFSV          設定メニューの設定保存
●入力変数
　MSEL_CMN%     : 設定メニュー番号 (0 以外を指定)
　MSEL_CMR%     : 設定メニュー行数
●出力変数
　MSEL_CBN%()   : MSEL_BN%()保存用
●説明
  メニュー番号MSEL_CMN% 〜MSEL_CMN% + MSEL_CMR% のボックス位置MSEL_BN%の
値を，MSEL_CBN%() に保存します。MSEL_CNFM 呼び出し直前に本モジュールを呼
ぶことで，設定メニューで変更されうるボックス位置のバックアップを取ること
ができます。
　MSEL_CNFLD（設定メニューの設定復元）と組み合わせて使用することで，設定
結果をキャンセルする機能を実現できます。

１０．MSEL_CNFLD        設定メニューの設定復元
●入力変数
　MSEL_CMN%     : 設定メニュー番号 (0 以外を指定)
　MSEL_CMR%     : 設定メニュー行数
●出力変数
  MSEL_BN%()    : MSEL_CBN%()からの復元値
●説明
  メニュー番号MSEL_CMN% 〜MSEL_CMN% + MSEL_CMR% のボックス位置MSEL_BN%の
値を，MSEL_CBN%() より復元します。MSEL_CNFM の呼び出し後に本モジュールを
呼ぶことで，設定メニューで変更されたボックス位置を元に戻すことができます。
　MSEL_CNFSV（設定メニューの設定保存）と組み合わせて使用することで，設定
結果をキャンセルする機能を実現できます。

１１．MSEL_BC           ボックスカーソル表示/消去
●入力変数
　C%            : ボックスカーソル（ＢＣ）色
  MSEL_BCM%     : ＢＣ描画モード（0:矩形枠 ／ 1:矩形反転）
●出力変数
　なし
●説明
  現在のボックスカーソル位置にボックスカーソルをＸＯＲで描画します。した
がって，呼び出す毎に表示／消去をトグルで行います。
  ＢＣ描画モードMSEL_BCM% が0 なら矩形枠を，1 なら矩形の反転を描画します。

１２．MSEL_LC           ラインカーソル表示/消去
●入力変数
　C%            : ラインカーソル色
●出力変数
　なし
●説明
  現在のボックスカーソル位置にラインカーソルをＸＯＲで描画します。した
がって，呼び出す毎に表示／消去をトグルで行います。
　ラインカーソルとは，ボックスカーソルの底辺部分に相当する線分です。

１３．MSEL_KY           選択キーチェック
●入力変数
　なし
●出力変数
　KY%          : 入力キーのアスキーコード
                （入力なし:0 ）
　K$            : 入力キー
                （入力なし:""）
  MSEL_KY%      : 選択キーコード
●説明
　キーボードおよびパッドからの入力をチェックします。
　キーボードからの入力があった場合，MSEL_KY%に該当キーの選択キーコード，
K$,KY%に入力文字とそのアスキーコードを格納します。
　パッドからの入力があった場合，MSEL_KY%に該当するボタンの組み合わせの
選択キーコードを格納します。ただし，パッドについては一度入力を検出すると，
いったん全ボタンが放されていることを検出するまで，次の入力には反応しません。
つまり，ボタンを押しっぱなしにしてもリピートは効かなくなっています。
　どちらからも入力がなければ，MSEL_KY%には-4が格納されます。

１４．MSEL_SETSC        ショートカットキー定義
●入力変数
　MSEL_SC$      : ショートカットキー定義文字列
●出力変数
　MSEL_SCB$     : SC$設定時のKB%()退避用
　MSEL_KB%()    : キー割当テーブル（アスキーコード）
●説明
　メニュー選択の一時的なショートカットキーを定義します。
　例えば，

    １．ロード（L）
　  ２．セーブ（S）

というメニューを作る場合，[L],[l] キーで１番，[S],[s] キーで２番を選択で
きると，いわゆるショートカットキー的なものが実現できて便利です。しかしキー
割当テーブルで[L] を１番選択キーに割り当ててしまうと，他のメニューのショー
トカットキーと衝突する可能性があります。そこで本モジュールを用いると，一
時的なキー割当変更を簡単にできます。
  MSEL_SC$にショートカットキーの定義を格納して本モジュールを呼び出すと，
キー割当テーブルが変更されます。元のテーブルの内容はMSEL_SCB$ に退避され
ます。メニュー選択モジュールなどを呼んだ後でMSEL_RESETSCを呼び出すことに
より，キー割当テーブルを復元することができます。
　ショートカットキーの定義は以下の書式で行います。

    "定義キー""選択番号"","［"定義キー""選択番号"","…………］

例えば上の例では，以下のようにします。

    VIL_MSEL_SC$="L1,l1,S2,s2":GOSUB *VIL_MSEL_SETSC

  本モジュールの呼び出しにより，MSEL_SCB$ はいったんクリアされた後，
MSEL_SC$に定義されたキーについてのみテーブル退避を行います。したがって，
２回連続で本モジュールを呼び出すと，一回目の退避結果は失われます。本モジ
ュールの呼び出しまでに，必ずMSEL_RESETSCにより前回の退避結果を復元してお
く必要があります。とくにメニューの階層構造を作る場合，注意してください。

１５．MSEL_RESETSC      ショートカットキー消去
●入力変数
　MSEL_SCB$     : SC$設定時のKB%()退避用
●出力変数
　MSEL_KB%()    : キー割当テーブル（アスキーコード）
●説明
  MSEL_SETSCにより退避されたキー割当テーブルを復元し，定義されたショート
カットキーを消去します。


◎INP（入力パッケージ）
○必要パッケージ
  WIN（ウィンドウ・パッケージ）
  MSEL（メニュー選択パッケージ）
○パッケージ変数
  INP_L%                : 現在の文字列長
  INP_CX%               : カーソル位置
  INP_HSP%              : ヒストリーポインタ
  INP_HSN%              : ヒストリー系列番号
  INP_HSMAX%            : ヒストリー系列数
  INP_HSB%()            : ヒストリーデータ開始位置
  INP_HSP%()            : ヒストリーポインタ
  INP_HS$()             : ヒストリーデータ
○説明
  指定長以内の長さの文字列入力を行うパッケージです。入力文字列には，全角・
半角を混在させることが可能です。ただし，全角入力を行うためには，ページ１
はテキスト画面にしておく必要があります。半角文字しか入力を行わないのであ
れば，ページ１はグラフィック画面としてアプリケーションで使用できます。
  また，ヒストリー機能をサポートしています。
  相対座標モードのとき，本パッケージにおける座標指定はすべて相対座標とな
ります。


○モジュール一覧

１．INP_INITM           初期化モジュール
●入力変数
　W0%           : ヒストリー系列数
●出力変数
　なし
●説明
  W0% にはヒストリーの系列数を指定します。
  ヒストリーとは，過去に本パッケージにより入力された文字列を入力順に保存
し，新たな入力の際にこれを呼び出すことでタイピングの手間を省く機能です。
メモリの制限から保存個数は有限であり，入力回数がこれを越えると古いものか
ら順に消えていきます。以下，この入力順の文字列の並びをヒストリー系列と呼
びます。
  本パッケージではこのヒストリー系列を，W0% で指定した数だけ扱うことがで
きます。したがって，ファイル名入力と数値入力のヒストリーを分けるといった
ことが可能です。
  また，各系列の保存個数は，アプリ環境ファイルでそれぞれ別個に設定できま
す。
  本モジュールを呼び出すことにより，マウス機能の初期化および位置の設定が
行われます（MOUSE 0 および MOUSE 1）。ただしマウスは表示されません。

２．INP_ENVR            アプリ環境ファイル読み込み
●入力変数
　なし
●出力変数
　INP_HSB%()    : ヒストリーデータ開始位置
　INP_HSP%()    : ヒストリーポインタ
  INP_HS$()     : ヒストリーデータ
●説明
  ヒストリーデータをアプリ環境ファイルから読み込みます。
　形式は以下のようになっています。
　・各系列の保存個数
    一行に１個ずつ，系列数の数だけ並べます。
　・各系列のデータ
　　系列数の数だけ，以下のものを並べます。
　　初期アプリ環境ファイルではヒストリーポインタを1 ，ヒストリーデータは
　　すべて"\" にすればいいのですが，デフォルトのヒストリーデータを記述す
　　る場合はポインタを調整してください。
　　　・ヒストリーポインタ
　　　　次の入力文字列が入るべき位置です。1 〜保存個数+1までの整数を指定
　　　　します。
    　・ヒストリーデータ
    　　入力文字列です。アプリ環境ファイルでは空行を読み飛ばすので，行頭
    　　に"\" を付加します。
    　　保存個数+1個のデータを並べます。このうちヒストリーポインタで指定
    　　した位置にはダミーデータとして"\" を記述します。
　例えば系列数を2 とすると，

    4
    2

    3
    \TEST.BAS
    \TEST.EXP
    \
    \
    \

    1
    \
    \
    \

のように記述すれば，ヒストリー系列1 は保存個数4 でデフォルト文字列として
TEST.BAS,TEST.EXP が入り，系列2 は保存個数2 で初期状態では空になります。
  本モジュール呼び出し前に，ENV_ROP を呼び出してアプリ環境ファイルを入力
オープンしておいてください。

３．INP_ENVW            アプリ環境ファイル書き込み
●入力変数
　なし
●出力変数
　なし
●説明
  ヒストリーデータをアプリ環境ファイルに保存します。
  本モジュール呼び出し前に，ENV_WOP を呼び出してアプリ環境ファイルを出力
オープンしておいてください。

４．INP_STR             文字列入力
●入力変数
　X%,Y%         : 入力行左上隅座標
  L%            : 入力文字列最大長
  A$            : 入力文字列初期値
                　（なければ空文字列）
  C%            : 入力文字・カーソル色
  CB%           : 背景色
  INP_HSN%      : ヒストリー系列番号
●出力変数
  KN%           :  0:決定入力
                  -1:取消入力
                  -2:左クリック
                 -13:ウィンドウマネージャ起動キー
  K$            : 最後の入力キー
  KY%           : 最後の入力キーのアスキーコード
  A$            : 入力文字列(KN%=-1 の時は無効)
  MX%,MY%       : 左クリック位置(絶対座標)
  MW%,MZ%       : 左クリック位置(相対座標)
                  (ともにKN%=-2 の時有効)
                  ただしウィンドウ外クリックの時 MW%=-1
  INP_L%,INP_CX%: 現在の文字列長，カーソル位置
●説明
　指定長以内の文字列入力を行います。
　INPUT 文を使わないため，サイドワークや割り込みが有効です。
　本モジュール呼出し前に，以下の設定を行ってください。

    ・(X%,Y%) に入力行左上隅座標を設定します。

    ・L%に，何文字までの文字列を受け付けるかを設定します（半角文字での文
    　字数）。

    ・A$に入力文字列初期値を設定します。これが設定されていると，入力行に
    　最初その文字列が表示され，これを編集して入力とすることができます。
    　例えばファイル名入力の場合，前回の入力値を設定するようにすれば，同
    　じファイル名のときはリターンキーを押すだけでよくなります。
      なければ空文字列を設定します。
      ヒストリー機能を使用する場合は，空文字列を設定したほうがいいかもし
      れません。

    ・C%,CB%に入力文字・カーソル色および背景色のパレット番号（0 〜15）を
      設定します。

    ・INP_HSN%にヒストリーの系列番号を指定します。
      0 を指定すると，ヒストリー機能を使用しません。

  本モジュールを呼び出すと，マウスカーソルとカーソル（１文字分の長さの線
分），および入力文字列初期値が表示されます。
  この状態で，入力に対して次の処理を行います。なお，以下の記述におけるキー
の説明のうち，「（選択キー）」とあるものは，選択パッケージの項で説明した
仮想的なキーを指します。したがって，アプリ設定ファイルにより任意のキーに
割り当てることができます。また，以下の記述における「１文字」とは，全角・
半角を問わず１文字を指します。

    ・マウスを右クリック，または取消キー（選択キー）
　    KN% に-1（取消入力）を格納して終了します。

    ・マウスを左クリック
      KN% に-2（左クリック）を格納して終了します。
      また，クリック位置を絶対座標で(MX%,MY%) に格納します。
      相対座標モードなら，相対座標が(MW%,MZ%) に格納され，絶対座標モード
      ならMW%は-1になります。

    ・決定キー（選択キー）
　    KN%に0（決定入力）を格納して終了します。
    　INP_HSN%>0のとき，この値の番号のヒストリー系列に現在のA$の内容を登
    　録します。

    ・ウィンドウマネージャ起動キー（選択キー）
　    KN% に-13 （ウィンドウマネージャ起動キー）を格納して終了します。

    ・↑↓移動キー（選択キー）を押す
      ヒストリーを呼び出し，過去の入力文字列を現在編集中の文字列にセット
      します。
      ↑を押す毎に，古い入力へと逆上ります。保存個数を越えて逆上ろうとす
      ると，いったん空文字列がセットされ，次には再び最新の入力に戻ります。
      ↓は逆に，新しい入力へと進めます。

    ・←→移動キー（選択キー）を押す
      カーソルを左右に１文字分移動します。移動可能範囲は文字列先頭から，
      文字列末尾文字の１つ後までです。

    ・表示可能文字（アスキーコード &H20〜&H7E,&H80〜&HFF）
      編集中の文字列の長さが最大文字列長L%以下ならば，カーソル位置に入力
      文字を挿入します。カーソルは１文字分後ろに移動します。

    ・ＢＳキー（CTRL+H）
      カーソル位置の１つ前の文字を抹消し，カーソルを１文字前に移動します。

    ・[削除]キー
      カーソル位置の文字を抹消する。

    ・[HOME]キー
      編集中の文字列をクリアする。

終了した場合，A$には編集された文字列の最終状態が残ります。KN% の値により
これをどう扱うかは，アプリケーション側に任されます。
  本モジュールは任意文字列の入力を行うため，マウスでは入力できません。た
だしウィンドウマネージャなどで利用するために，左クリック時にはその位置を
返します。また，右クリックで取消入力ができますので，キーボードが使えない
時に誤ってこのモジュールを呼んでも，抜けることはできます。
  パッドについては割り当てられた選択キーの入力ができます。したがって，取
消キーがボタンに割り当ててあれば，それを押すことで本モジュールを終了でき
ます。さらに，通常では上下の方向キーが↑↓キーに割り当ててありますから，
前もってヒストリーに適当なデフォルト文字列を格納しておけば，パッドだけで
もこれらを選択して入力することが可能です。
  マウスカーソルは本モジュールの終了時に非表示になります。

５．INP_GPRINT          文字列表示(グラフィック座標指定)
●入力変数
　X%,Y%         : 表示位置
  A$            : 表示文字列
  L%            : 文字列長
  C%            : 文字列表示色
  CB%           : 背景色
●出力変数
　なし
●説明
  座標(X%,Y%) にパレット番号C%で文字列A$を表示します。A$の長さを半角文字
での文字数で指定します（全角文字は2 文字分と数えます）。
  表示前に表示領域をパレット番号CB% で塗り潰します。したがって同じ座標に
文字表示を行った場合は，前回の表示は消去されます。

６．INP_FEPON           システム行表示
●入力変数
　なし
●出力変数
　なし
●説明
  全角入力のため，システム行を表示します。全角文字を含む入力を行う場合は，
INP_STR の前に本モジュールを呼び出してください。また，入力後にはINP_FEPOFF
を呼び出すことで，システム行を非表示にできます。
  システム行表示のために，ページ０のグラフィック画面のうち(0,464)-(639,479)
の領域をWIN パッケージの画面退避バッファに退避し，色番号0 でクリアします。
正常終了すればE%が0 になります。
  画面退避に失敗した場合はE%にエラー番号を格納し，クリアせずに終了します。
  画面退避にはWIN パッケージのバッファを勝手に使用しているため，WIN パッ
ケージのモジュールによりウィンドウの操作が行われると，退避データは失われ
る可能性があります。このため，INP_FEPON →INP_STR →INP_FEPOFFという一連
の呼び出しの間は，ウィンドウを操作できません。ウィンドウマネージャ呼び出
し等の際には，いったんINP_FEPOFFによりシステム行を非表示にしてください。

７．INP_FEPOFF          システム行非表示
●入力変数
　なし
●出力変数
　なし
●説明
　全角入力のためのシステム行を非表示にします。
　INP_STR の後に本モジュールを呼び出してください。INP_FEPON により退避さ
れた画面を復元します。

８．INP_MVWAIT          マウス移動/クリック/キー/パッド入力待ち
●入力変数
　なし
●出力変数
　なし
●説明
　次のいずれかが起きるまで待ち，終了します。

    ・マウスが動かされる

    ・左右いずれかのマウスボタンがクリックされる

    ・何かキーが入力される

    ・何かパッドのボタンが入力される。

　ちょっとしたメッセージ表示後の入力待ちなどに使ってください。


