I was interested in trying to re-create the bug to troubleshoot it futher. I began attempting to run Battletoads Double Dragon in the NO$NES
emulator PlayChoice-10 mode. But I ended up encountering the following issue in both NO$NES's NES and PlayChoice-10 modes: After the initial pre-level cutscene is either bypassed or finishes natrually and the level is just about to start, the game freezes. In the PlayChoice-10 mode, it then resets the NES game after about 4 seconds. I suspect the NO$NES emulator isn't precise enough to run the Battletoads Double Dragon game correctly. But perhaps this issue has some similarities to the issue you are experiencing.
In the NO$NES everynes.htm document, there is a section about differences to be aware of when running NES games in a PlayChoice-10
. The following differences may be relevant: "NES NMI Disable The PC10 BIOS is watching the NES NMI signal. If the NES disables NMIs for a longer period (around 255 frames), then it'll treat the game to have locked up, and will terminate the game. [...] NES Pause / Timings [...] reportedly, the PC10 RGB-PPU timing isn't exactly same as NES NTSC-PPU timing (reportedly something to do with missing dots on some NTSC scanlines or so)."
When I investigated using debuggers and tools in NO$NES and Mesen, I discovered the following. The game displays the scores and health status bar at the top of the screen, then switches the graphics for the rest of the screen to display the level. The game sets up a sprite zero hit
to occur at the bottom right of the status bar area to tell when to switch the graphics. In the NO$NES emulator, the sprite zero hit never happens for some reason and the game remains stuck in a loop checking for the sprite zero hit. This loop also has the effect of preventing the NMI from firing, so in the PlayChoice-10 mode, the BIOS notices the NES game is frozen and aborts it after about 4 seconds.
If you are willing to test this, here are some mods that move or bypass the status bar sprite zero hit.
Like the mods earlier in this thread, the following mods are for the US version (PRG+CHR CRC32 CEB65B06)
NES file offset hex: original value hex → new value hex
A. Move the status bar sprite zero hit left 8 pixels.
32239: 9F → 9E
38062: FE → F6
Maybe moving the sprite zero hit position a little bit to the left may help the game work reliably on the PlayChoice-10? This mod moves the sprite zero hit position left 8 pixels.
B. Disable the status bar sprite zero hit check loop
1A3: F0 FB → EA EA
This mod will disable the loop that checks for the sprite zero hit at the bottom of the status bar. This will cause the bottom half of status bar to be missing, but it might be useful for testing purposes. If the game runs okay otherwise, then that suggests this sprite zero hit check loop is the cause of the problem.