5

私は小さな8086エミュレーターを持っていますが、AFがsub内で適切に動作せず、命令を追加するようになったため、2年ほど長い間バグがありました。

その値を計算する私の現在の方法は、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フラグを正しく計算するにはどうすればよいですか?

4

1 に答える 1

5
flags.af = (((base-subt) & ~0xf) != 0);

下位 4 ビットのオーバーフローまたはアンダーフローを示す上位ビットがゼロ以外であるかどうかを確認します。

これは、オリジナルに少し近いバージョンです。2 つの 4 ビット量の差が 15 を超えることはありません。同様に、加算が 0 未満になることもありません。

flags.af = ((int16_t)base-subt < -15);

flags.af = ((int16_t)base+adder > 15);

ブール式を括弧で囲むことは、私のスタイルの好みにすぎません。それらが冗長であることはわかっています。

于 2010-12-22T21:12:04.587 に答える