73 lines
1.9 KiB
Odin
73 lines
1.9 KiB
Odin
package decoder_8086
|
|
|
|
import "core:os"
|
|
import "core:fmt"
|
|
|
|
Register :: struct {
|
|
fullname: string,
|
|
bytename: string,
|
|
value: struct #raw_union {
|
|
using _: struct {
|
|
low, high: byte,
|
|
},
|
|
full: u16,
|
|
},
|
|
code: u8,
|
|
}
|
|
|
|
registers := [8]Register {
|
|
{fullname = "ax", bytename = "al", code = 0b000},
|
|
{fullname = "cx", bytename = "cl", code = 0b001},
|
|
{fullname = "dx", bytename = "dl", code = 0b010},
|
|
{fullname = "bx", bytename = "bl", code = 0b011},
|
|
{fullname = "sp", bytename = "ah", code = 0b100},
|
|
{fullname = "bp", bytename = "ch", code = 0b101},
|
|
{fullname = "si", bytename = "dh", code = 0b110},
|
|
{fullname = "di", bytename = "bh", code = 0b111},
|
|
}
|
|
|
|
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")
|
|
if err != os.ERROR_NONE {
|
|
os.exit(1)
|
|
}
|
|
defer os.close(f)
|
|
|
|
data := make([]u8, 256)
|
|
bytes_read, err2 := os.read(f, data)
|
|
if err2 != nil {
|
|
// ...
|
|
os.exit(1)
|
|
}
|
|
// mov cx, bx ; mov 001, 011
|
|
// mov dx, bx
|
|
|
|
read_next := false
|
|
src_dst := true
|
|
is_word := false
|
|
prev :u8 = 0
|
|
fmt.println("bits 16\n")
|
|
for b in data {
|
|
if read_next {
|
|
mod := (b & 0b11000000) >> 6
|
|
reg := (b & 0b00111000) >> 3
|
|
rm := b & 0b00000111
|
|
src_name := is_word ? registers[reg].fullname : registers[reg].bytename
|
|
dst_name := is_word ? registers[rm].fullname : registers[rm].bytename
|
|
fmt.printfln("mov %s, %s ;; %b %b", dst_name, src_name, prev, b)
|
|
read_next = false
|
|
continue
|
|
}
|
|
if b == 0b10001001 {
|
|
read_next = true
|
|
is_word = true
|
|
} else if b == 0b10001000 {
|
|
read_next = true
|
|
is_word = false
|
|
}
|
|
prev = b
|
|
}
|
|
}
|