Search code examples
mathbcdz80

Z80 DAA instruction


Apologies for this seemingly minor question, but I can't seem to find the answer anywhere - I'm just coming up to implementing the DAA instruction in my Z80 emulator, and I noticed in the Zilog manual that it is for the purposes of adjusting the accumulator for binary coded decimal arithmetic. It says the instruction is intended to be run right after an addition or subtraction instruction.

My questions are:

  • what happens if it is run after another instruction?
  • how does it know what instruction preceeded it?
  • I realise there is the N flag - but this surely wouldnt definitively indicate that the previous instruction was an addition or subtraction instruction?
  • Does it just modify the accumulator anyway, based on the conditions set out in the DAA table, regardless of the previous instruction?

Solution

  • Does it just modify the accumulator anyway, based on the conditions set out in the DAA table, regardless of the previous instruction?

    Yes. The documentation is only telling you what DAA is intended to be used for. Perhaps you are referring to the table at this link:

    --------------------------------------------------------------------------------
    |           | C Flag  | HEX value in | H Flag | HEX value in | Number  | C flag|
    | Operation | Before  | upper digit  | Before | lower digit  | added   | After |
    |           | DAA     | (bit 7-4)    | DAA    | (bit 3-0)    | to byte | DAA   |
    |------------------------------------------------------------------------------|
    |           |    0    |     0-9      |   0    |     0-9      |   00    |   0   |
    |   ADD     |    0    |     0-8      |   0    |     A-F      |   06    |   0   |
    |           |    0    |     0-9      |   1    |     0-3      |   06    |   0   |
    |   ADC     |    0    |     A-F      |   0    |     0-9      |   60    |   1   |
    |           |    0    |     9-F      |   0    |     A-F      |   66    |   1   |
    |   INC     |    0    |     A-F      |   1    |     0-3      |   66    |   1   |
    |           |    1    |     0-2      |   0    |     0-9      |   60    |   1   |
    |           |    1    |     0-2      |   0    |     A-F      |   66    |   1   |
    |           |    1    |     0-3      |   1    |     0-3      |   66    |   1   |
    |------------------------------------------------------------------------------|
    |   SUB     |    0    |     0-9      |   0    |     0-9      |   00    |   0   |
    |   SBC     |    0    |     0-8      |   1    |     6-F      |   FA    |   0   |
    |   DEC     |    1    |     7-F      |   0    |     0-9      |   A0    |   1   |
    |   NEG     |    1    |     6-F      |   1    |     6-F      |   9A    |   1   |
    |------------------------------------------------------------------------------|
    

    I must say, I've never seen a dafter instruction spec. If you examine the table carefully, you will see that the effect of the instruction depends only on the C and H flags and the value in the accumulator -- it doesn't depend on the previous instruction at all. Also, it doesn't divulge what happens if, for example, C=0, H=1, and the lower digit in the accumulator is 4 or 5. So you will have to execute a NOP in such cases, or generate an error message, or something.