Things not working exactly as in a real Z80: * Interrupts Requests for interrupts and other services are only recognized and served after flow control instructions. This is often enough without spending too much time testing, and guarantees that emulation can never be stuck in an endless (or simply long) loop without being able to detect an interrupt. * BCD arithmetic The H and N flags of the F register are completely ignored, and are treated as the two unused flags. These instructions set flags so that a subsequent Daa will work : Adc A,s , Add A,s , Neg , Sbc A,s , Sub s . For them, data is stored for Daa to use. After these instructions, the flags are set so H (or Xh/Yh) could be adjusted by doing "Ld A,H , Daa , Ld H,A" : Adc HL,ss , Add HL,ss , Add IX,ss , Sbc HL,ss . For them, BCD is currently ignored. Nobody seems to use it. After the 8-bit Inc and Dec instructions, Daa could be successfully done (if m <> A, through "Ld A,m , Daa , Ld m,A", otherwise simply through Daa) provided it is regarded that Inc/Dec do not affect the carry flag. Currently not even the Inc A / Dec A instructions store Daa data, since no occurrence of a subsequent Daa has been spotted in any program. Other tricks possible to perform with Daa, using various instructions to set the flags, are simply ignored since that kind of total flag emulation would slow everything down beyond reason. The data stored for Daa : BCD_OP = operation, one of: OP_ADD OP_SUB OP_ADC OP_SBC BCD_A = destination (ackumulator before operation, or zero for Neg) BCD_B = source (ackumulator for Neg) BCD_C = flags before operation (word-sized, only stored for Adc/Sbc) * Push/Pop AF When the flag register is pushed or popped, it could either be stored and retreived in the 680x0 CCR form (the quickest way), or in Z80 form. The compile flag AFPUSHPOP_CCR controls this. If the CCR form is used, programs that inspect a stored flag byte will get wrong results. The difference lies in how the flags are ordered within the byte. For instance, in the 680x0, bit 3 is the sign flag; in the Z80, it is bit 7. Only programs that inspect the pushed flags (like a debugger) will ever notice this. In neither case are bits in the unused positions (including H and N) guaranteed to survive an operation that affects any of the flags. Is IS guaranteed, that a Pop AF with a following Push AF (or vice versa) and no flag-affecting instructions there inbetween, will preserve all the transferred bits. Since the H and N flags are not emulated, the BCD information could be lost if the flags are pushed to call a subroutine and then popped. There seems to be no problem, however, since nobody would want to delay the decimal adjust until after he has first pushed and popped the flags (unless he is bit-fiddling the flags, which wouldn't work anyway). An interrupt could possibly occur between the arithmetic operation and the decimal adjust (presently only if a change of flow control is made to the point where the Daa will be done). The possibility is slight, but I provide the option AFPUSHPOP_BCD to fix this; mostly for completeness. If the option is used, the BCD data will be stored in a separate, circular stack which keeps the last 7 pushed data units. * Refresh register The real behaviour of the R register seems impossible to emulate at a reasonable speed, since it increments at certain intervals providing certain parts of the CPU are free. Usually once per instruction, but sometimes twice. (If anybody finds a complete description of this, please send me a copy). I consider the Ld A,R and Ld R,A instructions to be implementation- dependent: The R register is not incremented after each instruction; instead when Ld A,R is executed the bits 0-6 have to be made up from some counter like the Pseudo-PC or the system clock. Bit 7 is taken from the last stored R in the Z80_R field. When Ld R,A is executed, only bit 7 must be safely stored in the Z80_R field of the control structure. Bits 0-6 may be treated in any way by the implementer. The file generic_macs.i provides a version of Ld A,R which uses the Pseudo-PC to 'approximate R' as a non-machine specific way to do it. (Maybe it could be plausible to do proper ticking of the R register in a single-step mode. Then one could single-step/trace through certain routines that use the R register for coding. I'll need some more details on its behaviour first.)