home *** CD-ROM | disk | FTP | other *** search
-
- 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.)
-