我有一个小型 8086 模拟器,并且我已经有一个长期存在的错误大约 2 年了,因为 AF 在 sub 和添加指令内部无法正常运行。
我当前计算其值的方法是 8 位数字和减法:
uint8_t base=... , subt=...
base=base&0xF;
subt=subt&0xF; //isolate bottom nibble
if((int16_t)base-subt>7 || (int16_t)base-subt<-7){
flags.af=1;
}else{
flags.af=0;
}
(假设有类似
sub base,subt
的指令)
添加如下:
uint8_t base=... , adder=...
base=base&0xF;
adder=adder&0xF; //isolate bottom nibble
if(base+adder>7 || base+adder<-7){
flags.af=1;
}else{
flags.af=0;
}
(对于像
add base,adder
这样的指令)
如何在模拟器中正确计算此类指令的 AF 标志?
flags.af = (((base-subt) & ~0xf) != 0);
检查高位是否为除零以外的任何值,这表明底部 4 位发生溢出或下溢。
这是一个更接近原始版本的版本。请注意,两个 4 位量之间的差永远不会大于 15。同样,相加永远不会小于 0。
flags.af = ((int16_t)base-subt < -15);
flags.af = ((int16_t)base+adder > 15);
在布尔表达式两边加上括号只是我的一种风格偏好,我知道它们是多余的。