| This doesn't seem to me to be evidence of deliberate anti-emulation features - just imagine a hastily written port by relatively inexperienced developers who don't know about these quirks, and then it could be said: #1 - memory mirroring - accidental bug that doesn't matter since hardware ignores those bits #2 - code in vram - possible technique to save memory in another memory area? #3 - STM to DMA - shortcut to DMA that "just worked" without the original developers knowing the CPU write ordering #4 - save type faking - just a library bug that breaks the emulator heuristics? #5 - prefetch abuse - idk, maybe a legit attempt to prevent reverse engineering? Don't really know enough to comment if there's a reasonable purpose for it #6 - audio FIFO irregularities - just a bug in the emulator? How many C/C++ devs accidentaly rely on undefined behavior or specific x86 quirks? It's really easy to do, and doubly so if you're targeting a single exact hardware configuration. I'm sure it's easy to see these as hostile attempts to make emulator developer's lives harder, but I think they could just as easily be accidents, especially with a complex project like porting NES games to GBA hardware. On the other hand, I dunno, maybe Nintendo pull out all the stops to try to prevent reverse engineering and deliberately use these kind of tricks, but really, they'd go the extra mile for old NES game ports? Having said that, still a great article for covering some fascinating hardware quirks and the challenges of writing a bug-compatible emulator! |
DS games also come with copy protection to stop people from running it in cartridges that run gmaes off of images, like the R4. In that case, the product the pirates offered was actually better than buying an original cartridge: I could buy 20 games and carry a case of games, or keep them al in a single micro SSD card, and switch games at will from the boot menu.