diff --git a/decoder8086.odin b/decoder8086.odin index 98ff8b9..4d45a83 100644 --- a/decoder8086.odin +++ b/decoder8086.odin @@ -143,6 +143,11 @@ get_i16 :: proc(data: []u8) -> i16 { return (i16)(data[1]) << 8 | (i16)(data[0]) } +operand_is :: proc($T: typeid, opr: Operand) -> bool { + _, ok := opr.(T) + return ok +} + calculate_effective_address :: proc(r_m: u8) -> string { val: string switch r_m { @@ -527,13 +532,11 @@ main :: proc() { src_opr = parse_operand(inst, inst.src, data[idx:], &processed, word, has_segment) // TODO: This is ugly as hell - _,ok_1 := src_opr.(Immediate8) - _,ok_2 := src_opr.(Immediate16) - _,ok_3 := dst_opr.(MemoryAddr); - _,ok_4 := dst_opr.(DirectAddress); + is_imm := operand_is(Immediate8, src_opr) || operand_is(Immediate16, src_opr) + is_bracketed := operand_is(MemoryAddr, dst_opr) || operand_is(DirectAddress, dst_opr) shiftrot := inst.src == .ShiftRotate size_string := "" - if ((ok_1 || ok_2) && (ok_3 || ok_4)) || ((ok_3 || ok_4) && shiftrot) { + if ((is_imm && is_bracketed) || (is_bracketed && shiftrot)) { size_string = word ? "word " : "byte " }