Having extracted both the original translation's game ROM file as well as the .SAV file from the Collection, I can now post my updated analysis with certainty.
The correct ROM file of the translated English version of "Kid Dracula" Famicom, that debuted with the Castlevania Collection, can be found in the Collection's directory tree as "system\roms\kid-dracula.nes". The .NES file with header has a CRC32 of 68047B59. There are 128 KiB of PRG-ROM (CRC32 C24B972C) and 128 KiB of CHR-ROM (CRC32 2BC4EF48), for a total of 256 KiB of ROM data without header (CRC32: 64AFD592).
However, this ROM file does not contain all the game needs to run. Because the translators could not fit everything into 128 KiB of PRG-ROM, they abused the CPU $6000-$7FFF range to store additional translation data. The game code reads from this address any time that text is printed, yet never writes anything there. The correct data is instead loaded from an SRAM .SAV file, which is why the file has the "battery" header bit set. The .SAV file does not exist directly in the Collection's directory tree, but is created when the game is launched by the Collection's menu scripting engine. The script that does this lies in the path "073\script\title_standalone.nut", starting in line 107 ("m_sram_data ="). This correct SRAM file has a size of 8,192 bytes (as usual) and a CRC32 of ABA5001B.
The correct "Kid Dracula" NES file, as extracted from the Collection with the CRC32s listed above, will run perfectly when the correct SRAM file is provided to the emulator. Without that SRAM file, the game cannot function.
Now, for the No-Intro .NES ROMs.
There is a 384 KiB .NES ROM file (headerless CRC32: E3A1CE4D) with 256 KiB of PRG-ROM (CRC32: 9DFE63BB) and 128 KiB of CHR-ROM (2BC4EF48). This means that the PRG-ROM is twice as large as it should be. The first half matches the PRG-ROM found in the correct ROM file, as extracted from the Collection. The second half is the same with two changes:
- It replaces the first 4,626 bytes with SRAM data that would be copied to $6000.
- It replaces the unused space in the fixed 8 KiB bank at PRG-ROM offset 1FFA8/3FFA8 with code that performs said copying to SRAM, and modifies four bytes at PRG-ROM offset 1FCC2/3FCC2 with a jump to that position.
With these changes, the game can now run without the SRAM file provided to the emulator. The ROM had to be doubled in size because there was no space to put the 4,626 bytes of SRAM data in there. This changed, or "SRAM-initialize fix" ROM, is in No-Intro. As "redunka" has pointed out, it still has one problem: The SRAM data in this file was somewhat incomplete, leading to a glitch in the ending credits. A second 384 KiB .NES ROM file (headerless CRC32: 166C2418) was posted by "farmerbb" in the Steam forums thread linked to by "redunka", which corrects that glitch. It is therefore an "SRAM-initialize fix, fixed ending".
Finally, there is a "trimmed" ROM floating around the internet that is 256 KiB in size, 128 KiB PRG (CRC32: D2955961) plus 128 KiB CHR, headerless CRC32 927DD49F. The trimming it did was to discard the first 128 KiB of PRG-ROM of the full "SRAM-initialize fix" and only keep the second half. This works for a while, until the original PRG-ROM bank 0 is accessed, at which point the game will behave erratically. I don't know when exactly this is, but in any case, this ROM can only be considered "bad".
To summarize:
Code: Select all
PRG-ROM Size&CRC CHR-ROM Size&CRC Headerless Size&CRC Meaning
128 KiB, C24B972C 128 KiB, 2BC4EF48 256 KiB, 64AFD592 Original ROM, requires SRAM file (8 KiB, CRC32 ABA5001B) to function ("[!]")
256 KiB, 9DFE63BB 128 KiB, 2BC4EF48 384 KiB, E3A1CE4D SRAM initialize fix with glitched ending ("[f1]")
256 KiB, CDC2B349 128 KiB, 2BC4EF48 384 KiB, 166C2418 SRAM initialize fix with fixed ending ("[f2]")
128 KiB, D2955961 128 KiB, 2BC4EF48 256 KiB, 927DD49F "Trimmed" SRAM initialize fix with glitched ending, bad! ("[f1][b]")
I'm tired.
Edit:typo.