Compare commits

...

2 Commits

View File

@ -15,6 +15,13 @@ Register :: struct {
code: u8, code: u8,
} }
RegMemMode :: enum {
Memory00 = 0b00,
Memory08 = 0b01,
Memory16 = 0b10,
Register = 0b11,
};
registers := [8]Register { registers := [8]Register {
{fullname = "ax", bytename = "al", code = 0b000}, {fullname = "ax", bytename = "al", code = 0b000},
{fullname = "cx", bytename = "cl", code = 0b001}, {fullname = "cx", bytename = "cl", code = 0b001},
@ -26,30 +33,70 @@ registers := [8]Register {
{fullname = "di", bytename = "bh", code = 0b111}, {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() { main :: proc() {
ax := registers[0] ax := registers[0]
ax.value.full = 52428 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 { if err != os.ERROR_NONE {
os.exit(1) os.exit(1)
} }
defer os.close(f) defer os.close(f)
data := make([]u8, 256) data := make([]u8, 512)
bytes_read, err2 := os.read(f, data) bytes_read, err2 := os.read(f, data)
if err2 != nil { if err2 != nil {
// ... // ...
os.exit(1) os.exit(1)
} }
// mov cx, bx ; mov 001, 011
// mov dx, bx for inst in instructions {
inst_map[inst.encoding] = inst
}
if true {
for i in 0..<bytes_read {
fmt.printfln("%b", data[i])
mask: u8 = 0b11111111
for i in 0..=4 {
encoding := data[i] & mask
if inst, ok := inst_map[encoding]; ok {
fmt.printfln("%b, %v", encoding, inst.desc)
// fmt.println(inst.desc)
break
}
mask <<= 1
}
// fmt.println("=============")
}
os.exit(0)
}
read_next := false read_next := false
src_dst := true src_dst := true
is_word := false is_word := false
prev :u8 = 0 prev :u8 = 0
fmt.println("bits 16\n") fmt.println("bits 16\n")
for b in data { for i in 0..<bytes_read {
b := data[i]
if read_next { if read_next {
mod := (b & 0b11000000) >> 6 mod := (b & 0b11000000) >> 6
reg := (b & 0b00111000) >> 3 reg := (b & 0b00111000) >> 3