The TZX of side 1 of the original release of Gryzor (sha256 a37485e846a5a7b3c70401b9fc198ebd479c857a8e2c25b618043789edbaf643) fails to load if tape traps are active. It loads successfully with --no-traps.
(This may not be a tape traps issue - if you manually start the tape after the first block has loaded, it all works so it may be an issue with the detect loaders functionality being confused)
I managed to fix this accidentally while working on the fix for [bugs:#431], so after having a quick look at this game here's what I think it happens:
After the basic code there's an 8643 byte loader that ends with a 7ms pause and is followed by a list of pulses of different lenghts (I suppose that this is a copy protection mechanism).
Back to the 8643 byte loader: trap_load_block() puts the code in memory and updates all registers but doesn't touch the value of tape_microphone.
Since libspectrum doesn't change the tape signal level during the 7ms pause, what seems to happen is that the Gryzor loader expects an edge before the copy protection pulses, but that edge never arrives.
You can verify this by adding a simple tape_microphone=1; at the end of tape_load_trap(). That's enough to make Gryzor load.
Related
Bugs: #431