From 8e669a32a3f76069416a002d9f622d63552cfe70 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 7 Mar 2022 16:34:56 -0500 Subject: [PATCH] Take a stab at group 8. --- InstructionSets/x86/Decoder.cpp | 23 +++++++++++++++++++---- InstructionSets/x86/Decoder.hpp | 3 ++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/InstructionSets/x86/Decoder.cpp b/InstructionSets/x86/Decoder.cpp index e16668563..521f1c4dd 100644 --- a/InstructionSets/x86/Decoder.cpp +++ b/InstructionSets/x86/Decoder.cpp @@ -524,10 +524,10 @@ std::pair::InstructionT> Decoder::decode(con RequiresMin(i80386); MemRegReg(MOVZX, Reg_MemReg, DataSize::Word); break; - // TODO: 0xba: Grp8 Ev, Ib - case 0xbb: RequiresMin(i80386); MemRegReg(BTC, MemReg_Reg, data_size_); break; - case 0xbc: RequiresMin(i80386); MemRegReg(BSF, MemReg_Reg, data_size_); break; - case 0xbd: RequiresMin(i80386); MemRegReg(BSR, MemReg_Reg, data_size_); break; + case 0xba: RequiresMin(i80386); MemRegReg(Invalid, MemRegBT_to_BTC, data_size_); break; + case 0xbb: RequiresMin(i80386); MemRegReg(BTC, MemReg_Reg, data_size_); break; + case 0xbc: RequiresMin(i80386); MemRegReg(BSF, MemReg_Reg, data_size_); break; + case 0xbd: RequiresMin(i80386); MemRegReg(BSR, MemReg_Reg, data_size_); break; case 0xbe: RequiresMin(i80386); MemRegReg(MOVSX, Reg_MemReg, DataSize::Byte); @@ -776,6 +776,21 @@ std::pair::InstructionT> Decoder::decode(con } break; + case ModRegRMFormat::MemRegBT_to_BTC: + destination_ = memreg; + source_ = Source::Immediate; + operand_size_ = DataSize::Byte; + + switch(reg) { + default: undefined(); + + case 4: operation_ = Operation::BT; break; + case 5: operation_ = Operation::BTS; break; + case 6: operation_ = Operation::BTR; break; + case 7: operation_ = Operation::BTC; break; + } + break; + default: assert(false); } diff --git a/InstructionSets/x86/Decoder.hpp b/InstructionSets/x86/Decoder.hpp index 6f0c4a6aa..6c837df2a 100644 --- a/InstructionSets/x86/Decoder.hpp +++ b/InstructionSets/x86/Decoder.hpp @@ -156,7 +156,8 @@ template class Decoder { // 'Group 8' // - // TODO. + // Parse for mode and register/memory field, populating destination, + // and prepare to read a single byte as source. MemRegBT_to_BTC, } modregrm_format_ = ModRegRMFormat::MemReg_Reg;