HN 日本語サマリー

← 一覧へ戻る
プログラミング

4Xゲーム「Stars!」のためのカスタム仮想マシン

A custom virtual machine for the Stars 4X game (nullprogram.com)

50 pointsby ibobev8 コメント

要約

この記事は、1995年のWindows 3.1向け4Xゲーム「Stars!」を現代の環境でプレイ可能にするためのカスタム仮想マシン「Stars!VM」の開発について詳述しています。Stars!VMは、80286エミュレータとWin16-Win32ブリッジを組み込み、オリジナルのゲーム体験を維持しつつ、現代のOSとの互換性を実現しています。さらに、ターン生成の最適化や圧縮技術についても触れています。

全文翻訳

Stars! 4Xゲームのためのカスタム仮想マシン 2026年9月17日 nullprogram.com/blog/2026/09/17/ Stars! は1995年の16ビットWindows 3.1向け4Xゲーム(探検、拡大、搾取、殲滅)で、私が最初にプレイしたのは約28年前でした。Windowsは後方互換性で有名ですが、Stars! を現代でプレイするのは非常に困難です。Windows x64は16ビットアプリケーションを実行できず、プレイするにはレトロなハードウェアまたはエミュレーション(otvdm、DOSBox)が必要で、時にはWineと組み合わせて使用します。 私の新しくエキサイティングなソリューション、Stars!VM、またはStars! Virtual Machineは、カスタム80286エミュレータとWin16からWin32へのブリッジを組み込んでいます。ネイティブWin32として、ゲームはオリジナルのように見え、感じられますが、モダンなファイル選択ダイアログと4Kスケーリングを備えています。オリジナルの16ビットゲームがVM実行ファイル内に埋め込まれていることを考えると、これはゲームの本格的な32ビットまたは64ビットポートと区別がつきません。GitHub上の署名付きリリースには、オリジナルの16ビットゲームの圧縮コピーが埋め込まれているため、単一のEXEで追加のセットアップやダウンロードなしにすぐにプレイできます。 私は32ビットビルド(SSE2が必要)を配布しています。これには64ビットの利点はなく、16ビットWindowsを除くほとんどの環境で動作します。32ビットWindowsはオリジナルの16ビットゲームを実行できましたが、VMにカプセル化されたバージョンの方が動作が良好です。C:\WINDOWSの下にStars.iniをダンプせず、タスクバーと正しく連携し、OSブリッジを介してコピープロテクションが無効化されます。もしStars!に興味があったなら、今が試す時です。ゲームには詳細な組み込みチュートリアルがありますが、Wiki、公式戦略ガイド、AutoHost(プレイバイメールサービス)もチェックしてください。 ゲームは現代の検索エンジンの概念よりも前に作られたため、もしかしたらより良い名前を選べたかもしれません。検索には「stars 4x」を使用することをお勧めします。 ソースからビルドしてVM自体をハックしたい場合は、もちろん、必要なものがすべて揃っているw64devkitが最適なツールです。それに加えてゲーム自体も必要です:stars.exe from stars27jrc3.zip。 実装の詳細 エミュレータ自体は、x87(80ビット浮動小数点)をソフトウェアで実装するのではなく、ホストのx87ハードウェア上で直接これらの操作を実行するため、x86またはx86-64を必要とします。これはシンプルで、高速で、正確です。プロジェクトは、ホストに対する差分ファザーを使用してエミュレーション全体を検証します。ファザーはランダムに16ビット命令を生成し、それをエミュレートしてから、ホスト上でJIT実行して結果を比較します。 Windowsのハンドルはポインタサイズであり、Win16からWin32へのブリッジは16ビットハンドルをホストハンドルにマッピングします。これらの呼び出しを翻訳する際に異なる構造体レイアウト間でマーシャリングを行い、ゲームが必要とするDOS割り込みをサービスし、ゲストメモリとの間でデータをコピーします。これは、Wasmインスタンスを実行するのとかなり似ており、当然ながら後から考えると理にかなっています。 Win32ブリッジは、Model Context Protocol(MCP)を使用して監視および操作することもできます。AIエージェントは、UIの「DOM」が構築されるのを見ることができ、通常のデスクトップ制御を経由せずにイベントポンプに合成イベントを注入することでUIを操作できます。MCPはゲストメモリの読み書きも可能です。Opus 5はMCPを介して完全なゲームをプレイしました。これは視聴するのが非常に楽しいです。UIで立ち往生したときにのみ私の助けを求めました。 新しいStars!Benchの基盤となるか? 古い16ビットコンピュータをターゲットにしていたため、作者はずさんで無駄の多いUIを構築する余裕がなく、現代の基準からするとゲームUIは驚くほど高速で応答性が高いです。昔はそんな風に作られていました。 次のターンを計算すること、または「ターン生成」は計算上のボトルネックであるため、最適化の努力をそこに集中させました。エミュレータは実行された命令をトレースできるため、ターン生成のトレースを収集し、Fable 5.1に最も頻繁に使用される共通ルーチン(例:ゲームのL'Ecuyer MCG PRNG)と基本ブロックを特定してリバースエンジニアリングさせました。それぞれがC言語で書き直され、命令デコーダに新しい80286命令としてマッピングされました。ロード時にエミュレータはこれらのルーチンを識別し、新しい命令でパッチを適用します。これにより、ターン生成の速度が約2倍になりました。ローカル条件を利用し、特定の既知のプログラムをエミュレートすることで、JITの複雑さなしにJITパフォーマンスを得ることができます。 元のゲームはバッファリングされたI/Oを使用せず、代わりに多数の小さな読み書きを発行します。これらの小さな読み書きを直接Win32に渡すと、I/Oはターン生成時間の約5%を占めました。おそらく当時よりも現在の方が悪化しています。さらに、それは単に無作法です。エミュレータはゲームのI/O呼び出しをバッファリングし、ターン生成をさらに高速化します。 ゲームには「バトルVCR」にいくつかのサウンドエフェクトがあり、ゲームの最終バージョンはMicrosoftのWaveMix.dllを同梱していました。このDLLをロードしてリンクする代わりに、エミュレータはDLLのインターフェースをネイティブに実装しており、これらのルーチンは16ビットプロセスに動的にリンクされます。エミュレータでこのDLLは必要なく、リリースにも埋め込まれていません。 ゲームにはオリジナルのEXEに非圧縮で埋め込まれたアートアセットもあり、その大部分(約3MB)を占めています。Stars!VMは、オリジナルのゲームを圧縮するために調整されたカスタムLZベースの圧縮アルゴリズムを使用しています。リリースに埋め込まれる際には圧縮されます。そのため、32ビット版のゲームはオリジナルの半分のサイズ、約1.5MBになります。 元のゲームは、コピープロテクションとして機能するシリアルコードを必要とします。コードは8文字の英数字で、2つのチェックを通過する必要があります。最初のチェックに失敗すると大きな音が出ますが、2番目のチェックに失敗するとペナルティでゲームが台無しになります。そうすると、人々があなたが偽物だと疑っているとアナウンスされるのでわかります。オンラインで見つかるほとんどのコードは、そのような「偽物」コードです。 プレイバイメール(PBEM)セーブは、CおよびDドライブ構成から派生したハードウェア署名を埋め込みます。同じシリアルコードを使用して異なるマシンでプレイしている人々は、偽物のペナルティを受けます。 私は当時シリアルコードを購入しましたが、少なくとも10年間は購入できなくなっています。そのため、エミュレータは初回実行時に固定シリアルコードを挿入します(--prompt-serialで無効化可能)。コードの再利用について心配する必要はありません。VMは固定ハードウェア署名(他のエミュレータと同じ)も生成するため、Stars!VMを実行しているすべての人々が同じマシンを共有しているように見え、キーの再利用によるペナルティはありません。 anyway、シリアルコードのチェックをクラックしたので、興味深いコードを発見できました。私のお気に入りは次のとおりです:CLONEMUM、CROSSNUT、EGGSWAIN、GHOSTKIN、GONKSHOW、GRIPMIME、SEEKCAPS、SIFTBOLD、SIRBUOYS、SLIMFAZE、SLOTMOPS、SPAWNELK、SUNBLOND、WANTNEAR、WRONGPOX。これらは私のパスワードのようにも見えます。 無限の可能性 特に週末のプロジェクトとしては、結果に非常に満足しており、興奮しています。ゲームを実行する体験が向上しただけでなく、夢見ていた方法でゲームを簡単に自分の意のままにできるようになったことで、ゲームに再び命が吹き込まれました。適切な場所にいくつかのフックがあれば、ゲームは簡単な改造に開かれるはずですが、私はモッダーよりもエンジニアです。 c game この記事にコメントがありますか? ~skeeto/public-inbox@lists.sr.ht [メーリングリストのエチケット] にメールを送信して、私のパブリックインボックスでディスカッションを開始するか、既存のディスカッションを参照してください。