EXCEEDの同人ソフト開発日記という名の備忘録

趣味のゲームソフト開発人。プロなのかアマなのかは不明(不定)らしい。

任天堂のソフトはいつも予定通りに出てこないって言われるけど、
ソフト作りっていうのは、そういうもの。
ゲームソフトは、期限までにやれと言われて、徹夜したり死に物狂いでやったからといって、
期待通りのものにはならない。そういうふうにすると、
結局、チームは妥協しなければならなくなる。
妥協させられて、できたものは、粗くなってしまう。
ユーザーは目が肥えていますから、受け付けてもらえない

山内 薄

とりあえず、現実逃避LYNX いじりはキリがついたので、しばらく休止宣言。他にやることいっぱいあるし・・・サウンドとフォントの作者の方との連絡をまだ取っていないのと、ちょっとしたバグがあるので、それらを片付けてから、実験成果物(ねずみくんとポーカーしようよ)を公開することにしよう。しかし、よくよく考えると、純和製の ATARI LYNX用ゲームソフトって、コレが初めてじゃないだろうか?


ねずみくんとポーカーしようよ


元々、5年程前に J2ME MIDP1.0用(いわゆる携帯電話用 JAVAアプリ)として制作したポーカーゲーム(非公開)を、LYNX習作として移植したもので、LYNX 特有の機能を使用して制作しました。今回は習作ということで、オンメモリモジュールとして開発をしましたが、終盤は残りフリーエリアが 2KB を切るという冷や汗もので、結局ご褒美グラフィックを3枚から2枚に減らして、減らした1枚をエンディングに持っていきました。BGMも結局、1曲入れるのが限界で、データ長の関係で、松鶴と同じ曲を最採用することになりました。また、意外にも LYNX の描画速度は重く、60フレームを保つことは不可能に等しく、ダブルバッファ領域とシングルバッファ領域を用意して、描画枚数を極力減らしてなんとかゲームとして耐えうるフレームレートを保ちました。と・・・まあ、ウンチクはこの位にして、公開を急がねば!

メモ


SCB の謎

 SCB はリンクアレイチェーンテーブルとして機能するはずだが、
 ちょっとした問題が・・・。リンクアドレスは 16ビット長の絶対アドレスを
 指定するもので、0000.w を指定すると、リンクの終了とみなされるはずだが、
 HANDY のソースをみると、

  リンクアドレスの下位8ビットが0かどうかでリンクの終了を判別し、
  リンクアドレスは 16ビット長絶対アドレスと見なす。

 仕様となっているらしい。故に、SCB を動的生成する場合、誤って、
 リンクアドレスを 256バイトアラインに設定すると、
 そこで、スプライト転送が中断されてしまう。
 しかも、リンクを使用すると、いずれオーバーフローを起こしてしまう。
 HANDY のソースでは、1回のスプライト転送要求で、リンクを使用して
 一括表示きる最大のスプライト数は、4096個となっているが、
 ちゃんとターミネートしても、リンクで表示した個数分が滞積してしまい、
 いずれ 4096個オーバーとなって、システムダウンしてしまう。
 経験では、回避策として、リンクを使用せず(リンクアドレスを 0000.w 固定)
 毎 Int 必要なスプライト表示枚数分、スプライト転送要求を発行すれば大丈夫と
 いうことが分かったが、結局、スプライト枚数分、バスステータス監視ルーチンの
 オーバーヘッドが発生してしまうことになる。

 LYNX の技術ドキュメントを見ても、リンクアドレスは、下位8ビットのみ有効とか
 訳の分からないことが書いてあったりするので、もはや、どの情報(サンプルソース
 技術ドキュメント、HANDYの仕様)が正しいのかわからないので、あきらめて、
 「毎 Int 必要なスプライト表示枚数分、スプライト転送要求を発行」することで
 妥協することにした・・・・


■ ROMカートリッジ化

 256Kbytes のものであればビルドに成功した。
 やはり、BLL 付属のツール類のお世話になることになり、
 BLL 同梱の insert.asm を lyxass でコンパイルして出力された
 insert.o ファイルが必要となる。ちなみに、この insert.o ファイルは、
 1枚絵のスプライトデータが埋め込まれているだけのものであり、
 65c02 コードは全く含まれないものである。

 要約すると、insert.o とは、市販ゲームを立ち上げた時に、必ず一番最初に
 表示されるなんらかの静止画(主にコピーライト表示)のバイナリデータであり、
 LYNXというハードウェアでの決まりごととなっているので、
 この静止画(サイズは自由らしい)が、絶対に必要となる。

 そして、foo.txt というテキストファイルを用意し、バインドしたいファイルを
 記述していく。例えば、今回のポーカーであれば、こんな感じで2行書くだけである。

    insert.o
    poker.o

 1行目は必ずIPL静止画データファイルを指定しなくてはならず、
 2行目は例えるなら、autoexec.exe といった感じのバイナリファイルを指定し、
 3行目以降は、それら以外のROMデータとなる。
 もちろん3行目以降のデータは、プログラム内で任意にリードしない限り、
 アクセスすることはできない。
 ちなみに、ROMデータの呼び出し単位は1024バイト(2Mbit ROMでの固定長)という
 制約があるので、ビルド時にアライン境界を自動計算してくれる
 #ALIGN コマンドが存在する。

 (例)
    insert.o
    boot.o
    #ALIGN
    data1.bin
    data2.bin
    #ALIGN
    data3.bin

 そして、コマンドプロンプトから、以下の手順で該当ツールを動かせば完成 

 lynxer foo.txt
 make_lnx foo.lyx -b0 256K

 これで、foo.lnx というファイルが出来ているはず。ただし、この lnx は、
 HANDY 用のヘッダ情報付きイメージファイルとなるので、上記 lynxer が
 吐き出した foo.lyx を 2Mbit EPROM に焼けば実機で動かせる!

 ちなみに、どの市販ゲームも起動が遅いのは、起動時に、暗号化されたROMデータを
 展開するルーチンが働いているためと、ROMかRAMにプログラムその他を、
 ダウンロードする関係上起動が遅いようだ。
 上記 lynxer とは、その暗号展開ルーチンとIPL静止画をビルドするツールとなり、
 make_lnx は、HANDY が理解できるように、ROMイメージにヘッダを付加するための
 ツールとなる。

 なお、512Kbytes ROM をビルドする LYNXER4 というツールも同梱されているのだが、
 拡張子が .TTP となっている。なんかの専用ツールでアーカイブされているものと
 思われるが、これの展開方法が不明なので、いずれ調べなくてはなるまい。

 これは、ATARI ST 専用の実行ファイルなので、この LYNXER4.TTP を動かすためには、
 なんらかの方法で ATARI ST を動かさなければならない。
 なので、インターネットを駆使して、512KB ROM ビルドができる DOS版 Lynxer を
 探してみたが、見つからず・・・(5/17追記)


■ Link65.exe の限界

 cc65 用のオブジェクトリンカ。ワイルドカードの指定もできる優れものだが、
 あまり沢山のオブジェクトをリンクすると例外を発生させて落ちてしまうため、
 大量のスプライトを .obj 化してリンクする場合等は、ベタバイナリの状態で
 独自にバインドして bin2obj.exe で、.obj化し、オフセットテーブルを
 用意しないといけない。