ファミコンメガロムの開発とPCエンジンのアセンブラ

ハドソンのアセンブラ&リンカas/lkとファミコンのメガROMとMMCの話
71
じぇみに @jeminilog

アーケードゲームだとその方式が主流だったと思うんだけど。うちわけは背景用256個+OBJ(いわゆるスプライト)256個、ファミコンは一画素2bitなので1キャラが16byte、256個+256個で4KB+4KB=8KB、つまりそれが64K(8KB)のROMにはいってる

2014-12-16 17:28:08
じぇみに @jeminilog

プログラムは8KBか16KBか32KBの3種。ルナボールは128-64、つまり16KB+8KBのカートリッジ。ゼビウスは256-64。だけどディスクシステムが出る前位から、256-128や256-256が登場した。(にごろろくよん、にごろいちにっぱ、にごろにごろと私は呼んでた)

2014-12-16 17:28:17
じぇみに @jeminilog

これはキャラクタ部を丸ごとバンク切り替えし、画像を4系列に切り替え可能にしたもの。同時に出せる絵の種類は増えないけど、例えば空中面と海中面とか、昼の面と夜の面とか場面によって別系統の絵を使いたい時には有効だった。

2014-12-16 17:28:27
じぇみに @jeminilog

256-256を使ったのは例えばスーパーマリオ、スターソルジャー、鬼太郎(バンダイから出た奴。CMでも「変幻自在の秘密は2つの256Kビットロム」とかうたってる)多分ワルキューレも。結構あったと思う。なおツインビーは256-128。

2014-12-16 17:28:37
じぇみに @jeminilog

ディスクシステムは8KBのシステムROMを持ち、ロード可能部分として32KBのプログラムRAMと8KBのキャラクラRAMが入っていた。つまりその前の256-256に比べ、一度に持てる容量の優位性はなく、映像はいちいち読み替えないといけなくなった。

2014-12-16 17:28:50
じぇみに @jeminilog

せめてどっちも32KBのRAMだったらねえと思うが、まあそれはともかくディスク衰退に合わせて出てきたUN-ROM。1メガROMを16KBずつ8つに分割し(0~7)、プログラム領域を16KBずつに分割して後半には7を固定で、前半に0~6を可変で割り当て可能にした。(バンク)

2014-12-16 17:29:01
じぇみに @jeminilog

プログラム部は、ROM領域にCPUが書き込み動作を行う事でバンクが指定される。キャラクタは切り替え機能がないが、RAMなのでプログラムでごりごりと書き換える事が出来る。(切り替えほど早くないけどその代り柔軟)

2014-12-16 17:29:11
じぇみに @jeminilog

コンパイルだとタッチ、ガーディック外伝がこれ。ああ、似たような原理のカートリッジは各社も作っていて、少なくともサン電子とアイレムのはUN-ROMと大体同じ制御で切り替えできた。カプコンもだったけど、あれむしろ純正だったんだろうか?

2014-12-16 17:29:23
じぇみに @jeminilog

そして任天堂が出してきたのがMMC1。UN-ROMより機能が増えてるんだけど(正確には覚えてない。私のプロジェクトでは使わなかったので)問題があった。それが、バンクの指定をシリアル書き込みで行う事。つまり何度か書き込みを行い、1bitずつ値を指定していく。

2014-12-16 17:29:36
じぇみに @jeminilog

だけどファミコンって垂直帰線割り込みはNMIで、禁止ができない。バンクを切り替えてる最中に割り込みが発生した場合、いまどこまで切り替え操作をしたのか知る術がない。今何回書き込んだ、って情報が取れないし、そもそも切り替え中かどうかすら不明。

2014-12-16 17:29:49
じぇみに @jeminilog

今作業中って事をメモリに書いても無意味。だってそのメモリに書いたタイミングと、切り替え操作のタイミングの間に割り込まれたらアウト。どっちなのか判断のしようがない。そりゃまあ切れる人が出てもおかしくない。

2014-12-16 17:30:04
じぇみに @jeminilog

当時の石丸君が散々悩んで編み出した方法が「各バンクの先頭に、そのバンクが何であるかの数値を書く」「切り替え操作してその値が目的の値でないなら、いったんゼロを延々書き込んでバンク0になるのを確認、その後目的のバンクにする」って方法。

2014-12-16 17:30:14
じぇみに @jeminilog

当事者じゃないので手段の正確さはやや怪しいが、当時聞いた説明がおおむねそんな感じ。それくらいしか対処法がなかった(まったくないよりはマシだけど)。有体に言えばこれって仕様の欠陥っぽいけど、もう量産しちゃってたからどうしようもなかったんでしょうか。

2014-12-16 17:30:26
じぇみに @jeminilog

少なくともMMC3以降はシリアル書き込みなんて仕様は消えてました。なおMMC3はスーパーマリオ3やガンナックで使っています。5はドラクエ辺りで使ったのかなー。

2014-12-16 17:30:35
じぇみに @jeminilog

なお当時のコナミは、割り込み処理内にメイン処理を書くという特殊な流儀だった様に見えたので、ひょっとしたらMMC1でもあまり苦労なく作れたのかもしれません。・・・でもコナミってだいたい独自カートリッジだったよね。

2014-12-16 17:30:45