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

ACA NeoGeo releases

Open TheNametag opened this issue 1 year ago • 18 comments

Is there any information on extracting the ROM files from the various Arcade Archives releases? They're available on consoles, phones (mostly), and on Windows via the Microsoft Store, but the latter are apps rather than executables.

TheNametag avatar Sep 04 '24 17:09 TheNametag

@TheNametag, people are working on it (if I remember correctly), but no one has been able to get them fully extracted.

DrAzathoth avatar Sep 07 '24 06:09 DrAzathoth

It's only the NeoGeo games that are released on Windows, right?

kjetil-f avatar Sep 10 '24 10:09 kjetil-f

It appears so, according to Wikipedia etc.

TheNametag avatar Sep 10 '24 16:09 TheNametag

Seems that it's possible to extracts the ROMs from certain releases, such as the Android version of The King of Fighters 2003: https://milkchoco.info/archives/8448

RealRelativeEase avatar Sep 12 '24 14:09 RealRelativeEase

I did some stuff around extracting from ACA NeoGeo releases here: https://github.com/ValadAmoleo/sf30ac-extractor

Unfortunately I don't have time to support or update this anymore. But the source might give you some hints if you want to try taking it further.

ValadAmoleo avatar Oct 02 '24 20:10 ValadAmoleo

I've been poking around in the apk for the android release of Aero Fighters 2, but I can't find any sign of the Neo Geo binaries. Either they are inside one of the Unity archives or they get downloaded separately.

stuckinstyx avatar Oct 03 '24 22:10 stuckinstyx

I've been poking around in the apk for the android release of Aero Fighters 2, but I can't find any sign of the Neo Geo binaries. Either they are inside one of the Unity archives or they get downloaded separately.

Looks like the ROM can be extracted, here's a blogpost with the instructions: https://milkchoco.info/archives/5936

RealRelativeEase avatar Oct 14 '24 21:10 RealRelativeEase

I've been poking around in the apk for the android release of Aero Fighters 2, but I can't find any sign of the Neo Geo binaries. Either they are inside one of the Unity archives or they get downloaded separately.

Looks like the ROM can be extracted, here's a blogpost with the instructions: https://milkchoco.info/archives/5936

Thanks, that worked. Google translate was a big help for this.

stuckinstyx avatar Oct 18 '24 23:10 stuckinstyx

It appears so, according to Wikipedia etc.

Is there a guide to extract ACA NeoGeo roms from Windows versions?

NeoArcade1 avatar Jan 07 '25 21:01 NeoArcade1

Guides exist, but they are not suitable for the people here.

beetooree avatar Jan 08 '25 02:01 beetooree

Would it be possible to extract a rom from a NGCD disc?

NeoArcade1 avatar Mar 18 '25 03:03 NeoArcade1

Would it be possible to extract a rom from a NGCD disc?

I haven't done that system, but RetroArch can dump the CD games of many consoles, including it. All you need is a CD or DVD drive connected.

retroguy42 avatar Mar 18 '25 04:03 retroguy42

Here's the file list for Puzzle Bobble when the disc is simply in the CD drive of the PC.

I did a search of the files and it looks as if others were thinking of the same thing down at the bottom of the page.

Image

Here's the dumped file list. lol

Image

NeoArcade1 avatar Mar 18 '25 04:03 NeoArcade1

@NeoArcade1, the NGCD is a completely separate platform than the Neo Geo. Sure, hardware-wise they are somewhat similar, but they still have many differences under the hood. What you’re asking to do is the equivalent of trying to extract a Sega Genesis/Mega Drive rom from a Sega CD disc.

Try emulating the NGCD rather than extracting from the disc!

DrAzathoth avatar Mar 18 '25 07:03 DrAzathoth

Maybe it was just that Puzzle Bobble was a unique situation and I happened to stumble across that. Here is the translation of the post from the link that was mentioned above.

I am planning to verify whether the NeoGeo version can be extracted from the NeoGeo CD version of Puzzle Bobble. The background music for the NeoGeoCD version of Puzzle Bobble is not converted to Audio tracks, so what do you think? and.

NeoGeoCD version file 1995/03/31 05:43 1,048,576 PUZZLE.PCM 1995/04/13 00:31 232,882 PB_PROG.PRG 1995/03/24 20:57 851,968 PB_CHR.SPR 1995/04/13 04:00 65,200 PUZZLE.Z80 1994/08/19 01:52 131,072 PB_FIX.FIX

d96-01.v3 1 MB 0840cbc4 → PUZZLE.PCM's 0x00000-0x0dffff (896KB) + 0x0e0000-0x0ffffff is filled with ff (128KB) matches d96-05.v4 512 KB CRC: 0a548948 → PUZZLE.PCM's 0x0e5300-0x0f97ff+ d96-02.c5 512 KB CRC: e89ad494 → Even byte for PB_CHR.SPR? , fill +0x6800-0x80000 with ff d96-03.c6 512 KB CRC: 4b42d7eb →Odd number byte for PB_CHR.SPR? , fill +0x6800-0x80000 with ff d96-04.s1 128 KB CRC: 9caae538 → Matches PB_FIX.FIX d96-06.m1 128 KB CRC: f424368a d96-07.ep1 512 KB CRC: 6102ca14 #

