So far I have regarded the PRG-NVRAM field always as a "size of the save file" field, and so does the Nintendulator main executable. Changing this definition to mean
additional NVRAM would be a major change in that intuition, and would lead to MMC6, Mapper 80, 82 and several Mapper 19 games having the battery flag set with PRG-NVRAM value of "0", which even in the knowledge of its meaning bothers me greatly. It would also break compatibility with existing NES 2.0 emulator implementations that do assume that PRG-NVRAM also include internal RAM.
I'm opposed to excessive submapper use because you would be using the submapper to reflect something that the other fields are already supposed to reflect, but cannot because of the stupid decision (sorry for being blunt) to define the fields as powers of two. My proposal of using the previously reserved value 0xF as an "Other", with the mapper number providing the actual oddball size, would merely rectify that mistake for the rare cases where it's needed. It would keep compability with existing NES 2.0 emulator implementations for all games that do not use oddball sizes, because value 0xF has always been "special".
Sour is right in theory that one would have to use submappers anyway if there were more than one oddball size per mapper number. But in practice, there is no reason to believe that there is. So far, no unlicensed game is known that uses oddball NVRAM sizes at all, and only three mappers --- 19, 82 and 157, are known to use one oddball size per mapper number. And in the unlikely case that one turns up, we can go back to the submapper idea for those few cases after all.
Still yet another proposal could be to go for the 0xF value as "Other", but instead of then deducing the actual oddball size from the (sub)mapper number, one could define another header field to specify the exact size in some way. For example, PRG-NVRAM value 0xF could mean that the PRG-RAM value nibble no longer specifies the power-of two non-battery-backed RAM size, but one of sixteen pre-defined RAM-NVRAM-configurations having oddball sizes, e.g. 0x0:=8320 bytes NVRAM/0 RAM, 0x1:=5120 bytes NVRAM/0 RAM, 0x2:=384 bytes EEPROM, 0x3-0xF reserved for future use.
Let's see what the options proposed so far are (correct me if I misrepresent them):
- Include internal and external NVRAM in PRG-NVRAM field, always round up for oddball sizes. (Current NES 2.0 specification)
- Include internal NVRAM in PRG-NVRAM field only when there is no external NVRAM. Prevents oddball sizes resulting from the sum of internal and external NVRAM. Oddball sizes resulting from other reasons (Mapper 82) are still rounded up. (Lidnariq)
- Only include external NVRAM in PRG-NVRAM field. The mapper code itself has to know how many bytes of internal NVRAM to add. Will result in several headers with battery flag set and a PRG-NVRAM size of "0". If necessary, use submappers to denote if internal RAM is not battery backed but external RAM is. (Lidnariq, Sour)
- Include internal and external NVRAM in PRG-NVRAM field, use PRG-NVRAM value 0xF for oddball sizes whose actual value is derived from the mapper number, and should it be discovered that there are several oddball sizes for one mapper number, also from the submapper number. (NewRisingSun)
- Include internal and external NVRAM in PRG-NVRAM field, use PRG-NVRAM value 0xF for oddball sizes whose actual value is one of sixteen pre-defined configurations chosen by a repurposed PRG-RAM nibble. (NewRisingSun)