mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-27 15:29:34 +00:00
Sets up [ignored] memory and data size prefixes.
This commit is contained in:
parent
8e3ae2c78f
commit
11bb594fa2
@ -179,10 +179,14 @@ std::pair<int, typename Decoder<model>::InstructionT> Decoder<model>::decode(con
|
|||||||
RequiresMin(i80286);
|
RequiresMin(i80286);
|
||||||
MemRegReg(ARPL, MemReg_Reg, 2);
|
MemRegReg(ARPL, MemReg_Reg, 2);
|
||||||
break;
|
break;
|
||||||
// case 0x67:
|
case 0x66:
|
||||||
// RequiresMin(i80386);
|
RequiresMin(i80386);
|
||||||
// address_size_ = true;
|
data_size_ = DataSize(int(default_data_size_) ^ int(DataSize::Word) ^ int(DataSize::DWord));
|
||||||
// break;
|
break;
|
||||||
|
case 0x67:
|
||||||
|
RequiresMin(i80386);
|
||||||
|
address_size_ = AddressSize(int(default_address_size_) ^ int(AddressSize::b16) ^ int(AddressSize::b32));
|
||||||
|
break;
|
||||||
case 0x6c: // INSB
|
case 0x6c: // INSB
|
||||||
RequiresMin(i80186);
|
RequiresMin(i80186);
|
||||||
Complete(INS, None, None, 1);
|
Complete(INS, None, None, 1);
|
||||||
@ -722,6 +726,21 @@ std::pair<int, typename Decoder<model>::InstructionT> Decoder<model>::decode(con
|
|||||||
return std::make_pair(0, InstructionT());
|
return std::make_pair(0, InstructionT());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <Model model> void Decoder<model>::set_32bit_protected_mode(bool enabled) {
|
||||||
|
if constexpr (!is_32bit(model)) {
|
||||||
|
assert(!enabled);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(enabled) {
|
||||||
|
default_address_size_ = address_size_ = AddressSize::b32;
|
||||||
|
default_data_size_ = data_size_ = DataSize::DWord;
|
||||||
|
} else {
|
||||||
|
default_address_size_ = address_size_ = AddressSize::b16;
|
||||||
|
default_data_size_ = data_size_ = DataSize::Word;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Ensure all possible decoders are built.
|
// Ensure all possible decoders are built.
|
||||||
template class InstructionSet::x86::Decoder<InstructionSet::x86::Model::i8086>;
|
template class InstructionSet::x86::Decoder<InstructionSet::x86::Model::i8086>;
|
||||||
template class InstructionSet::x86::Decoder<InstructionSet::x86::Model::i80186>;
|
template class InstructionSet::x86::Decoder<InstructionSet::x86::Model::i80186>;
|
||||||
|
@ -36,6 +36,11 @@ template <Model model> class Decoder {
|
|||||||
*/
|
*/
|
||||||
std::pair<int, InstructionT> decode(const uint8_t *source, size_t length);
|
std::pair<int, InstructionT> decode(const uint8_t *source, size_t length);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Enables or disables 32-bit protected mode. Meaningful only if the @c Model supports it.
|
||||||
|
*/
|
||||||
|
void set_32bit_protected_mode(bool);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum class Phase {
|
enum class Phase {
|
||||||
/// Captures all prefixes and continues until an instruction byte is encountered.
|
/// Captures all prefixes and continues until an instruction byte is encountered.
|
||||||
@ -148,16 +153,22 @@ template <Model model> class Decoder {
|
|||||||
// Prefix capture fields.
|
// Prefix capture fields.
|
||||||
Repetition repetition_ = Repetition::None;
|
Repetition repetition_ = Repetition::None;
|
||||||
bool lock_ = false;
|
bool lock_ = false;
|
||||||
AddressSize address_size_ = AddressSize::b16;
|
|
||||||
Source segment_override_ = Source::None;
|
Source segment_override_ = Source::None;
|
||||||
|
|
||||||
|
// 32-bit/16-bit selection.
|
||||||
|
AddressSize default_address_size_ = AddressSize::b16;
|
||||||
|
DataSize default_data_size_ = DataSize::Word;
|
||||||
|
AddressSize address_size_ = AddressSize::b16;
|
||||||
|
DataSize data_size_ = DataSize::Word;
|
||||||
|
|
||||||
/// Resets size capture and all fields with default values.
|
/// Resets size capture and all fields with default values.
|
||||||
void reset_parsing() {
|
void reset_parsing() {
|
||||||
consumed_ = operand_bytes_ = 0;
|
consumed_ = operand_bytes_ = 0;
|
||||||
displacement_size_ = operand_size_ = 0;
|
displacement_size_ = operand_size_ = 0;
|
||||||
displacement_ = operand_ = 0;
|
displacement_ = operand_ = 0;
|
||||||
lock_ = false;
|
lock_ = false;
|
||||||
address_size_ = AddressSize::b16;
|
address_size_ = default_address_size_;
|
||||||
|
data_size_ = default_data_size_;
|
||||||
segment_override_ = Source::None;
|
segment_override_ = Source::None;
|
||||||
repetition_ = Repetition::None;
|
repetition_ = Repetition::None;
|
||||||
phase_ = Phase::Instruction;
|
phase_ = Phase::Instruction;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user