diff --git a/InstructionSets/x86/Implementation/BCD.hpp b/InstructionSets/x86/Implementation/BCD.hpp index 1d86e865a..876cd813e 100644 --- a/InstructionSets/x86/Implementation/BCD.hpp +++ b/InstructionSets/x86/Implementation/BCD.hpp @@ -133,42 +133,19 @@ void daa( uint8_t &al, ContextT &context ) { - /* - (as modified by https://www.felixcloutier.com/x86/daa ...) - - old_AL ← AL; - old_CF ← CF; - CF ← 0; - - IF (((AL AND 0FH) > 9) or AF = 1) - THEN - AL ← AL + 6; - CF ← old_CF OR CarryFromLastAddition; (* CF OR carry from AL ← AL + 6 *) - AF ← 1; - ELSE - AF ← 0; - FI; - IF ((old_AL > 99H) or old_CF = 1) - THEN - AL ← AL + 60H; - CF ← 1; - ELSE - CF ← 0; - FI; - */ - /* - The CF and AF flags are set if the adjustment of the value results in a - decimal carry in either digit of the result (see the “Operation” section above). - The SF, ZF, and PF flags are set according to the result. The OF flag is undefined. - */ - const uint8_t old_al = al; + bool top_exceeded_threshold; + if constexpr (ContextT::model == Model::i8086) { + top_exceeded_threshold = al > (context.flags.template flag() ? 0x9f : 0x99); + } else { + top_exceeded_threshold = al > 0x99; + } if((al & 0x0f) > 0x09 || context.flags.template flag()) { al += 0x06; context.flags.template set_from(1); } - if(old_al > 0x99 || context.flags.template flag()) { + if(top_exceeded_threshold || context.flags.template flag()) { al += 0x60; context.flags.template set_from(1); }