tepples wrote:It's already bigger than Super Mario Bros. 3 and tied with SUROM games.
I consider it irrelevant to compare it to the old commercial games. Whenever I think of mapper features I'd want, I think of everything I wanted to do at some point but couldn't because of one limitation or another. If we keep aiming only at the old NES games we will never surpass them, and I really believe we can innovate and do more. And more PRG space is not so hard to provide and can make all the difference, IMO.
I could bump up the mapper to 2048 KiB using four more register bits, two more inputs (D6-D5), and two more outputs (PRG A19-A18).
I'd really appreciate if you could do this. I just hope it still fits the CPLD.
Watch Super Mario Bros. 2 or 3 in an emu with a pattern table viewer
I'm familiar with the effect, and I agree that this part is covered, I was just pointing out another common problem, one that newer games solved by dedicating a 1KB slot in the CHR area to the main character and switched in the appropriate data depending on the character's animation frame.
But like I said, I cant think of a simple way to solve this problem. It seems that with this mapper I can only pick one to use bankswitching for: the main character or background animations.
For sprite animations, do what Battletoads does: a big unrolled loop to blast a bunch of bytes at once from a buffer in stack space.
Yeah, my current approach is similar to that. But depending on the amount of background tiles that animate, it would make more sense to update them with the unrolled loop and dedicate the bankswitching to the main character. Hey, at least we have a choice!
BTW, I don't think using the stack is much of an advantage in this process, as PLA takes the same amount of time an indexed load does, so as long as the data is stored interleaved in the ROM (and properly aligned) you can copy directly from it just as fast, without wasting time using the stack as an intermediary. The only disadvantage is that an indexed load is 3 bytes long, and PLA is just 1, but if you're unrolling code you probably have a lot of space for it (and you can partially unroll it without much performance penalty).