・FZCCの初代FZ(System16版)のデータをエミュレーターで動かすには 1.データをROM単位で分割して、実機から吸い出した時と同じ状態にする 2.エミュレーターのソースをいじってファイルを直接読めるようにする ここでは1.の方法でやってみます。 基板と吸い出し環境があれば、データを比較しながら調べられるのですが、 どちらもないのでMAMEのソースとCRCを頼りに調べてみました。 試行錯誤の経緯を以下記載…しても意味ないのでとりあえず手順を わかりにくい文章で記載します。 ※以降、FZCCのBIN.PAKをツールで展開済みであることを前提に話を進めます。 [関連ファイル] fz1_*.p00→プログラム(バージョン違いで4ファイル) fantasyz.scr→BG fantasyz.obj→スプライト fanta_jp.snd→サウンドROM(JP) fanta_us.snd→サウンドROM(US) ------------------------------------------------------------------------------- 参考:M.A.M.E.ソースのROM定義部分 /************************************************************************************************************************** ************************************************************************************************************************** ************************************************************************************************************************** Fantasy Zone, Sega System 16A CPU: 68000 */ ROM_START( fantzone ) ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "epr-7385a.43", 0x000000, 0x8000, CRC(4091af42) SHA1(1d4fdd32db9f75e5ccaab5766a50249ad71a60af) ) ROM_LOAD16_BYTE( "epr-7382a.26", 0x000001, 0x8000, CRC(77d67bfd) SHA1(886ce4c2d779cedd81f85737ef55fce3c94baa18) ) ROM_LOAD16_BYTE( "epr-7386a.42", 0x010000, 0x8000, CRC(b0a67cd0) SHA1(2e2bf2b7306fc567f7d13f89977543b368c19027) ) ROM_LOAD16_BYTE( "epr-7383a.25", 0x010001, 0x8000, CRC(5f79b2a9) SHA1(de3125bbd0a126fc5a67ba3134cd3f4608ebdfce) ) ROM_LOAD16_BYTE( "epr-7387.41", 0x020000, 0x8000, CRC(0acd335d) SHA1(f39566a2069eefa7682c57c6521ea7a328738d06) ) ROM_LOAD16_BYTE( "epr-7384.24", 0x020001, 0x8000, CRC(fd909341) SHA1(2f1e01eb7d7b330c9c0dd98e5f8ed4973f0e93fb) ) ROM_REGION( 0x18000, "gfx1", 0 ) /* tiles */ ROM_LOAD( "epr-7388.95", 0x00000, 0x08000, CRC(8eb02f6b) SHA1(80511b944b57541669010bd5a0ca52bc98eabd62) ) ROM_LOAD( "epr-7389.94", 0x08000, 0x08000, CRC(2f4f71b8) SHA1(ceb39e95cd43904b8e4f89c7227491e139fb3ca6) ) ROM_LOAD( "epr-7390.93", 0x10000, 0x08000, CRC(d90609c6) SHA1(4232f6ecb21f242c0c8d81e06b88bc742668609f) ) ROM_REGION16_BE( 0x30000, "gfx2", 0 ) /* sprites */ ROM_LOAD16_BYTE( "epr-7392.10", 0x00001, 0x8000, CRC(5bb7c8b6) SHA1(eaa0ed63ac4f66ee285757e842bdd7b005292600) ) ROM_LOAD16_BYTE( "epr-7396.11", 0x00000, 0x8000, CRC(74ae4b57) SHA1(1f24b1faea765994b85f0e7ac8e944c8da22103f) ) ROM_LOAD16_BYTE( "epr-7393.17", 0x10001, 0x8000, CRC(14fc7e82) SHA1(ca7caca989a3577dd30ad4f66b0fcce712a454ef) ) ROM_LOAD16_BYTE( "epr-7397.18", 0x10000, 0x8000, CRC(e05a1e25) SHA1(9691d9f0763b7483ee6912437902f22ab4b78a05) ) ROM_LOAD16_BYTE( "epr-7394.23", 0x20001, 0x8000, CRC(531ca13f) SHA1(19e68bc515f6021e1145cff4f3f0e083839ee8f3) ) ROM_LOAD16_BYTE( "epr-7398.24", 0x20000, 0x8000, CRC(68807b49) SHA1(0a189da8cdd2090e76d6d06c55b478abce60542d) ) ROM_REGION( 0x10000, "soundcpu", 0 ) /* sound CPU */ ROM_LOAD( "epr-7535a.12", 0x0000, 0x8000, CRC(bc1374fa) SHA1(ed2c87ae024dc251e175239f1bccc728fc096548) ) ROM_END /************************************************************************************************************************** Fantasy Zone, Sega System 16A CPU: 68000 */ ROM_START( fantzone1 ) ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "epr-7385.43", 0x000000, 0x8000, CRC(5cb64450) SHA1(5831405359975dd7d8c6614b20fd9b18a5d6410d) ) ROM_LOAD16_BYTE( "epr-7382.26", 0x000001, 0x8000, CRC(3fda7416) SHA1(91f34cc8afb4ad8bc783c31d25781a1359c44cfe) ) ROM_LOAD16_BYTE( "epr-7386.42", 0x010000, 0x8000, CRC(15810ace) SHA1(e61a258ab6601d359f6ad1f37a2b2801bf777d26) ) ROM_LOAD16_BYTE( "epr-7383.25", 0x010001, 0x8000, CRC(a001e10a) SHA1(04ebb012b10817db36997d0ee877104d512decf8) ) ROM_LOAD16_BYTE( "epr-7387.41", 0x020000, 0x8000, CRC(0acd335d) SHA1(f39566a2069eefa7682c57c6521ea7a328738d06) ) ROM_LOAD16_BYTE( "epr-7384.24", 0x020001, 0x8000, CRC(fd909341) SHA1(2f1e01eb7d7b330c9c0dd98e5f8ed4973f0e93fb) ) ROM_REGION( 0x18000, "gfx1", 0 ) /* tiles */ ROM_LOAD( "epr-7388.95", 0x00000, 0x08000, CRC(8eb02f6b) SHA1(80511b944b57541669010bd5a0ca52bc98eabd62) ) ROM_LOAD( "epr-7389.94", 0x08000, 0x08000, CRC(2f4f71b8) SHA1(ceb39e95cd43904b8e4f89c7227491e139fb3ca6) ) ROM_LOAD( "epr-7390.93", 0x10000, 0x08000, CRC(d90609c6) SHA1(4232f6ecb21f242c0c8d81e06b88bc742668609f) ) ROM_REGION16_BE( 0x30000, "gfx2", 0 ) /* sprites */ ROM_LOAD16_BYTE( "epr-7392.10", 0x00001, 0x8000, CRC(5bb7c8b6) SHA1(eaa0ed63ac4f66ee285757e842bdd7b005292600) ) ROM_LOAD16_BYTE( "epr-7396.11", 0x00000, 0x8000, CRC(74ae4b57) SHA1(1f24b1faea765994b85f0e7ac8e944c8da22103f) ) ROM_LOAD16_BYTE( "epr-7393.17", 0x10001, 0x8000, CRC(14fc7e82) SHA1(ca7caca989a3577dd30ad4f66b0fcce712a454ef) ) ROM_LOAD16_BYTE( "epr-7397.18", 0x10000, 0x8000, CRC(e05a1e25) SHA1(9691d9f0763b7483ee6912437902f22ab4b78a05) ) ROM_LOAD16_BYTE( "epr-7394.23", 0x20001, 0x8000, CRC(531ca13f) SHA1(19e68bc515f6021e1145cff4f3f0e083839ee8f3) ) ROM_LOAD16_BYTE( "epr-7398.24", 0x20000, 0x8000, CRC(68807b49) SHA1(0a189da8cdd2090e76d6d06c55b478abce60542d) ) ROM_REGION( 0x10000, "soundcpu", 0 ) /* sound CPU */ ROM_LOAD( "epr-7535.12", 0x0000, 0x8000, CRC(0cb2126a) SHA1(42b18a81bed58ef59eaad929007eef89ad273dbb) ) ROM_END ------------------------------------------------------------------------------- とりあえず日本版の初期版?(下側の"fantzone1"の方)に合わせて分割することにします。 まずCPU(プログラム)ですが、fz1_07382.p00が対応ファイルです。 ROM_LOAD16_BYTEは、例えばROMの内容が01 02 03 04の場合は 01 00 02 00 03 00 04 00..のように書き込み先を1byte飛ばしながら読み込むということのようです。 また、エンディアンの関係か、2byte単位で順序が逆になっているみたいです。 これらをまとめると、  epr-7385.43 ← fz1_07382.p00 の $00001、$00003、...、$0FFFF  epr-7382.26 ← fz1_07382.p00 の $00000、$00002、...、$0FFFE  epr-7386.42 ← fz1_07382.p00 の $10001、$10003、...、$1FFFF  epr-7383.25 ← fz1_07382.p00 の $10000、$10002、...、$1FFFE  epr-7387.41 ← fz1_07382.p00 の $20001、$20003、...、$2FFFF  epr-7384.24 ← fz1_07382.p00 の $20000、$20002、...、$2FFFE のように、fz1_07382.p00の特定位置から1byte飛ばしで読み込んだ$8000byteのデータが 各ROMファイルになります。 次はタイル(BG)ですが、対応ファイルはfantasyz.scrです。 これを3つのファイルに分割します。 これはそれぞれ1byteにつき、fantasyz.scrの4byte単位での特定bitの状態を表すものなのですが、 文章での説明が面倒なので以下の表(?)を元に推測してください。 (もしくは、後ろにあるソースを見てください) PC-98などのようなプレーン式VRAMを知っていれば理解しやすいかと思います tile 1byte×3ファイルでscrファイル4byte それぞれ各byteの特定ビットに対応 fantasyz.scr → 11 11 11 11 11 11 11 13 11 11 11 34 11 11 13 44 -------------------------------------------------------------------------------------- epr-7388.95 → FF FF FE FC (→ 11 11 11 11 11 11 11 11 11 11 11 10 11 11 11 00) bit0 epr-7389.94 → 00 01 02 04 (→ 00 00 00 00 00 00 00 02 00 00 00 20 00 00 02 00) bit1 epr-7390.93 → 00 00 01 03 (→ 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 44) bit2 スプライトはfantasyz.objです。 CPUと同様に1byte飛ばしで読み込んで分割するのですが、CPUの部分であった「2byte単位での順序が逆」はありません。 つまりソース通りに  epr-7392.10 ← fantasyz.obj の $00001、$00003、...、$FFFF  epr-7396.11 ← fantasyz.obj の $00000、$00002、...、$FFFE  epr-7393.17 ← fantasyz.obj の $10001、$10003、...、$1FFFF  (以下省略) で読み込みんで分割します。 サウンドはfanta_jp.sndで、これは手を加える必要はありません。 つまり、fanta_jp.snd=epr-7535.12です。 以上の手順で得られたファイルでCRCの一致、およびMAMEでの動作を確認しています。 一切手をつけてないですが、System E版FZ2も同様の手順で出来るかもしれません。 なお、System16C版FZ2ですが、これはSystem16B基板にメモリを増設してあり、 (FZCCの説明書によればワークメモリが256KB、Z80は8KBとの記載があります。その他の変更があるかは不明) エミュレーターのSystem16Bのソースを元に、メモリサイズ変更などの修正・定義追加をすれば エミュレーターで動くかもしれません。 実際のSystem16B基板に上記の改造をして、上記を参考にして各ファイルを分割して、ROM焼きをすれば 実機でも動くのかも? ちなみにfz2_s16c.obj、fz2_s16c.scrの他に画像データと思われるのがfz2_s16c.spr、fz2_s16c.bgですが、 パッと見の判断なので断定はできませんが、 fz2_s16c.spr→fz2_s16c.objを2byte単位での並び順を逆にしただけ? fz2_s16c.bg→128KB単位で分割すればfz2_s16c.scrを上記手順で分割したのと同じ結果? かもしれないです。 あと、気になるのがfz1_s16bと名前がついたファイルですが、 fz1_s16b_ta.*というファイルがあるので、名前からして隠しのタイムアタックモード用に System16B基板仕様で動くように移植(?)・改造をしてあるのだと思われます。 (追記) タイムアタックの方はちゃんと動くようなのですが、 taとついていない方は上記方法でやってもROMエラーが出る上に 一部グラフィックがおかしいようです。 (処理方法が違う、もしくはPAKファイルからの展開の時点で間違っている?) おまけ:fz1_07382.p00、fantasyz.obj、fantasyz.scrを分割するHSPスクリプト 単純なスクリプトなのでEXE配布の予定はなし #module #deffunc writedata str filename,int ofs,int size sdim buf2,size repeat size : poke buf2,cnt,peek(filedat@,cnt*2+ofs) : loop bsave ""+filename,buf2,size return #global ;//cpu notesel filedat noteload "fz1_07382.p00" : filesize = strsize writedata "epr-7385.43", $000001, $8000 writedata "epr-7382.26", $000000, $8000 writedata "epr-7386.42", $010001, $8000 writedata "epr-7383.25", $010000, $8000 writedata "epr-7387.41", $020001, $8000 writedata "epr-7384.24", $020000, $8000 ;//sprite noteload "fantasyz.obj" : filesize = strsize writedata "epr-7392.10", $00001, $8000 writedata "epr-7396.11", $00000, $8000 writedata "epr-7393.17", $10001, $8000 writedata "epr-7397.18", $10000, $8000 writedata "epr-7394.23", $20001, $8000 writedata "epr-7398.24", $20000, $8000 ;//bg noteload "fantasyz.scr" : filesize = strsize sdim outbuf,filesize/4,3 repeat filesize/4 ofs1 = cnt*4 : ofs2 = cnt tmp = 0 : repeat 4 : tmp = (tmp<<8)|peek(filedat,ofs1+cnt) : loop dim bytebuf,3 repeat 8 tmp2 = tmp&($70000000>>(cnt*4)) : tmp2 = tmp2>>(28-cnt*4) ;特定位置の4bitを取り出す tmp3 = $80>>cnt if (tmp2&1)!0 : bytebuf.0 = bytebuf.0 | tmp3 if (tmp2&2)!0 : bytebuf.1 = bytebuf.1 | tmp3 if (tmp2&4)!0 : bytebuf.2 = bytebuf.2 | tmp3 loop repeat 3 : poke outbuf.cnt,ofs2,bytebuf.cnt : loop loop bsave "epr-7388.95", outbuf.0, filesize/4 bsave "epr-7389.94", outbuf.1, filesize/4 bsave "epr-7390.93", outbuf.2, filesize/4 ;//sound noteload "fanta_jp.snd" : filesize = strsize bsave "epr-7535.12",filedat,filesize end