Oeffentliches Kunst Nr.1
リボルティーII タイトル画面 1988年、風雅システムの処女作にして同社の技術力の高さを世間に知らしめたのが本作です。対象機はシャープのX1シリーズならびに同Turboシリーズ。今では懐かしの名機となってしまいました。

 まずはご存じない方のためにX1シリーズというマシンについて説明しましょう。X1は1982年にシャープから発売された8ビット機で「パソコンテレビ」というカテゴリを新しく作った存在でもありました。どこが「パソコンテレビ」かというと、推奨ディスプレイがテレビ機能を持っており、パソコン画面のスーパーインポーズ(合成表示)が可能という点です。テレビの自動ON/OFF時間なども合成画面で設定できるようになっていました。つまりパソコンにテレビ制御用のI/Oが備わっていたわけです。当時としては画期的で、価格は高めでしたが人気機種となりました。また、その二年後にはFDDや漢字ROM、2面分のグラフィックVRAM(400ライン1面)などを標準搭載したX1turboシリーズが発売になり、X1全盛期を迎えます。そしてOPM音源(FM8和音)なども備えたX1turboZシリーズが登場し、X68000シリーズにバトンタッチしていきます。

 続いてスペックについて解説します。CPUはZ−80A、クロック周波数は4MHz、メインメモリ64KBという標準的なものです。これは全シリーズ共通です。初代の“マニアタイプ”以外はVRAMを48KB標準搭載しており、8色カラー640×200ドット×1面の表示ができました。これもごくスタンダードです。ちなみに当初はフロッピーディスクドライブもオプションで、標準外部記憶装置はカセットテープでした。
 そしてこれからがX1の特徴的なスペックです。
ステージ2 森林ステージ その1)カラーのPCGを標準搭載。PCGは“プログラマブル・キャラクタ・ジェネレータ”の略で、テキストとして表示する文字をハード的に自由に書き換えることができるというものです。この場合、8×8ドット×8色(3ビット)×256個の自由なグラフィックパターンをキャラクタ単位で配置できるわけです。アトリビュート(キャラクタの色や属性)を含めて2バイトを書き換えるだけで8×8ドット×8色のパターンを任意に変更することができたので、BASICでもそれなりにカラフルなゲームが容易に作成可能でした。同じことをグラフィックで行おうとすると、1バイト×8ライン×3プレーン=24バイト、つまり12倍もの処理が必要になります。8ドット単位のスクロールゲームを作ったとすると、X1はグラフィック画面を使ったものに比べて単純計算で12倍も表示を高速にできたのです。事実、X1用ゲームにはこのタイプのものが多くありましたし、リボルティーIIの高速スクロールステージ(宇宙ステージ)もこのカラーPCGによるものです。
 その2)画面のプライオリティが任意に設定できる。“プライオリティ”とはテキスト画面とグラフィック画面の優先順位のことです。どれを手前に表示するか、どの色を透明色にするか(後ろの画面が透けて見える部分の決定)などを自由に設定できました。ちなみにPC8801/9801シリーズは必ずテキスト画面が手前に表示されます。一見地味に感じますが、この機能はリボルティーII高速化技法に不可欠なものです。
 その3)ハードウェア割り込みが貧弱。これはゲームソフトを実行する際にはX1の致命的な欠点となりました。最短でも1秒の時計割り込みしか使えなかったのです。私もこのスペックを見たときは愕然としたものです。当時の私は大学生でしたが、このスペックだけでX1を購入予定機種から完全に外しました。タイマー割り込みが使えないことによる制約はあまりにも大きかったからです。例えばX1には標準でPSG(電子音3音+ノイズの音源チップ)が登載されていましたが、ゲームのBGMとして曲を鳴らそうとしても非同期に鳴らせないので、必ずゲームのメインルーチンから定期的に演奏ルーチンを呼び出す必要がありました。当然、メインルーチンで時間のかかる処理が発生すると演奏テンポが遅くなります。回避策が無いわけでもありませんが、あまりにも面倒かつ非効率的です。
 ただし、turbo以降はCTC(割り込みタイマーチップ)が内蔵され、標準搭載のOPN(FM3和音+PSG音源チップ)が持つ2本のタイマー(割り込みは1系統のみ)や、マウス用のインターバルタイマなど、いくつも使えるようになりました。
 その4)キー入力をサブCPUが担当。これもX1のウイークポイントのひとつ。PC9801シリーズやDOS/V機も同様のシステムなので「なぜ?」と思われるかもしれません。ところがこれが原因でX1はリアルタイムキー入力が苦手なマシンなのです。サブCPU自体はi8049コンパチでPC9801と実質上変わらないのですが、サブCPU上のプログラム(ROMに内蔵)がマズいというか、メインCPUとの連携がマズいとうか、レスポンスのよいリアルタイムマルチキー入力ができないのです。リボルティーIIは『ジョイスティック専用』ということで回避(?)しています。
