JOYDRVの使い方について

JOYDRVは市販ゲームでの使用を主な目的として製作しているため、読み込むコントローラの種類やボタンの入れ替え等は
添付のツールや制御用データの読み込みで行う構造にしています。
プレイヤー視点であればこれで問題ないのですが、自作ゲームでボタンの入れ替えや連射の機能を活用したい場合は
ゲーム側からコントロールできないため不便です。
簡単ではありますが、ゲーム側からJOYDRVをコントロールする方法を書きたいと思います。


1.JOYDRVのアクセス方法

JOYDRVはデジタルコントローラの読み込みを行うIOCS $3Bと、アナログコントローラの読み込みを行うIOCS $F2の両方を使用(管理下に)します。
IOCS $3Bは本体内蔵のROMにATARIコントローラだけを読み込める標準ルーチンがありますが、それに置き換わります。
IOCS $F2はメーカー提供のAJOY.Xを実行することで、後からルーチンを追加する形式となっています。
JOYDRVもAJOY.Xと同様にIOCS $F2にルーチンを追加することで、コントローラの読み込みだけでなく各種設定も行えるようにしています。

JOYDRVの登録状態はIOCSコール$F2のベクタを取得することで判断できます。
ベクタの取得は以下でできます。

(1)DOSコールを実行
 move.w #$01f2,-(sp)
 .dc.w $ff35 * DOSコール(ベクタゲット)
 addq.w #2,sp
 D0.LにIOCSコール$F2のベクタが格納される。

(2)ベクタの領域を直接アクセス
 $7C8-$7CBをLongで読みだす。

読み込んだベクタは、処理が何も登録されていないときは最上位1バイトに$F2が設定されています。
処理が登録されているときは最上位1バイトは$00で、下位3バイトが処理アドレスになります。
読み込んだベクタを$00ffffffと比較し、これ以下の場合はドライバが登録されていると判別できます。
しかし、これだけではAJOY.XとJOYDRVのどちらが登録されているか、わかりません。
JOYDRVが登録されていることを判別するには、IOCS $F2を以下の方法でコールします。

 lea.l WORK(pc),a1
 moveq.l #$f,d1
 moveq.l #$f2,d0
 trap #15
 D0.L ステータス

 WORK:
 .ds.b 20 (20バイトのワーク領域)

ステータスが0のときはJOYDRVが登録されていて、負の値の時はAJOY.Xが登録されています。


2.ドライバ内のボタン情報のコントロール方法

JOYDRVは様々な変換や制御ができるのですが、全てとなると膨大な量になるため、シューティングゲームで必須になると思われる
連射とボタン割り当ての変更に絞って説明をします。

自作ゲーム側からドライバ内を制御するためには、最初に以下のコールでドライバ内のコントロールデータのアドレスを取得します。

 moveq.l #$0,d2 (JOY番号を指定)
 moveq.l #$c,d1
 moveq.l #$f2,d0
 trap #15
 D0.L ステータス
 A1.L コントロールデータのアドレス

コントロールデータはJOY番号ごとに管理情報を有していますので、コントローラ単位に制御が可能です。
なお、ステータスは上記「1.」内のコールと同じ(+JOY番号が管理範囲外の時は負の値)ため、
こちらのコールでもJOYDRVの登録状態が確認できます。
ドライバが管理するJOY番号数はドライバの登録時にコンフィグファイルで指定できますが、
1JOY番号あたり512バイトあるため、最大数である10(JOY番号9)を指定するとそれだけで5Kバイト占有します。
そのため、通常は2(JOY番号1)を指定するのが良いと思います。
また、コンフィグファイルで指定する320バイトの制御データですが、コントロールデータの先頭から格納されているものになります。
「後半の192バイトは?」と思うかもしれませんが、後半はドライバが使用するワーク領域になっていますので、固定値的な設定はありません。
先頭の320バイトを書き換えるとドライバの制御が可能となります。後半の192バイトは理解せずにいじるとドライバの動作がおかしくなるため、お勧めしません。


