我有一个小的8086模拟器,我有一个长期存在的错误2年,因为自动对焦在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标志以获取此类指示?
答案 0 :(得分:4)
flags.af = (((base-subt) & ~0xf) != 0);
检查高位是否为除零之外的任何值,这表示最后4位的溢出或下溢。
这是一个与原版更接近的版本。请注意,两个4位量之间的差异绝不会大于15.同样,加法永远不会小于0.
flags.af = ((int16_t)base-subt < -15);
flags.af = ((int16_t)base+adder > 15);
将括号括在布尔表达式周围只是我的样式偏好,我知道它们是多余的。