「スプライト」タグアーカイブ

ネオジオのスプライトデータを覗いたり編集したりするツールを開発中


お久しぶりです。

ここ数日はプログラミングに勤しんでおりました。
といっても、パチスロのシミュレーションツールではなく、別なツールです。

その名も

「ネオジオのスプライトデータを覗いたり編集したりするツール」(仮名)

NeoSpriteDecoder.png

最近は”NeoDev”というツールキットがあるようで、(https://arcadedev.emuvibes.com/参照)、C言語を使ってネオジオのソフトを自作できるらしいのです。これには私もものすごく興味があるのですが、残念ながらグラフィックツールやサウンドツールが無い。コンバーターの類は発見できたのですが、直接編集できるツールがまだ無いっぽいのです。

そこで、自作することを決意しました。

ネオジオのROMカセットには、用途別にP-ROM、C-ROM、V-ROM、S-ROM、M-ROMが搭載されています。このうちP-ROMには68000CPUで実行されるゲームのプログラム、C-ROMにはゲームで利用されるスプライトデータが格納されています。

このツールはC-ROMに格納されているスプライトデータをのぞき見ることができます。
編集機能はまだ搭載していませんが、データの仕様はわかったのでいずれは編集機能もつけたいところであります。

しかしながら、スプライトデータの解析に丸一日かかってしまいました。
というのも、そのへんに転がっている資料を探せば見つかるだろう、と甘く見ていたのですが、どこにもC-ROMに関する資料がない! 
しょうがなく、わかっている情報から手探りで解析することに……。

ネオジオのスプライトは、スプライト一つにつき16色が使えますので、4BPPであります。つまり、1バイトに2ピクセル分の情報が格納されていることになります。
そして、ネオジオのスプライトひとつの基本サイズは16×16ピクセル。
すなわち、スプライト一つにつき128バイト、ということになります。

チャン・コーハンやアースクェイクのような巨大なキャラクターも、複数のスプライトを組み合わせて表現されています。それどころか、ゲームの背景画もスプライトです。

つまり、ゲーム中は大量のスプライトが画面で動き回っていることになります。
それでも、たくさんのスプライトを管理するとなるとプログラムが複雑になったり、処理落ちが発生するかもしれません。

しかしながらここがネオジオのすごいところで、ネオジオのVDPには「複数のスプライトを合体させてあたかも一つの巨大なスプライトとして扱う」機能が付いています。このおかげで格闘ゲームなどの開発がやりやすかったのでしょう。

さて、話をスプライトデータにもどしましょう。スプライトは4bppで表現されていることから、データはMSXのSCREEN 5みたいな形式で格納されているのだろう、と読んでいたのですが、甘かった。 

解析してみてわかったのですが、ネオジオのスプライトはものすごくひねくれた形式で格納されています。4bppなのは間違いないのですが、本当にヒネクレてます。MSXのSCREEN 5、というよりは、SCREEN 2が4層重なったような形式になっています。

そして、基本的に一つのスプライトは二つのROMにまたがって格納されています。

なぜこんな仕様なのかはわかりませんが、おそらく当時のVDPで巨大なスプライトを大量に動かすにはメモリインターリーブのようなことをせざるを得なかったのでは? と予想しています。

この辺で得たノウハウは、後々資料として公開しようかと。

それで、この数日間でとりあえずなんとか中身を覗くところまでできました。
しかもC#で書いたのにもかかわらずとても軽快に動作します。

あとはやっぱり編集機能を付けたいですね。

しっかし・・・プログラミングはそれほどではなかったけれども、解析はものすごく疲れた(汗