X1ターボ その5)グラフィックV−RAMがI/O空間にある。8ビットCPUは一般的にメモりを64KBまでしか同時に接続できません。VRAMが48KBも(?)あるとメインメモリが16KBしか残らないことになってしまいます。そこで、例えば青画面、赤画面、緑画面というように16KB×3のバンクに切り分けて接続したり(PC-8801やMZ-2500など)、サブCPUのメモリとして持たせたり(FM-7やFP-1100など)、メモリ空間を持つビデオコントローラチップを利用したり(MSXやぴゅう太など)と、各社工夫をしていました。ところがX1のそれは以上のどれとも違います。X1のCPUであるZ80は64KBのメモリ空間と共に256バイトのI/O空間(周辺LSIの制御用などに使うためのアドレスを持つ空間)を持っていますが、これを拡張して(スペック外なのですが、シャープは自前のZ80互換CPUを使用していたので・・・)64KBの新たなアドレス空間を生み出し、そこにグラフィックVRAM48KBを接続していたのです。メインメモリほど高速かつ自由にアクセスはできませんが、当時のVRAMはメインメモリに比べてずっと低速だったので、I/OアクセスのレーテンシーがVRAMアクセスのレーテンシーとうまく重なり、思ったよりも自然に操作することができたのです(バンクの切り替えも不要ですし)。
 しかし、グラフィックVRAMアクセスが決して速かったわけではありません。X1のCRTコントローラは、ベーシックマスターL3などと同じくオーソドックスな日立のHD46505チップを使用していたので、VRAMのアドレスが変則的で、グラフィックを操作するにはお世辞にも扱いやすいとはいえませんでした。このため、X1ではグラフィック画面を使った高速なスクロールゲームは不可能であると囁かれていたのです。
 X1シリーズは、およそ以上のような特徴を持つマシンです。ちょっと知識のある人なら、このマシンでスムーススクロールのシューティングゲームを作ろうとは思いもしないことと思います。事実、X1/turbo用の数多くのゲームソフトが発売されましたが、リボルティーIIのように2ドット単位でフルカラー(8色)スクロールするような製品は見たことがありません。当時、ソフト流通やゲーム雑誌の担当者の方にも見てもらいましたが、目を丸くして首をかしげておられました。
 当然、この高速スクロールの仕組みは二重丸の社外秘でした。X1が廃れても、カラーPCGと画面プライオリティ機能を持つ新型マシンが発売されれば、このテクニックは応用できたからです。
 しかし現在(というかDirectXが普及してから)、2D表現であればどんなマシンでも簡単に高速&スムーズなスクロールゲームが作れるようになっています。CPUの能力は1万倍、インテリジェントなビデオチップは大容量の高速RAMと数百MHzの高クロックで動作していますから当然です。リボルティーIIの秘密技術も秘密である必要が全くなくなってしまいました。よってここに全容を公開することといたしました。
 高速スクロールの仕組みを解説する前に、リボルティーIIの動作環境について補足しておきます。リボルティーIIは全X1/turboシリーズで動作しますが、グラフィックVRAM、漢字ROM、FDD2台、アタリ社仕様ジョイスティックが必須です。つまり、X1turboシリーズでは標準で動作しますが、それ以前の機種ではオプション拡張が必要です。グラフィックVRAMと漢字ROM(無いとメッセージが読めない)は当然として、FDDは大量のデータを高速に読み込むため、ジョイスティックはシューティングゲームをストレスなくプレイするため、それぞれ必要となるのです。また必須ではありませんが無印のX1にはFM音源カードも事実上は必要であるといえました。タイマー割り込みの使えない環境のPSGによるBGMではさすがに寂しいので・・・・(でも、ちゃんとPSGでも演奏されます)。
 では本題の高速スクロールの仕組みについて解説していきましょう。
 8ビット機でスムーズスクロール型シューティングゲームを作る場合、MZ-2500のようにハードウェアによるグラフィック画面のスムーズスクロール機能がない限り、非常に処理の重いグラフィック画面のスクロールを高速化するため、色数を落とす方法が一般的でした。つまり、青・緑・赤の3枚の画面を重ねて8色を表現していることを利用し、スクロールする背景を2色または4色で描いて、スクロール処理自体にかかる時間を削減するわけです。そして残りの4色または2色で弾丸やビーム、機体などを描けば、見た目は地味ですが、何とかゲームにはなるというわけです。この手法だと背景(スクロールする)と前景(機体や弾丸など)がパレット(色の割り当て)の設定だけで合成できるので、処理はさらに軽くなります。
