Assembly Z80与DAA一起溢出

Assembly Z80与DAA一起溢出,assembly,emulation,z80,Assembly,Emulation,Z80,我正在编写一个Z80仿真器,我一直试图理解十进制调整指令对某些操作数的作用。 在实际Z80上,这些操作码的结果(在寄存器A和F中)是什么 LD A,1h ADD A,99h DAA 我的代码当前以A寄存器中的0xA0以及半进位和溢出位集结束。但它是否应该返回0?仅在ADD指令在a寄存器中留下两位BCD字节结果后执行DAA 加法运算符应由两个压缩BCD数字组成。DAA指令调整寄存器以包含正确的两位数压缩十进制结果,溢出、进位和零标志也会受到影响。 如果结果(在DAA执行后)大于99,则在D

我正在编写一个Z80仿真器,我一直试图理解十进制调整指令对某些操作数的作用。 在实际Z80上,这些操作码的结果(在寄存器A和F中)是什么

LD   A,1h
ADD  A,99h
DAA

我的代码当前以A寄存器中的0xA0以及半进位和溢出位集结束。但它是否应该返回0?

仅在ADD指令在a寄存器中留下两位BCD字节结果后执行DAA

加法运算符应由两个压缩BCD数字组成。DAA指令调整寄存器以包含正确的两位数压缩十进制结果,溢出、进位和零标志也会受到影响。 如果结果(在DAA执行后)大于99,则在DAA后设置进位标志

x86 CPU还支持与Z80 DAA指令非常接近的DAA指令,因此,如果您在x86平台上工作,则可以在仿真中使用它。

之后:

LD A, 1h
ADD A, 99h
A
应包含9Ah。进位、半进位和溢出都应该重置,因为从第3位到第4位没有进位,或者从第7位开始没有进位,并且在有符号解释中,您在负数中添加了一个正数,因此溢出是不可能的

然后执行
DAA
时,处理器将发现低半字节的值大于0x9。因此,它将决定添加0x6以从低位创建合适的十进制进位

假设它将把0x9添加到低半字节,它将检查高半字节是否会创建十进制进位。测试是高半字节是否大于0x8。它是。因此,DAA还将决定将0x6添加到高半字节

因此,总体而言,DAA将决定添加0x66

(0x9a + 0x66) MOD 0x100 = 0x00
因此,留在
A
中的结果将为0x00

DAA决定将0x6添加到顶部半字节。因此,现在将设置进位

DAA还决定将0x6添加到底部半字节。因此,也将设置半进位

将根据0x00结果设置符号、零等


如果我不得不猜测的话,您的代码似乎发现低半字节是不正确的,并计划创建半进位。但是,它没有检查是否会因此而使上半部分不正确(即,是否为0x8或更大),也没有计划创建上半部分携带。

出于怀旧的原因,请参见+1。我不知道答案,但请检查这个问题的答案:@Michael Great link谢谢。谢谢你非常详细的回答。你是对的,问题是我的代码检查每个半字节(按正确的顺序),并根据半字节和标志添加6h、60h或66h。我想我需要把它分成6小时,然后是60小时。