Gigamix DM-SYSTEM2

デバイス入力機能

updated:

第1章 概要

1.1 デバイス入力機能とは

 ユーザーがパソコンへ指示を与えるための周辺機器には、キーボードやマウス、ジョイスティックなどがありますが、DMシステム2では、これらを総称して「デバイス」と呼んでいます。

 従来のプログラミングでは、マウスにはマウスの、ジョイスティックにはジョイスティックのと、異なるデバイスに対してそれぞれのルーチンを用意する必要がありましたが、DMシステム2ではこれらのデバイスをひとつの命令群で一括管理できます。

 これにより、マウスがなくてもジョイスティックで、ジョイスティックがなくてもキーボードで、といった具合に、いかなる環境においても同一のルーチンでひとつのアプリケーションを操作することが可能となります。

1.2 デバイス入力機能を使用するメリット

 MSX BASICは様々な入力機器に対応しているのですが、機器によって入力の検出方法や結果がバラバラです。2つのデバイス、あるいはキーボードとデバイスの両方の入力を同時に検出するのは非常に面倒です。

 例えばジョイスティックではSTICK関数とSTRIG関数、マウスではPAD関数という風に入力機器に対応するBASICの命令も違いますし、値の意味も違います。また、マウスが接続されているポートに向かってジョイパッドのSTICK関数を実行すると、無意味な値が返ってきます。

 そこで、DMシステム2では、デバイスの入力と検出方法を一本化しました。たった1回の命令でキーボード、ポート1、ポート2の入力状態をすべてチェックできますので、プログラムが簡潔になり便利です。

 また、マウス操作などのプログラムではたった1つの命令を実行するだけでカーソルを自由自在に動かすことができ、しかもボタンをクリックするまでBASICに帰って来ませんので、プログラマの負担がたいへん軽くなります。

次のリストは、110行はモードの設定、130行はプログラムの終了を行ってるだけですから、実際にマウスの移動とクリックの判定をしているのは120行だけです。しかも、この1命令だけでマウスカーソル用のスプライトまで表示しているのです。

100 SCREEN 5,0:SPRITE$(0)=STRING$(255,8)
110 _DMMINI(0,0)
120 _DMM(A),S
130 END

第2章 DMシステム2からの使用方法

 デバイスドライバにデフォルト設定の「マウス+ジョイスティック」以外を使用している場合でも、プログラムの記述はすべてのドライバにおいて共通します。

2.1 デバイス入力の初期化

 カーソルキーやジョイスティック、マウス等のデバイス入力をどのように処理をするかを宣言します。

CALL DMMINI(<入力モード>)
図7.1 CALL DMMINIの設定
スティック入力の処理(bit0)
0:座標(マウス的)  マウスカーソル座標を更新させ、トリガ入力があるまで処理を続行します。カーソルキーまたはジョイパッドでは1/60秒ごとに1pxずつ移動します。
1:戻り値(スティック的)  MSX BASICのSTICK関数と同等の数値またはトリガ入力を変数に返してデバイス入力を終了します。マウスが接続されている場合は移動方向の戻り値(1~8)を取得することはできません。
画面の終点 (bit1)
0:ループ  カーソルが画面端を超えた場合、線対称な位置に移動します。
1:画面端  カーソルが画面端を超えた場合、画面端まで戻ります。
縦方向のループ範囲 (bit2)
0:192/212(px)  現在の画面モードの有効範囲に合わせます。
1:256(px)  スプライトの表示できる最大値に合わせます。

ex.)
CALL DMMINI(&B00000010) ← 座標更新&非ループで入力
CALL DMMINI(2) ← 座標更新&非ループで入力 (同上)
CALL DMMINI(3) ← 戻り値&非ループで入力

2.2 マウスカーソルの表示を含めた宣言

CALL DMMINI(<入力モード>,<スプライト番号>)

 ここで指定したスプライトは“CALL DMM”(後述)実行中にマウスカーソルとして表示します。スプライトは指定した番号とその次の番号の“2枚重ね”で表示します。

ex.)
CALL DMMINI(2,4) ← 座標更新&非ループで、スプライト#4をマウスカーソルに指定

デバイス入力の開始

 CALL DMMINIで指定したモードで、デバイス入力を待ちます。

CALL DMM(<変数>)

 DMシステム2のデバイス入力機能では、以下のような戻り値を返します。

CALL DMMのキー入力値
数値 意味
1~8 移動方向(STICK関数と同値)
9 キー1(SPACEキー、ジョイパッドまたはマウスのトリガA)
10 キー2(GRAPHキー、ジョイパッドまたはマウスのトリガB)
11 キー3(STOPキー)
12 キー4(TABキー)
13 キー5(ESCキー)
14 キー6(HOMEキー、TOWNSパッドのRUNボタン)
15 キー7(SELECTキー、TOWNSパッドのSELECTボタン)
0 なし
FMT-PD102
富士通 FM TOWNS パッドによるトリガ入力の戻り値

