EMF stands for the emulation framework, which aims to significantly lower the barrier to entry for emulation developers, and would-be emulation developers.
It exists in two parts: the first is the EMF builder which takes an XML description of a computer system, and translates it into source code, generating an emulator, assembler, and disassembler - all from the same originating file.
The second part consists of utility methods and interface routines that tie everything together.
The framework includes:
The examples I'm going to demonstrate all exist in JavaScript, but a simple change to the EMF builder can output native C++, Rust, or even assembly!
By describing the processor in a domain-specific language you can generate the emulator for multiple platforms without additional manual effort.
You can change the implementation details once the XML description, to change the CPU 'flags' state from being a single register to multiple internal variables, it that improves performance
You can pre-compile a ROM into native code using the same XML description.
By tweaking the build process, you can change the internal structures of the emulation code to generate more efficient code.
And obviously, the assembler, disassembler, and other tools come for free.
See a full development emulator running 'Space Invaders' with real-time disassembler, and register listings. Note how the values become bold whenever they change.
Experiment with the 8080 assembler, which supports equates, back references, and other traditional functionality. It was auto-generated from the same XML file as the Space Invaders game.
The emulator is packed into its own JS file, so you can see how little code is necessary to embed it elsewhere