11 ポイント 投稿者 GN⁺ 2025-11-19 | 4件のコメント | WhatsAppで共有
  • 1996年に発売された Quake は、3D アクセラレータ、インターネット、そして MS-DOS から Windows 95 への移行という3つの技術的変化に同時に直面したゲーム
  • id Software は DOS と Windows 95 の両方で動作する単一の実行ファイルを作るため、djgpp コンパイラと DPMI 互換構造を活用
  • Mpath の「Chunnel」システムにより、DOS 版 Quake が Windows 95 の Winsock TCP/IP スタックへアクセスできるように実装
  • この構造は quakeudp.dllgenvxd.dllmgenvxd.vxd などの構成要素から成り、DOS 実行ファイルが Win32 ネットワーク API と通信できるよう中継
  • その後、id Software が **Win32 専用実行ファイル(WinQuake、GLQuake)**へ移行したことで、この複雑な構造は姿を消した

Quake と OS 移行期

  • 1996〜1997年のあいだに MS-DOS の市場シェアは半減し、Microsoft は Windows 95 と NT への移行を推進
  • 一部の開発会社(例: Blizzard North)は Windows 95 専用ゲームを開発したが、id Software は **1つの実行ファイル(quake.exe)**で DOS と Windows の両方をサポート
  • quake.exeDJGPP の DPMI クライアントを使い、DOS 用 cwsdpmi.exe または Windows 95 の DPMI サーバーと互換性を持つよう設計された
  • Microsoft のエンジニア Raymond Chen はこれを「異質なエクステンダー間でもプログラムが正常に動作する驚くべき事例」と説明

DOS 環境での Quake 実行

  • DOS で Quake を実行するには、quake.execonfig.cfgpak0.pakcwsdpmi.exe の4つのファイルだけが必要
  • マルチプレイは モデム、NullModem、IPX、TCP/IP の4方式をサポート
    • IPX は LAN 用、TCP/IP はインターネット用だが、DOS には TCP/IP スタックが標準搭載されていない
  • DOS 用 TCP/IP TSR で唯一の選択肢は Beame & Whiteside の BWNFS で、価格は 395 ドル(1996年当時)と非常に高価だった

Windows 95 環境での実行

  • Windows 95 の **仮想 DOS ボックス(dos-box)**で quake.exe を実行すると、同じ方式で動作
  • Windows 95 の DPMI サーバーを使うため、cwsdpmi.exe は不要
  • 動作はスムーズだったが、16MB 以上の RAM が必要で、DOS よりメモリオーバーヘッドが大きい
  • VGA へのアクセスが直接許可されるため、フルスクリーンでも性能低下なく実行可能

q95.bat と Mpath の Chunnel

  • q95.bat は単に Quake を起動するスクリプトではなく、**Mpath の Winsock トンネリングシステム(Chunnel)**を通じて TCP/IP 接続を有効化
  • Mpath Interactive は **オンラインゲームサービス(Mplayer)**を運営し、Quake や Unreal を含む複数ゲームのインターネットプレイを支援
  • 当時の Mpath エンジニア Larry Hastings は、Quake の初期ビルドで id Software チームとインターネット対戦のデスマッチを行った逸話を紹介
  • Mpath は Quake のソースコードを受け取り、Mplayer のネットワークスタックと通信するよう修正し、Chunnel 技術を id にライセンス提供した

Chunnel の技術構造

  • q95.batqlaunch.exe を実行し、これは quakeudp.dll をロードする
    • quakeudp.dllWinsock(wsock32.dll)とのブリッジ役を担う
    • genvxd.dll を通じて 仮想デバイスドライバ mgenvxd.vxd をロードし、割り込み 0x48 を介して Win32 と通信
  • Quake の BSD ソケット実装(mpplc.c)は Mpath 提供コードで、ソフトウェア割り込みを通じてネットワーク呼び出しを渡す
  • genvxd.dll はこの呼び出しを **アンマーシャリング(unmarshalling)**して Winsock に渡す
  • mgenvxd.vxd のシンボルには John Cash の名前が含まれている
  • この技術は Mpath の独自特許技術であり、ソースコードは公開されていない
  • 1996年12月以降、id Software が **Win32 専用実行ファイル(WinQuake、GLQuake、QuakeWorld)**へ移行したことで、Chunnel 構造は廃止された

結論

  • Quake の TCP/IP 対応は、DOS 実行ファイルが Windows 95 のネットワークスタックを間接的に呼び出す独創的な構造で実装された
  • これは DOS と Windows の境界で動作したハイブリッド技術であり、1990年代半ばのゲームネットワーキングの過渡期を示す事例
  • その後 Win32 専用化によって単純化されたが、当時としては OS 移行期における技術的挑戦と革新を象徴する構造だった

4件のコメント

 
bungker 2025-11-21

あの頃のジョン・カーマックといえば、天才の中の天才の開発者でした。

 
thinkpad 2025-11-20

とても面白く、楽しく読ませていただきました。

 
ipuris 2025-11-20

