diff --git a/lib/soft386/opcodes.c b/lib/soft386/opcodes.c index e325133eb91..f78dce83af8 100644 --- a/lib/soft386/opcodes.c +++ b/lib/soft386/opcodes.c @@ -253,7 +253,7 @@ Soft386OpcodeHandlers[SOFT386_NUM_OPCODE_HANDLERS] = Soft386OpcodeGroupD3, Soft386OpcodeAam, Soft386OpcodeAad, - NULL, // TODO: OPCODE 0xD6 NOT SUPPORTED + Soft386OpcodeSalc, Soft386OpcodeXlat, NULL, // TODO: OPCODE 0xD8 NOT SUPPORTED NULL, // TODO: OPCODE 0xD9 NOT SUPPORTED @@ -5588,3 +5588,21 @@ SOFT386_OPCODE_HANDLER(Soft386OpcodeMovOffsetEax) sizeof(USHORT)); } } + +SOFT386_OPCODE_HANDLER(Soft386OpcodeSalc) +{ + /* Make sure this is the right instruction */ + ASSERT(Opcode == 0xD6); + + if (State->PrefixFlags & SOFT386_PREFIX_LOCK) + { + /* Invalid prefix */ + Soft386Exception(State, SOFT386_EXCEPTION_UD); + return FALSE; + } + + /* Set all the bits of AL to CF */ + State->GeneralRegs[SOFT386_REG_EAX].LowByte = State->Flags.Cf ? 0xFF : 0x00; + + return TRUE; +} diff --git a/lib/soft386/opcodes.h b/lib/soft386/opcodes.h index 02d260fafe3..eb0398b4abb 100644 --- a/lib/soft386/opcodes.h +++ b/lib/soft386/opcodes.h @@ -147,5 +147,6 @@ SOFT386_OPCODE_HANDLER(Soft386OpcodeMovAlOffset); SOFT386_OPCODE_HANDLER(Soft386OpcodeMovEaxOffset); SOFT386_OPCODE_HANDLER(Soft386OpcodeMovOffsetAl); SOFT386_OPCODE_HANDLER(Soft386OpcodeMovOffsetEax); +SOFT386_OPCODE_HANDLER(Soft386OpcodeSalc); #endif // _OPCODES_H_