Compare commits
No commits in common. "7c48c5ed908abd7bdd25cc22c9d33c2aefacb68d" and "86428f026382b80ed2a7eb7a88ec8202e02606b0" have entirely different histories.
7c48c5ed90
...
86428f0263
@ -15,13 +15,6 @@ 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},
|
||||||
@ -33,70 +26,30 @@ 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-02-39.bin")
|
f,err := os.open(len(os.args) > 1 ? os.args[1] : "./asm_files/01-01-38.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, 512)
|
data := make([]u8, 256)
|
||||||
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
|
||||||
for inst in instructions {
|
// mov dx, bx
|
||||||
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 i in 0..<bytes_read {
|
for b in data {
|
||||||
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user