サブページ
ゲームポートの概要
Amigaは本体前面または側面に2つのゲームポート(DB-9コネクタ)を備えており、それぞれマウス、デジタルジョイスティック、またはアナログパドルを接続できる。3種類のデバイスはすべて同じ物理コネクタを共有するが、ポート信号の異なるサブセットを使用する。入力ハードウェアはDeniseおよびPaulaカスタムチップに実装されており、ボタン入力はCIA-Aを経由する。
各ゲームポートは4つの方向信号、2つのアナログ入力、および1つのプライマリボタンラインを持つ。方向信号は二重の役割を果たす:マウスの場合は直交符号化パルスを伝送し、ジョイスティックの場合はシンプルなスイッチ接点信号を伝送する。Deniseは両モード用のカウンタとロジックを内蔵しており、JOYxDATレジスタを通じてアクセスできる。
ポート信号の割り当て
各DB-9コネクタの9ピンは以下のように割り当てられている:
- ピン1–4: 4つの方向信号(ジョイスティックでは上・下・左・右、マウスではV・VQ・H・HQ)
- ピン5: アナログポットY(POTY)
- ピン6: 発射ボタン(押下で直接アクティブ)
- ピン7: +5V電源
- ピン8: グランド
- ピン9: アナログポットX(POTX)
マウスの直交信号
マウスは光学式エンコーディングシステムを使用して移動を報告する。マウス内部では、ゴムでコーティングされたボールが直交する2本の回転軸を駆動する。各軸の端にはスリット付きディスクがあり、回転に伴って光ビームを断続する。ディスク1枚あたり2つのフォトセンサがスリット半分だけオフセットされて配置され、各軸ごとに直交信号のペアを生成する:
- HとHQ(水平パルスと水平直交パルス)
- VとVQ(垂直パルスと垂直直交パルス)
パルス信号と直交パルス信号の位相関係が移動方向を符号化する。マウスが右に動くとHがHQに先行し、左に動くとHQがHに先行する。垂直方向も同じ原理で動作する。
信号処理
Deniseは各パルスペアから単純な論理演算で2つの内部信号を導出する:
- X1 = HQの反転
- X0 = H XOR HQ(HとHQが異なるとき1になる)
水平信号の真理値表:
これらの導出信号が内部8ビットカウンタを駆動する。右方向/下方向の移動でインクリメントし、左方向/上方向の移動でデクリメントする。カウンタ値はマウスの現在の相対位置を表す。マウスは1インチあたり約200パルス(1cmあたり約79パルス)を生成する。
JOYxDATレジスタ
Denise内の2つの読み取り専用レジスタが、各ゲームポートのマウス/ジョイスティックカウンタ値を保持する:
各レジスタは2つの8ビットカウンタを1つの16ビットワードにパックする:
カウンタオーバーフロー処理
各カウンタは8ビット(0–255)しかないため、マウスを約3–4cm動かすとオーバーフローする。絶対位置を追跡するには、ソフトウェアが頻繁にカウンタをポーリングしてオーバーフローを検出する必要がある。OSは垂直帰線割り込みの間にJOYxDATをサンプリングし、2回のサンプル間の移動が127カウンタステップを超えないことを保証する。
移動方向は現在のカウンタ値と前回の値を比較して判定する:
- 差が-127から+127の範囲内: オーバーフローなし。正の値=右/下、負の値=左/上。
- 差が+127を超える: アンダーフロー発生。実際の移動量 = -(256 - 差分)。
- 差が-127未満: オーバーフロー発生。実際の移動量 = 256 + 差分。
JOYTEST — カウンタプリセット
JOYTESTレジスタに書き込むことでカウンタをプリセットできる。JOY0DATとJOY1DATの両方が同時に設定される。
各カウンタの上位6ビットのみプリセット可能。各カウンタの下位2ビットはマウス信号線から直接供給されるため、ソフトウェアからは書き込みできない。
ジョイスティックの読み取り
デジタルジョイスティックはシンプルなスイッチ接点を使用し、マウスの直交信号ラインと同じ信号を生成する。信号がパルスではなく静的であるため、Deniseのカウンタはスイッチ位置を符号化する固定値に落ち着く。ジョイスティックの方向はJOYxDATのビットから直接デコードされる:
左右はシンプルな1ビットテスト。前方と後方は隣接するビット間のXOR演算が必要。以下はゲームポート1の標準的なジョイスティックテストルーチン:
TestJoystick:
move.w $DFF00C,d0 ; JOY1DATをd0に読み込む
btst #1,d0 ; ビット1(X1)をテスト
bne right ; セットされていれば右に倒されている
btst #9,d0 ; ビット9(Y1)をテスト
bne left ; セットされていれば左に倒されている
move.w d0,d1 ; d1にコピー
lsr.w #1,d1 ; 右シフト:X1がX0の位置に、Y1がY0の位置に
eor.w d0,d1 ; XOR:d1.bit0 = X0^X1、d1.bit8 = Y0^Y1
btst #0,d1 ; X0 XOR X1をテスト
bne backward ; セットされていれば後方(下)に倒されている
btst #8,d1 ; Y0 XOR Y1をテスト
bne forward ; セットされていれば前方(上)に倒されている
bra center ; ジョイスティックは中立位置
このルーチンは斜め方向に対応していない。斜めをサポートするには、if-elseチェーンではなく各軸を独立してテストする必要がある。
パドル/アナログ入力
各ゲームポートはパドルやアナログジョイスティックなどの比例コントローラを接続するための2つのアナログ入力(POTXとPOTY)を提供する。パドルには可変抵抗器(ポテンショメータ)が内蔵されており、その位置が抵抗値を決定する。アナログジョイスティックも同様に、各軸に1つのポテンショメータを持つ。
アナログ測定の原理
Amigaはコンデンサベースのタイミング方式で抵抗値を測定する。4つのアナログ入力はそれぞれ、入力ピンとグランド間に47 nFのコンデンサが内部接続されている。測定サイクルは以下のように動作する:
- Paulaが入力をグランドに引くことで4つのコンデンサを急速に放電し、カウンタレジスタをリセットする。
- コンデンサが外部ポテンショメータを通じて充電を開始する。
- 充電中、ディスプレイラインごとにカウンタが1ずつインクリメントされる。
- コンデンサの電圧がしきい値を超えると、対応するカウンタが停止する。
低い抵抗値はコンデンサを素早く充電する(低いカウンタ値)。高い抵抗値はゆっくり充電する(高いカウンタ値)。ポテンショメータの最大抵抗値は470 kオーム(+/-10%)でなければならない。
POTxDATレジスタ
POTGO / POTGOR — 制御と読み取り
POTGOレジスタはアナログ測定サイクルを制御し、アナログラインを汎用デジタルI/Oとして構成することもできる。
POTGOへの書き込みは両方のPOTxDATカウンタをリセットする。通常、STARTビットは垂直帰線期間中に1にセットされる。アクティブ表示期間中にコンデンサが充電されカウンタが動作する。次の垂直帰線期間までに、POTxDATレジスタには最終的な測定値が格納される。
OUTxxビットを1にセットすると、対応するラインがデジタル出力モードに切り替わり、コンデンサ測定回路から切断される。その後、POTGOのDATxxビット値がピンに出力される。POTGORのDATxxを読み取ると、モードに関係なく常にピンの現在のロジックレベルが反映される。
注意: アナログポートをデジタルI/Oとして使用する場合、ライン上の47 nFのコンデンサにより、各信号遷移後に最大300マイクロ秒の安定化遅延が発生する。
発射ボタン
各入力デバイスは1つ以上のボタンを持つ。プライマリ発射ボタン(またはマウス左ボタン)はアクティブローで、CIA-Aに直接接続されている。
ゲームポート0のボタン
ゲームポート1のボタン
特に指定がない限り、ボタンはアクティブロー(0=押下)である。例外はパドルボタンで、これらはアクティブハイ(1=押下)。ポート1(標準ジョイスティックポート)の発射ボタンを読み取るには:
btst #7,$BFE001 ; CIA-A PRA ビット7をテスト
beq fire_pressed ; ゼロならボタン押下
右マウスボタンと第3マウスボタンはPOTGORレジスタを通じて読み取る。使用するには、POTGOの対応するOUTxxビットがクリアされている(入力モード)必要があるが、これはデフォルト状態である。