2011-11-14 73 views
14

对于这个看似小问题的道歉,但我似乎无法在任何地方找到答案 - 我只是想在我的Z80模拟器中实现DAA指令,并且我在Zilog手册中注意到它是为了调整二进制编码的十进制算术的累加器。它表示该指令旨在在加法或减法指令后运行。Z80 DAA指令

我的问题是:

  • 如果另一指令运行后会发生什么?
  • 它是如何知道前面有什么指令的呢?
  • 我意识到有N标志 - 但这肯定不会明确指出前面的指令是加法或减法指令?
  • 不管前面的指令如何,它是否只是根据DAA表中列出的条件修改累加器?

回答

13

是否只是修改累加器无论如何,根据载于DAA表的条件,不管前面的指令?

是的。该文档仅告诉您DAA旨在用于何种用途。也许你是指表在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 | 
|------------------------------------------------------------------------------| 

我必须说,我从来没有见过一个dafter指令规范。如果仔细检查表格,您会看到指令的效果仅取决于标志CH以及累加器中的值 - 它不依赖于前一条指令。另外,如果例如C=0H=1和累加器中的低位数字是4或5,它不会泄露发生的情况。因此,在这种情况下您将必须执行NOP,或者生成错误消息或其他内容。

+0

非常感谢 - 我希望找到像这样的更多含糊不清的指令:-) – PhilPotter1987

+1

Z80的DAA应该与x86的DAA和DAS相同,因为它们具有相同的目的。查看两者的x86描述。许多CPU都可以使用某种DAA。 –

+1

@Alex:x86芯片有两个十进制调整指令:DAA(加法后的十进制调整)和DAS(减法后的十进制调整)。 Z80 DAA指令将它们组合为一个,假定最新的加/减操作数是有效的BCD数字。 – TonyK

8

只是想补充一点,N标记是他们谈论前面的操作时的意思。加法设置N = 0,减法设置N = 1。因此A寄存器的内容和C,H和N标志确定结果。

该指令旨在支持BCD算术,但有其他用途。考虑下面的代码:

and 15 
    add a,90h 
    daa 
    adc a,40h 
    daa 

它结束转换寄存器的低4位为ASCII值 '0', '1',... '9', 'A', 'B',.. 。, 'F'。换句话说,一个二进制到十六进制的转换器。

8

我发现这个指令相当混乱,但我发现它的行为描述从z80-heaven是最有帮助的。

当执行此指令时,A寄存器使用标志的内容进行BCD校正。确切的过程如下:如果A的最低有效四位包含一个非BCD数字(即它大于9)或H标志置位,则$ 06被添加到寄存器。然后检查四个最重要的位。如果这个更重要的数字也恰好大于9或设置了C标志,则增加60美元。

这提供用于指令一个简单的模式:

  • 如果低4个比特形成大于9或H被设置的数,加$ 06至累加器
  • 如果高4位形成许多比9或C被设定时,加$ 60向累加器

此外,尽管DAA是旨在的加减运算后运行,它可以在任何时候运行

+0

它看起来像缺少最后四个操作(SUB,SBC,NEG和DEC)。 – Salgat

+3

@Salgat当'N = 1'时,同样的规则适用。唯一的是你必须在'N = 1'时减去修正值。 – GabrielOshiro