Copyright (C) 2003 by XEXYZA_7773. ●●●●● ゲームポートの利用法 ●●●●● ・ゲームポートとは ゲームポートはIBM-PC仕樣のジョイスティックインターフェースの規格です。 Sound Blaster等のサウンドボードに付いてゐる事が多いです。 コネクタ形状はD-Sub 15pinです。 PC-88/98シリーズ等のRGBコネクタや、10BASE-5のコネクタ等と形状が同一なので 誤って插してしまふ事の無い樣に注意する必要があります。 PC-98シリーズに於いても、Sound Blaster16/98、PC-9801-118、PCJOY等があれば ゲームポートを利用する事が出來ます。 ・ゲームポートのアドレス ゲームポートは、1バイト分だけアドレスを占有します。 ・Sound Blaster16/98やPCJOY等 I/Oポートの 04D2h にある樣です。 ・PC-9801-118 I/Oポートの 1480h にある樣です。 (・IBM-PC系(參考) I/Oポートの 0201h にある樣です。) 何れの場合もアドレスは、固定なのか、移動可能なのかは不明です。 PC-9801-118では、アドレスの下位3bitをデコードしてゐないらしく、1480h〜1487h の何れのアドレスでもゲームポートにアクセス出來る樣です。しかし、このうちの どのポートが「ハードウェア設計者の本來想定したアドレス」なのかは不明です。 一應1480hと云ふ事にしましたが、互換品(PC-9801-118相當機能内藏機種等)では もしかしたら1480h以外のポートで無いとアクセス出來ないものもあるかも 知れません。 CバスPnPやPCIバス等のサウンドボードのゲームポートは、とんでもないアドレスに 配置される事になるかも知れません。 以上の理由から、ゲームポートをサポートするプログラムを書く場合は、ユーザーが アドレスを設定出來る樣にした方が良いでせう。 ・プログラミング ゲームポート讀込時のビット割當は以下の通りです。 bit 7: 2P側 Bボタン 0=押 1=離 bit 6: 2P側 Aボタン 0=押 1=離 bit 5: 1P側 Bボタン 0=押 1=離 bit 4: 1P側 Aボタン 0=押 1=離 bit 3: 2P側 Y軸 (後述) bit 2: 2P側 X軸 (後述) bit 1: 1P側 Y軸 (後述) bit 0: 1P側 X軸 (後述) ジョイスティックのトリガーボタンを讀む場合は、ゲームポートのI/Oアドレスから 1バイト讀んで、上位4bitを見るだけです。 負理論なので 0で押下状態、1で離した状態である事に氣をつけませう。 チャタリング對策が行はれてゐないインターフェースもあるらしいので、 ソフト側でチャタリング對策を行った方が良い場合もあるかも知れません。 スティックの方向を取得する場合は、先づゲームポートに何かの値を1バイト書き込み ます。單にインターフェースに讀取タイミングを通知する爲に出力するので、この時 書くデータは何でも構ひません。 すると讀取ポートの下位4bitが全て 1 になります。 その後、各軸ごとに、スティックの位置に應じた長さの時間の經過後に該當bitが0に なります。即ち、スティック位置が目一杯 左 或は 上 の場合、即座に0に、右 或は 下 の場合、時間が經ってから0に戻ります。スティックが右にあればあるほど、 下にあればあるほど、0に戻る迄の時間が長い事になります。 プログラムでは、ゲームポートのポーリング(0になるまで繰り返し讀む事)によって スティック位置の檢出を行ふ事になります。 スティックが左上目一杯の位置でも、實際には0に戻る迄にほんの少しではありますが 時間がかかります。つまり、完全に零になる譯ではありません(恐らくは配線抵抗か 保護抵抗の爲)。 右 或は 下 に目一杯入れた時は、典型的ゲームポートでは約1ms程の時間になる事が 多い樣です。 ジョイスティックが無い場合、いつまでも0に戻らない事になります。ハングアップ を避ける爲、タイムアウト處理(いつまでも戻らなかったら待つのを諦めてエラーと する處理)を入れておかねばなりません(冗談の樣ですが、實際にそれでハングする ソフトが昔ありました)。逆に、これを利用すればジョイスティックが接續されて ゐるかどうかを調べる事も出來ます(が、タイムアウトを待つため時間がかかる事に 氣をつける事)。その代はり、ゲームポートそのものが存在するかを檢出する事は 不可能なのですが。 該當bitが 0 に戻る迄の時間とスティック位置の關係は、必ずしも比例の關係にある とは限らない樣です。筆者の手持ちのインターフェースやジョイスティックは、その どれもが概ね線形(比例關係)の特性を示すのですが、中には指數・對數函數の樣な 曲線を描く樣な對應關係になるものもある模樣です。 また、ゲームポートはとにかくノイズが大きく、±5%程度は常に變動してゐます。 また温度の變化にも敏感な樣です。 ポーリングでタイミングを調べる事により位置を得るため、CPUの速度・バスの速度・ 割込處理・DMA等の影響をもろに受けてしまふ事にも氣をつける必要があります。 以上の理由より、ゲームポートのジョイスティックを利用する前には、 キャリブレーションと呼ばれる處理を行ひ、スティックが左上/中央/右下にある時の 時間が幾らであるかを前もって調べておく必要があります。 勿論この處理は、(正確にやらうとするなら)ユーザー側に協力して貰ふ必要が あります。具體的には「レバーを左上に入れてボタンを押して下さい」等の協力を して貰ふ必要がある譯です。 ゲームポートは温度の影響を強く受ける爲、時間が經って機械が暖まるにつれて だんだん調整が狂ってしまふ事も考へられます。從って、ユーザーが望む時は いつでも再キャリブレーションが出來る樣な機能があれば尚良いでせう。 デジタル入力のジョイパッドの場合、單にそれぞれの軸が「一番左・中央・一番右」 「一番上・中央・一番下」の三通りの値を示す樣になるだけです。 つまり、デジタル入力の裝置とアナログ入力の裝置の間でプログラミング上で特別な 違ひは無く、デジタル入力を前提としたゲームでアナログ入力のスティックを利用 しても、そのまま無理矢理使用する事は出來てしまひます。まともにゲームになるか どうかは別問題ではありますが。 デジタル入力を必要とするアプリケーションソフトの場合、キャリブレーションで 得た値を元に適切な閾値を設定し、毎囘その値と比較する事で入力判定を行ふ 事になります。どうせ三通りの位置しか取り得ないのですから、いっその事、 ソフトの起動時に、中央の値だけキャリブレーションを行ってしまふのも良いかも 知れません。但し、勿論起動時にはスティックを中央にしておく樣にソフトの説明書 に明記しておく必要があります(Nintendo64の3Dスティックと同じ要領です)。 4ボタンのジョイスティックの場合、CボタンとDボタンは、單に2P側のA・B ボタンの端子につながってゐるだけです。つまりCボタンは2P側Aボタンとして、 Dボタンは2P側Bボタンとして讀む事になります。 この爲、4ボタンのジョイスティックを二臺接續する事は出來ません。嚴密に云へば、 4ボタンのジョイスティックを二臺接續した場合は、CボタンとDボタンを使用する 事が出來なくなります。 これは4ボタンのものだけでなく、3ボタン以上のもの全て、例へば8ボタン等の場合 にもあてはまります。 8ボタンのジョイスティックの場合、AボタンからDボタンまでの讀み方は4ボタン の物の場合と同樣です。 Eボタン〜Hボタンは、2P側のX軸とY軸に割り當てられてゐます。 それぞれの割當は次の通りです。 Eボタン: 2P 左 Fボタン: 2P 上 Gボタン: 2P 右 Hボタン: 2P 下 これは、例へばEボタンを押せば、2P側のスティックを左に入れた樣に見える、 と云ふ意味です。 EボタンとGボタンが同時に押された場合はEボタンが、また、 FボタンとHボタンが同時に押された場合はFボタンが、それぞれ優先されます。 つまり、EボタンとGボタンが同時に押された状態、またFボタンとHボタンが 同時に押された状態を檢出する事は不可能です。その場合、優先度の高い方のボタン しか押されてゐない樣に見える事になります。 この爲、E・FボタンとG・Hボタンを同時に使用せずに濟む樣にアプリケーション ソフトを設計する必要があります。 三軸以上の入力を持つジョイスティックも、同樣に2P側の部分を使用してゐます。 例へば、スロットルつきのジョイスティックの場合、X軸・Y軸に、第三軸である スロットルの軸が追加される事になりますが、この場合、スロットルの軸は 2P側のY軸として見える事になります(もしかしたら2PのX軸として見える物もあるの かも知れません)。 某社サイドワインダーシリーズは、ゲームポートインターフェースに接續しますが その仕樣は本來のゲームポート用ジョイスティックとはまるで異なります。 今となっては持ってゐる人も少ない事でせうし、筆者が所持してゐないので ここではその讀取方法は書きません。 他のかたの解析した資料が存在する樣ですのでそちらを參照して下さい。 ちなみに、ボタン入力用の4bitを遣ってデジタルで送信して來る樣です。 ・ひとりごと ゲームポートは何とも扱ひ難い代物です。 兎に角ノイズは多いし、ポーリングでタイミングを調べなければならないので 時間は掛かるし不正確だし、おまけにまともに位置を讀むには長時間割込を禁止 しなければならないし……。ゲームポートを利用する環境ではRS-232C通信なんて とてもぢゃないけど出來ないですね。データ取りこぼしまくり。 フライトシミュレータのやうなのんびりしたゲームとかだったら、まだ、敢へて 割込を禁止せず、前囘のスティック位置との平均をとる等の方法でごまかしたり 出來なくも無いんでせうけど、フレーム單位の功防が繰り廣げられる樣なタイトな アクションゲームとかだと、絶對にそんな事は不可能ですし……。 スティック位置の讀み取りに最低でも1msもかかると云ふのも納得いかん。 まともなゲームを創るのなら、毎秒約60フレーム、ちゃんとV-SYNCとの同期を取る のも必須。秒間60フレームと云へば、一フレームあたりたったの約16ms。なのに、 たかがジョイスティックの讀み取りだけに1msですよ1ms。實に處理時間の1/16もを たかがジョイスティックの讀み取りだけに喰ひ潰されるのはどうにも……。 これがPC-9801-26Kに繋がれたデジタル入力のジョイスティックだったなら、それこそ ほんの一瞬。ものの10μs程度で濟んでしまふ事でせう。アナログ入力の ジョイスティック(SHARPのCYBER STICKや電波新聞社のXE-1AJ等)でもゲームポートの ジョイスティックの數分の一程度の時間で濟んでしまひます。 おまけに、CYBER STICKやXE-1AJの方が遥かに高精度で情報を得られる(スティック 位置を一軸あたり8bitで送って來るが、全ビット有效。ゲームポートは精々4bitか 5bit相當程度の精度しか無い)し。 全く、ジョイスティック側の仕樣はあのままにするにしても、もっとましな實裝を する事は出來なかったものなんですかね。時間を計る部分だけは(CPUがやるのでは 無く)專用囘路に任せる、とか。時間計測開始指示とキャリブレーションはCPU側が やるにしても。(USBになってやっとそれが實現したのですが、複雜なUSBでは恐らく オーバーヘッドが1msなんかぢゃ濟まない事でせうし、USB仕樣はそれ以外の ゲームポート仕樣の缺點をまるまる抱へ込んでゐる樣ですし……) えぇ、分かってゐますとも。アナログ入力のジョイスティックを安價に實現する爲 にあの樣な仕樣にせざるを得なかった事は充分分かってます。アナログ入力の ジョイスティックを安價に實現するには、ね。 安價性の面では本當に良く出來てゐると確かに思ひます。ゲームポート用 ジョイスティックの中身なんて、ボタン用のスイッチとスティック用可變抵抗位 しかありませんしね。 でも、アナログ入力のスティックが必要なゲームなんて、殆ど無いですよね。 殆どどれもがデジタル入力。アナログ入力が必要なゲームなんて、それこそ 微妙な入力が必要なフライトシミュレータ位な物です。レーシングゲームでも アナログ入力が欲しくはなりますけど、これ迄只の一度もゲームポート用ハンドル型 コントローラーなんて見た事無いし。 フライトシミュレータなんて、そんなに誰でも彼でもが何時でも何處でもやって ゐる樣なものぢゃ無いですよね。 Nintendo64の3Dスティックを活かしたソフト達以後の今でこそ、ゲーム專用機の 世界ではアナログスティックもある程度遣はれる樣になって來ましたけど、 ゲームポートの精度でマリオに綱渡りさせられる氣はしないですし、第一その手の ゲームがやっとパソコンで實現出來る樣になった今、そんなマシンではとっくに すっかりゲームポートは廢れてしまひました。 で、何でそんなゲームポートを遣ふプログラムを書く羽目になったかと云へば。 「某大手オペレーティングシステム會社」の怠慢、もしくは陰謀なんですね。 そこの會社の出してゐる某OSが、PC-9801-26K系のアタリ仕樣インターフェースに 非對應なんですね。OSの構造自體が既に過度にゲームポートに依存してゐる構造 なので、そもそもPC-9801-26K仕樣に對應するのが難しい始末。USBとかIF-SEGAとか のドライバもゲームポートのドライバの下にぶら下がる設計って何よ。 そんな状態なので、PC-9801-26K/86の後繼サウンドボードであるPC-9801-118も、 アタリ仕樣のインターフェースを削除しゲームポート仕樣に變更せざるを得なかった んでせう。アタリ仕樣が削除されてしまったからにはゲームポートもサポート せざるを得ない譯で。 Sound Blasterは元々IBM-PCの世界のボードなんで、PC-98版であっても インターフェースがゲームポートなのは納得出來るんですがね。 ゲームポート仕樣の「文化」を押し付けられてしまったせゐで、アタリ仕樣用の 日本製ジョイパッドは驅逐され、大雜把なアメリカ製ジョイパッドしか入手出來なく なってしまったのも困ります。USB時代になってもそのままですし……。 仕方が無いので、「アタリ仕樣のジョイスティックをゲームポート仕樣に變換する アダプタ」を用ゐて日本製ジョイパッドをゲームポートに接續してゐます。 このアダプタ、市販されてゐないので、同人ハードとして入手するか自作するしか 無いんですよね……。 もしも今遣ってゐるジョイパッドがお亡くなりになったらどうしよう。とっても 困ってしまひます。アタリ仕樣の衰頽は本當に困りますね。 なんでも、聞いた話によると、身體障碍者用の各種入力デバイスは大抵アタリ仕樣 インターフェースなのだとか。さう云った裝置に頼ってゐる方々にとっては益々 アタリ仕樣の衰頽は深刻な問題ですよね。 ・最後に このドキュメントの著作權と著作者人格權は全て、筆者である XEXYZA_7773 が 所有します。 筆者はこのドキュメントの内容の正確さを保證しません。 筆者はこのドキュメントを使用した/使用しなかった/使用出來た/使用出來なかった 事により發生した損害を補償する義務を一切負ひません。 このドキュメントは、平和目的に利用する限り、自由に閲覽・複製・配布して 構ひません。但し、以下の條件は必ず守る樣にして下さい。 ・戰爭や軍事行動は全て、「平和の爲の戰爭」と云ふ名目の下で行はれるもので あっても一切「平和利用」と見なさない。 ・不特定多數に再配布する時は、事後でも構はないので連絡する事。 ・この利用條件を守らない事が明らかな者に對して配布しない事。 ・このドキュメントを改變した物を配布しない事。もしもこのドキュメントの改良版 や翻譯版を作り配布したい時は、その旨を筆者に連絡する事。 但し、點字譯版と朗讀音聲録音版は、單なる複製版と見なされる爲、内容が原版と 全く同じであれば、利用條件を滿たす利用をする限り改變・翻譯版とは見なさない ものとする。 ・勿論、著作權表示を勝手に削除・改變して配布してはならない。 ……とかたい話を書いてしまひましたが、要は單に、良識と常識をもって利用すれば 當然守れる樣な事が書いてあるだけです。 勿論、御意見・御感想・各種情報などは大歡迎です。 連絡先は次の通りです。 xe_7@yahoo.co.jp (インターネット e-mail)