10000 '<<<<<<<<<<<<<<<<<<<<  Visual Interface Library  >>>>>>>>>>>>>>>>>>>>
10002 '<<<<<<<<<<<<<<<<<<<<       　Ｖ　Ｉ　Ｌ　       >>>>>>>>>>>>>>>>>>>>
10004 '<<<<<<<<<<<<<<<<<<<<  基本パッケージ・ファイル  >>>>>>>>>>>>>>>>>>>>
10006 '
10008 '--------------------  バージョンチェック　--------------------
10010 '
10012 *VIL_BAS_VER
10014 VIL_VER%=310                                  'ＶＩＬ VER3.10
10016 RETURN
10018 '
10020 '---------------  ENV  アプリ環境ファイルパッケージ　---------------
10022 '必要パッケージ : なし
10024 '・アプリ環境ファイルの入出力処理
10026 '
10028 *VIL_ENV_INITM
10030 '　アプリ環境ファイルパッケージ初期化
10032 '
10034 '入力変数         : E%            : 0以外なら初期化処理をせず戻る
10036 '破壊変数         : W0%           : トークン切り出し用
10038 '出力変数         : ENV_ENV$      : アプリ環境ファイル名（パス付）
10040 '                 : ENV_ORG$      : 初期アプリ環境ファイル名（パス付）
10042 '呼出しモジュール : なし
10044 '
10046 IF VIL_E%=0 THEN
10048   VIL_ENV_ENV$="APPLI.ENV"      ' アプリ環境ファイル・デフォルト名
10050   VIL_ENV_ORG$="APPLI.ORG"      ' 初期アプリ環境ファイル・デフォルト名
10052 '
10054   VIL_W0%=SEARCH(VIL_ENVNAM$,"APPLIENV"):                                      IF VIL_W0%>-1 THEN VIL_ENV_ENV$=VIL_ENVVAL$(VIL_W0%)
10056   VIL_W0%=SEARCH(VIL_ENVNAM$,"APPLIORG"):                                      IF VIL_W0%>-1 THEN VIL_ENV_ORG$=VIL_ENVVAL$(VIL_W0%)
10058 ENDIF
10060 RETURN
10062 '
10064 *VIL_ENV_ROP
10066 '　アプリ環境ファイル入力オープン
10068 '
10070 '入力変数         : ENV_ENV$      : アプリ環境ファイル名（パス付）
10072 '                 : ENV_ORG$      : 初期アプリ環境ファイル名（パス付）
10074 '破壊変数         : なし
10076 '出力変数         : E%            : 0      : 正常終了
10078 '                                   その他 : オープン失敗
10080 '呼出しモジュール : なし
10082 '
10084 VIL_E%=0:OPEN "I",#1,VIL_ENV_ENV$
10086 IF VIL_E% THEN VIL_E%=0:OPEN "I",#1,VIL_ENV_ORG$
10088 RETURN
10090 '
10092 *VIL_ENV_RCL
10094 '　アプリ環境ファイル入力クローズ
10096 '
10098 '入力変数         : なし
10100 '破壊変数         : なし
10102 '出力変数         : なし
10104 '呼出しモジュール : なし
10106 '
10108 CLOSE #1:RETURN
10110 '
10112 *VIL_ENV_WOP
10114 '　アプリ環境ファイル出力オープン
10116 '
10118 '入力変数         : ENV_ENV$      : .ENVファイル名（パスつき）
10120 '破壊変数         : なし
10122 '出力変数         : E%            : 0      : 正常終了
10124 '                                   その他 : オープン失敗
10126 '呼出しモジュール : なし
10128 '
10130 VIL_E%=0:OPEN "O",#1,VIL_ENV_ENV$
10132 IF VIL_E%=64 THEN KILL VIL_ENV_ENV$:VIL_E%=0:OPEN "O",#1,VIL_ENV_ENV$
10134 RETURN
10136 '
10138 *VIL_ENV_WCL
10140 '　アプリ環境ファイル出力クローズ
10142 '
10144 '入力変数         : なし
10146 '破壊変数         : なし
10148 '出力変数         : なし
10150 '呼出しモジュール : なし
10152 '
10154 CLOSE #1:RETURN
10156 '
10158 *VIL_ENV_ERR
10160 '　アプリ環境ファイルエラー
10162 '
10164 '入力変数         : なし
10166 '破壊変数         : なし
10168 '出力変数         : なし
10170 '呼出しモジュール : なし
10172 '
10174 CLS               '現バージョンはアプリを強制終了
10176 PRINT"環境ファイルにエラーがあります"
10178 PRINT"エラー行:";VIL_W0$
10180 STOP
10182 RETURN
10184 '
10186 '--------------------  BEEP  ブザー音パッケージ　--------------------
10188 '必要パッケージ : なし
10190 '・受理時/エラー時のブザー音
10192 '
10194 *VIL_BEEP_INITM
10196 '　ブザー音パッケージ初期化
10198 '
10200 '入力変数         : E%            : 0以外なら初期化処理をせず戻る
10202 '破壊変数         : なし
10204 '出力変数         : なし
10206 '呼出しモジュール : なし
10208 '
10210 'パッケージ変数
10212 IF VIL_E%=0 THEN
10214   VIL_BEEP_F%=-1        'ブザーフラグ（-1:ON / 0:OFF）
10216 ENDIF
10218 RETURN
10220 '
10222 *VIL_BEEP_ENVR
10224 '　アプリ環境ファイル読み込み
10226 '
10228 '入力変数         : なし
10230 '破壊変数         : なし
10232 '出力変数         : BEEP_F%       : ブザーフラグ（-1:ON / 0:OFF）
10234 '呼出しモジュール : LNR
10236 '
10238 VIL_W0$="":WHILE VIL_W0$<>"#BEEP":GOSUB *VIL_LNR:WEND
10240 GOSUB *VIL_LNR:VIL_BEEP_F%=VAL(VIL_W0$)
10242 RETURN
10244 '
10246 *VIL_BEEP_ENVW
10248 '　アプリ環境ファイル書き込み
10250 '
10252 '入力変数         : BEEP_F%       : ブザーフラグ（-1:ON / 0:OFF）
10254 '破壊変数         : なし
10256 '出力変数         : なし
10258 '呼出しモジュール : なし
10260 '
10262 PRINT #1,"#BEEP"
10264 PRINT #1,VIL_BEEP_F%
10266 RETURN
10268 '
10270 *VIL_BEEP_G
10272 '　受理ブザー音
10274 '
10276 '入力変数         : BEEP_F%       : ブザーフラグ（-1:ON / 0:OFF）
10278 '破壊変数         : I%            : ループ用
10280 '出力変数         : なし
10282 '呼出しモジュール : なし
10284 '
10286 IF VIL_BEEP_F% THEN FOR VIL_I%=1 TO 4:BEEP 363523,5,400:WAIT 5:NEXT
10288 RETURN
10290 '
10292 *VIL_BEEP_B
10294 '　エラー・ブザー音
10296 '
10298 '入力変数         : BEEP_F%       : ブザーフラグ（-1:ON / 0:OFF）
10300 '破壊変数         : なし
10302 '出力変数         : なし
10304 '呼出しモジュール : なし
10306 '
10308 IF VIL_BEEP_F% THEN BEEP 363523,40,80:WAIT 40
10310 RETURN
10312 '
10314 '--------------------  WIN  ウィンドウ・パッケージ　------------------
10316 '必要パッケージ : なし
10318 '・ウィンドウ領域の退避・復元処理および退避データの管理
10320 '・絶対座標/相対座標モードの切替
10322 '※ウィンドウ・オープン/クローズは絶対座標モードで行うこと
10324 '
10326 *VIL_WIN_INITM
10328 '　ウィンドウ・パッケージ初期化
10330 '
10332 '入力変数         : W0&           : 画面退避バッファサイズ
10334 '                   W1%           : 最大ウィンドウ番号
10336 '                 : E%            : 0以外なら初期化処理をせず戻る
10338 '破壊変数         : なし
10340 '出力変数         : なし
10342 '呼出しモジュール : なし
10344 '
10346 IF VIL_E%=0 THEN
10348 'パッケージ変数
10350 '   アクティブウィンドウ左上隅座標・右下隅座標
10352   VIL_WIN_X%=0:VIL_WIN_Y%=0:VIL_WIN_W%=0:VIL_WIN_Z%=0
10354 '   ウィンドウ枠の上部・下部・左部・右部幅
10356   VIL_WIN_UB%=0:VIL_WIN_DB%=0:VIL_WIN_LB%=0:VIL_WIN_RB%=0
10358 '   現在のアクティブウィンドウ番号（0:NONE/1..W1%）
10360 '   座標モード（0:絶対座標 / -1:相対座標）
10362   VIL_WIN_AN%=0:VIL_WIN_PM%=0
10364 '   画面退避バッファサイズ、最大ウィンドウ番号
10366   VIL_WIN_BFMAX&=VIL_W0&:VIL_WIN_ANMAX%=VIL_W1%
10368 '   画面退避バッファ，WIN_BF%()オフセット
10370   DIM VIL_WIN_BF%(VIL_W0&),VIL_WIN_BFO&(VIL_W1%)
10372 '   ウィンドウ左上隅座標・右下隅座標
10374   DIM VIL_WIN_X%(VIL_W1%),VIL_WIN_Y%(VIL_W1%),                                     VIL_WIN_W%(VIL_W1%),VIL_WIN_Z%(VIL_W1%)
10376  '     WIN_AN%=0 のとき相対座標＝絶対座標
10378   VIL_WIN_X%(0)=  0:VIL_WIN_Y%(0)=  0:                                         VIL_WIN_W%(0)=639:VIL_WIN_Z%(0)=479
10380 ENDIF
10382 RETURN
10384 '
10386 *VIL_WIN_ENVR
10388 '　アプリ環境ファイル読み込み
10390 '
10392 '入力変数         : なし
10394 '破壊変数         : なし
10396 '出力変数         : なし
10398 '呼出しモジュール : LNR
10400 '
10402 VIL_W0$="":WHILE VIL_W0$<>"#WIN":GOSUB *VIL_LNR:WEND
10404 RETURN
10406 '
10408 *VIL_WIN_ENVW
10410 '　アプリ環境ファイル書き込み
10412 '
10414 '入力変数         : なし
10416 '破壊変数         : なし
10418 '出力変数         : なし
10420 '呼出しモジュール : なし
10422 '
10424 PRINT #1,"#WIN"
10426 RETURN
10428 '
10430 *VIL_WIN_OP
10432 '　ウィンドウ・オープン
10434 '
10436 '入力変数         : WIN_X%,WIN_Y% : ウィンドウ左上隅座標
10438 '                   WIN_W%,WIN_Z% : ウィンドウ右下隅座標
10440 '破壊変数         : なし
10442 '出力変数         : E%            : 0 : 正常終了
10444 '                                   5 : オープン失敗（退避領域不足）
10446 '                   WIN_X%,WIN_Y% : オープン失敗時のみ、現在の
10448 '                   WIN_W%,WIN_Z%   アクティブウィンドウの値を設定
10450 '呼出しモジュール : なし
10452 '
10454 VIL_WIN_AN%=VIL_WIN_AN%+1
10456 VIL_WIN_X%(VIL_WIN_AN%)=VIL_WIN_X%:VIL_WIN_Y%(VIL_WIN_AN%)=VIL_WIN_Y%
10458 VIL_WIN_W%(VIL_WIN_AN%)=VIL_WIN_W%:VIL_WIN_Z%(VIL_WIN_AN%)=VIL_WIN_Z%
10460 VIL_WIN_BFO&(VIL_WIN_AN%)=VIL_WIN_BFO&(VIL_WIN_AN%-1)                        +INT((INT((VIL_WIN_W%-VIL_WIN_X%+VIL_WIN_LB%+VIL_WIN_RB%+8)/8)               *(VIL_WIN_Z%-VIL_WIN_Y%+VIL_WIN_UB%+VIL_WIN_DB%+1)*4+1)/2)
10462 VIL_E%=0
10464 GET@A(VIL_WIN_X%-VIL_WIN_LB%,VIL_WIN_Y%-VIL_WIN_UB%)                             -(VIL_WIN_W%+VIL_WIN_RB%,VIL_WIN_Z%+VIL_WIN_DB%)                              ,VIL_WIN_BF%,VIL_WIN_BFO&(VIL_WIN_AN%-1)
10466 IF VIL_E% THEN
10468   VIL_WIN_AN%=VIL_WIN_AN%-1
10470   VIL_WIN_X%=VIL_WIN_X%(VIL_WIN_AN%)
10472   VIL_WIN_Y%=VIL_WIN_Y%(VIL_WIN_AN%)
10474   VIL_WIN_W%=VIL_WIN_W%(VIL_WIN_AN%)
10476   VIL_WIN_Z%=VIL_WIN_Z%(VIL_WIN_AN%)
10478 ENDIF
10480 RETURN
10482 '
10484 *VIL_WIN_CL
10486 '　ウィンドウ・クロ－ズ
10488 '
10490 '入力変数         : なし
10492 '破壊変数         : なし
10494 '出力変数         : WIN_X%,WIN_Y% : 新アクティブウィンドウ左上隅座標
10496 '                   WIN_W%,WIN_Z% : 新アクティブウィンドウ右下隅座標
10498 '呼出しモジュール : なし
10500 '
10502 PUT@A(VIL_WIN_X%(VIL_WIN_AN%)-VIL_WIN_LB%,VIL_WIN_Y%(VIL_WIN_AN%)            -VIL_WIN_UB%)-(VIL_WIN_W%(VIL_WIN_AN%)+VIL_WIN_RB%,VIL_WIN_Z%(               VIL_WIN_AN%)+VIL_WIN_DB%),VIL_WIN_BF%,,,,,VIL_WIN_BFO&(VIL_WIN_AN%-1)
10504 VIL_WIN_AN%=VIL_WIN_AN%-1
10506 VIL_WIN_X%=VIL_WIN_X%(VIL_WIN_AN%):VIL_WIN_Y%=VIL_WIN_Y%(VIL_WIN_AN%)
10508 VIL_WIN_W%=VIL_WIN_W%(VIL_WIN_AN%):VIL_WIN_Z%=VIL_WIN_Z%(VIL_WIN_AN%)
10510 RETURN
10512 '
10514 *VIL_WIN_CLDMY
10516 '　ウィンドウ・クロ－ズダミー
10518 '
10520 '入力変数         : なし
10522 '破壊変数         : なし
10524 '出力変数         : WIN_X%,WIN_Y% : 新アクティブウィンドウ左上隅座標
10526 '                   WIN_W%,WIN_Z% : 新アクティブウィンドウ右下隅座標
10528 '呼出しモジュール : なし
10530 '
10532 VIL_WIN_AN%=VIL_WIN_AN%-1
10534 VIL_WIN_X%=VIL_WIN_X%(VIL_WIN_AN%):VIL_WIN_Y%=VIL_WIN_Y%(VIL_WIN_AN%)
10536 VIL_WIN_W%=VIL_WIN_W%(VIL_WIN_AN%):VIL_WIN_Z%=VIL_WIN_Z%(VIL_WIN_AN%)
10538 RETURN
10540 '
10542 *VIL_WIN_CLALL
10544 '　ウィンドウ全クロ－ズ
10546 '
10548 '入力変数         : なし
10550 '破壊変数         : なし
10552 '出力変数         : WIN_X%,WIN_Y% : (0,0)
10554 '                   WIN_W%,WIN_Z% : (639,479)
10556 '呼出しモジュール : WIN_CL
10558 '
10560 WHILE VIL_WIN_AN%
10562   GOSUB *VIL_WIN_CL
10564 WEND
10566 RETURN
10568 '
10570 *VIL_WIN_PMR
10572 '　相対座標モード
10574 '
10576 '入力変数         : なし
10578 '破壊変数         : なし
10580 '出力変数         : WIN_PM%       : -1 (相対座標モード)
10582 '呼出しモジュール : なし
10584 '
10586 VIL_WIN_PM%=-1
10588 VIEW(VIL_WIN_X%,VIL_WIN_Y%)-(VIL_WIN_W%,VIL_WIN_Z%)
10590 WINDOW(0,0)-(VIL_WIN_W%-VIL_WIN_X%,VIL_WIN_Z%-VIL_WIN_Y%)
10592 RETURN
10594 '
10596 *VIL_WIN_PMA
10598 '　絶対座標モード
10600 '
10602 '入力変数         : なし
10604 '破壊変数         : なし
10606 '出力変数         : WIN_PM%       : 0 (絶対座標モード)
10608 '呼出しモジュール : なし
10610 '
10612 VIL_WIN_PM%=0
10614 VIEW(0,0)-(639,479):WINDOW(0,0)-(639,479)
10616 RETURN
10618 '
10620 '--------------------  仮想キー・パッケージ　--------------------
10622 '必要パッケージ : なし
10624 '・パッド／キーボードによる仮想キーの入力
10626 '
10628 *VIL_VKEY_INITM
10630 '　仮想キー・パッケージ初期化
10632 '
10634 '入力変数         : なし
10636 '破壊変数         : I%            : ループ用
10638 '出力変数         : なし
10640 '呼出しモジュール : なし
10642 '
10644 IF VIL_E%=0 THEN
10646 'パッケージ変数
10648 '   仮想キーコード
10650 '        0..    : 番号選択
10652 '       -1      : 取消
10654 '       -2      : 決定
10656 '       -3      : 非対応
10658 '       -4      : ヌル入力
10660 '       -5..-8  : 移動（→←↑↓）
10662 '       -9..-12 : 拡張移動（→←↑↓）
10664 '       -13     : ウィンドウマネージャ起動
10666 '       -14     : アクセサリ起動
10668 '       -15     : ＢＳ
10670 '       -16     : 削除
10672 '       -17     : クリア
10674 '   パッドボタン リピートモード
10676 '   仮想キー一時変更定義文字列,TC$設定時のKB%()退避用
10678   VIL_VKEY_KY%=0:VIL_VKEY_PRM%=0:VIL_VKEY_TC$="":VIL_VKEY_TCB$=""
10680 '   キー割当テーブル、パッド割当テーブル( PAD(1)+PTRIG(1)*9 )
10682   DIM VIL_VKEY_KB%(255),VIL_VKEY_PAD%(107)
10684 'アプリ設定ファイル読み込み
10686   VIL_W0$="":WHILE VIL_W0$<>"#VKEY":GOSUB *VIL_LNR:WEND
10688 '   VKEY_KB%()
10690   FOR VIL_I%=0 TO 240 STEP 16
10692     GOSUB *VIL_LNR
10694     FOR VIL_J%=0 TO 15
10696       VIL_VKEY_KB%(VIL_I%+VIL_J%)=VAL(VIL_W0$)
10698       VIL_W0%=INSTR(VIL_W0$,",")+1
10700       IF VIL_W0%>1 THEN VIL_W0$=MID$(VIL_W0$,VIL_W0%)
10702     NEXT
10704   NEXT
10706 '   VKEY_PAD%()
10708   FOR VIL_I%=0 TO 99 STEP 9
10710     GOSUB *VIL_LNR
10712     FOR VIL_J%=0 TO 8
10714       VIL_VKEY_PAD%(VIL_I%+VIL_J%)=VAL(VIL_W0$)
10716       VIL_W0%=INSTR(VIL_W0$,",")+1
10718       IF VIL_W0%>1 THEN VIL_W0$=MID$(VIL_W0$,VIL_W0%)
10720     NEXT
10722   NEXT
10724 '
10726 ENDIF
10728 RETURN
10730 '
10732 *VIL_VKEY_ENVR
10734 '　アプリ環境ファイル読み込み
10736 '
10738 '入力変数         : なし
10740 '破壊変数         : なし
10742 '出力変数         : なし
10744 '呼出しモジュール : LNR
10746 '
10748 VIL_W0$="":WHILE VIL_W0$<>"#VKEY":GOSUB *VIL_LNR:WEND
10750 RETURN
10752 '
10754 *VIL_VKEY_ENVW
10756 '　アプリ環境ファイル書き込み
10758 '
10760 '入力変数         : なし
10762 '破壊変数         : なし
10764 '出力変数         : なし
10766 '呼出しモジュール : なし
10768 '
10770 PRINT #1,"#VKEY"
10772 RETURN
10774 '
10776 *VIL_VKEY_KY
10778 '　選択キーチェック
10780 '
10782 '入力変数         : なし
10784 '破壊変数         : なし
10786 '出力変数         : KY%           : 入力キーのアスキーコード
10788 '                                  （入力なし:0 ）
10790 '                   K$            : 入力キー
10792 '                                  （入力なし:""）
10794 '                   VKEY_KY%      : 仮想キーコード
10796 '呼出しモジュール : なし
10798 '
10800 VIL_K$=INKEY$:VIL_VKEY_KY%=-4
10802 IF VIL_K$<>"" THEN
10804   VIL_KY%=ASC(VIL_K$):VIL_VKEY_KY%=VIL_VKEY_KB%(VIL_KY%)
10806 ELSE
10808   VIL_KY%=0:VIL_PAD%=PAD(1)+PTRIG(1)*9
10810   IF VIL_PAD% THEN
10812     IF VIL_VKEY_PRM%=0 THEN VIL_VKEY_PRM%=1:                                                             VIL_VKEY_KY%=VIL_VKEY_PAD%(VIL_PAD%)
10814   ELSE
10816     VIL_VKEY_PRM%=0:VIL_VKEY_KY%=-4
10818   ENDIF
10820 ENDIF
10822 'SCREEN 0:LOCATE 0,0:PRINT VIL_VKEY_KY%
10824 RETURN
10826 '
10828 *VIL_VKEY_SETTC
10830 '　仮想キー一時変更
10832 '
10834 '入力変数         : VKEY_TC$      : 一時変更定義文字列
10836 '破壊変数         : I%            : ループ用
10838 '                   W0%           : TC$切りだし用
10840 '出力変数         : VKEY_TCB$     : TC$設定時のKB%()退避用
10842 '                   VKEY_KB%()    : キー割当テーブル（アスキーコード）
10844 '呼出しモジュール : なし
10846 '
10848 VIL_VKEY_TCB$="":VIL_I%=1
10850 WHILE VIL_I%>0
10852   VIL_W0%=ASC(MID$(VIL_VKEY_TC$,VIL_I%,1))
10854   VIL_VKEY_TCB$=VIL_VKEY_TCB$+","+MID$(VIL_VKEY_TC$,VIL_I%,1)                                                 +STR$(VIL_VKEY_KB%(VIL_W0%))
10856   VIL_VKEY_KB%(VIL_W0%)=VAL(MID$(VIL_VKEY_TC$,VIL_I%+1))
10858   VIL_I%=INSTR(VIL_I%+1,VIL_VKEY_TC$,","):VIL_I%=VIL_I%-(VIL_I%>0)
10860 WEND
10862 RETURN
10864 '
10866 *VIL_VKEY_RESETTC
10868 '　仮想キー一時変更解除
10870 '
10872 '入力変数         : VKEY_TCB$     : TC$設定時のKB%()退避用
10874 '破壊変数         : I%            : ループ用
10876 '                   W0%           : TCB$切りだし用
10878 '出力変数         : VKEY_KB%()    : キー割当テーブル（アスキーコード）
10880 '呼出しモジュール : なし
10882 '
10884 VIL_I%=2
10886 WHILE VIL_I%>0
10888   VIL_W0%=ASC(MID$(VIL_VKEY_SCB$,VIL_I%,1))
10890   VIL_VKEY_KB%(VIL_W0%)=VAL(MID$(VIL_VKEY_SCB$,VIL_I%+1))
10892   VIL_I%=INSTR(VIL_I%+1,VIL_VKEY_SCB$,","):VIL_I%=VIL_I%-(VIL_I%>0)
10894 WEND
10896 RETURN
10898 '
10900 '--------------------  メニュー選択パッケージ　--------------------
10902 '必要パッケージ : 仮想キー
10904 '・マウス／パッド／キーボードによるメニュー選択入力
10906 '
10908 *VIL_MSEL_INITM
10910 '　メニュー選択パッケージ初期化
10912 '
10914 '入力変数         : W0%           : 最大メニュー番号
10916 '                   W1%           : 最大ボックス数
10918 '                   W2%           : 設定メニュー最大行数
10920 '破壊変数         : I%            : ループ用
10922 '出力変数         : なし
10924 '呼出しモジュール : なし
10926 '
10928 IF VIL_E%=0 THEN
10930 'パッケージ変数
10932 '   メニュー番号（0のとき無効）
10934 '   ボックス番号ＭＩＮ,ＭＡＸ
10936 '   ボックスカーソル（ＢＣ）位置(ボックス番号)
10938   VIL_MSEL_MN%=0:VIL_MSEL_BB%=1:VIL_MSEL_BE%=9:VIL_MSEL_BN%=0
10940 '   -1:ＢＣ表示済 / 0:ＢＣ未表示
10942 '   ボックスの並べ方
10944 '       1:Ｙ方向優先で並べる(省略時Ｘ方向優先)
10946 '       2:左方向に並べる    (省略時右方向)
10948 '       4:上方向に並べる    (省略時下方向)
10950 '       これらの和を指定
10952 '   ボックス整列モード
10954 '       0 : 縦方向整列
10956 '       1 : 横方向整列
10958   VIL_MSEL_BC%=0:VIL_MSEL_BD%=0:VIL_MSEL_BAM%=0
10960 '   リピート開始までのウェイト
10962 '   マウスボタン リピートモード
10964 '   移動キー・モード
10966 '       0 : 上下／左右ともそのメニュー内
10968 '       1 : 上下キーが押されたらその旨返して終了
10970 '       2 : 左右キーが押されたらその旨返して終了
10972   VIL_MSEL_WT%=50:VIL_MSEL_MRM%=0:VIL_MSEL_MKM%=0
10974 '   設定メニュー番号(0 以外を指定),行数,現在行(0 ～ MSEL_CMR%)
10976 '   MSEL_CR%保存用
10978   VIL_MSEL_CMN%=0:VIL_MSEL_CMR%=0:VIL_MSEL_CR%=0:VIL_MSEL_CRB%=0
10980 '   MSELループ終了判定用(アプリ中で使用)
10982   VIL_MSEL_R%=0
10984 '   ボックス左上隅・右下隅座標保存
10986   DIM VIL_MSEL_X%(VIL_W1%),VIL_MSEL_Y%(VIL_W1%),                                   VIL_MSEL_W%(VIL_W1%),VIL_MSEL_Z%(VIL_W1%)
10988 '   ＢＣ位置保存
10990   DIM VIL_MSEL_BN%(VIL_W0%)
10992 '   設定メニュー用
10994 '     各行の基準ボックス　左上隅・右下隅座標
10996   DIM VIL_MSEL_CX%(VIL_W2%),VIL_MSEL_CY%(VIL_W2%),                                 VIL_MSEL_CW%(VIL_W2%),VIL_MSEL_CZ%(VIL_W2%)
10998 '     各行のボックス個数,  各行のボックス間隔(左上隅座標間隔)
11000 '     各行のボックス番号ＭＩＮ, ＭＡＸ
11002 '     MSEL_BN%()保存用（変更取消時に使用）
11004   DIM VIL_MSEL_CN%(VIL_W2%) ,VIL_MSEL_CL%(VIL_W2%),                                VIL_MSEL_CBB%(VIL_W2%),VIL_MSEL_CBE%(VIL_W2%),                               VIL_MSEL_CBN%(VIL_W2%)
11006 'アプリ設定ファイル読み込み
11008   VIL_W0$="":WHILE VIL_W0$<>"#MSEL":GOSUB *VIL_LNR:WEND
11010   GOSUB *VIL_LNR:VIL_MSEL_BCM%=VAL(VIL_W0$)  'ＢＣ描画モード
11012 '
11014   MOUSE 0:MOUSE 1,320,240,0
11016 ENDIF
11018 RETURN
11020 '
11022 *VIL_MSEL_ENVR
11024 '　アプリ環境ファイル読み込み
11026 '
11028 '入力変数         : なし
11030 '破壊変数         : なし
11032 '出力変数         : MSEL_WT%      : リピート開始までのウェイト
11034 '呼出しモジュール : LNR
11036 '
11038 VIL_W0$="":WHILE VIL_W0$<>"#MSEL":GOSUB *VIL_LNR:WEND
11040 GOSUB *VIL_LNR:VIL_MSEL_WT%=VAL(VIL_W0$)
11042 RETURN
11044 '
11046 *VIL_MSEL_ENVW
11048 '　アプリ環境ファイル書き込み
11050 '
11052 '入力変数         : MSEL_WT%      : リピート開始までのウェイト
11054 '破壊変数         : なし
11056 '出力変数         : なし
11058 '呼出しモジュール : なし
11060 '
11062 PRINT #1,"#MSEL"
11064 PRINT #1,VIL_MSEL_WT%
11066 RETURN
11068 '
11070 *VIL_MSEL_M
11072 '　メニュー選択
11074 '
11076 '入力変数         : X%,Y%         : 基準ボックス左上隅座標
11078 '                   W%,Z%         : 基準ボックス右下隅座標
11080 '                   XN%,YN%       : ボックス縦横個数
11082 '                   XL%,YL%       : ボックス縦横間隔(左上隅座標の間隔)
11084 '                   C%            : ボックスカーソル（ＢＣ）色
11086 '                   MSEL_MN%      : メニュー番号 (0 のとき無効)
11088 '                   MSEL_BB%      : ボックス番号ＭＩＮ
11090 '                   MSEL_BE%      : ボックス番号ＭＡＸ
11092 '                   MSEL_BN%      : ＢＣ位置 (ボックス番号)
11094 '                                   MSEL_MN%>0のときは無効
11096 '                   MSEL_BC%      : -1:ＢＣ表示済 / 0:ＢＣ未表示
11098 '                   MSEL_BD%      : ボックスの並べ方(属性の和を指定)
11100 '                   MSEL_WT%      : リピート開始までのウェイト
11102 '                   MSEL_MKM%     : 移動キー・モード
11104 '破壊変数         : なし
11106 '出力変数         : KN%           : 入力番号
11108 '                     MSEL_BB%..MSEL_BE% :左クリック/決定/直接選択
11110 '                     -1                 :右クリック/取消
11112 '                     -2                 :ボックス外を左クリック
11114 '                     -3                 :非対応キー入力
11116 '                    -13                 : ウィンドウマネージャ起動キー
11118 '                   KY%           : 入力キーのアスキーコード
11120 '                                  （入力なし:0 ）
11122 '                   K$            : 入力キー
11124 '                                  （入力なし:""）
11126 '                   MX%,MY%       : 左クリック位置(絶対座標)
11128 '                   MW%,MZ%       : 左クリック位置(相対座標)
11130 '                                   (ともにKN%=-2 の時有効)
11132 '                              ただしウィンドウ外クリックの時 MW%=-1
11134 '                   VKEY_KY%      : 仮想キーコード
11136 '                   MSEL_BN%      : 最後のＢＣ位置 (KN%<1のときも有効)
11138 '                   MSEL_BC%      : -1 （ＢＣ表示済） 
11140 '呼出しモジュール : MSEL_BCMK,MSEL_IN
11142 '
11144 GOSUB *VIL_MSEL_BCMK
11146 GOSUB *VIL_MSEL_IN
11148 RETURN
11150 '
11152 *VIL_MSEL_BCMK
11154 '　ボックス座標作成
11156 '
11158 '入力変数         : X%,Y%         : 基準ボックス左上隅座標
11160 '                   W%,Z%         : 基準ボックス右下隅座標
11162 '                   XN%,YN%       : ボックス縦横個数
11164 '                   XL%,YL%       : ボックス縦横間隔(左上隅座標の間隔)
11166 '                   MSEL_BB%      : ボックス番号ＭＩＮ
11168 '                   MSEL_BE%      : ボックス番号ＭＡＸ
11170 '                   MSEL_BD%      : ボックスの並べ方(属性の和を指定)
11172 '破壊変数         : W0%           : ボックス番号
11174 '                   W1%,W2%       : ボックス並びの方向
11176 '                   I%,J%         : ループ用
11178 '出力変数         : MSEL_X%(),MSEL_Y%() : 各ボックス左上隅座標
11180 '                   MSEL_W%(),MSEL_Z%() : 各ボックス右下隅座標
11182 '呼出しモジュール :   なし
11184 '
11186 IF VIL_MSEL_BD% AND 2 THEN VIL_W1%=-1 ELSE VIL_W1%=1
11188 IF VIL_MSEL_BD% AND 4 THEN VIL_W2%=-1 ELSE VIL_W2%=1
11190 FOR VIL_I%=1 TO VIL_YN%
11192   FOR VIL_J%=1 TO VIL_XN%
11194     IF VIL_MSEL_BD% AND 1 THEN
11196       VIL_W0%=(VIL_J%-1)*VIL_YN%+VIL_I%-1+VIL_MSEL_BB%
11198     ELSE
11200       VIL_W0%=(VIL_I%-1)*VIL_XN%+VIL_J%-1+VIL_MSEL_BB%
11202     ENDIF
11204     VIL_MSEL_X%(VIL_W0%)=VIL_X%+(VIL_J%-1)*VIL_XL%*VIL_W1%
11206     VIL_MSEL_Y%(VIL_W0%)=VIL_Y%+(VIL_I%-1)*VIL_YL%*VIL_W2%
11208     VIL_MSEL_W%(VIL_W0%)=VIL_W%+(VIL_J%-1)*VIL_XL%*VIL_W1%
11210     VIL_MSEL_Z%(VIL_W0%)=VIL_Z%+(VIL_I%-1)*VIL_YL%*VIL_W2%
11212   NEXT
11214 NEXT
11216 RETURN
11218 '
11220 *VIL_MSEL_IN
11222 '　メニュー選択入力
11224 '
11226 '入力変数         : XN%,YN%       : ボックス縦横個数
11228 '                   C%            : ボックスカーソル（ＢＣ）色
11230 '                   MSEL_MN%      : メニュー番号 (0 のとき無効)
11232 '                   MSEL_BB%      : ボックス番号ＭＩＮ
11234 '                   MSEL_BE%      : ボックス番号ＭＡＸ
11236 '                   MSEL_BN%      : ＢＣ位置 (ボックス番号)
11238 '                                   MSEL_MN%>0のときは無効
11240 '                   MSEL_BC%      : -1:ＢＣ表示済 / 0:ＢＣ未表示
11242 '                   MSEL_BD%      : ボックスの並べ方(属性の和を指定)
11244 '                   MSEL_BAM%     : ボックス整列モード
11246 '                   MSEL_WT%      : リピート開始までのウェイト
11248 '                   MSEL_MKM%     : 移動キー・モード
11250 '                   MSEL_X%(),MSEL_Y%() : 各ボックス左上隅座標
11252 '                   MSEL_W%(),MSEL_Z%() : 各ボックス右下隅座標
11254 '破壊変数         : W0%,W1%,      : カーソルキーコード
11256 '                   W2%,W3%
11258 '                   W4%           : ワーク
11260 '                   I%,J%         : ループ用
11262 '出力変数         : KN%           : 入力番号
11264 '                     MSEL_BB%..MSEL_BE% :左クリック/決定/直接選択
11266 '                     -1                 :右クリック/取消
11268 '                     -2                 :ボックス外を左クリック
11270 '                     -3                 :非対応キー入力
11272 '                    -13                 : ウィンドウマネージャ起動キー
11274 '                   KY%           : 入力キーのアスキーコード
11276 '                                  （入力なし:0 ）
11278 '                   K$            : 入力キー
11280 '                                  （入力なし:""）
11282 '                   MX%,MY%       : 左クリック位置(絶対座標)
11284 '                   MW%,MZ%       : 左クリック位置(相対座標)
11286 '                                   (ともにKN%=-2 の時有効)
11288 '                              ただしウィンドウ外クリックの時 MW%=-1
11290 '                   VKEY_KY%      : 仮想キーコード
11292 '                   MSEL_BN%      : 最後のＢＣ位置 (KN%<1のときも有効)
11294 '                   MSEL_BC%      : -1 （ＢＣ表示済） 
11296 '呼出しモジュール : MSEL_BC,VKEY_KY
11298 '
11300 'VIL_W4%=MOUSE(3,0)+MOUSE(3,1)                 'マウス先行入力除去
11302 VIL_W0%=-5:VIL_W1%=-6:VIL_W2%=-7:VIL_W3%=-8
11304 IF VIL_MSEL_BD% AND 2 THEN SWAP VIL_W0%,VIL_W1%
11306 IF VIL_MSEL_BD% AND 4 THEN SWAP VIL_W2%,VIL_W3%
11308 IF VIL_MSEL_BD% AND 1 THEN SWAP VIL_W0%,VIL_W3%:SWAP VIL_W1%,VIL_W2%:                                   SWAP VIL_XN%,VIL_YN%
11310 '
11312 'FOR VIL_I%=VIL_MSEL_BB% TO VIL_MSEL_BE%      '以下３行はデバッグ時の
11314 'LINE(VIL_MSEL_X%(VIL_I%),VIL_MSEL_Y%(VIL_I%))                                   -(VIL_MSEL_W%(VIL_I%),VIL_MSEL_Z%(VIL_I%)),PSET,VIL_I%,B
11316 'NEXT':VIL_A$=INPUT$(1)                       'ボックス位置確認用
11318 MOUSE 1,,,1                                   'マウス表示
11320 IF VIL_MSEL_MN% THEN VIL_MSEL_BN%=VIL_MSEL_BN%(VIL_MSEL_MN%) 'BN復元
11322 IF VIL_MSEL_BN%<VIL_MSEL_BB% OR VIL_MSEL_BE%<VIL_MSEL_BN%                      THEN VIL_MSEL_BN%=VIL_MSEL_BB% 'BNが範囲外なら最初のボックス番号に
11324 IF VIL_MSEL_BC%=0 THEN GOSUB *VIL_MSEL_BC     'ＢＣ未表示なら表示
11326 '
11328 *VIL_MSEL_IN_W0
11330 GOSUB *VIL_VKEY_KY
11332 '                                     マウスボタンリピート
11334 IF MOUSE(6,0) THEN VIL_MSEL_MRM%=0
11336 IF MOUSE(2,0) THEN
11338   IF VIL_MSEL_MRM%=1 THEN WAIT VIL_MSEL_WT%
11340   IF VIL_MSEL_MRM%<2 THEN VIL_MSEL_MRM%=VIL_MSEL_MRM%+1
11342 ENDIF
11344 '
11346 IF MOUSE(3,1) OR VIL_VKEY_KY%=-1 THEN         '右クリック/ 取消
11348   VIL_W4%=MOUSE(3,0)                          '左クリックをクリア
11350   VIL_KN%=-1
11352 ELSE IF MOUSE(3,0) OR MOUSE(2,0) THEN       '左クリック
11354   VIL_MX%=MOUSE(0):VIL_MY%=MOUSE(1)
11356   IF VIL_WIN_PM% THEN                         '相対座標モード
11358     VIL_KN%=-2
11360     IF  VIL_WIN_X%<=VIL_MX% AND VIL_MX%<=VIL_WIN_W%                              AND VIL_WIN_Y%<=VIL_MY% AND VIL_MY%<=VIL_WIN_Z% THEN
11362 '                                                ウィンドウ内クリック
11364       VIL_MW%=VIL_MX%-VIL_WIN_X%:VIL_MZ%=VIL_MY%-VIL_WIN_Y%'相対座標化
11366       GOSUB *VIL_MSEL_BC:GOSUB *VIL_MSEL_BCCHK:GOSUB *VIL_MSEL_BC
11368     ENDIF
11370   ELSE                                        '絶対座標モード
11372     VIL_MW%=VIL_MX%:VIL_MZ%=VIL_MY%
11374     GOSUB *VIL_MSEL_BC:GOSUB *VIL_MSEL_BCCHK:GOSUB *VIL_MSEL_BC
11376     VIL_MW%=-1
11378   ENDIF
11380 ELSE
11382   IF VIL_VKEY_KY%=-4 THEN                             '入力なし
11384     GOTO *VIL_MSEL_IN_W0
11386   ELSE IF  VIL_MSEL_BB%<=VIL_VKEY_KY%                                               AND VIL_VKEY_KY%<=VIL_MSEL_BE% THEN
11388 '                                                     番号選択キー
11390     VIL_KN%=VIL_VKEY_KY%
11392     GOSUB *VIL_MSEL_BC:VIL_MSEL_BN%=VIL_KN%:GOSUB *VIL_MSEL_BC
11394   ELSE IF VIL_VKEY_KY%=-2 THEN                        '決定キー
11396    VIL_KN%=VIL_MSEL_BN%
11398   ELSE IF VIL_VKEY_KY%=-3 OR VIL_VKEY_KY%=-13 THEN    '非対応キー                                                                 ・ＷＭ起動キー
11400     VIL_KN%=VIL_VKEY_KY%
11402   ELSE                                                '移動キー
11404     IF VIL_MSEL_MKM%=1 THEN
11406       IF VIL_VKEY_KY%=-7 OR VIL_VKEY_KY%=-8 THEN                                     VIL_KN%=VIL_VKEY_KY%:GOTO *VIL_MSEL_IN_W1
11408     ELSE IF VIL_MSEL_MKM%=2 THEN
11410       IF VIL_VKEY_KY%=-5 OR VIL_VKEY_KY%=-6 THEN                                     VIL_KN%=VIL_VKEY_KY%:GOTO *VIL_MSEL_IN_W1
11412     ENDIF
11414 '
11416     GOSUB *VIL_MSEL_BC
11418     VIL_MSEL_BN%=VIL_MSEL_BN%                                                     -(VIL_VKEY_KY%=VIL_W0%)+(VIL_VKEY_KY%=VIL_W1%)                              +((VIL_VKEY_KY%=VIL_W2%)-(VIL_VKEY_KY%=VIL_W3%))*VIL_XN%
11420     VIL_MSEL_BN%=VIL_MSEL_BN%                                                     +(VIL_VKEY_KY%=VIL_W0% AND (VIL_MSEL_BN% MOD VIL_XN%)=1)*VIL_XN%
11422     VIL_MSEL_BN%=VIL_MSEL_BN%                                                     -(VIL_VKEY_KY%=VIL_W1% AND ((VIL_MSEL_BN%+1) MOD VIL_XN%)=1)                  *VIL_XN%
11424     VIL_MSEL_BN%=VIL_MSEL_BN%-((VIL_MSEL_BN%<VIL_MSEL_BB%)                       -(VIL_MSEL_BN%>VIL_MSEL_BE%))*(VIL_MSEL_BE%-VIL_MSEL_BB%+1)
11426     GOSUB *VIL_MSEL_BC
11428     GOTO *VIL_MSEL_IN_W0
11430   ENDIF
11432 ENDIF
11434 '
11436 *VIL_MSEL_IN_W1
11438 VIL_MSEL_BN%(VIL_MSEL_MN%)=VIL_MSEL_BN%:MOUSE 1,,,0:VIL_MSEL_BC%=-1
11440 RETURN
11442 '
11444 *VIL_MSEL_BCCHK
11446 '　指定座標がボックスに含まれるかをチェック
11448 '
11450 '入力変数         : MX%,MY%       : ボックスに含まれるかを調べる座標
11452 '                   MSEL_BB%      : ボックス番号ＭＩＮ
11454 '                   MSEL_BE%      : ボックス番号ＭＡＸ
11456 '                   MSEL_BD%      : ボックスの並べ方(属性の和を指定)
11458 '                   MSEL_BAM%     : ボックス整列モード
11460 '                   MSEL_X%(),MSEL_Y%() : 各ボックス左上隅座標
11462 '                   MSEL_W%(),MSEL_Z%() : 各ボックス右下隅座標
11464 '破壊変数         : I%,J%         : ループ変数
11466 '出力変数         : KN%           : 入力番号
11468 '                     MSEL_BB%..MSEL_BE% :指定座標がボックス内
11470 '                     -2                 :指定座標がボックス外
11472 '                   MSEL_BN%      : ＢＣ位置 (ボックス番号)
11474 '                                   （指定座標がボックス内のとき）
11476 '呼出しモジュール : MSEL_BC
11478 '
11480 VIL_KN%=-2
11482 IF MSEL_BAM%=0 THEN     '縦方向整列
11484   IF (VIL_MSEL_BD% AND 1)=1 THEN
11486     FOR VIL_I%=VIL_MSEL_BB% TO VIL_MSEL_BE% STEP VIL_YN%
11488       IF  VIL_MSEL_X%(VIL_I%)=<VIL_MW%                                             AND VIL_MW%=<VIL_MSEL_W%(VIL_I%) THEN
11490         FOR VIL_J%=VIL_I% TO VIL_I%+VIL_YN%-1
11492           IF  VIL_MSEL_Y%(VIL_J%)=<VIL_MZ%                                             AND VIL_MZ%=<VIL_MSEL_Z%(VIL_J%) THEN
11494             VIL_KN%=VIL_J%:VIL_MSEL_BN%=VIL_KN%
11496             VIL_I%=VIL_MSEL_BE%:VIL_J%=VIL_I%
11498           ENDIF
11500         NEXT
11502       ENDIF
11504     NEXT
11506   ELSE
11508     FOR VIL_I%=VIL_MSEL_BB% TO VIL_MSEL_BB%+VIL_XN%-1
11510       IF  VIL_MSEL_X%(VIL_I%)=<VIL_MW%                                             AND VIL_MW%=<VIL_MSEL_W%(VIL_I%) THEN
11512         FOR VIL_J%=VIL_I% TO VIL_MSEL_BE% STEP VIL_XN%
11514           IF  VIL_MSEL_Y%(VIL_J%)=<VIL_MZ%                                             AND VIL_MZ%=<VIL_MSEL_Z%(VIL_J%) THEN
11516             VIL_KN%=VIL_J%:VIL_MSEL_BN%=VIL_KN%
11518             VIL_I%=VIL_MSEL_BE%:VIL_J%=VIL_I%
11520           ENDIF
11522         NEXT
11524       ENDIF
11526     NEXT
11528   ENDIF
11530 ELSE                    '横方向整列
11532   IF (VIL_MSEL_BD% AND 1)=1 THEN
11534     FOR VIL_I%=VIL_MSEL_BB% TO VIL_MSEL_BB%+VIL_YN%-1
11536       IF  VIL_MSEL_Y%(VIL_I%)=<VIL_MZ%                                             AND VIL_MZ%=<VIL_MSEL_Z%(VIL_I%) THEN
11538         FOR VIL_J%=VIL_I% TO VIL_MSEL_BE% STEP VIL_YN%
11540           IF  VIL_MSEL_X%(VIL_J%)=<VIL_MW%                                             AND VIL_MW%=<VIL_MSEL_W%(VIL_J%) THEN
11542             VIL_KN%=VIL_J%:VIL_MSEL_BN%=VIL_KN%
11544             VIL_I%=VIL_MSEL_BE%:VIL_J%=VIL_I%
11546           ENDIF
11548         NEXT
11550       ENDIF
11552     NEXT
11554   ELSE
11556     FOR VIL_I%=VIL_MSEL_BB% TO VIL_MSEL_BE% STEP VIL_XN%
11558       IF  VIL_MSEL_Y%(VIL_I%)=<VIL_MZ%                                             AND VIL_MZ%=<VIL_MSEL_Z%(VIL_I%) THEN
11560         FOR VIL_J%=VIL_I% TO VIL_I%+VIL_XN%-1
11562           IF  VIL_MSEL_X%(VIL_J%)=<VIL_MW%                                             AND VIL_MW%=<VIL_MSEL_W%(VIL_J%) THEN
11564             VIL_KN%=VIL_J%:VIL_MSEL_BN%=VIL_KN%
11566             VIL_I%=VIL_MSEL_BE%:VIL_J%=VIL_I%
11568           ENDIF
11570         NEXT
11572       ENDIF
11574     NEXT
11576   ENDIF
11578 ENDIF
11580 RETURN
11582 '
11584 *VIL_MSEL_CNFM
11586 '　設定メニュー選択
11588 '
11590 '入力変数         : MSEL_CX%(),   : 各行の基準ボックス左上隅座標
11592 '                   MSEL_CY%()
11594 '                   MSEL_CW%(),   : 各行の基準ボックス右下隅座標
11596 '                   MSEL_CZ%()
11598 '                   MSEL_CN%()    : 各行のボックス個数
11600 '                   MSEL_CL%()    : 各行のボックス間隔(左上隅座標間隔)
11602 '                   MSEL_CBB%()   : 各行のボックス番号ＭＩＮ
11604 '                   MSEL_CBE%()   : 各行のボックス番号ＭＡＸ
11606 '                   C%            : ボックスカーソル（ＢＣ）色
11608 '                   MSEL_CMN%     : 設定メニュー番号 (0 以外を指定)
11610 '                   MSEL_CMR%     : 設定メニュー行数
11612 '                     (MN% は CMN%～CNB%+CMR% までが使用される)
11614 '                     (MSEL_BN%(MSEL_CMN%) にはアクティブ行番号を格納)
11616 '                   MSEL_BC%      : -1:ＢＣ表示済 / 0:ＢＣ未表示
11618 '破壊変数         : MSEL_BD%      : ボックスの並べ方(0 に設定)
11620 '                   MSEL_BAM%     : ボックス整列モード(0 に設定)
11622 '                   MSEL_BN%      : ＢＣ位置 (ボックス番号)
11624 '                   MSEL_MKM%     : 移動キー・モード(0 に設定)
11626 '                   MSEL_CR%      : 現在行(0 ～ MSEL_MRN%)
11628 '                   MSEL_CRB%     : MSEL_CR%保存用
11630 '                   MSEL_MN%      : メニュー番号
11632 '                   MSEL_X%(),MSEL_Y%() : 各ボックス左上隅座標
11634 '                   MSEL_W%(),MSEL_Z%() : 各ボックス右下隅座標
11636 '出力変数         : KN%           : 入力番号
11638 '                     MSEL_BB%..MSEL_BE% :左クリック/決定/直接選択
11640 '                     -1                 :右クリック/取消
11642 '                     -2                 :ボックス外を左クリック
11644 '                     -3                 :非対応キー入力
11646 '                    -13                 : ウィンドウマネージャ起動キー
11648 '                   KY%           : 入力キーのアスキーコード
11650 '                                  （入力なし:0 ）
11652 '                   K$            : 入力キー
11654 '                                  （入力なし:""）
11656 '                   MX%,MY%       : 左クリック位置(絶対座標)
11658 '                   MW%,MZ%       : 左クリック位置(相対座標)
11660 '                                   (ともにKN%=-2 の時有効)
11662 '                              ただしウィンドウ外クリックの時 MW%=-1
11664 '                   VKEY_KY%      : 選択キーコード
11666 '                   MSEL_BC%      : -1 （ＢＣ表示済） 
11668 '呼出しモジュール : MSEL_BCMK,MSEL_LC,MSEL_IN,MSEL_BC,MSEL_BCCHK
11670 '
11672 VIL_MSEL_BD%=0:VIL_MSEL_MKM%=1
11674 '
11676 IF VIL_MSEL_BC%=0 THEN
11678   FOR VIL_MSEL_CR%=1 TO VIL_MSEL_CMR%
11680     GOSUB *VIL_MSEL_CNFM_W0           'パラメータ作成
11682     GOSUB *VIL_MSEL_BCMK
11684     VIL_MSEL_BN%=VIL_MSEL_BN%(VIL_MSEL_MN%)
11686     GOSUB *VIL_MSEL_LC
11688   NEXT
11690 ENDIF
11692 VIL_MSEL_CR%=VIL_MSEL_BN%(VIL_MSEL_CMN%)
11694 IF VIL_MSEL_CR%<1 OR VIL_MSEL_CMR%<VIL_MSEL_CR% THEN VIL_MSEL_CR%=1
11696 '
11698 'VIL_MSEL_MN%=VIL_MSEL_CMN%
11700 VIL_KN%=-6 'ループに入るためのダミー
11702 WHILE -9<VIL_KN% AND VIL_KN%<-4   ' OR -1<VIL_KN%
11704   GOSUB *VIL_MSEL_CNFM_W0
11706   GOSUB *VIL_MSEL_BCMK:VIL_MSEL_BN%=VIL_MSEL_BN%(VIL_MSEL_MN%)
11708   GOSUB *VIL_MSEL_LC
11710   VIL_MSEL_BC%=0
11712   GOSUB *VIL_MSEL_IN
11714   GOSUB *VIL_MSEL_BC:GOSUB *VIL_MSEL_LC
11716   IF VIL_KN%=-2 THEN  'アクティブ行のボックス外を左クリック
11718     VIL_MSEL_BN%(VIL_MSEL_MN%)=VIL_MSEL_BN%
11720     IF VIL_WIN_PM%=0 THEN VIL_MW%=VIL_MX%:VIL_MZ%=VIL_MY%
11722     VIL_MSEL_CRB%=VIL_MSEL_CR%
11724     FOR VIL_I%=1 TO VIL_MSEL_CMR%
11726       IF  VIL_MSEL_CY%(VIL_I%)<=VIL_MZ%                                            AND VIL_MZ%<=VIL_MSEL_CZ%(VIL_I%) THEN
11728         VIL_MSEL_CR%=VIL_I%
11730         GOSUB *VIL_MSEL_CNFM_W0
11732         GOSUB *VIL_MSEL_BCMK:GOSUB *VIL_MSEL_BCCHK
11734         IF VIL_KN%>-1 THEN  'アクティブ行を移動
11736           GOSUB *VIL_MSEL_LC
11738           VIL_MSEL_BN%=VIL_MSEL_BN%(VIL_MSEL_MN%)
11740           VIL_MSEL_BN%(VIL_MSEL_MN%)=VIL_KN%
11742           GOSUB *VIL_MSEL_LC
11744         ELSE
11746           VIL_MSEL_CR%=VIL_MSEL_CRB%
11748           VIL_KN%=-2          'ボックス外をクリックのため終了
11750         ENDIF
11752         VIL_I%=VIL_MSEL_CMR%
11754       ENDIF
11756     NEXT
11758     IF VIL_WIN_PM%=0 THEN VIL_MW%=-1
11760   ELSE
11762     VIL_MSEL_CR%=VIL_MSEL_CR%+(VIL_KN%=-7)-(VIL_KN%=-8)
11764     VIL_MSEL_CR%=VIL_MSEL_CR%                                                                +((VIL_MSEL_CR%>VIL_MSEL_CMR%)-(VIL_MSEL_CR%<1))                             *VIL_MSEL_CMR%
11766   ENDIF
11768 WEND
11770 VIL_MSEL_BN%(VIL_MSEL_CMN%)=VIL_MSEL_CR%
11772 VIL_MSEL_MKM%=0
11774 RETURN
11776 '
11778 *VIL_MSEL_CNFM_W0
11780 'MSEL_M 呼出し用にパラメータを作成
11782 '
11784 VIL_X%=VIL_MSEL_CX%(VIL_MSEL_CR%):VIL_Y%=VIL_MSEL_CY%(VIL_MSEL_CR%):         VIL_W%=VIL_MSEL_CW%(VIL_MSEL_CR%):VIL_Z%=VIL_MSEL_CZ%(VIL_MSEL_CR%)
11786 VIL_XL%=VIL_MSEL_CL%(VIL_MSEL_CR%):                                          VIL_XN%=VIL_MSEL_CN%(VIL_MSEL_CR%):VIL_YN%=1
11788 VIL_MSEL_BB%=VIL_MSEL_CBB%(VIL_MSEL_CR%):                                    VIL_MSEL_BE%=VIL_MSEL_CBE%(VIL_MSEL_CR%)
11790 VIL_MSEL_MN%=VIL_MSEL_CMN%+VIL_MSEL_CR%
11792 RETURN
11794 '
11796 *VIL_MSEL_CNFSV
11798 '　設定メニューの設定保存
11800 '
11802 '入力変数         : MSEL_CMN%     : 設定メニュー番号 (0 以外を指定)
11804 '                   MSEL_CMR%     : 設定メニュー行数
11806 '破壊変数         : I%            : ループ変数
11808 '出力変数         : MSEL_CBN%()   : MSEL_BN%()保存用
11810 '呼出しモジュール : なし
11812 '
11814 FOR VIL_I%=0 TO VIL_MSEL_CMR%:                                                 VIL_MSEL_CBN%(VIL_I%)=VIL_MSEL_BN%(VIL_MSEL_CMN%+VIL_I%):                  NEXT
11816 RETURN
11818 '
11820 *VIL_MSEL_CNFLD
11822 '　設定メニューの設定復元
11824 '
11826 '入力変数         : MSEL_CMN%     : 設定メニュー番号 (0 以外を指定)
11828 '                   MSEL_CMR%     : 設定メニュー行数
11830 '破壊変数         : I%            : ループ変数
11832 '出力変数         : MSEL_BN%()    : MSEL_CBN%()からの復元値
11834 '呼出しモジュール : なし
11836 '
11838 FOR VIL_I%=0 TO VIL_MSEL_CMR%:                                                 VIL_MSEL_BN%(VIL_MSEL_CMN%+VIL_I%)=VIL_MSEL_CBN%(VIL_I%):                  NEXT
11840 RETURN
11842 '
11844 *VIL_MSEL_BC
11846 '　ボックスカーソル表示/消去
11848 '
11850 '入力変数         : C%            : ボックスカーソル（ＢＣ）色
11852 '                 : MSEL_BCM%     : ＢＣ描画モード（0:枠/1:反転）
11854 '破壊変数         : なし
11856 '出力変数         : なし
11858 '呼出しモジュール : なし
11860 '
11862 IF VIL_MSEL_BCM% THEN 
11864   LINE(VIL_MSEL_X%(VIL_MSEL_BN%),VIL_MSEL_Y%(VIL_MSEL_BN%))                       -(VIL_MSEL_W%(VIL_MSEL_BN%),VIL_MSEL_Z%(VIL_MSEL_BN%))                       ,XOR,%VIL_C%,BF
11866 ELSE
11868   LINE(VIL_MSEL_X%(VIL_MSEL_BN%),VIL_MSEL_Y%(VIL_MSEL_BN%))                       -(VIL_MSEL_W%(VIL_MSEL_BN%),VIL_MSEL_Z%(VIL_MSEL_BN%))                       ,XOR,%VIL_C%,B
11870 ENDIF
11872 RETURN
11874 '
11876 *VIL_MSEL_LC
11878 '　ラインカーソル表示/消去
11880 '
11882 '入力変数         : C%             : ラインカーソル色
11884 '破壊変数         : なし
11886 '出力変数         : なし
11888 '呼出しモジュール : なし
11890 '
11892 LINE(VIL_MSEL_X%(VIL_MSEL_BN%),VIL_MSEL_Z%(VIL_MSEL_BN%))                       -(VIL_MSEL_W%(VIL_MSEL_BN%),VIL_MSEL_Z%(VIL_MSEL_BN%))                       ,XOR,%VIL_C%
11894 RETURN
11896 '
11898 '--------------------  入力パッケージ　--------------------
11900 '必要パッケージ : ウィンドウ、仮想キー
11902 '・指定長以内の文字列入力
11904 '
11906 *VIL_INP_INITM
11908 '　入力パッケージ初期化
11910 '
11912 '入力変数         : W0%           : ヒストリ系列数
11914 '破壊変数         : なし
11916 '出力変数         : なし
11918 '呼出しモジュール : なし
11920 '
11922 IF VIL_E%=0 THEN
11924 'パッケージ変数
11926 '   現在の文字列長、カーソル位置(全角を2字,1字)
11928   VIL_INP_L%=0:VIL_INP_CX%=0:VIL_INP_CKX%=0
11930 '   ヒストリポインタ、ヒストリ系列番号、ヒストリ系列数
11932   VIL_INP_HSP%=0:VIL_INP_HSN%=0:VIL_INP_HSMAX%=VIL_W0%
11934 '   ヒストリ系列から押し出された文字列
11936   VIL_INP_HSO$=""
11938 '   ヒストリデータ開始位置,終了位置
11940   VIL_INP_HSB%=0:VIL_INP_HSE%=0
11942 '   入力文字列変更有無フラグ
11944   VIL_INP_CF%=0
11946 '   ヒストリデータ開始位置,終了位置
11948   DIM VIL_INP_HSB%(VIL_W0%),VIL_INP_HSE%(VIL_W0%)
11950 '   ヒストリ系列過去方向・未来方向リンク（ダミー定義）
11952 '   ヒストリ文字列データ（ダミー定義）
11954   DIM VIL_INP_HSPP%(0),VIL_INP_HSNP%(0),VIL_INP_HS$(0)
11956 '
11958   MOUSE 0:MOUSE 1,320,240,0
11960 ENDIF
11962 RETURN
11964 '
11966 *VIL_INP_ENVR
11968 '　アプリ環境ファイル読み込み
11970 '
11972 '入力変数         : なし
11974 '破壊変数         : I%,J%         : ループ用
11976 '                 : W0$           : ファイル入力用
11978 '                   W0%           : ヒストリバッファサイズ
11980 '出力変数         : INP_HSB%()    : ヒストリデータ開始(最古)位置
11982 '                   INP_HSE%()    : ヒストリデータ終了(最新)位置
11984 '                   INP_HSPP%()   : ヒストリ系列過去方向リンク
11986 '                   INP_HSNP%()   : ヒストリ系列未来方向リンク
11988 '                   INP_HS$()     : ヒストリデータ
11990 '呼出しモジュール : LNR
11992 '
11994 VIL_W0$="":WHILE VIL_W0$<>"#INP":GOSUB *VIL_LNR:WEND
11996 VIL_I%=1:VIL_INP_HSE%(0)=0
11998 WHILE VIL_I%<=VIL_INP_HSMAX%      'ヒストリデータ開始位置読み込み
12000   GOSUB *VIL_LNR:
12002   VIL_INP_HSB%(VIL_I%)=VIL_INP_HSE%(VIL_I%-1)+1
12004   VIL_INP_HSE%(VIL_I%)=VIL_INP_HSB%(VIL_I%)+VAL(VIL_W0$)-1
12006   VIL_I%=VIL_I%+1
12008 WEND
12010 '   ヒストリデータ領域確保
12012 VIL_W0%=VIL_INP_HSE%(VIL_INP_HSMAX%)
12014 ERASE VIL_INP_HSPP%,VIL_INP_HSNP%,VIL_INP_HS$
12016 DIM VIL_INP_HSPP%(VIL_W0%),VIL_INP_HSNP%(VIL_W0%),VIL_INP_HS$(VIL_W0%)
12018 '
12020 VIL_I%=1
12022 WHILE VIL_I%<=VIL_INP_HSMAX%
12024   FOR VIL_J%=VIL_INP_HSB%(VIL_I%) TO VIL_INP_HSE%(VIL_I%)
12026 '       ヒストリ系列リンク接続
12028     VIL_INP_HSPP%(VIL_J%)=VIL_J%-1:VIL_INP_HSNP%(VIL_J%)=VIL_J%+1:
12030 '       ヒストリデータ読み込み
12032     GOSUB *VIL_LNR:VIL_INP_HS$(VIL_J%)=MID$(VIL_W0$,2)
12034   NEXT
12036   VIL_INP_HSPP%(VIL_INP_HSB%(VIL_I%))=0:                                       VIL_INP_HSNP%(VIL_INP_HSE%(VIL_I%))=0
12038   VIL_I%=VIL_I%+1
12040 WEND
12042 RETURN
12044 '
12046 *VIL_INP_ENVW
12048 '　アプリ環境ファイル書き込み
12050 '
12052 '入力変数         : なし
12054 '破壊変数         : I%,J%         : ループ用
12056 '                 : W0%           : 系列スキャン用
12058 '                 : W1%           : 系列個数カウント
12060 '出力変数         : なし
12062 '呼出しモジュール : なし
12064 '
12066 PRINT #1,"#INP"
12068 VIL_I%=1
12070 WHILE VIL_I%<=VIL_INP_HSMAX%    '保存個数書き込み
12072   VIL_W1%=0:VIL_W0%=VIL_INP_HSB%(VIL_I%)
12074   WHILE VIL_W0%
12076     VIL_W1%=VIL_W1%+1:VIL_W0%=VIL_INP_HSNP%(VIL_W0%)
12078   WEND
12080   PRINT #1,VIL_W1%
12082   VIL_I%=VIL_I%+1
12084 WEND
12086 '
12088 VIL_I%=1
12090 WHILE VIL_I%<=VIL_INP_HSMAX%
12092   VIL_W0%=VIL_INP_HSB%(VIL_I%)
12094   WHILE VIL_W0%
12096 '       ヒストリデータ書き込み
12098     PRINT #1,"\"+VIL_INP_HS$(VIL_W0%)
12100     VIL_W0%=VIL_INP_HSNP%(VIL_W0%)
12102   WEND
12104   VIL_I%=VIL_I%+1
12106 WEND
12108 RETURN
12110 '
12112 *VIL_INP_STR
12114 '　文字列入力
12116 '
12118 '入力変数         : X%,Y%         : 入力行左上隅座標
12120 '                   L%            : 入力文字列最大長
12122 '                   A$            : 入力文字列初期値
12124 '                                   （なければ空文字列）
12126 '                   C%            : 入力文字・カーソル色
12128 '                   CB%           : 背景色
12130 '                   INP_HSN%      : ヒストリ系列番号
12132 '                                 　（0:ヒストリを使用しない）
12134 '破壊変数         : W0%           : カーソルサイズ,カーソル位置保存
12136 '出力変数         : KN%           :  0:決定入力
12138 '                                   -1:取消入力
12140 '                                   -2:左クリック
12142 '                                  -13:ウィンドウマネージャ起動キー
12144 '                   K$            : 最後の入力キー
12146 '                   KY%           : 最後の入力キーのアスキーコード
12148 '                   A$            : 入力文字列(KN%=-1 の時は無効)
12150 '                   MX%,MY%       : 左クリック位置(絶対座標)
12152 '                   MW%,MZ%       : 左クリック位置(相対座標)
12154 '                                   (ともにKN%=-2 の時有効)
12156 '                              ただしウィンドウ外クリックの時 MW%=-1
12158 '                   INP_L%        : 現在の文字列長
12160 '                   INP_CX%       : カーソル位置(全角は2字)
12162 '                   INP_KCX%      : カーソル位置(全角は1字)
12164 '                   INP_HSO$=""   : 系列から押し出された文字列
12166 '呼出しモジュール : INP_GPRINT,VKEY_KY
12168 ' 
12170 VIL_INP_L%=LEN(VIL_A$)
12172 VIL_INP_CX%=VIL_INP_L%:VIL_INP_CKX%=KLEN(VIL_A$,0)
12174 IF VIL_INP_HSN% THEN VIL_INP_HSP%=0:VIL_INP_CF%=0:VIL_INP_HSS$="":                                VIL_INP_HSB%=VIL_INP_HSB%(VIL_INP_HSN%):                                     VIL_INP_HSE%=VIL_INP_HSE%(VIL_INP_HSN%)
12176 MOUSE 1,,,1
12178 '
12180 VIL_KN%=1:GOSUB *VIL_INP_GPRINT:GOSUB *VIL_INP_STR_W0
12182 '
12184 WHILE VIL_KN%>0
12186 '
12188 '  PRINT VIL_INP_CX%;VIL_INP_CKX%;KLEN(VIL_A$);VIL_INP_L%;"/";VIL_L%
12190   GOSUB *VIL_VKEY_KY
12192 '         全角文字入力    **** 全角入力にはエラーを返すモード検討
12194   IF 128<=VIL_KY% AND VIL_KY%<=159                                               THEN VIL_W0$=VIL_K$:GOSUB *VIL_VKEY_KY:VIL_K$=VIL_W0$+VIL_K$
12196 '
12198   IF MOUSE(3,1) OR VIL_VKEY_KY%=-1 THEN             '右クリック/取消
12200     VIL_KN%=-1
12202   ELSE IF MOUSE(3,0) OR MOUSE(2,0) THEN             '左クリック
12204     VIL_MX%=MOUSE(0):VIL_MY%=MOUSE(1)
12206     IF VIL_WIN_PM% THEN
12208       IF VIL_WIN_PM% AND VIL_WIN_X%<=VIL_MX% AND VIL_MX%<=VIL_WIN_W%                              AND VIL_WIN_Y%<=VIL_MY% AND VIL_MY%<=VIL_WIN_Z%               THEN   '相対座標化
12210         VIL_MW%=VIL_MX%-VIL_WIN_X%:VIL_MZ%=VIL_MY%-VIL_WIN_Y%
12212       ELSE
12214         VIL_MW%=-1
12216       ENDIF
12218     ENDIF
12220     VIL_KN%=-2
12222   ELSE IF VIL_VKEY_KY%=-4 THEN             'ヌル入力
12224     VIL_KN%=1     'ループから抜けないためのダミー
12226   ELSE IF VIL_VKEY_KY%=-2 THEN             '決定キー
12228     IF VIL_INP_HSN% AND VIL_A$<>"" THEN
12230       GOSUB *VIL_INP_HSSA
12232 'PRINT "HSP:";VIL_INP_HSP%;VIL_INP_HSB%;VIL_INP_HSE%
12234 '           新規エントリ/押し出される内容を系列末に移動
12236       IF VIL_INP_HSP%=0 OR VIL_INP_HSP%=VIL_INP_HSB% THEN
12238         VIL_INP_HSO$=VIL_INP_HS$(VIL_INP_HSB%)
12240         VIL_INP_HS$(VIL_INP_HSB%)=VIL_A$
12242         VIL_INP_HSNP%(VIL_INP_HSE%)=VIL_INP_HSB%
12244         VIL_INP_HSPP%(VIL_INP_HSB%)=VIL_INP_HSE%
12246         VIL_INP_HSB%=VIL_INP_HSNP%(VIL_INP_HSB%)
12248         VIL_INP_HSE%=VIL_INP_HSNP%(VIL_INP_HSE%)
12250         VIL_INP_HSPP%(VIL_INP_HSB%)=0
12252         VIL_INP_HSNP%(VIL_INP_HSE%)=0
12254       ELSE IF VIL_INP_HSP%<>VIL_INP_HSE% THEN'前回と同入力なら変化なし
12256         VIL_INP_HSPP%(VIL_INP_HSNP%(VIL_INP_HSP%))                                     =VIL_INP_HSPP%(VIL_INP_HSP%)
12258         VIL_INP_HSNP%(VIL_INP_HSPP%(VIL_INP_HSP%))                                     =VIL_INP_HSNP%(VIL_INP_HSP%)
12260         VIL_INP_HSNP%(VIL_INP_HSE%)=VIL_INP_HSP%
12262         VIL_INP_HSPP%(VIL_INP_HSP%)=VIL_INP_HSE%
12264         VIL_INP_HSNP%(VIL_INP_HSP%)=0
12266         VIL_INP_HSE%=VIL_INP_HSP%
12268       ENDIF
12270     ENDIF
12272     VIL_KN%=0
12274   ELSE IF VIL_VKEY_KY%=-13 THEN            'ウィンドウマネージャキー
12276     VIL_KN%=-13
12278   ELSE
12280     GOSUB *VIL_INP_STR_W0
12282     IF VIL_KY%>=32 AND VIL_KY%<>127 THEN '表示可能文字
12284       VIL_W0%=KTYPE(VIL_K$,1)+1
12286       IF VIL_INP_L%+VIL_W0%<=VIL_L% THEN
12288         VIL_A$=LEFT$(VIL_A$,VIL_INP_CX%)+VIL_K$                                            +MID$(VIL_A$,VIL_INP_CX%+1)
12290         VIL_INP_L%=VIL_INP_L%+VIL_W0%
12292         IF VIL_INP_L%<VIL_L% THEN
12294           VIL_INP_CKX%=VIL_INP_CKX%+1:VIL_INP_CX%=VIL_INP_CX%+VIL_W0%
12296         ENDIF
12298       GOSUB *VIL_INP_GPRINT
12300       VIL_INP_CF%=-1
12302       ENDIF
12304     ELSE IF VIL_VKEY_KY%=-7 OR VIL_VKEY_KY%=-8 THEN           '↑↓
12306       IF VIL_INP_HSN% THEN
12308         GOSUB *VIL_INP_HSSP
12310         VIL_INP_L%=LEN(VIL_A$):                                                      VIL_INP_CX%=VIL_INP_L%:VIL_INP_CKX%=KLEN(VIL_A$,0):                          VIL_INP_CF%=0
12312         GOSUB *VIL_INP_GPRINT
12314       ENDIF
12316     ELSE IF VIL_VKEY_KY%=-5 THEN                              '→
12318       IF VIL_INP_CX%<VIL_INP_L% THEN
12320         VIL_INP_CKX%=VIL_INP_CKX%+1:VIL_W0%=VIL_INP_CX%
12322         IF VIL_INP_CKX%<KLEN(VIL_A$)+1                                                 THEN VIL_INP_CX%=VIL_INP_CX%+1+KTYPE(VIL_A$,VIL_INP_CKX%)                    ELSE VIL_INP_CX%=VIL_INP_CX%+1
12324         IF VIL_INP_CX%=VIL_L%                                                          THEN VIL_INP_CX%=VIL_W0%:VIL_INP_CKX%=VIL_INP_CKX%-1
12326       ENDIF
12328     ELSE IF VIL_VKEY_KY%=-6 THEN                              '←
12330       IF VIL_INP_CX%>0 THEN
12332         VIL_INP_CKX%=VIL_INP_CKX%-1
12334         VIL_INP_CX%=VIL_INP_CX%-1-KTYPE(VIL_A$,VIL_INP_CKX%+1)
12336       ENDIF
12338     ELSE IF VIL_VKEY_KY%=-15 AND VIL_INP_CX%>0 THEN           'ＢＳ
12340       VIL_INP_CKX%=VIL_INP_CKX%-1
12342       VIL_W0%=KTYPE(VIL_A$,VIL_INP_CKX%+1)+1
12344       VIL_INP_L%=VIL_INP_L%-VIL_W0%:VIL_INP_CX%=VIL_INP_CX%-VIL_W0%
12346       VIL_A$=KLEFT$(VIL_A$,VIL_INP_CKX%)+KMID$(VIL_A$,VIL_INP_CKX%+2)
12348       GOSUB *VIL_INP_GPRINT
12350       VIL_INP_CF%=-1
12352     ELSE IF VIL_VKEY_KY%=-16 AND VIL_INP_CX%<VIL_INP_L% THEN  '削除
12354       VIL_INP_L%=VIL_INP_L%-KTYPE(VIL_A$,VIL_INP_CKX%+1)-1
12356       VIL_A$=KLEFT$(VIL_A$,VIL_INP_CKX%)+KMID$(VIL_A$,VIL_INP_CKX%+2)
12358       GOSUB *VIL_INP_GPRINT
12360       VIL_INP_CF%=-1
12362     ELSE IF VIL_VKEY_KY%=-17 THEN                             'クリア
12364       VIL_A$="":VIL_INP_L%=0:VIL_INP_CX%=0:VIL_INP_CKX%=0
12366       GOSUB *VIL_INP_GPRINT
12368       VIL_INP_CF%=-1
12370     ENDIF
12372     GOSUB *VIL_INP_STR_W0:VIL_KN%=1
12374   ENDIF
12376 WEND
12378 MOUSE 1,,,0
12380 IF VIL_INP_HSN% THEN VIL_INP_HSB%(VIL_INP_HSN%)=VIL_INP_HSB%:                                     VIL_INP_HSE%(VIL_INP_HSN%)=VIL_INP_HSE%
12382 GOSUB *VIL_INP_STR_W0
12384 RETURN
12386 '
12388 'CURSOR
12390 *VIL_INP_STR_W0
12392 VIL_W0%=7
12394 IF VIL_INP_CX%<VIL_INP_L% THEN IF KTYPE(VIL_A$,VIL_INP_CKX%+1)                                                THEN VIL_W0%=15
12396 LINE(VIL_X%+VIL_INP_CX%*8        ,VIL_Y%+17)                                    -(VIL_X%+VIL_INP_CX%*8+VIL_W0%,VIL_Y%+17),XOR,%VIL_C%
12398 RETURN
12400 '
12402 *VIL_INP_HSSA
12404 '　ヒストリ全検索(完全一致照合)
12406 '入力変数         : A$            : 検索文字列
12408 '                   INP_HSN%      : ヒストリ系列番号（1以上）
12410 '破壊変数         : なし
12412 '出力変数         : INP_HSP       : A$を発見したとき:
12414 '                                       そのデータへのヒストリポインタ
12416 '                                   発見しなかったとき
12418 '                                       0
12420 '呼出しモジュール : なし
12422 '
12424 VIL_INP_HSP%=VIL_INP_HSE%(VIL_INP_HSN%)
12426 WHILE VIL_INP_HSP% AND VIL_INP_HS$(VIL_INP_HSP%)<>VIL_A$
12428   VIL_INP_HSP%=VIL_INP_HSPP%(VIL_INP_HSP%)
12430 WEND
12432 RETURN
12434 '
12436 *VIL_INP_HSSP
12438 '　ヒストリ検索(開始部分文字列一致照合)
12440 '
12442 '入力変数         : A$            : 入力文字列
12444 '                   VKEY_KY       : -7:過去方向検索
12446 '                                   -8:未来方向検索
12448 '                   INP_CF%       : 入力文字列変更有無フラグ
12450 '                   INP_HSN%      : ヒストリ系列番号（1以上）
12452 '                   INP_HSP%      : 現在のヒストリポインタ
12454 '破壊変数         : W0%           : 検索文字列長
12456 '出力変数         : 入力A$で始まる文字列を発見したとき
12458 '                   (発見しなかったときは変化なし)
12460 '                     A$          : 検索結果
12462 '                     INP_HSP     : そのデータへのヒストリポインタ
12464 '                     INP_HSS$    : 検索文字列
12466 '呼出しモジュール : なし
12468 ' 
12470 IF VIL_INP_CF% THEN VIL_INP_HSS$=VIL_A$:VIL_INP_HSP%=0
12472 IF VIL_INP_HSP%=0 THEN
12474   IF VIL_VKEY_KY%=-7 THEN VIL_INP_HSP%=VIL_INP_HSE%                                               ELSE VIL_INP_HSP%=VIL_INP_HSB%
12476 ELSE
12478   IF VIL_VKEY_KY%=-7 THEN VIL_INP_HSP%=VIL_INP_HSPP%(VIL_INP_HSP%)                                ELSE VIL_INP_HSP%=VIL_INP_HSNP%(VIL_INP_HSP%)
12480 ENDIF
12482 VIL_W0%=LEN(VIL_INP_HSS$)
12484 'PRINT VIL_INP_HSP%;VIL_W0%
12486 WHILE VIL_INP_HSP%                                                             AND (   LEFT$(VIL_INP_HS$(VIL_INP_HSP%),VIL_W0%)<>VIL_INP_HSS$                    OR VIL_INP_HS$(VIL_INP_HSP%)="")
12488   IF VIL_VKEY_KY%=-7 THEN VIL_INP_HSP%=VIL_INP_HSPP%(VIL_INP_HSP%)                                ELSE VIL_INP_HSP%=VIL_INP_HSNP%(VIL_INP_HSP%)
12490 WEND
12492 IF VIL_INP_HSP% THEN VIL_A$=VIL_INP_HS$(VIL_INP_HSP%)                                        ELSE VIL_A$=VIL_INP_HSS$
12494 'PRINT VIL_INP_HSP%;"|";VIL_A$;"|";VIL_INP_HSS$"|"
12496 RETURN
12498 '
12500 *VIL_INP_GPRINT
12502 '　文字列表示(グラフィック座標指定)
12504 '
12506 '入力変数         : X%,Y%         : 表示位置
12508 '                   A$            : 表示文字列
12510 '                   L%            : 文字列長
12512 '                   C%            : 文字列表示色
12514 '                   CB%           : 背景色
12516 '破壊変数         : なし
12518 '出力変数         : なし
12520 '呼出しモジュール : なし
12522 '
12524 LINE(VIL_X%,VIL_Y%)-(VIL_X%+VIL_L%*8-1,VIL_Y%+15),PSET,%VIL_CB%,BF
12526 SYMBOL(VIL_X%,VIL_Y%),VIL_A$,1,1,%VIL_C%
12528 RETURN
12530 '
12532 *VIL_INP_FEPON
12534 '　システム行表示
12536 '
12538 '入力変数         : なし
12540 '破壊変数         : W0%           : 座標モード一時保存
12542 '出力変数         : なし
12544 '呼出しモジュール : WIN_PMA,WIN_PMR
12546 '
12548 CONSOLE 0,24,2
12550 VIL_W0%=VIL_WIN_PM%:GOSUB *VIL_WIN_PMA
12552 VIL_E%=0
12554 GET@A(0,464)-(639,479),VIL_WIN_BF%,VIL_WIN_BFO&(VIL_WIN_AN%)
12556 IF VIL_E%=0 THEN LINE(0,464)-(639,479),PSET,0,BF
12558 IF VIL_W0% THEN GOSUB *VIL_WIN_PMR
12560 RETURN
12562 '
12564 *VIL_INP_FEPOFF
12566 '　システム行非表示
12568 '
12570 '入力変数         : なし
12572 '破壊変数         : W0%           : 座標モード一時保存
12574 '出力変数         : なし
12576 '呼出しモジュール : WIN_PMA,WIN_PMR
12578 '
12580 CONSOLE 0,25,0
12582 VIL_W0%=VIL_WIN_PM%:GOSUB *VIL_WIN_PMA
12584 PUT@A(0,464)-(639,479),VIL_WIN_BF%,PSET,,,,VIL_WIN_BFO&(VIL_WIN_AN%)
12586 IF VIL_W0% THEN GOSUB *VIL_WIN_PMR
12588 RETURN
12590 '
12592 *VIL_INP_MVWAIT
12594 '　マウス移動/クリック/キー/パッド入力待ち
12596 '
12598 '入力変数         : なし
12600 '破壊変数         : W0%,W0$       : 先行入力無効化用
12602 '出力変数         : なし
12604 '呼出しモジュール : なし
12606 '
12608 VIL_W0%=MOUSE(9)+MOUSE(10):VIL_W0$=INKEY$
12610 WHILE ABS(MOUSE(9))<10 AND ABS(MOUSE(10))<10                                   AND MOUSE(3,0)+MOUSE(3,1)=0 AND INKEY$="" AND PAD(1)+PTRIG(1)=0:WEND
12612 RETURN
12614 '
12616 '--------------------  マルチグラフィックス・パッケージ　-----------
12618 '必要パッケージ : なし
12620 '・ＭＧ（Multi Graphics）形式画像データの表示
12622 '   ・オンメモリ画像データの瞬間表示
12624 '   ・複数パレットテーブルの管理・切替
12626 '
12628 *VIL_MG_INITM
12630 '　マルチグラフィックス・パッケージ初期化
12632 '
12634 '入力変数         : W0&           : MGDバッファ要素数
12636 '                   W1%           : MGIバッファ要素数
12638 '                   W2&           : MPDバッファ要素数
12640 '                   W3%           : MPIバッファ要素数
12642 '出力変数         : なし
12644 '呼出しモジュール : なし
12646 IF VIL_E%=0 THEN
12648 'パッケージ変数
12650 '   画像表示座標、画像データ番号、パレットデータ番号
12652   VIL_MG_X%=0:VIL_MG_Y%=0:VIL_MG_GN%=0:VIL_MG_PN%=0
12654 '   ＭＧ形式データファイル名
12656 '   VIL_MG_F$=""
12658 '画像データバッファ、画像データインデックス
12660 'パレットデータバッファ、パレットデータインデックス
12662   DIM VIL_MG_MGD%(VIL_W0&),VIL_MG_MGI&(VIL_W1%),                                   VIL_MG_MPD%(VIL_W2&),VIL_MG_MPI&(VIL_W3%)
12664 '   CNF読み込み
12666   VIL_W0$="":WHILE VIL_W0$<>"#MG":GOSUB *VIL_LNR:WEND
12668 ENDIF
12670 RETURN
12672 *VIL_MG_ENVR
12674 '　アプリ環境ファイル読み込み
12676 '
12678 '入力変数         : なし
12680 '破壊変数         : なし
12682 '出力変数         : なし
12684 '呼出しモジュール : LNR
12686 '
12688 VIL_W0$="":WHILE VIL_W0$<>"#MG":GOSUB *VIL_LNR:WEND
12690 RETURN
12692 '
12694 *VIL_MG_ENVW
12696 '　アプリ環境ファイル書き込み
12698 '
12700 '入力変数         : なし
12702 '破壊変数         : なし
12704 '出力変数         : なし
12706 '呼出しモジュール : なし
12708 '
12710 PRINT #1,"#MG"
12712 RETURN
12714 '
12716 *VIL_MG_LD
12718 '　ＭＧ形式ファイル読み込み
12720 '
12722 '入力変数         : MG_F$         : ＭＧ形式ファイル名
12724 '破壊変数         : I%            : ループ用
12726 '出力変数         : なし
12728 '呼出しモジュール : なし
12730 '
12732 LOAD@ VIL_MG_F$+".MGD",VIL_MG_MGD%
12734 LOAD@ VIL_MG_F$+".MGI",VIL_MG_MGI&
12736 LOAD@ VIL_MG_F$+".MPD",VIL_MG_MPD%
12738 LOAD@ VIL_MG_F$+".MPI",VIL_MG_MPI&
12740 RETURN
12742 '
12744 *VIL_MG_SETP
12746 '　パレットデータ設定
12748 '
12750 '入力変数         : MG_PN%        : パレットデータ番号
12752 '破壊変数         : I%            : ループ用
12754 '出力変数         : なし
12756 '呼出しモジュール : なし
12758 '
12760 FOR VIL_I%=0 TO 15
12762   PALETTE VIL_I%,[(VIL_MG_MPD%(VIL_MG_MPI&(VIL_MG_PN%)+VIL_I%) AND &HF0)          ,(VIL_MG_MPD%(VIL_MG_MPI&(VIL_MG_PN%)+VIL_I%) AND &HF00)/&H10,                 (VIL_MG_MPD%(VIL_MG_MPI&(VIL_MG_PN%)+VIL_I%) AND &HF)*&H10]
12764 NEXT
12766 RETURN
12768 '
12770 *VIL_MG_PUTG
12772 '　画像データ表示
12774 '
12776 '入力変数         : MG_GN%        : 画像データ番号
12778 '                 : MG_X%,MG_Y%   : 表示座標
12780 '出力変数         : なし
12782 '呼出しモジュール : なし
12784 '
12786 PUT@A(VIL_MG_X%,VIL_MG_Y%)-(VIL_MG_X%+VIL_MG_MGD%(VIL_MG_MGI&(VIL_MG_GN%)+2),                                                    VIL_MG_Y%+VIL_MG_MGD%(VIL_MG_MGI&(VIL_MG_GN%)+3)),VIL_MG_MGD%,,,,,VIL_MG_MGI&(VIL_MG_GN%)+4
12788 RETURN
12790 '
12792 'SCALE--------2---------3---------4---------5---------6---------7-----*--*8
