ゲームポート
ゲームポートはx86ベースのパーソナルコンピュータ(パソコン)にビデオゲーム用の入力デバイス(ゲームコントローラ)を接続するレガシーインターフェースである。通常の場合、ISAまたはPCIのI/Oカードやサウンドカード、いくつかのマザーボードではオンボード上に実装している。
ゲームポートはD-subのDA-15コネクタ(DB-15と誤って呼ばれている場合もある)を採用しており、1コネクタにつきアナログ入力、デジタル入力をそれぞれ4系統備えている。当初想定されていた利用方法はアナログ2軸+1トリガボタンのジョイスティックを2つ、あるいはパドルを4つ接続するというものであった。1980年代に日本のパソコンで利用されていたいわゆるアタリ仕様のジョイスティック端子においては方向入力がデジタル端子によって行っており基本的に「どの方向にスティックが傾いているか」のみを読み取るものであったが、ゲームポートにおいてはスティックの傾きの程度も読み取り可能である。
ゲームポート(特にサウンドカードに実装されているもの)のコネクタの余剰・重複端子にはMIDI信号も配線されていることが多い(Pin15にMIDI IN、Pin12にMIDI OUT)。これはゲームのBGM再生にMIDIが用いられた経緯による。
MIDI規格では入出力端子に5ピンDINコネクタが規定されており、また信号を電流値として渡すようになっている。一方ゲームポートは上記のようにDA-15コネクタであり、かつ信号は電圧値として渡すようになっている。そのため、ゲームポートにMIDI機器(MIDIケーブル)を直接接続することはできず、電圧-電流変換回路を備えた変換コネクタや変換ケーブルを必要とする。ゲームコントローラの利用と音源モジュールによるBGM再生を同時に行うためにはゲームポートとMIDI OUTポートを併用する必要があり、そのような目的のために左記のコネクタ変換を兼ねた分岐ケーブル(オスとメスのDA-15と2つのオスの5ピンDINコネクタを備える)が用意されている。
MIDIポート用のハードウェアとデバイスドライバは、ローランドのMPU-401 MIDI インタフェース(UARTモードのみ)を基本としており、WindowsやMS-DOS用の多くのMPU-401用アプリケーションをサポートしている。MIDIポートの公式な設計はMMAがウェブサイト上で公開している。
ゲームポートは初代IBM PC(model 5150)が登場した時点で純正のオプションカードとして提供されていた。IBM自身が純正のジョイスティックを提供しなかったこともあり普及は進まなかったが、デファクトスタンダードとなったサウンドカードであるSound Blasterに標準採用されたことにより標準的なジョイスティック端子として幅広く利用されるようになった。以前からパラレルポート、シリアルポート、PS/2コネクタなどをゲームコントローラ用のポートとして使用する試みもあったが、最終的には上記のようにゲームポートに取って代わられることになった。
後にSound Blaster互換の音源がマザーボードに搭載されるようになり、それとともにゲームポートも搭載されるようになった。このようなマザーボードにおいてはMIDIポートやゲームポートの設定(I/Oアドレス等)をBIOS上で設定が可能になっている。
その後1990年代後半にはプラグアンドプレイ性に優れたUSBが登場し、標準的なゲームコントローラコネクタとして定着していった。しかし、機器側にインテリジェントなコントローラを必要とせず機器を安価に製造可能であるという利点もあり、ゲームポート接続のアナログジョイスティックやゲームパッドは選択肢の一つだった。
USBが普及した2000年代以降ではゲームポートをマザーボードに内蔵したPCはほとんど見られなくなった。また、サウンドカードからもゲームポートが省略されるようになった。
また、Radio Shackのような小売業者はUSB上で古いゲームコントローラを使うためのアダプタを販売していた。
スティック等のアナログ入力は電源(Vcc、5V)と各アナログ端子(3、6、11、13ピン)との間に100kΩの可変抵抗を接続することが推奨されている。また、デジタル入力は各端子(2、7、10、14ピン)とGNDの間にトリガボタン等のスイッチを接続する。
デジタル入力に関しては(アタリ仕様のものと同様)各入力端子を電源電圧でプルアップすることでGNDとの短絡が発生したか(=機器側のスイッチが操作されたか)を検出するようになっている。
一方、アナログ入力に関してはワンショットタイマ回路を用いて可変抵抗の値をパルス生成時間に変換することによって、CPUが可変抵抗の値を間接的に読み取れるようになっている。IBMの純正カードにおいては可変抵抗の値rとパルス生成時間Timeとの間には下記の式が成り立つ。
Time = 24.2 + 0.011r [\mu sec]
CPUはゲームポートのデジタル、アナログ各入力端子の状態をI/Oアドレス(典型的にはx201)を介して読み取ることが可能である。より具体的には当該アドレスのBit0~3が各アナログ端子のパルスの状態、Bit4~7が各デジタル入力端子の状態を示している。
アナログ入力端子の抵抗値の値は典型的には下記の手順によって取得される。
ゲームポートにアサインされたI/Oアドレスに書き込みを行う。これによって可変抵抗の値に応じたパルスの出力が開始される(Bit0~3が0となる)
周期的にI/Oアドレスを読み取り、Bit0~3の各々が0である状態を何回検出されたかをカウントする
Bit0~3のすべてが1となるか手順1から十分な時間が経過するまで、手順2を繰り返す
いわゆるアタリ仕様や任天堂のジョイスティックのようなデジタル入力のみのインタフェースはプログラマが扱うのが容易であるのに対して、上記のようにゲームポートは入力を読むためにタイミングよくソフトウェア割り込み等でトリガをかける必要がある(例えば、256段階の分解能を得るためには約4.4マイクロ秒間隔でI/Oアドレスに数百回アクセスする必要がある)。このた通常のデジタル (TTL) ジョイスティックポートを比較すると、ゲームポートは読み出しに著しくCPU時間を消費するものでありパフォーマンス問題を引き起こしうる。
可変抵抗の値とコントローラの入力状態との関係(例えばスティックを中位にした時や最大限傾けたときの可変抵抗の値)は定められておらず、また可変抵抗の値とワンショットタイマのパルス出力時間はインターフェースカードの回路構成(ワンショットタイマ回路を構成する抵抗の大きさ及びキャパシタの容量、及びタイマICの仕様)によって変化しうることから、ゲームポートのアナログ入力を使用するすべての種類のコントローラはキャリブレーションを必要とする。ゲームポートに接続される機器がジョイスティックである場合は、典型的にはスティックが中位の時と最大限傾けたときのパルス出力時間を計測することによってキャリブレーションは行われる。
MS-DOSでは、ゲームポートを使うゲーム毎に、ゲームプログラム自身でキャリブレーションを行わなければならなかった。このキャリブレーションはゲーム開始時に行われ、いくつかの貧弱なキャリブレーションコードによって、ゲームコントローラを適切に動作させることに失敗することもあり、一部のゲームではゲームコントローラが使用できなくなることもある。
Windows XP等の後世代のOSではゲームソフト自身ではキャリブレーションを行わず、OSのコントロールパネルからキャリブレーションを行うようになっている。
本来、4つまでのボタンしかサポートできない仕様上、5つ以上のボタンをもつゲームコントローラでは専用ドライバが必要になる。例えば、hatスイッチと呼ばれる小型の十字ボタンをスティック先端に設けた操縦桿型ジョイスティックがあるが、3つ以上のボタンを有するジョイスティックにhatスイッチを追加する場合は、hatスイッチによる入力方向をアナログ値として出力する、或いはボタン出力の同時押しとして出力する等の手段が用いられた。
Microsoft SideWinderのようなゲームポートを使ったハイエンドゲームコントローラは、4つの標準ボタン入力や未使用ピンに独自のデータストリームを多重化して流すことによって、複数のジョイスティックをデイジーチェーン接続したり、いくつかの条件下でジョイスティックをプログラミングできたりする一方で、16個や20個など多くのボタンを完全にサポートしている。また、制御信号をMIDIメッセージとしてPC側から受信して内蔵のモータを駆動させる、フォースフィードバック機能を実現したコントローラも発売されている。
しかし、専用ドライバを必要とするゲームコントローラは、より多くのCPU時間を消費したり、使用できる環境がドライバが対応しているOSやゲームに依存するなどの欠点が挙げられる。
何人かのハードウェアもしくはDIY愛好家は、電圧や電流測定、単純なインタフェースやデータ取得方法などを組み合わせることにより、ゲームポートに接続する入力デバイスを複数接続し、他のアプリケーションからそれらを扱う方法を発見している。
NECのPC-9800シリーズ用のSound Blasterや、NEC純正のPC-9801-118サウンドカードはゲームポートを備えており、ゲームポート対応のDOS用ソフトやWindows上でゲームポート対応のコントローラを使用することができた。