※_DMMINIで座標更新モードが宣言されている場合は、カーソルキーおよびジョイパッド十字キーによる移動方向の戻り値(1~8)を取得することはできません。

 この命令は、スペースキーやトリガA等、何か入力されるまでBASICへ戻れません。Ctrl+STOPでの中断はできます。何か入力されると、入力結果を変数に返しBASICへ戻ります。

ex.) _DMM(A)   ← デバイス入力開始、結果を変数Aに代入

スプライト付き・デバイス入力

 “CALL DMMINI”で指定したスプライトをマウスカーソルとして常に表示し、移動させながら、デバイス入力を待ちます。

CALL DMM(<変数>),S

 “CALL DMM”が実行されている間、入力に応じてスプライトが移動します。変数に値が代入された瞬間(=トリガが押された瞬間)、スプライトの移動は終了し、BASICへ戻ります。

ex.) _DMM(A),S ← スプライト移動を有効にして入力開始、結果を変数Aに代入

※SCREEN0ではスプライト機能がない為、実行できません。

 トリガが押された瞬間の使用ポートや座標等の詳細情報を得るには、インフォメーションエリアを参照してください。

4300hからのオフセットラベル名意味BASICコード
+65DMMDEV入力のあったポート番号_PEEK(&H4300+65, <変数>)
+66DMMXスプライト座標X_PEEK(&H4300+66, <変数>)
+67DMMYスプライト座標Y_PEEK(&H4300+67, <変数>)
などなど…

制限時間付き・デバイス入力

 デバイス入力が行われなくても、制限時間になるとBASICへ復帰します。制限時間を作ることで、キー入力を兼ねた時間待ちとして利用できる便利な機能です。

CALL DMM(<変数>,<制限時間>)[,S]

 時間は1/60秒単位で設定し、制限時間内に入力が行われなかった場合、戻り値は0になります。

ex.)
_DMM(A,120)   ← 2秒間(120/60秒)だけデバイス入力
_DMM(A,120),S ← さらにスプライトを動かしつつ入力

2.2 キーカスタマイズと倍速移動

マウスカーソル倍速移動

 ジョイスティックやカーソルキーでもマウス同様、マウスカーソルを動かすことができますが、1/60秒につき1ドットしか移動できないため、速度にやや難点があります。

 そこで、マウスカーソルの移動を快適に行う為、「倍速キー」を用意しました。倍速キーを押しながらカーソルを移動させると、2倍速になります。

 倍速キーは、デフォルト設定ではSHIFTキーに割り当てられています。倍速キーは後述のキーカスタマイズでキーを変更できます。

また、主にジョイスティックの場合は、次の3種類の倍速方法が用意されています。

  • 方向キーのダブルクリック(デフォルト)
  • 同一方向を一定時間押し続ける
  • トリガBを押している間

 インフォメーションエリアの“ACCEL(4300h+90)”に1バイトの数値を代入します。

マウスカーソル倍速の設定値
数値 意味
0 倍速なし
1~127 ダブルクリック(数値は有効時間)
128~254 押しっぱなし(-128した数値が有効時間)
255 トリガBのクリック
ex.)
_POKE(&H4300+90,4)     ← 4/60秒の間にダブルクリックすると倍速
_POKE(&H4300+90,128+4) ← 4/60秒押し続けると倍速
_POKE(&H4300+90,255)   ← トリガBを押していると倍速

キーカスタマイズ

 DMシステム2では、キーボードからの入力に対してのみ、返り値に対応するキーを初期設定と異なった仕様に変更することができます。

 DMシステム2のインフォメーションエリアに“DMMKEY(4300h+74)”が存在します。トリガ番号9~15の計8つのキーの割り当てはこのカスタマイズテーブルで決められており、ここを変更すると入力キーを独自で割り当てることができます。

 カスタマイズテーブルはDMMKEY+0をオフセットとして「マトリクス行」「ビット」の2バイトで1セット、それが8つ並んでいます。ここにMSXシステムの「キーマトリクス」に準じた2バイトのデータを代入します。

マウスカーソル倍速の設定値
+0 マトリクス行(0~10)
+1 ビット(0~7)

※マトリクスの8行目を超える特殊なキー(テンキーや松下の実行・取消キー等)も割り当てることができます。

※キーマトリクスは「MSX2テクニカル・ハンドブック(アスキー)」等を参照してください。

 「DMシステム2 ユーティリティディスク」をお使いの方は、”DS2.INI”に以下のような項目を追加すると、キー入力を独自で割り当てた状態で他のソフト起動できます。デフォルトの仕様が気に入らなかったり、一部のキーが壊れてて操作できない時などにご利用ください。

