If you're emulating something like an 8080, you can do so on an x86 so that it runs very, very fast.
Use the x86's registers as the emulated system's registers. If you've got a lot of space, allocate 8 bytes to the code to emulate each opcode, fetch the opcode, shift it 3 bits left and then jump to that value+the location of opcode 00 code. Since the "fetch next opcode" will always be the same, three's no point in doing a call of each opcode's emulation.
If you don't have that much space, make a table of addresses of each opcode's emulation code and do an indirect jump, indexed by the opcode.
The nice thing about using x86 to emulate x80 is that there are very few adjustments to the flags that are needed.
On a 286, the emulation will run like the wind, but even on an 8088, the emulation can turn in a respectable speed.
But you have to be a hard-bitten cycle-counting assembly geek to do this.