I did the Nerdy Nights chapter on MMC1 and read the corresponding wiki articles:
https://wiki.nesdev.com/w/index.php/MMC1
https://wiki.nesdev.com/w/index.php/Programming_MMC1
So far, everything works fine.
But I still have some questions about it:
1. About the fact that things like switching the bank need several consecutive writes, the wiki says:
I actually have such a situation: If the game logic is still in the middle of running and the NMI starts, it immediately stops again, but not before calling the sound library, so that the music doesn't lag. In this case, it sets the bank as well.If an NMI or IRQ can interrupt a series of writes, it is not easy to know what state the serial register was in before the interruption.
So, is there even a way to reset only one specific register? I thought that setting a 1 in the highest bit of $8000-$FFFF will reset the whole mapper.
Does that mean whenever I switch the bank, I also have to set the screen mirroring again?
2. What happens if writing to a register, for example $8000, is interrupted by the NMI and the NMI then writes to $E000? Do the writes to $8000 and $E000 clash with each other as well or can they be mixed?
I.e. if setting screen mirroring is interrupted by setting the bank, do I have to reset and try again the screen mirroring?
3. The wiki suggests that you should mirror the start of the reset function as well as the three vectors to all banks. Because there are some MMC1 revisions that don't guarantee that the last bank is indeed treated as the fixed bank at startup, so any bank could be the active bank at the beginning.
Is this really something I need to consider or can I just ensure that I use an MMC1 version where the last bank is always guaranteed to be active?
In how far can you rely on this and in how far is this more a thing that you should take care of regardless?
Can I simply declare that my game has to run on an MMC1 SNROM-05 board and that's it? Or getting a specific revision something that you shouldn't rely on?
4. I've read somewhere that you should disable battery support when values are not written to WRAM. Am I remembering this correctly or do I confuse something here?