---------------------------------------------
[Keyboard]
Trig09=&H80	;キー1:決定/SPACE
Trig10=&H62	;キー2:キャンセル/GRAPH
Trig11=&H74	;キー3:ポーズ/STOP
Trig12=&H73	;キー4:デバイス再チェック/TAB
Trig13=&H72	;キー5:終了/ESC
Trig14=&H81	;キー6:HOME
Trig15=&H76	;キー7:SELECT
Trig16=&H60	;高速化キー:SHIFT
---------------------------------------------

 まず”[Keyboard]”という行を作ります(Keyboardセクション)。これが無いとカスタマイズできません。

 次に”Trig**=n”という書式で書いてゆきます。”**”は09~16で、CALL DMMでの戻り値となります(Trig16はキーボードの「倍速キー」なので戻り値にはなりません)。”n”にはMSXシステムの「キーマトリクス」に準じた1バイト(0~255)のデータを入れます。Trig09=&H80というのは「キーマトリクス8行目の0ビットなら戻り値9」という意味です。16進数で書くと分かりやすいのでオススメですが、"&H"を先頭に付けてください。なお、Trig00~08は固定値ですので、変更はできません。

ex.) Trig09=&HB1 ← 実行キー(11行目の1ビット)

※ キーカスタマイズしても、その後起動するソフトで独自にキーを変更する場合があります。

2.3 ちょっとマニアックな活用方法

 ここでは、更に突っ込んだデバイス入力システムの活用法についてご紹介します。

バックグラウンド処理

 DMシステム2のバックグラウンド処理にデバイス入力を追加します。

CALL DMMON

 この命令による効果は以下の2点です。

 まず、“CALL DMMON”以後デバイス入力は1/60秒単位でバックグラウンド処理されます。バックグラウンド処理されたデバイス入力機能は、デバイス入力情報を毎秒60回インフォメーションエリアに書き出します。

“CALL DMMON"は入力結果の書き出しを指示するだけですので、実際は“CALL DMM”を利用したり、インフォメーションエリアを参照するなどしなければ、入力結果は得られません。

ON STRIG GOSUB命令との連動

 DMシステム2には、デバイス入力のバックグラウンド処理機能を、BASICから手軽に利用する方法として、“ON STRIG GOSUB”によるトリガの検知があります。通常、MSX BASICでは、ポートからのトリガ入力に対しては、それぞれ“STRIG(1)ON”、“STRIG(2)ON”・・・といった具合に、それぞれのトリガに対していちいち宣言する必要がありますが、“CALL DMMON”を実行した場合、

ON STRIG GOSUB XXX:STRIG(0)ON

を一度宣言するだけで、すべてのトリガ入力に対して有効となります。

 BASICの“ON STRIG GOSUB”割り込みは、BASICの1命令を実行し終えるごとにトリガ入力を検知します。ですが、その1命令がとても時間のかかる処理だったりすると、どうでしょう。その命令を終了するまではトリガ入力ができないことになりますし、“A=USR(0)”などマシン語ルーチン実行中では、そのマシン語からBASICに戻らない限りトリガ入力が一切検知できないことになります。

 DMシステム2の“CALL DMMON”による割り込み処理は、BASIC内の内部処理や“A=USR(0)"などのマシン語ルーチン実行内でも有効です。そして、BASIC復帰後、速やかに“ON STRIG GOSUB”割り込みを検知できるよう、MSXのシステムワークに情報を書き残します。

 この連動に、VDPマクロを合わせることができます。詳しくは「ON STRIG GOSUB命令と併用する」をご覧下さい。

バックグラウンド処理の終了

 デバイス入力のバックグラウンド処理を終了します。

CALL DMMOFF

“CALL DMMON”を実行したら、必ずこの命令でデバイス入力を終了してください。“CALL SYSON”を実行した場合も、バックグラウンド処理は終了します。

トリガの同時押しを判定したい場合

 デバイス入力機能はあくまで「ジョイパッドをマウスのように扱う」機構である為、キーやトリガの判定は「最初にクリックされたキー」として1つのトリガしか検出できないよう設計されています。

 しかしアクションゲームなどでトリガの同時押し、および方向キーの検出が一度に必要な場面も出てくるかもしれません。そういった場合デバイス入力機能では役不足ですので、デバイスドライバを「忍者タップドライバ」へ差し替えてください。

 「忍者タップドライバ」は、忍者タップによってすべてのパッドが接続された最大8タスクとキーボードから2タスクの計10タスクを一度に検出し、それぞれのタスクの方向4つとトリガA,トリガBの状態を8ビットに整理して出力します。忍者タップが接続されていない場合は通常のパッドとして計4タスクを出力するので、このドライバを組み込んでおくと方向とトリガの情報を一度で取り出すことができ、アクションゲームなどの用途でも不自由しないと思います。

 忍者タップドライバを導入する際の弊害として、CALL DMMの戻り値はトリガ以外は正常に入らなくなります。入力結果は「忍者タップドライバ」内のワークエリアに保存されていますので、そちらを直接参照してください。

[Back]トップページへ