mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-06 13:31:55 +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);
|
||||
MemRegReg(ARPL, MemReg_Reg, 2);
|
||||
break;
|
||||
// case 0x67:
|
||||
// RequiresMin(i80386);
|
||||
// address_size_ = true;
|
||||
// break;
|
||||
case 0x66:
|
||||
RequiresMin(i80386);
|
||||
data_size_ = DataSize(int(default_data_size_) ^ int(DataSize::Word) ^ int(DataSize::DWord));
|
||||
break;
|
||||
case 0x67:
|
||||
RequiresMin(i80386);
|
||||
address_size_ = AddressSize(int(default_address_size_) ^ int(AddressSize::b16) ^ int(AddressSize::b32));
|
||||
break;
|
||||
case 0x6c: // INSB
|
||||
RequiresMin(i80186);
|
||||
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());
|
||||
}
|
||||
|
||||
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.
|
||||
template class InstructionSet::x86::Decoder<InstructionSet::x86::Model::i8086>;
|
||||
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);
|
||||
|
||||
/*!
|
||||
Enables or disables 32-bit protected mode. Meaningful only if the @c Model supports it.
|
||||
*/
|
||||
void set_32bit_protected_mode(bool);
|
||||
|
||||
private:
|
||||
enum class Phase {
|
||||
/// Captures all prefixes and continues until an instruction byte is encountered.
|
||||
@ -148,16 +153,22 @@ template <Model model> class Decoder {
|
||||
// Prefix capture fields.
|
||||
Repetition repetition_ = Repetition::None;
|
||||
bool lock_ = false;
|
||||
AddressSize address_size_ = AddressSize::b16;
|
||||
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.
|
||||
void reset_parsing() {
|
||||
consumed_ = operand_bytes_ = 0;
|
||||
displacement_size_ = operand_size_ = 0;
|
||||
displacement_ = operand_ = 0;
|
||||
lock_ = false;
|
||||
address_size_ = AddressSize::b16;
|
||||
address_size_ = default_address_size_;
|
||||
data_size_ = default_data_size_;
|
||||
segment_override_ = Source::None;
|
||||
repetition_ = Repetition::None;
|
||||
phase_ = Phase::Instruction;
|
||||
|
Loading…
x
Reference in New Issue
Block a user