Объясните, как работает флаг AF в инструкциях x86?

У меня есть небольшой эмулятор 8086, и вот уже 2 года у меня есть давняя ошибка, из-за которой AF не ведет себя должным образом внутри команд sub и add.

Мой текущий способ вычисления его значения таков для 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;
}

] (для такой инструкции, как добавить базу, сумматор )

Как правильно рассчитать флаг AF в моем эмуляторе для таких инструкций?

6
задан Earlz 22 December 2010 в 21:13
поделиться