『ネクロマンサー』と『凄ノ王伝説』の不思議な関係
ハドソン伝説2でファミリーBASICについてちょっと追加で確認したいことがあって、メールインタビューしたとき、竹部さんから教えていただいた『ネクロマンサー』の開発から始まる逸話について書いておきたい。
この話があった場所は東京のはずで1987年も後半になってからの話だろうから、飛田さん・野沢さん・奥野さんあたりの、当時、もう北海道に異動していた人たちは、多分知らない話だと思う。
竹部さんが『ネクロマンサー』を作るとき、バトルを若手に全部任せることにしたわけだけど、ここで困ったことが起こる。
端的に書けば「若手に6502のアセンブラで全部戦闘ルーチンを書かせるのヤバいんじゃね?」ということだ。
確かにわかる。
オールアセンブラで、しかも6502でRPGの戦闘ルーチンを書くのは本当に大変だ。
というも、そもそもアセンブラでプログラムを書くのは常に簡単ではないのに加え、6502はともかく16ビット以上の演算が面倒だ。
そしてRPGのバトルは普通に計算の塊で、しかも普通に作ると16ビットの演算がバリバリ出てくる6502がワリと苦手とする世界なわけだ(『ドラクエ1』の時代なら8ビットの中に納めることも出来たろうが、『ネクロマンサー』の時代に8ビットはムリがある)。
少しだけ説明すると8ビットは0-255だが、これを2つ足せば、最大511ということになって、自動的に9ビット必要になる。
また掛け算をすれば最大が255*255なので65025(1111_1110_0000_0001)となって16ビット必要。
つまり最大値が255を超えたら、だいたい16ビットの演算がほぼ必須になり、Z80などと違って、65はこれを1命令でやることが出来なかったので大変に面倒だった。
またうっかり計算の順番を間違えると簡単にオーバーフローするので、計算時にそこらへんを間違えないようにするのも重要だったりした。
つまりアセンブラでRPGの戦闘を書いてもらうのは怖いし16ビットの演算いっぱい出てくるしどうしようと思って竹部さんが若手プログラマに聞いたら「Cなら書ける」。
そこで竹部さんが思い出したのがAPPLEⅡの仮想16ビットCPU、SWEET 16。
これは16本のレジスタを持つ仮想16ビットCPUで、APPLEⅡの16ビット処理を行うときの処理を補助的にやるために実装されていた。書いたのはスティーブ・ウォズニアク。
こいつのソースコードがAPPLEⅡのリファレンスマニュアル(通称赤本)にフルで載っていたので、竹部さんはそれを参考にして16ビットCPUエミュレータを書き、その仮想16ビットCPU用のCコンパイラを若手の筆頭板垣君が書くことになる。
つまり若手がCなら書けるというので仮想の16ビットCPUをゲーム内に実装して、それ用のCコンパイラを作るというビックリ展開だ。仮想CPUの速度は遅かったろうけれど対面型のバトルだ。複雑な計算を簡単に間違いなく書けるほうが遥かに重要だったわけだ(ついでに書くと、仮想CPUのメモリサイズを考えるとフルアセンブラより効率が高かった可能性が高い)。
この一連の話を説明してくれた竹部さんの証言が以下。
■竹部さんの証言
APPLE IIのBIOSで思い出したことが…。
BIOSの中に16ビットCPUエミュレータSWEET16が記述されていました。
完全な8ビットCPUである6502を拡張する目的で16ビットレジスタを16本持っています。
6502のコードを読み始めた頃の話なので当時はその意味や価値を理解していませんでした。
後にPCエンジンでネクロマンサーを作ることになるのですが、SWEET16を思い出し16ビットの仮想CPUを作りました。
詳細は忘れてしまいましたが、確かこいつも16ビットレジスタを16本を持たせました。
アセンブラはMacro80でオペコードをマクロ展開しアセンブルできるようにしました。
この時期、pc98でPC-UXがリリースされていたので、yacc/lexを駆使して仮想CPU用のCコンパイラのサブセットを作りました。
Cコンパイラを書いたのは板垣、仮想CPUは私の合作です。
サブセットなので使用制限はあるもののPC98上の通常のCで書いたコードを一部修正するのみでPCエンジンで動作しました。
ネクロマンサーのバトルのコアコードはCサブセットで書かれています。
速度は実測していませんが、それなりに遅かったと思います。
重い処理は外部関数を呼べるようにしてアセンブラで置き換えたりしてました。
この戦略を取ったのは、バトルのコードを若手にまるっと任せるようにしたのですが、アセンブラで書かせるのは怖い。
Cなら書ける? そうか…ではコンパイラを作ろうという流れです。
なので、この部分を逆アセンブルしても意味不明なデータ列が並んでいるだけになります。笑
おっと、この話はPCエンジンネタでしたね…。
こうして『ネクロマンサー』のバトルは出来上がる。
つまり『ネクロマンサー』のバトルは
- 竹部さんが書いたSWEET16を参考にした仮想16ビットCPUエミュレータの上で動いていて
- そのコードはPC-UXの上でyacc/lexを使って板垣君が作ったCコンパイラで書かれている。
と、かなりケッタイな代物だったわけだ。
ところで、このネクロマンサー用に作られたCのサブセットは以降使われることはなかったのか?
実はあった。
1988年初頭、ハドソン北海道に現れた僕は、その当時はすでになんでもCで書く環境に移行しており(仕事はOS-9/68KでCD-iのいろいろなものを書くことで、デバイスドライバなどOSのコア部を除けばCで書くのが当たり前の環境だった)、もちろん『凄ノ王伝説』も出来ればCで書きたくて「PCエンジンで動くCはないの?」と聞いて回った。
で、その時、飛田さんが「確か板垣がCコンパイラ持ってるよ」と教えてくれた(と記憶している)。
それで、僕は全然由来を知らないまま、板垣さんからサブセットのCコンパイラをもらい『凄ノ王伝説』を書こうと、最初の1か月ぐらい試みる。
板垣君から仮想CPUのソースとコンパイラをもらったとき「ランタイム用の中間コードとして出るから、速度は遅いと思う」と説明された記憶はあり、確かにその通りで、全部書く分には全然速度が足りないし、割り込みの処理とかももちろん出来ない。
だから結局アセンブラで書くことになってしまうのだけど、今から考えればバトルの計算とか部分的に使えば便利だったのに! と思うのだ。
まあもう33年も昔の話だけど、僕がこんなことをして暴れてたのを、アルファシステムの長谷川君なら覚えているかも知れない。
そして、竹部さんにインタビューしたときに、竹部さんのテキストを読んで「実は『凄ノ王伝説』で使おうとしました。テストしました」と返事したら、竹部さんは超ビックリしていたw
では、これで話は終わりなのかというと、さらにもうちょっと続く。
このあと『凄ノ王伝説』を書きながら並行してCDROM BIOSを手伝いながら、一度も多分実用的には使われることがなかった(残念!)、GRAPHICS BIOSを書くわけだけど、実はこのGRAPHICS BIOSのテスト用のルーチンには、この板垣Cコンパイラサブセットが使われていた。
実は元ハドソンな人たちの一部にはちょっと有名な僕がマルチタップとグラフィックBIOSのテスト用に書いたオリジナルゲーム『バイオテレクラ僕ってSPA!』(酷いタイトルだが、ホントにこういうタイトルだったのである)は、このCコンパイラ+僕のアセンブラコード+グラフィックBIOSで出来上がっていたのであるw
と、全く不思議な縁が僕と竹部さんの間にはあったのだった。
なお元ハドソンのゲームを覚えている人に書いておくと『Knights Of Fights』は和泉taskmanの練習で作ったので、フルアセンブラであるw
で、このインタビューした内容が含まれているのが『ハドソン伝説2』。
多分、世界で一番『バンゲリングベイ』について詳しく書かれている同人誌であるw
ハドソン伝説既刊。BEEPさん・とらのあなさん・メロンブックスさんで委託しています。BEEPさんでは描き下ろしのイラスト+コラムの特典ペーパーがつきます。
2件のコメント
コメントは現在停止中です。
ネクロマンサーと言えば、実は途中までは(仲間を死亡させたままの)一人プレイが楽ですが、開発側も知っていたんでしょうかね?
経験値が3倍になるので序盤は特に楽です。
説明書P.14の「アンバランスな3人組になってしまう」が暗に示唆していると取れなくも無い気がします。
どうでしょうねえ、そこらへんはハドソン伝説3でインタビューしたときにわかる気がしますw