令和のSFXVIプログラミング①クロスコンパイル環境構築
SFXVIとは
1990年代中頃、X68000界隈ではストリートファイターXVIというストリートファイターIIを模したフリーゲームが登場しました。後にSFXVIと改題されたそれは、いわゆるストIIクローンの中でも出来がよく、リュウやケンに混じってドラゴンボールのキャラが選べるユニークさが受けて人気がありました。
バージョンアップを重ねていくうちに、キャラクターの開発キットが公開され比較的簡単に自分でキャラクターを作ることができるようになりました。キャラクターの開発にはC言語でプログラムを書く必要がありましたがX68000ではGCCなどの高性能でフリーの開発環境が整っており多くの人がキャラ開発に参入して人気が爆発。数百ものキャラやステージが作られパソコン通信などで配布されていました。
その後、X68000も衰退していき多くの人が去っていきましたが、エミュレータが開発されBIOSやOSなどのソフトウェア資産が無償公開されたことで実機を持っていなくてもX68000の世界に触れることができるようになりました。
さらにX68000Zが発売され、にわかに脚光を浴びているこのタイミングでもう一度SFXVIに興じてみるのも面白いのではないでしょうか。
クロスコンパイルしよう
かつてのように実機もしくはエミュレータでソースを書いてコンパイル、ビルドするというのも可能ではありますが、やはり普段使っているPCのエディタでソースを書いて、あわよくばコンパイルまでやりたいと思うのは自然な考えでしょう。最新のGCCの最適化技術も堪能したいし、マルチコアによる並列コンパイルも魅力です。
ということでクロスコンパイルを行うために悪戦苦闘した結果をここに残したいと思います。
X68000のクロスコンパイル環境
X68000におけるクロスコンパイルのアプローチはいくつかありますが、私の環境では上手く動かないものが多かったため、それに関しては簡単な説明に留めます。
run68
X68000のコンソールエミュレーションを行うソフトウェアです。Cコンパイラのようなファイルの入出力やテキスト表示しか行わないソフトウェアの実行が可能です。様々なバージョン違いが公開されていますが、基本的にgithubによるソースコード配布となっており自分でビルドしなければなりません。
これが結構ハードルが高く、最近のコンパイラではチェックが厳しくてコンパイルが通らなかったりします。エラーになる部分を書き換えれば何とかなるケースもあります。
そうやって何とかビルドできたとしてもGCCを実行したらエラーで落ちたりするので諦めました。
xdev68k
https://github.com/yosshin4004/xdev68k
X68000ネイティブのGCCではなく、最新のGCCを使ってコンパイルした後、生成されたGAS形式のアセンブラソースをHAS形式に変換、その後はrun68を使ってHAS、HLKを実行するという流れになります。
コンパイルしてGAS形式のファイルを生成するところまでは上手くいったのですが、何故かGASからHASに変換するときに正しく変換されないケースがありアセンブルができませんでした。
調べた限りでは正規表現の文字列マッチングで正しい結果が返ってこないのが原因でしたが・・・正規表現自体が間違っているようには見えませんでした。
elf2x68k
https://github.com/yunkya2/elf2x68k
今回の本命です。xdev68kと同様にGCCを使いますが、GCCでELF形式の実行ファイルの生成まで行った後にX68000形式の実行ファイルに変換するという手法です。run68を使うこともなく、実行ファイルの変換もコンパイラドライバの中で完結しているため非常にシンプルな構成です。
ということで早速インストールしたいところですが、Windowsネイティブ環境では動かないため、MINGWやWSLといったWindowsで動くUNIX環境を構築する必要があります。
https://github.com/yosshin4004/xdev68k#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E6%89%8B%E9%A0%86
こちらの「1. Unix 互換環境のインストールと環境構築(作業時間 : 10 分程度)」に書かれている手順に従ってMSYSをインストール、UNIX開発環境を構築します。10GB程度のディスク容量が必要なので注意してください。
https://github.com/yunkya2/elf2x68k/blob/master/README-elf2x68k.md
次にelf2x68kをインストールします。ビルド済みバイナリが配布されているのでそれを使いたいところですが何故か動いてくれなかったので自力でビルドすることにします。
git clone --recursive https://github.com/yunkya2/elf2x68k.git
MSYS64のシェル内で上記のgit cloneコマンドを実行しローカルリポジトリを作成します。
make all
作成が終わったらmakeを実行してひたすら待ちます。どれくらい待つかというとマシンスペックにもよりますが、一晩では足りず丸一日くらいかかると思っておいた方がいいでしょう。
makeが終わるとm68k-xelf/bin/ に各種実行ファイルが配置されるのでここにパスを通します。WindowsのパスではなくMINGWのパスに追加することに注意が必要です。.bashrcの最終行あたりに追加してください。
export PATH="$PATH:/home/ユーザ名/elf2x68k/m68k-xelf/bin"
homeとelf2x68kの間はUNIXユーザ名なので自分の環境に合わせて書き換えてください。viを使ったことがないという人であればWindows環境のテキストエディタでも読み書きが可能です。MSYS64をC:\MSYS64にインストールしていた場合は.bashrcのパスはC:\MSYS64\home\ユーザ名\.bashrcになります。
書き換えた後、MINGWのプロンプトからsource .bashrcと打ち込むか、MINGWのウィンドウを新たに開くことでパスが追加された状態になります。
任意のディレクトリに移動してm68k-xelf-gccを実行したときに次のような表示になればコンパイラのビルドは完了したといっていいでしょう。
XXXXX@XXXXXXX-PC MINGW64 ~/elf2x68k
$ m68k-xelf-gcc
m68k-xelf-gcc.exe: fatal error: no input files
compilation terminated.
X68000の実行ファイルのビルドまで試してみましょう。
elf2x68kのローカルリポジトリにはサンプルが含まれているのでsample/hello/に移動してmakeを実行します。
cd sample/hello
make
ビルドが成功すれば同じディレクトリ内にhello.xが作られるので、これを実機、もしくはエミュレータに持っていきます。
そしてhello.xを実行して問題なく動けばX68000のクロスコンパイルに成功です。
SFXVIのクロス開発のためにはさらにあと少しだけ手間が必要なのでそれは次回に回したいと思います。