diff --git a/decoder8086.odin b/decoder8086.odin index 488dddd..034d50a 100644 --- a/decoder8086.odin +++ b/decoder8086.odin @@ -15,6 +15,13 @@ Register :: struct { code: u8, } +RegMemMode :: enum { + Memory00 = 0b00, + Memory08 = 0b01, + Memory16 = 0b10, + Register = 0b11, +}; + registers := [8]Register { {fullname = "ax", bytename = "al", code = 0b000}, {fullname = "cx", bytename = "cl", code = 0b001}, @@ -26,30 +33,52 @@ registers := [8]Register { {fullname = "di", bytename = "bh", code = 0b111}, } +Instruction :: struct { + mask: u8, + encoding: u8, + name: string, + desc: string, +} + +instructions := [?]Instruction { + { mask = 0b11111100, encoding = 0b10001000, name = "mov", desc = "Register/memory to/from register" }, + { mask = 0b11111110, encoding = 0b11000110, name = "mov", desc = "Immediate to register/memory" }, + { mask = 0b11110000, encoding = 0b10110000, name = "mov", desc = "Immediate to register" }, + { mask = 0b11111110, encoding = 0b10100000, name = "mov", desc = "Memory to accumulator" }, + { mask = 0b11111110, encoding = 0b10100010, name = "mov", desc = "Accumulator to memory" }, + { mask = 0b11111111, encoding = 0b10001110, name = "mov", desc = "Register/memory to segment register" }, + { mask = 0b11111111, encoding = 0b10001100, name = "mov", desc = "Segment register to register/memory" }, +} + +inst_map := make(map[u8]Instruction) + main :: proc() { ax := registers[0] ax.value.full = 52428 - f,err := os.open(len(os.args) > 1 ? os.args[1] : "./asm_files/01-01-38.bin") + f,err := os.open(len(os.args) > 1 ? os.args[1] : "./asm_files/01-02-39.bin") if err != os.ERROR_NONE { os.exit(1) } defer os.close(f) - data := make([]u8, 256) + data := make([]u8, 512) bytes_read, err2 := os.read(f, data) if err2 != nil { // ... os.exit(1) } - // mov cx, bx ; mov 001, 011 - // mov dx, bx + + for inst in instructions { + inst_map[inst.encoding] = inst + } read_next := false src_dst := true is_word := false prev :u8 = 0 fmt.println("bits 16\n") - for b in data { + for i in 0..> 6 reg := (b & 0b00111000) >> 3