1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-07-04 18:29:40 +00:00

Sets up [ignored] memory and data size prefixes.

This commit is contained in:
Thomas Harte 2022-03-02 20:23:35 -05:00
parent 8e3ae2c78f
commit 11bb594fa2
2 changed files with 36 additions and 6 deletions

View File

@ -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>;

View File

@ -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;