ClassicHasClass
Veteran Member
The Magic Voice doesn't assert any lines when the machine is turned on - it only does so when it sees the machine going for reset vectors, at which point it pretends to be an Ultimax cartridge. Ordinarily it would then take over the 64 with its own reset vector, copy its code to $c000, and reassert BASIC and Kernal ROM to finish startup. However, the machine is already in 128 mode by this point because the Z80 didn't see any lines asserted. My understanding is this ends up in an unhandled situation between the PLA and the MMU. Even if the 8502 saw EXROM in the second check at $e242, it would never end up running the Magic Voice's initialization routine, so the cartridge would still fail.Afaik those lines "only" affect the 8502 while in 64 mode, not in 128 mode, so at least in theory it should be possible to do this even in 8502 C128 mode. But then maybe it would had been harder to set up the 8502 in a way that ensures that after writing to the 64/128 mode I/O thing ends up doing an indirect jump to the reset vector location, without altering bank 0 memory contents (that I think the C128 doesn't touch if you hold C= or a cart pulls GAME/EXROM at boot).
I.E. to me it feels like the Z80 more helps with switching to C64 mode as cleanly as possible rather than being particularly helpful for the GAME/EXROM cartridge port signals. (I would think that code that reads those as inports in C128 mode, determines that at least one is low, and jumps to the code switching to C64 mode, would execute similarly fast either on the 8502 or Z80).
By having the Commodore key down, the Z80 has already forced the machine to 64 mode before the Magic Voice sees the 8502 start. The 8502 then goes for vectors in the correct configuration and everything works. I guess this is a sort of race condition, but not really one due to the way they're clocked AIUI.