RED-Project icon indicating copy to clipboard operation
RED-Project copied to clipboard

Windjammers / Flying Power Disc (DotEmu re-release)

Open RealRelativeEase opened this issue 5 months ago • 3 comments

I've taken a look at a Switch dump of Windjammers / Flying Power Disc. Unfortunately, this isn't as easy as some of DotEmu's other Neo Geo titles, since this one was developed by Blitworks and handles things in a different way. While there's a toggle to switch between MVS and Neo Geo CD soundtracks in-game, I'm still convinced that it's ROM-based and that it should be possible to extract a playable ROM.

Using Spudlow as a reference, two of the files seem to match the database as is. wjammers_game_z80 has the same hashes as 065-m1.m1, while wjammers_zoom_table matches 000-lo.lo.

But from here on, things get a little dicey. wjammers_game_m68k should be 065-p1.p1, since they both have a file size of 1MB, but the hashes don't match. I'm tempted to say that wjammers_game_sfix is 065-s1.s1 and that wjammers_bios_m68k is sm1.sm1 due to the region entries on spudlow. Which leaves us with audio and sprites. Splitting wjammers_adpcm into four files, each with a size of 1MB, results in three files with matching hashes for 065-v1.v1, 065-v2.v2 and 065-v3.v3. So I guess the audio has been altered for this release, resulting in a mismatch for 065-v4.v4. Splitting wjammers_tiles into four files results in all four files being a mismatch for 065-c1.c1 through 065-c4.c4.

I've attempted to manipulate the CRC32 to get the .zip to boot in an emulator, and you can probably guess how that turned out. Image Sprites are a mess, but the audio seemed fine to me.

So if anyone's got an idea what I'm missing or a general knowledge of Neo Geo ROMs, feel free to chime in.

Edit: I solved it, thanks to the author of this blog and the tools they provided. You'll need answap, tileswap, tiles2crom and romcutter.

I tried to make my own switch_WINDJAMMERS.bat by modifying one of the batch files released by the author of the post:

echo off
romcutter.exe wjammers_adpcm 065-v1.v1 0 100000
romcutter.exe wjammers_adpcm 065-v2.v2 100000 100000
romcutter.exe wjammers_adpcm 065-v3.v3 200000 100000
romcutter.exe wjammers_adpcm 065-v4.v4 300000 100000
answap wjammers_game_sfix 065-s1.s1
copy wjammers_game_z80 065-m1.m1
tileswap wjammers_tiles wjammers_tiles.swp
echo Memo : 065-c1.c1 - 065-c4.c4 (ALL 0x100000 bytes).
tiles2crom.exe wjammers_tiles.swp
pause
echo on

Here's the cheat sheet for the C-ROM:

WINDJAMMERS
 065-c1.c1 StartAddr:0      Odd_or_Even:0 SplitSize:100000
 065-c2.c2 StartAddr:0      Odd_or_Even:1 SplitSize:100000
 065-c3.c3 StartAddr:100000 Odd_or_Even:0 SplitSize:100000
 065-c4.c4 StartAddr:100000 Odd_or_Even:1 SplitSize:100000

The files generated by this procedure match the required hashes for the ROM. However, the remaining files still won't match and I'm not sure how to properly fix those. So I ended up editing their CRC32 hashes and took another shot at zipping the files and booting them in an emulator.

Image

Much better. This is technically cheating, since I ended up manipulating some of the CRC32 hashes, but I haven't noticed any issues as a result. I'm also not sure whether the ROM has been edited in any way by Blitworks or DotEmu.

Another edit:

Thanks to @alhumbra's analysis, it's possible to create a ROM with correct hashes.

  1. Create a Powershell script named dummy_ff_512k.ps1 containing these instructions:
#dummy_ff_512k.ps1

# 任意の名前
$filePath = "dummy_ff_512k.tmp"
# 任意の容量
$fileSize = 512kb
# FFで埋める
$fillByte = 0xFF

#書込
$fileStream = New-Object IO.FileStream($filePath, [IO.FileMode]::Create)
$byteArray = New-Object byte[] $fileSize
for ($i = 0; $i -lt $fileSize; $i++) {
    $byteArray[$i] = $fillByte
}
$fileStream.Write($byteArray, 0, $byteArray.Length)
$fileStream.Close()
  1. Run the Powershell script to create the dummy file, then create a batch file with these instructions:
echo off
romcutter.exe wjammers_adpcm 065-v1.v1 0 100000
romcutter.exe wjammers_adpcm 065-v2.v2 100000 100000
romcutter.exe wjammers_adpcm 065-v3.v3 200000 100000
romcutter.exe wjammers_adpcm 065-v4.tmp 300000 80000
copy /b 065-v4.tmp+dummy_ff_512k.tmp 065-v4.v4
answap wjammers_game_sfix 065-s1.s1
copy wjammers_game_z80 065-m1.m1
romcutter.exe wjammers_game_m68k p1.tmp 0 0x80000
copy /b p1.tmp+dummy_ff_512k.tmp 065-p1.p1
tileswap wjammers_tiles wjammers_tiles.swp
echo Memo : 065-c1.c1 - 065-c4.c4 (ALL 0x100000 bytes).
tiles2crom.exe wjammers_tiles.swp
pause
echo on
  1. Run the batch file and use these for the C-ROM:
WINDJAMMERS
 065-c1.c1 StartAddr:0      Odd_or_Even:0 SplitSize:100000
 065-c2.c2 StartAddr:0      Odd_or_Even:1 SplitSize:100000
 065-c3.c3 StartAddr:100000 Odd_or_Even:0 SplitSize:100000
 065-c4.c4 StartAddr:100000 Odd_or_Even:1 SplitSize:100000
  1. This should result in all files having the correct hashes. Compress them into a folder named wjammers.zip and you're good to go.

RealRelativeEase avatar Jul 29 '25 22:07 RealRelativeEase

Hi, @RealRelativeEase I previously conducted an analysis of the PSVITA version and shared the information in Japanese. In the PSVITA version, the sizes of P1 and V4 are reduced, but I was able to obtain a valid CRC by appending a 512KB FF-filled dummy file to the end.

I hope this serves as a useful reference.

alhumbra avatar Aug 02 '25 09:08 alhumbra

Hi, @alhumbra

thank you for sharing your analysis! Appending those 512KB dummy segments worked for the files from the Switch version as well. Do you mind if I amend my post with your findings?

RealRelativeEase avatar Aug 02 '25 15:08 RealRelativeEase

No problem, Feel free to write anything you want. I wish you the best.

alhumbra avatar Aug 03 '25 01:08 alhumbra