a5k - FPGAに移植された Another World / Out of This World
(github.com/sylefeb)- Another World / Out of This World の VM、blitter、rasterizer を標準 CPU なしで FPGA ハードウェアとして実装した個人的オマージュプロジェクト
- 中核設計は、VM を実際のカスタムプロセッサとして作り、フレームバッファ間のコピー・塗りつぶしを担当する blitter、ポリゴンを描画する rasterizer、ディスプレイ更新をまとめた SoC で構成される
- Lattice UP5K の 128KB SPRAM は 4ビット 320x200 のフレームバッファ 4枚に適合し、各 SPRAM ブロック 32KB が 1枚のフレームバッファに対応するメモリ配置となっている
- ゲームデータはストレージに含まれておらず、
BANK01〜BANK0DとMEMLIST.BINをGAMEDATAフォルダにコピーすることで、データパッケージと bitstream を利用できる - 実行方法はシミュレーションと実機ボードの両方に対応
- シミュレーションは Silice をインストール後、
make simul1でイントロを実行可能 - ハードウェアは icebreaker + VGA PMOD、mch2022 badge、ULX3S HDMI をサポート
- 事前ビルド済みの bitstream は含まれているが、ゲームデータは別途必要
- シミュレーションは Silice をインストール後、
- VM 実行では SPI メモリから命令とオペランドを取得し、待ち時間を減らすために 64バイトを小さな BRAM キャッシュへ先読みする方式を採用
- グラフィックス経路では、4枚のフレームバッファ、double buffering、
vblank区間でのアクセス制限、blitter と rasterizer のフレームバッファアクセス仲裁を用いる - rasterizer は Another World の凸ポリゴンを水平 span として描画し、透明効果のために既存ピクセル値を読み取って変更したり、別のソースフレームバッファからピクセルをコピーしたりできる
- テキストレンダリングと part 6 の一部背景は、残り LUT 予算の都合で、ROM に事前レンダリングしたピクセルバッファを保存し、
op_drawString経路でコピーする方式で処理している - 明示されている制限と残作業として、サウンド・音楽の未実装、part ごとの個別 bitstream とデータパックが必要、ゲーム全編のプレイ検証未完了、原作より速いタイミングの調整、part 間の接続方法の検討が挙げられる
- ライセンスは、Silice 設計が MIT License、ドキュメントが CC BY-NC-SA 4.0、修正された C++ ポートは既存の GPL を維持し、ゲームデータは著作権保護の対象
1件のコメント
Hacker Newsの意見
Sega であんな完全アニメーションのカットシーンを見たのは初めてで、本当にすごかった。もちろんグラフィックはその後さらに進化したが、Another World は今でも芸術作品として十分に通用すると感じる。スタイルが際立っていて、1年ほど前に遊び直したときもなお印象的だった。
パズルのかなりの部分は試行錯誤に近く、ゲームも極端に短いが、それでも変えたいところはない。Another World のファンなら Flashback: The Quest for Identity も勧めたい。似たような映画的な雰囲気があり、最初はそれほどでもなかったが、この10年ほどでだんだん好きになってきた
それでも Another World は芸術作品だ。ゲームポスターが油絵のように見えて、本当に美しい [1]
[1] http://www.anotherworld.fr/download/AnotherWorld_Poster.jpg
cyxx による Amstrad CPC 向け Infernal Runner のリバースエンジニアリングと JavaScript 移植版。Another World の作者による作品で、どちらも仮想マシン構造を活用している: https://github.com/cyxx/infernal_js
Norbert Kehrer による The Virtual Machine Architecture of Infernal Runner の発表。ドイツ語での発表だが英語スライド付き: https://media.ccc.de/v/vcfb20_-146-en-202010111400-_th...
The Story of Another World on the Amiga | MVG: https://www.youtube.com/watch?v=0iz9PJbs5rE
Another World の Nintendo 64 移植版: https://github.com/jnmartin84/aw64
Another World の PlayStation 1 移植版: https://github.com/fgsfdsfgs/rawpsx
Verilog にコンパイルするコンパイラを提供しており、その結果を既存の設計フローに組み込める
最初の行動から泳いで逃げなければならず、その後すぐライオンのような生き物から脱出しなければならないのは、史上最も過酷なゲーム体験のひとつだ。このゲームは1分遊んだだけでも一生記憶に残る
当時としては、このゲームの劇的なカメラ演出は本当にタイトルどおり別世界のようだった
表紙のアートもすばらしい
konanaka beetzai! motsuubo! /wave
https://www.youtube.com/watch?v=JFaOYYSxSEA
記憶では開発ツールの一部も紹介されていて、仮想マシンのバイトコード上でアニメーションを1行ずつ直接修正し、ステップ実行する様子も出てくる
現在は80年代の爆発的成長期より機種数が少ない。今でも大半の「ソフトウェア」は、ウェブブラウザが解釈する JavaScript だと見ることもできる。80年代にも移植性の問題はあり、むしろ当時は自前でインタプリタを作らなければならなかったぶん、さらに難しかった。
多くの、あるいはおそらく大半のビデオゲームは、Doom や高性能 3D グラフィックス以前には 仮想マシン で書かれていたように思う。コンソールゲームは性能上の理由から C やアセンブリだった可能性が高い
当時の「コンピューター」ゲームは、IBM PCが標準になる前、あるいは少なくともPCが勝ち、Microsoftが支配する前の時代だった。Amiga、PC-98、IBM PC、Macなど、何が勝つかわからない状況では、仮想マシンを作るのは合理的で、SCUMMがまさに思い浮かぶ
移植性も重要だったが、ムーアの法則が全速力で進み、プラットフォームの寿命がカゲロウのように短かった当時は、仮想マシンには圧縮効果もあった。完全にコンパイルされたバイナリは、ディスクやテープの容量、RAMをあまりにも多く消費し得た。
一方で、ごく小さな仮想マシンなら、その場で解釈するための専用言語を作ることができ、1KBごとに節約しなければならない状況で容量を大きく削減できた。
print "Hello world!"と基本的なコンパイル済みバイナリのサイズ差を思い浮かべればよい。テキストアドベンチャーはどれだけ高速でも、X KBに収まらなければ意味がなかったテキストやグラフィック資産が多く、計算は比較的単純だった。オーサリング上の制約は、ハードウェアとは入出力とデータ圧縮の面でのみ結びついており、インタプリタが実行するコードはたいてい、一度だけ実行される「シーン初期化」と少しのアニメーションタイマーだった。
反対側の発想は、アーケードゲーム、そしてその後のDoomやQuakeのような作品によく現れている。ゲームがシミュレーションする内容がハードウェアにはるかに密接で、シーン定義は「ここにモンスターを置き、あそこに体力アイテムを置く」程度で、スクリプトロジックというよりマップデータに近くなる
もちろん後者2つは、一部でネイティブのグラフィック基本演算を使っていた
ビットプレーンを使えば、ビデオメモリを再読込する必要がない。最上位ビットは透明効果専用だと仮定して、そのままスパンを描画すればよい。
残り2つの利点は、プレーン同士を相対的に動かして見事なモアレ効果を作れること、そして8色(ピクセルあたり3ビット)や32色(ピクセルあたり5ビット)のように、バイトやニブルにぴったり合わない中途半端な色深度でメモリとバス帯域幅の効率がよいことだ