NeoArcade1 avatar Mar 18 '25 20:03 NeoArcade1

Interesting. I guess I’m not that surprised as almost every NGCD game is a direct port of a Neo Geo game to very similar hardware. Still, I would consider this the exception rather than the rule when it comes to NGCD ports as those usually rework elements such as sprite animations and music to make it work with the read speed of a disc drive.

DrAzathoth avatar Mar 18 '25 21:03 DrAzathoth

I tried to build a standalone Python script for the Switch version of Aero Fighters 2, based on @ValadAmoleo's split.py combined with @alhumbra's blogpost about the Android version to append a 512KB dummy file to 075-v2.v2 in order to create a ROM with the correct hashes. I also excluded the sfix file since it's not required for the ROM to work. The script assumes that all gz files are in the same folder as the script:

import os
import gzip
import zipfile

def rename_file(input_file, output_file):
    with gzip.open(input_file, 'rb') as f_in:
        data = f_in.read()
    with open(output_file, 'wb') as f_out:
        f_out.write(data)

def split_file(input_file, output_file, size):
    with gzip.open(input_file, 'rb') as f_in:
        data = f_in.read(size)
    with open(output_file, 'wb') as f_out:
        f_out.write(data)

def rename_file_offset(input_file, output_file, offset):
    with gzip.open(input_file, 'rb') as f_in:
        f_in.seek(offset)
        data = f_in.read()
    with open(output_file, 'wb') as f_out:
        f_out.write(data)

def append_ff_block(output_file, size):
    with open(output_file, 'ab') as f_out:
        f_out.write(b'\xFF' * size)

def join_files(input_files, output_file):
    with open(output_file, 'wb') as f_out:
        for file in input_files:
            with open(file, 'rb') as f_in:
                f_out.write(f_in.read())

def split_even_odd_block(input_file, output_pair, offset, chunk_size):
    with gzip.open(input_file, 'rb') as f:
        f.seek(offset)
        data = f.read(chunk_size)
        even = data[::2]
        odd = data[1::2]
        with open(output_pair[0], 'wb') as f_even:
            f_even.write(even)
        with open(output_pair[1], 'wb') as f_odd:
            f_odd.write(odd)

# === Main Execution ===
if __name__ == "__main__":
    files = {f: f for f in os.listdir() if f.endswith(".gz")}

    # Rename m1, s1
    if "m1.bin.gz" in files:
        rename_file("m1.bin.gz", "075-m1.m1")
    if "s1.bin.gz" in files:
        rename_file("s1.bin.gz", "075-s1.s1")

    # Split v1 and extract offset for v2
    if "v1.bin.gz" in files:
        split_file("v1.bin.gz", "075-v1.v1", 0x200000)
        rename_file_offset("v1.bin.gz", "075-v2.v2", 0x200000)
        append_ff_block("075-v2.v2", 0x80000)  # Append 512KB of 0xFF

    # Handle p1 reordering
    if "p1.bin.gz" in files:
        split_file("p1.bin.gz", "075-p1.p1b", 0x100000)
        rename_file_offset("p1.bin.gz", "075-p1.p1a", 0x100000)
        join_files(["075-p1.p1a", "075-p1.p1b"], "075-p1.p1")
        os.remove("075-p1.p1a")
        os.remove("075-p1.p1b")

    # Handle c1 even/odd splitting with 2MB output files
    if "c1.bin.gz" in files:
        split_even_odd_block("c1.bin.gz", ("075-c1.c1", "075-c2.c2"), 0x000000, 0x400000)
        split_even_odd_block("c1.bin.gz", ("075-c3.c3", "075-c4.c4"), 0x400000, 0x400000)

    # Compress selected files into sonicwi2.zip
    output_files = [
        "075-p1.p1", "075-s1.s1", "075-m1.m1",
        "075-v1.v1", "075-v2.v2",
        "075-c1.c1", "075-c2.c2", "075-c3.c3", "075-c4.c4"
    ]

    with zipfile.ZipFile("sonicwi2.zip", "w", compression=zipfile.ZIP_DEFLATED) as zipf:
        for file in output_files:
            if os.path.exists(file):
                zipf.write(file)
                os.remove(file)

    print("All files processed, archived into sonicwi2.zip, and cleaned up.")

RealRelativeEase avatar Aug 07 '25 22:08 RealRelativeEase

I've been trying to extract the Switch version of ACA Neo Geo Strikers 1945 Plus. v1.bin.gz splits properly into four files with individual sizes of 4MB, matching the correct hashes for 254-v1.v1 through 254-v4.v4. p1.bin.gz has a size of 5MB when decompressed, cutting out the first 1MB as 254-p1.p1 and the remaining 4MB as 254-p2.sp2 will once again yield files with the correct hashes. I'm having trouble with the remaining files, s1.bin.gz and m1.bin.gz seem to have the correct file sizes as 254-sm1.sm1 and 254-m1.m1, but the hashes don't match. Just splitting the C-ROM like with Aero Fighters 2 doesn't seem to work either.

RealRelativeEase avatar Aug 09 '25 22:08 RealRelativeEase