diff --git a/InstructionSets/x86/Decoder.cpp b/InstructionSets/x86/Decoder.cpp index 20efb3a0d..b574f36cc 100644 --- a/InstructionSets/x86/Decoder.cpp +++ b/InstructionSets/x86/Decoder.cpp @@ -199,72 +199,124 @@ std::pair::InstructionT> Decoder::decode(con #undef RegisterBlock case 0x60: - RequiresMin(i80186); - Complete(PUSHA, None, None, data_size_); + if constexpr (model < Model::i80186) { + Displacement(JO, DataSize::Byte); + } else { + Complete(PUSHA, None, None, data_size_); + } break; case 0x61: - RequiresMin(i80186); - Complete(POPA, None, None, data_size_); + if constexpr (model < Model::i80186) { + Displacement(JNO, DataSize::Byte); + } else { + Complete(POPA, None, None, data_size_); + } break; case 0x62: - RequiresMin(i80186); - MemRegReg(BOUND, Reg_MemReg, data_size_); + if constexpr (model < Model::i80186) { + Displacement(JB, DataSize::Byte); + } else { + MemRegReg(BOUND, Reg_MemReg, data_size_); + } break; case 0x63: - RequiresMin(i80286); - MemRegReg(ARPL, MemReg_Reg, DataSize::Word); + if constexpr (model < Model::i80286) { + Displacement(JNB, DataSize::Byte); + } else { + MemRegReg(ARPL, MemReg_Reg, DataSize::Word); + } break; case 0x64: - RequiresMin(i80386); - segment_override_ = Source::FS; + if constexpr (model < Model::i80386) { + Displacement(JZ, DataSize::Byte); + } else { + RequiresMin(i80386); + segment_override_ = Source::FS; + } break; case 0x65: + if constexpr (model < Model::i80286) { + Displacement(JNZ, DataSize::Byte); + break; + } RequiresMin(i80386); segment_override_ = Source::GS; break; case 0x66: + if constexpr (model < Model::i80286) { + Displacement(JBE, DataSize::Byte); + break; + } RequiresMin(i80386); data_size_ = DataSize(int(default_data_size_) ^ int(DataSize::Word) ^ int(DataSize::DWord)); break; case 0x67: + if constexpr (model < Model::i80286) { + Displacement(JNBE, DataSize::Byte); + break; + } RequiresMin(i80386); address_size_ = AddressSize(int(default_address_size_) ^ int(AddressSize::b16) ^ int(AddressSize::b32)); break; case 0x68: - RequiresMin(i80286); - Immediate(PUSH, data_size_); - operation_size_ = data_size_; + if constexpr (model < Model::i80286) { + Displacement(JS, DataSize::Byte); + } else { + Immediate(PUSH, data_size_); + operation_size_ = data_size_; + } break; case 0x69: - RequiresMin(i80286); - MemRegReg(IMUL_3, Reg_MemReg, data_size_); - operand_size_ = data_size_; + if constexpr (model < Model::i80286) { + Displacement(JNS, DataSize::Byte); + } else { + MemRegReg(IMUL_3, Reg_MemReg, data_size_); + operand_size_ = data_size_; + } break; case 0x6a: - RequiresMin(i80286); - Immediate(PUSH, DataSize::Byte); + if constexpr (model < Model::i80286) { + Displacement(JP, DataSize::Byte); + } else { + Immediate(PUSH, DataSize::Byte); + } break; case 0x6b: - RequiresMin(i80286); - MemRegReg(IMUL_3, Reg_MemReg, data_size_); - operand_size_ = DataSize::Byte; - sign_extend_operand_ = true; + if constexpr (model < Model::i80286) { + Displacement(JNP, DataSize::Byte); + } else { + MemRegReg(IMUL_3, Reg_MemReg, data_size_); + operand_size_ = DataSize::Byte; + sign_extend_operand_ = true; + } break; case 0x6c: // INSB - RequiresMin(i80186); - Complete(INS, None, None, DataSize::Byte); + if constexpr (model < Model::i80186) { + Displacement(JL, DataSize::Byte); + } else { + Complete(INS, None, None, DataSize::Byte); + } break; case 0x6d: // INSW/INSD - RequiresMin(i80186); - Complete(INS, None, None, data_size_); + if constexpr (model < Model::i80186) { + Displacement(JNL, DataSize::Byte); + } else { + Complete(INS, None, None, data_size_); + } break; case 0x6e: // OUTSB - RequiresMin(i80186); - Complete(OUTS, None, None, DataSize::Byte); + if constexpr (model < Model::i80186) { + Displacement(JLE, DataSize::Byte); + } else { + Complete(OUTS, None, None, DataSize::Byte); + } break; case 0x6f: // OUTSW/OUSD - RequiresMin(i80186); - Complete(OUTS, None, None, data_size_); + if constexpr (model < Model::i80186) { + Displacement(JNLE, DataSize::Byte); + } else { + Complete(OUTS, None, None, data_size_); + } break; case 0x70: Displacement(JO, DataSize::Byte); break; diff --git a/OSBindings/Mac/Clock SignalTests/8088Tests.mm b/OSBindings/Mac/Clock SignalTests/8088Tests.mm index a023c10eb..080653568 100644 --- a/OSBindings/Mac/Clock SignalTests/8088Tests.mm +++ b/OSBindings/Mac/Clock SignalTests/8088Tests.mm @@ -151,11 +151,6 @@ std::string to_string( // Unofficial opcodes; ignored for now. NSSet *ignoreList = [NSSet setWithObjects: - @"60.json.gz", @"61.json.gz", @"62.json.gz", @"63.json.gz", - @"64.json.gz", @"65.json.gz", @"66.json.gz", @"67.json.gz", - @"68.json.gz", @"69.json.gz", @"6A.json.gz", @"6B.json.gz", - @"6C.json.gz", @"6D.json.gz", @"6E.json.gz", @"6F.json.gz", - @"82.0.json.gz", @"82.1.json.gz", @"82.2.json.gz", @"82.3.json.gz", @"82.4.json.gz", @"82.5.json.gz", @"82.6.json.gz", @"82.7.json.gz",