メインコンテンツへスキップ
見出し画像

MSXのマシン語ゲームをファミコン(NES)に移植してみたらこうなりました

    毎度、rorosukeです。

    前回、MSXのフルマシン語ゲーム「METEOR STORM(メテオストーム)」を公開しました。その記事がこちらです。

    そして最後に、こんなことを書きました。

    「AIの力を借りれば、ファミコンのソフトなんかも作れるんじゃないか……と、夢が広がってきますね。」

    実際にファミコンへの移植に挑戦してみました。

    MSXとファミコン。両者は何もかも違います。ゲームを移植するにしても、CPUも違えば、画面の表示方法も違います。音の出し方も、操作方法も違います。つまり、

    同じところがありまへん


    なので、ひとことで「移植」と言っても、作業的には、すべてをリビルドするぐらいのことになります。

    そんな無茶な話なのですが、果たして結果やいかに?



    ファミコン vs. MSX

    「ファミコン」について押さえておきましょう。

    ファミコンは、1983年7月に任天堂が発売したゲーム専用機です。正式名称は「ファミリーコンピュータ」で、価格は14,800円。この安さでアーケードに近いゲームが家庭で遊べたため、爆発的に普及しました。海外では「NES(Nintendo Entertainment System)」の名前で発売されています。家庭用ゲームを広く普及させた、まさしくエポックメイキングなマシンです。

    一方、MSXは、1983年にアスキーとマイクロソフトが提唱した、パソコンの共通規格です。メーカーごとにバラバラだった8ビットパソコンを、ひとつの規格に統一しようという試みでした。ソニー、パナソニック、ヤマハなど多くのメーカーから、同じソフトが動く互換機が発売されました。BASICでプログラムが組めて、ゲームも遊べる、いわば「手の届くパソコン」です。

    つまり、ファミコンは「遊ぶための専用機」、MSXは「作って遊べるパソコン」。同じ1983年生まれでも、生い立ちがまるで違います。

    まずは両者のスペック比較をしてみます。どちらも8ビットコンピュータですが、頭脳であるCPUからして別物です。ファミコンは6502系、MSXはZ80系で、命令の体系がまったく違います。ですから、プログラムをそのままコピーして動かすことはできません。

    項目ファミコンMSX(MSX1)発売1983年7月1983年(規格提唱)CPU6502系 約1.79MHzZ80A 3.58MHzメモリRAM 2KBRAM 8〜64KB(本機は32KB)画面用メモリ2KB16KB解像度256×240ドット256×192ドット色数約50色から選択(同時に最大25色)16色スプライト64個(横一列に最大8個)32個(横一列に最大4個)音源矩形波2+三角波1+ノイズ1+DPCMPSG 3音+ノイズソフトの形態ROMカートリッジROMカートリッジ、テープ、ディスク入力コントローラーキーボード、ジョイスティック、マウスなど\begin{array}{|c|c|c|} \\[-1.15em]\hline \textbf{\textsf{\small{項目}}} & \textbf{\textsf{\small{ファミコン}}} & \textbf{\textsf{\small{MSX(MSX1)}}} \\ \hline \textbf{\textsf{\small{発売}}} & \textsf{\small{1983年7月}} & \textsf{\small{1983年(規格提唱)}} \\ \hline \textbf{\textsf{\small{CPU}}} & \textsf{\small{6502系 約1.79MHz}} & \textsf{\small{Z80A 3.58MHz}} \\ \hline \textbf{\textsf{\small{メモリ}}} & \textsf{\small{RAM 2KB}} & \textsf{\small{RAM 8〜64KB(本機は32KB)}} \\ \hline \textbf{\textsf{\small{画面用メモリ}}} & \textsf{\small{2KB}} & \textsf{\small{16KB}} \\ \hline \textbf{\textsf{\small{解像度}}} & \textsf{\small{256×240ドット}} & \textsf{\small{256×192ドット}} \\ \hline \textbf{\textsf{\small{色数}}} & \textsf{\small{約50色から選択(同時に最大25色)}} & \textsf{\small{16色}} \\ \hline \textbf{\textsf{\small{スプライト}}} & \textsf{\small{64個(横一列に最大8個)}} & \textsf{\small{32個(横一列に最大4個)}} \\ \hline \textbf{\textsf{\small{音源}}} & \textsf{\small{矩形波2+三角波1+ノイズ1+DPCM}} & \textsf{\small{PSG 3音+ノイズ}} \\ \hline \textbf{\textsf{\small{ソフトの形態}}} & \textsf{\small{ROMカートリッジ}} & \textsf{\small{ROMカートリッジ、テープ、ディスク}} \\ \hline \textbf{\textsf{\small{入力}}} & \textsf{\small{コントローラー}} & \textsf{\small{キーボード、ジョイスティック、マウスなど}} \\ \hline \end{array}

    表を見ると気になることがあります。ファミコンはRAMが2KBしかありません。MSXの32KBと比べると、わずか16分の1です。代わりに、画面表示は専用チップが得意とするところで、ゲームを動かすための機能は充実しています。
    ファミコンを表現するなら「メモリは少ないけれど、ゲームに特化した作り」と言えるかと思います。



    まずは小さなプログラムから

    白状しますが、この私、ファミコンの開発に携わったことは皆無です。知識としてあるのは、CPUが6502ってことぐらい。6502のマシン語プログラムは一度も作った経験がありませんし、画面制御に関する部分は素人そのものです。

    また、いまのところ、AIがファミコンのプログラムを作ることができるのかについても未確認の状態です。いったいどうなってしまうのか見当も付きません。

    とは言え、「分からない分からない」と嘆いてもしかたないので、一発目として、MSXでも作った「画面いっぱいに、同じ文字を並べるだけのデモプログラム」のROMイメージを作成してもらって、

    AIにファミコンソフトが作れるのか

    を確かめてみることにしました。

    プロンプトはこんな感じです。

    👦
    前にMSX用に作った、画面に同じ文字を敷き詰めるマシン語プログラムはすぐ作れますか?

    AIの答えがきました。

    💻
    すぐ作れると思います。移植の第一歩にもちょうどいい題材です。

    やること
     
    ☞画面全体(32×30マス)を同じ文字で埋めて、フレームごとに文字を変えていきます。MSX 版の動きと同じものです。
     ☞画面の書き換えは、垂直ブランキング中に行う必要があります。全面を同じ文字で埋める程度なら、1フレームの間に書き込みが収まるようです。

    準備が要るもの
     ☞
    ファミコンには、MSX のような文字フォントが入っていません。A〜Z のパターンを自分で用意して、カートリッジの CHR-ROM に入れます。
     ☞6502 のアセンブラが必要です。cc65 の ca65 を GitHub から取得してビルドするか、小さな専用ツールを用意するか、どちらかです。

    作業の流れは、アセンブラの準備、ROM の組み立て、エミュレータでの動作確認の順です。短時間でできるはずです。

    なんのことはない、作れそうな気配です。また「準備が要る」とありますが、すべてAIが行ってくれるので私は何もする必要がありません。
    ただ待つのみ……こうしてできたのが次のROMファイルです。



    エミュレータで実行してみた

    MSX同様に実機を所有していませんので、ファミコンのソフトもエミュレータ上で動かします。使用したのは、「cfxnes」というブラウザ上で動作するエミュレータです。

    実行の方法は簡単です。上部の「Open Rom」ボタンをクリックして、ダウンロードしておいたROMファイル(LETTERFLOOD.nes)を選択するだけです。

    画像

    画面に文字が高速に表示されています。

    画像

    なんと、スルッと動作しました。

    すんばらし~い!ブラボー!


    これで、ファミコン用のプログラムを作り、ROMにして、動かすところまで確認できました。あとは、本番に取り掛かるのみですね。



    移植しちゃってもいいかな?

    ゲーム本体の移植を頼むときの指示は、これまで同様にシンプルです。

    NESに移植してください

    しばらくして、ファミコン用のROMイメージ「METEORSTORM.nes」ができました。それが次です。

    完成したROMは、約40KBです。プログラム部分が32KB、文字や絵のタイルデータが8KBという構成になりました。

    これをエミュレータで実行してみました。

    画像
    スタート画面
    画像
    プレイ画面

    動いてます!
    私の作ったミニゲーム「メテオストーム」がファミコンで!

    楽し~い!


    いやはや、これはもう超感動です。



    操作はコントローラーへ

    MSX版ではキーボードで操作していましたが、これをファミコンのコントローラーで使えるようにしています。また、MSXではマウス対応にしていましたが、ファミコンにはマウスがないので、非対応です。

    キーアサインは次のようになっています。「cfxnes」を使うときには、同項目の割り当てキーを使用すれば操作できると思います。

    ボタンcfxnes機能十字キーカーソルキー自機の移動AボタンXキー弾と爆弾を同時に発射BボタンZキー爆弾だけ発射SELECTShiftキータイトル画面では面選択。ゲーム中は単発・連射の切り替えSTARTEnterキーポーズ・再開\begin{array}{|c|c|c|} \\[-1.15em]\hline \textbf{\textsf{\small{ボタン}}} & \textbf{\textsf{\small{cfxnes}}} & \textbf{\textsf{\small{機能}}} \\ \hline \textbf{\textsf{\small{十字キー}}} & \textsf{\small{カーソルキー}} & \textsf{\small{自機の移動}} \\ \hline \textbf{\textsf{\small{Aボタン}}} & \textsf{\small{Xキー}} & \textsf{\small{弾と爆弾を同時に発射}} \\ \hline \textbf{\textsf{\small{Bボタン}}} & \textsf{\small{Zキー}} & \textsf{\small{爆弾だけ発射}} \\ \hline \textbf{\textsf{\small{SELECT}}} & \textsf{\small{Shiftキー}} & \textsf{\small{タイトル画面では面選択。ゲーム中は単発・連射の切り替え}} \\ \hline \textbf{\textsf{\small{START}}} & \textsf{\small{Enterキー}} & \textsf{\small{ポーズ・再開}} \\ \hline \end{array}

    なお今回、Aボタン(Xキー)で弾と爆弾をまとめて出せるようにしました。また、ゲーム中SELECTボタン(Shiftキー)を押すと連射できます。これで十字キー+Aボタンのみでの操作ができるようにしています。



    移植において克服した課題について

    完成画面を見ると、MSX版からスムーズに移植できたかのようにも見えますが、実際には、さまざまな調整をしています。苦労話としてまとめます。

    自由に使えるメモリが小さい

    今回のMSX版で使っていた環境には、32KBのRAMがありました。しかし、ファミコン本体のRAMは、

    わずか2KB(2,048バイト)

    しかありません。プログラムや画像データはROM側に置けますが、動作中に変化する敵や弾の位置、爆発の状態などは、この小さなRAMで管理する必要があります。

    今回の移植では、なんとカートリッジ側に追加のRAMを載せることなく、この範囲に収められています。

    画面が一度に全部書き換えられない

    ファミコンは、画面を表示しながら、いつでも自由に画面メモリを書き換えられるようになっていません。そこで通常は、画面を描いていない短い時間を使って更新するのが決まりです。

    しかし、実際に行ってみると、その短い時間内に、今回の画面全体のデータを送ることができませんでした。

    そこで、画面を上・中・下の3つに分け、順番に書き換える方法を採用しています。

    爆発アニメーションで処理が重くなる

    今回の移植では、まずC言語でゲームを作り直しています。やはりC言語のほうが開発がしやすいからです。しかし、実行してみると爆発が起きたとき動きがもたつくという問題が起きました。本ゲームは、爆発の輪や飛び散る破片も見どころなので、ここは外せません。
    そこで、処理時間を調べながら、負担の大きい部分をアセンブラに書き直して、さらなる最適化を行っています。

    これで、時間のかかるところを重点的に修正。その結果、爆発が続いても、動きが大きく崩れないところまで改善しました。

    色や音もファミコン用に作り直す

    ファミコンは、画面全体で好きな色を自由に使えるわけではありません。背景では、16×16ドットの区画ごとにパレットを選ぶ、といった制約があります。
    そこで色を置き換えたり、同じ形でも色違いのタイルを用意したり、画面下部の基地には別のパレットを使ったりしています。

    音も同様です。MSXとファミコンでは音源の仕組みが違うので、元の設定をそのまま流用することができません。そこで、音の高さを換算し、ファミコンの音源用に直しています。

    ポーズから復帰できない

    不具合も起きています。
    STARTボタン(Enterキー)を押すとポーズがかかります。しかし、もう一度押しても再開になりません。原因は、ボタンを押した情報を、画面更新の割り込み処理と、ゲーム本体の両方で書き換えていたことによるものでした。ボタンを押した情報の扱い方を変更して、無事に再開できるようになりました。

    以上について私は面倒をみていません

    MSXからファミコンへの移植には、こうしたさまざまな問題があるわけですが、上記について私がいちいち指示をしたわけではありません。というか、指示できるだけの知識がありません。

    つまり、こうした問題はAI自身がエミュレータで動作を確認し、すべて自分自身で解決しています。これが、ファミコンハード音痴な私でも、ファミコンソフトが作れる理由です。

    もっとも、さらに技巧的なゲームを作るとなったら、こうはいかないかもしれません。画面に出すものが増えたり、データが多くなれば、処理速度やメモリの使い方について、もっと厳しい調整が必要になりそうです。

    当時の開発者が格闘のすえ編み出した、さまざまな表技、裏技に、AI任せでたどり着けるものかはわかりませんが、テーマとしてはおもしろいかもしれませんね。



    まとめ:知識なくても問題なし

    というわけで、MSXについては、私にもそれなりの知識がありますので、何か問題が起きた時に、AIに対して指摘することもできました。

    しかし、ファミコンについては、それができません。どうなるかと思っていたのですが、結果、おおざっぱな指示だけで完成しました。

    つまりは、AIは私にとって、ファミコンのプロの開発者そのものであり、プロデュースする立場に専念できたということです。

    これがどういうことかというと、

    AIが開発環境を準備できるマシンなら、私が詳しく知らない機種でも、ソフト開発に挑戦できそうだ

    ということです。

    野望が増え過ぎて困っちゃいますね。

    以上!

    #AI活用 #ファミコン #NES #MSX #レトロゲーム #ゲーム制作 #生成AI #Claude

     
     
    AIで時間を生み出す実験をしています。 元PC系出版社編集者。 Claude・ChatGPT・Geminiを並行使用しながら、 実践した話だけを書いています。

    あなたへのおすすめ