図1 しかし、背景2色、前景4色でシューティングゲームを作ってもカラフルとはほど遠いものになってしまうことは容易に想像できるでしょう。そこでリボルティーIIでは、何とか背景だけでもカラフルにできないだろうかと考えました。残っているグラフィックリソースはグラフィック画面(2色)が1枚とカラーPCGだけです。1枚のグラフィック画面でどうすれば2色の壁を打ち破れるか・・・・答えは「マスク」です。残ったグラフィック画面を黒と透明色のマスクパターンにするのです。では何を「マスク」するのか?それは光の3原色を含むパターンを持たせたカラーPCGです。つまり、原理は現在の一般的なカラー液晶パネルと同様です。通常のカラー液晶パネルに使用されている液晶は、光を遮るか透過するかをコントロールするだけで、自ら色を発しているわけではありません。青・赤・緑の光を透過するカラーフィルタを適宜遮ることで発色を制御しているのです。この「カラーフィルタ」に相当するのが“カラーPCG”、「液晶」に相当するのが“1枚のグラフィック画面”となるわけです。プライオリティの設定でキャラクタ画面が奥、グラフィック画面が手前になるようにしておき、「黒」と「透明」の2色に設定したグラフィック画面を2ドット単位でスクロールさせるのです。するとあたかもフルカラー(8色)の背景がスクロールしているように見えるという仕掛けです(図1)。なぜ1ドット単位でないかというと、見た目の速度が遅く感じるということとマスクパターンの関係で2ドット単位の方が自然で美しく見えるという理由からです。ちなみにカラーPCGのパターンは図2のようになっています。青・赤・緑の他に黄が入っているところがミソです。この「黄ドット」によって「輝度」と「鮮やかな色」を獲得しているのです。
 あとは残った2つのグラフィック画面で4色(白・赤・黒・透明)の機体や弾丸を合成描画しています。もちろんスクロールルーチンやキャラクタ表示ルーチンなども独自のアルゴリズムにより最適化しています。
図2
 スクロールはDMAを使用せずフトウェアのみで行っています。書き換える必要のない部分は極力そのままになるように工夫を凝らしています。一般的な8ドットや16ドット単位でスクロールするような場合(アマランス1〜3などもこのパターン)は、同一パターンのPCGか否かをチェックするだけで書き換えの必要性を判断できます。2ドットスクロールの場合も上下のパターンブロック(リボルティーIIの場合は32×16ドット構成)が縦方向にベタなパターン(床や縦パイプ、道など)である場合は応用が利きます。マップデータに「スクロール不要ビット」を設けて、それをチェックするようになっています。