笑、面白いですね。

 
GN⁺ 2025-11-19
Hacker News のコメント
  • 昔、DJGPP と DPMI を直接いじって実験していた頃を思い出す
    当時は本当に未来的な技術のように感じられた
    特に Star Wars: Dark Forces を遊んでいてロードがあまりに遅かったので、DOS/4GW を別のDOS エクステンダに入れ替えてみたら、驚いたことに 3〜5 倍速くなった
    おそらく新しいエクステンダがリアルモードに切り替えず、保護モードで直接ディスクハードウェアを呼び出していたからだと思う

  • Linux 初期の、まだネットワーク機能がなかった時代にはKA9Q TCP/IP スタックを使っていた
    KA9Q コードリンク
    これは DOS で動いていたが、Linux にも簡単に移植できた
    最近でも CWSDPMI クライアントを使ってみたが、32 ビットプログラムを DOS と Windows の両方で動かせるようにしてくれる
    CWSDPMI ウィキ

  • 子どもの頃に半田付けを覚えた理由は、ヌルモデムケーブルを自作するためだった
    その後で抵抗器の存在を知り、パラレルポート用サウンドカードの Covox Speech Thing を自作してみた
    本当に楽しい時代だった

    • そのパラレルポートのサウンドカードは、しばらくの間、自分のメインのサウンドカードだった
      Maplin で大きな抵抗を山ほど買って雑に半田付けしたが、最初から完璧に動いた
    • 半田ごてを使う許可がもらえなかったので、普通のシリアルケーブルを切ってヌルモデムに改造した
      友達と OMF2097 を一緒に遊ぶために作ったもので、キーボード 1 台を取り合わなくて済むのが良かった
    • 自分もあの頃に半田付けを覚えた
      自作した機器でMod ファイルを再生して携帯スピーカーで聴いたときは本当にすごかった
      後になってフラックスを知ってから、半田付けがずっと楽になった
  • 「DJGPP のエンジニアたち」という表現を見て、実質的にはDJ Delorie 一人だったことを思い出した
    GCC のツールチェーン全体を DOS/Windows に移植したのは本当にとてつもない偉業だった
    彼が id Software の依頼で機能を追加したのか、それとも単なる趣味でやったのかは分からないが、尊敬する

    • 当時の DJGPP にはかなり大きなコミュニティがあり、Quake 最適化の功績はCharles Sandmannにも大きい
      彼は CWSDPMI の作者で、id と直接協業していた
    • 自分もその二人の間で実際にCWSDPMI 関連のやり取りがあった記憶がある
      オープンソースプロジェクトに対してこういう言い方は少し変かもしれないが、たぶん事実だと思う
      それに、Quake が VM 上で動くことに驚いているのは、おそらくVM86 モードを知らないからだろう
    • DJ Delorie のインタビューをぜひ見てみたい
    • 彼のウェブサイトを見たら、大学時代に射撃の授業を取っていた記録があった
      アメリカではそういう体育の授業は一般的なのか気になる
    • DJGPP のおかげで初めてプログラミングを学んだ
  • 「Chunnel」という名前は、たぶん Channel Tunnel から取ったのだと思う

    • あるいは、1995 年放送の Seinfeld の「The Pool Guy」エピソードに登場する**架空の映画『Chunnel』**に着想を得たのかもしれない
  • 以前、Quake のTCP/IP マルチプレイを設定しようとして TECHINFO.TXT を読んだ記憶がある
    そこには Beame & Whiteside TCP/IP スタックを使うと書かれていた
    ftp.cdrom.com でソフトウェアを入手してインストールしたが、当時はネットワークの知識が足りず、設定がとても大変だった
    結局、遅延も大きく性能も悪くて、WinQuake で NetQuake をやるほうがずっと良かった

  • Fabian がQuake 関連のリサーチを始めたように思える

    • 実際に chocolate-quake プロジェクトに貢献し、バグレポート も残している
      自分も自分の chocolate Doom 3 BFG fork で OpenGL の問題解決を手伝ってほしい
    • たぶんそちらの方向に進んでいるのだろう
      ただ、Quake は Doom よりずっと複雑な世界なので、本 1 冊で扱うのは難しい
  • 90 年代には、友達の電話番号にモデム接続するだけで Quake や Doom を簡単にマルチプレイできたのに、
    今ではサーバーなしではほとんど不可能なのが皮肉だ

    • DOOM は 1993 年 12 月からシリアルマルチプレイをサポートし、1994 年には IPX ネットワークにも対応していた
      TCP/IP は当初なかったが、後にiDOOM TCP ドライバで解決された
      大学の寮でテストしたときは本当に画期的だった
    • 最近はSTUN サーバーや Steam の Steam Datagram Relay で NAT 問題を解決している
      いわばエンジン内蔵の Hamachiのようなものだ
    • Tailscale を使えば、昔のように簡単にできる方法があるのだろうかと気になる
    • 実際にはルーターでポートフォワーディングするだけでも可能だ
      ただ、最近はゲーム会社がスキン販売の収益のために個人サーバーを塞ぐことが多い
      Valve は例外的に TF2 のカスタムサーバーを許可しているし、Minecraft も今なお認証を切って友達と遊べる
  • Windows 95 が TCP/IP を内蔵したことで、昔のようにTCP を別途インストールしていた時代は終わった

    • 当時はネットワークが企業向け中心だったので、自宅で導入するのはほとんどマニアックな趣味だった
      ネットワークカードが一般消費者向けに普及して、世界が変わった
      ただし Windows はネットワークカードがないと TCP/IP をインストールせず、ping コマンドすらなかった
      今の Windows 11 はネットワークなしでインストールするとどうなるのか気になる
    • Windows 3.1 の時代には Trumpet Winsock を使っていた
    • Windows 95 の TCP/IP スタックはFreeBSD 由来だという話もあった
  • 25 年前に自分が書いたDJGPP/NASM チュートリアルが、いまだに Google 検索に引っかかる