先頭からの位置 項目 内容
+  0〜+  7 アナログ(アナログレバー)→デジタル(十字キー)の変換データ OFF/ONの閾値を設定します。左アナログレバーは左十字キー、右アナログレバーは右十字キーに変換します。
+ 0 : 左アナログレバーの上 0〜127 : 0の場合デジタル変換が無効となります。127に近いほど少しの入力で十字キーがオンになります。
+ 1 : 左アナログレバーの下 128〜255 : 255の場合デジタル変換が無効となります。128に近いほど少しの入力で十字キーがオンになります。
+ 2 : 左アナログレバーの左 0〜127 : 0の場合デジタル変換が無効となります。127に近いほど少しの入力で十字キーがオンになります。
+ 3 : 左アナログレバーの右 128〜255 : 255の場合デジタル変換が無効となります。128に近いほど少しの入力で十字キーがオンになります。
+ 4 : 左アナログレバーの上 0〜127 : 0の場合デジタル変換が無効となります。127に近いほど少しの入力で十字キーがオンになります。
+ 5 : 左アナログレバーの下 128〜255 : 255の場合デジタル変換が無効となります。128に近いほど少しの入力で十字キーがオンになります。
+ 6 : 左アナログレバーの左 0〜127 : 0の場合デジタル変換が無効となります。127に近いほど少しの入力で十字キーがオンになります。
+ 7 : 左アナログレバーの右 128〜255 : 255の場合デジタル変換が無効となります。128に近いほど少しの入力で十字キーがオンになります。
+  8〜+ 71 連射のカウンタ値 +0がONとするコール回数(0〜255)で、+1がOFFとするコール回数(0〜255)になります。ON、OFFともに0のときは連射を行いません。
連射はボタン(キー)が押されている間だけ機能し、IOCSコールの呼び出しごとにカウントが行われます。
+ 0 : 左十字キーの上のカウンタ値
+ 2 : 左十字キーの下のカウンタ値
+ 4 : 左十字キーの左のカウンタ値
+ 6 : 左十字キーの右のカウンタ値
+ 8 : 右十字キーの上のカウンタ値
+ 10 : 右十字キーの下のカウンタ値
+ 12 : 右十字キーの左のカウンタ値
+ 14 : 右十字キーの右のカウンタ値
+ 16 : Aボタンのカウンタ値
+ 18 : Bボタンのカウンタ値
+ 20 : Cボタンのカウンタ値
+ 22 : Dボタンのカウンタ値
+ 24 : Xボタンのカウンタ値
+ 26 : Yボタンのカウンタ値
+ 28 : Zボタンのカウンタ値
+ 30 : Z’ボタンのカウンタ値
+ 32 : L1ボタンのカウンタ値
+ 34 : L2ボタンのカウンタ値
+ 36 : L3ボタンのカウンタ値
+ 38 : L4ボタンのカウンタ値
+ 40 : R1ボタンのカウンタ値
+ 42 : R2ボタンのカウンタ値
+ 44 : R3ボタンのカウンタ値
+ 46 : R4ボタンのカウンタ値
+ 48 : STARTボタンのカウンタ値
+ 50 : SELECTボタンのカウンタ値
+ 52 : 予約1ボタンのカウンタ値(現時点では未使用)
+ 54 : 予約2ボタンのカウンタ値(現時点では未使用)
+ 56 : 予約3ボタンのカウンタ値(現時点では未使用)
+ 58 : 予約4ボタンのカウンタ値(現時点では未使用)
+ 60 : 予約5ボタンのカウンタ値(現時点では未使用)
+ 62 : 予約6ボタンのカウンタ値(現時点では未使用)
+ 72〜+203 IOCS $3B用のボタン変換データ IOCS$3BのD0.Lの戻り値設定に使用するデータで、4バイトごとに以下の内容が格納されています。
+ 0 : 初期データ:ボタンが何も押されていない時、この値が戻り値となる。
+ 4 : 左十字キーの上:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 8 : 左十字キーの下:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 12 : 左十字キーの左:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 16 : 左十字キーの右:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 20 : 右十字キーの上:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 24 : 右十字キーの下:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 28 : 右十字キーの左:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 32 : 右十字キーの右:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 36 : Aボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 40 : Bボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 44 : Cボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 48 : Dボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 52 : Xボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 56 : Yボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 60 : Zボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 64 : Z’ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 68 : L1ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 72 : L2ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 76 : L3ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 80 : L4ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 84 : R1ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 88 : R2ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 92 : R3ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+ 96 : R4ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+100 : STARTボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+104 : SELECTボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。
+108 : 予約1ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。(現時点では未使用)
+112 : 予約2ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。(現時点では未使用)
+116 : 予約3ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。(現時点では未使用)
+120 : 予約4ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。(現時点では未使用)
+124 : 予約5ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。(現時点では未使用)
+128 : 予約6ボタン:左記ボタンが押された時に、この値が戻り値となるもの(初期データ)にANDされる。(現時点では未使用)
ボタンが複数押された時、戻り値は初期データと押された全てのボタンの値がANDされたものになります。
+204〜+269 IOCS $F2用のボタン変換データ IOCS$F2 D1.L=0コール時のA1.Lのアドレス+8のWord領域の設定に使用するデータで、2バイトごとに以下の内容が格納されています。
+ 0 : 初期データ:ボタンが何も押されていない時、この値が設定値となる。
+ 2 : 左十字キーの上:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 4 : 左十字キーの下:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 6 : 左十字キーの左:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 8 : 左十字キーの右:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 10 : 右十字キーの上:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 12 : 右十字キーの下:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 14 : 右十字キーの左:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 16 : 右十字キーの右:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 18 : Aボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 20 : Bボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 22 : Cボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 24 : Dボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 26 : Xボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 28 : Yボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 30 : Zボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 32 : Z’ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 34 : L1ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 36 : L2ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 38 : L3ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 40 : L4ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 42 : R1ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 44 : R2ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 46 : R3ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 48 : R4ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 50 : STARTボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 52 : SELECTボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。
+ 54 : 予約1ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。(現時点では未使用)
+ 56 : 予約2ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。(現時点では未使用)
+ 58 : 予約3ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。(現時点では未使用)
+ 60 : 予約4ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。(現時点では未使用)
+ 62 : 予約5ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。(現時点では未使用)
+ 64 : 予約6ボタン:左記ボタンが押された時に、この値が設定値となるもの(初期データ)にANDされる。(現時点では未使用)
ボタンが複数押された時、設定値は初期データと押された全てのボタンの値がANDされたものになります。
+270〜+270 アナログレバー変換データ アナログレバーの上下や左右方向を逆転させたり、レバーの上下と左右を入れ替えたり、左レバーと右レバーを入れ替えたりするためのフラグ情報です。
bit 0 : 左アナログレバーの上下 0:リバースなし 1:リバースあり
bit 1 : 左アナログレバーの左右 0:リバースなし 1:リバースあり
bit 2 : 右アナログレバーの上下 0:リバースなし 1:リバースあり
bit 3 : 右アナログレバーの左右 0:リバースなし 1:リバースあり
bit 4 : 左アナログレバーの上下と左右 0:入れ換えなし 1:入れ換えあり
bit 5 : 右アナログレバーの上下と左右 0:入れ換えなし 1:入れ換えあり
bit 6 : 左アナログレバーの上下と右アナログレバーの上下 0:入れ換えなし 1:入れ換えあり
bit 7 : 左アナログレバーの左右と右アナログレバーの左右 0:入れ換えなし 1:入れ換えあり
+271〜+271 アナログレバーセンタ余裕値 コントローラによってはアナログレバーのセンタ値が安定していないものがあるため、センタを安定させるための余裕値を設定します。
0〜127 : 0の場合余裕値なし
+272〜+319 予約領域 予約領域のため現時点では未使用です。