図3  しかし、これで満足してはいけません。背景は上から下に向かってスクロールするので、パターンブロックの上2ドット分のパターンをその上のパターンブロックのパターンと同一になるようにデザインしておくのです。すると、上のパターンブロックが縦方向にベタな場合、スクロールさせる必要がなくなるわけです。ちょっと言葉による説明ではわかりにくいと思いますので、図3を参照してください。限られたケースのように感じられるかもしれませんが、意外とこれが利くのです。プログラマとデザイナの連携によって高速化が図られているのです。
 また、リボルティーIIはPC9801とのクロス環境で開発されています。CGデータなどの多くは98上で作成されており、専用のデータコンパータなどもすべて98のMS−DOS上でC言語によって開発されています。グラフィックツールなどもX1シリーズに合わせて200ライン用のものを作成したり、市販の400ライン用のものを200ライン用に改造するなどして使用していました。
 データの通信も現在のような便利なLAN環境などありませんから、X1のCP/M環境用のフロッピーフォーマットと相互変換して通信していました。これによって無駄なく人とマシンを開発に当てることができました。ちなみにオープニングのアニメーションは98上の3Dグラフィックツールで骨格を作成してあります。
 おまけにもう一点。リボルティーIIにはコピープロテクトがかけられていました。当時はゲームソフトのプロテクトは常識になっていましたので、それなりに強力なプロテクトがかけられました。X1シリーズに使用されていたFDC(フロッピードライブコントローラLSI)は富士通のMB8876(オリジナルはウエスタンデジタル社)というNECのμPD765Aとともにスタンダードとなっていたものでしたが、フォーマット機能がとても強力で、いろいろなプロテクトをかけることができました。しかし反面、フォーマット解析機能も強力だったので、コピーツールに自動でコピーされないようにするにはかなり工夫が必要でした。
敵プラントステージ  そこでリボルティーIIにかけたプロテクトは「ギャップチェック」方式です(名称は勝手につけました)。フロッピーディスクに書き込まれたデータの中には、実際に読み書きされるデータの他に0〜4番までの「ギャップ(Gap)」と呼ばれる同期用のデータ域があります。このギャップ自体はフォーマット時に書き込まれた以降は一切書き換えられることもなく、データとして読み込まれることもありません。この中にこっそりと意味のあるデータを紛れ込ませておいてゲーム起動時にチェックすれば、ギャップの中身まで正確にコピーできるコピーツールがないため、コピープロテクトになるというわけです。いちおう風雅システム(というか杉之原名人)のオリジナル方式です。リボルティーIIではとあるトラックのギャップ4のお尻の方に数バイトの秘密のキーワードが書き込まれています。ギャップ4はトラックの最後のセクタのさらに後ろにある、通常は最も長いギャップです。ここに書き込むことによって、解析されたときもビットずれが起きやすく(というかほぼ100%ズレる)、チェック用のキーワードが解らないようになるのです。実際、当時のどのコピーツールでもコピー不可能でした(ファイラーが出れば別)。
 でもちょっと気になりませんか?まともに解析できないような情報をどうやってチェックするのかっていうこと。答えは「根性」です(^^!)。当然チェックするときも肝心のチェック用キーワードはビットずれを起こして滅茶苦茶な状態です。でも「ビットずれ」を起こしていることは判っているので、キーワード周辺のデータを実際に1ビットずつずらしてみて、キーワードと符合するか試行錯誤するのです。妙なズレ方をして単純にビットシフトするだけでは合致しないこともあるので、何度かリトライしてみます。面倒な方法ですが、この不確実性が本コピープロテクトの実体でもあるのです。解析時にズレて読み込まれたデータをそのまま書き込んでコピーしても、そのコピーを読み込んだときにはさらにズレてしまうため、プロテクトチェックをくぐり抜ける確率は極端に低くなってしまうのです。
 ちなみにリボルティーIIは2Dタイプ(両面倍密)のフロッピーでしたから、ギャップの値はすべて4EH(十進数で78)が基本ですので、すべてのトラックのギャップ4を地道にチェックしていけば、このプロテクトの正体はおおよそ推測できます。しかし実際にはICE(インサーキットエミュレータ)を使用してFDCへのアクセスをトラップすれば、ほとんどのプロテクトは簡単にはずされてしまいます。つまりプロテクトチェックしている部分のプログラムの“ありか”を探し出して、そこを潰してしまうわけです。リボルティーIIも発売一週間後には「ファイラー」によってプロテクト解除されてしまっていました。杉之原名人が虚しさを覚えながらも「ファイラー不能」のプロテクトを考案するまでに時間はかかりませんでした。次回作の「ビートバイス」にその新技術が適用されることになるのですが、そのお話しは次回のお楽しみといたします。
※参考文献 : 絵夢絶党刊 「零壱複合心理VOL.1 ゲームメイキングハイテクBOX」 近江 慎一郎

特別講義メニューページへ
ディン:「こういう仕組みだったのね・・・」