diff --git a/decoder8086.odin b/decoder8086.odin index c2e0b56..132b1e1 100644 --- a/decoder8086.odin +++ b/decoder8086.odin @@ -23,7 +23,14 @@ OpName :: enum { PUSH, POP, XCHG, + IN, + OUT, + XLAT, + LEA, + LDS, + LES, ADD, + ADC, SUB, CMP, JMP, @@ -204,6 +211,22 @@ instructions := [?]InstructionInfo { reg_info = reg_second_middle, has_address = true, word_size = LastBit{}, has_flip = true}, { opname = .XCHG, desc = "", mask = 0b11111000, encoding = 0b10010000, reg_info = reg_first_last, uses_accumulator = true, word_size = Force{}, }, + { opname = .IN, desc = "", mask = 0b11111110, encoding = 0b11100100, + has_data = true, word_size = LastBit{}, }, + { opname = .IN, desc = "", mask = 0b11111110, encoding = 0b11101100, + word_size = LastBit{}, }, + { opname = .OUT, desc = "", mask = 0b11111110, encoding = 0b11100110, + has_data = true, word_size = FourthBit{}, }, + { opname = .OUT, desc = "", mask = 0b11111110, encoding = 0b11101110, + word_size = LastBit{}, }, + { opname = .XLAT, desc = "", mask = 0b11111111, encoding = 0b11010111, + }, + { opname = .LEA, desc = "", mask = 0b11111111, encoding = 0b10001101, + has_address = true }, + { opname = .LDS, desc = "", mask = 0b11111111, encoding = 0b11000101, + has_address = true }, + { opname = .LES, desc = "", mask = 0b11111111, encoding = 0b11000100, + has_address = true }, { opname = .TBD, desc = "Reg/memory with register to either", mask = 0b11000100, encoding = 0b00000000, opcode_id = .First, reg_info = reg_second_middle, has_address = true, word_size = LastBit{}, has_flip = true }, { opname = .TBD, desc = "Immediate to register/memory", mask = 0b11111100, encoding = 0b10000000, @@ -371,6 +394,7 @@ get_opname :: proc(b: u8) -> string { name: string switch b & 0b00111000 >> 3 { case 0b000: name = "add" + case 0b010: name = "adc" case 0b101: name = "sub" case 0b111: name = "cmp" }