Make your software pretend to be different hardware. Build a CHIP-8 emulator, expand to NES CPU/PPU/APU, implement a Game Boy emulator, understand dynamic recompilation for speedup, and add save states.