performance-aware/sim8086.odin

67 lines
1.9 KiB
Odin

package sim_8086
import "core:os"
import path "core:path/filepath"
import "core:fmt"
import "core:math"
import "core:strings"
CPU := Cpu {
memory = make([dynamic]u8, 65536),
}
main :: proc() {
f,err := os.open(os.args[1])
if err != os.ERROR_NONE {
fmt.eprintln("ERROR:", err)
os.exit(1)
}
defer os.close(f)
what_to_print := len(os.args) >= 3 ? os.args[2] : ""
data := make([]u8, 1024)
bytes_read, err2 := os.read(f, data)
if err2 != nil {
// ...
os.exit(1)
}
// asdf :u16 = 0b00000110_11011101
// asdf2 :i16 = (i16)(asdf)
// fmt.printfln("%d", asdf2)
print_at_end := false
line_count := 0
instruction_list := make([dynamic]string, 0, 512)
instructions_list := make([dynamic]Instruction, 0, 512)
decode_data(&instructions_list, data[:], bytes_read)
for inst in instructions_list {
execute_instruction(inst)
}
if what_to_print == "registers" || what_to_print == "all" {
for reg,i in CPU.registers {
full := fmt.aprintf("%s: %d ", get_register_name(RegisterId{idx=i}), reg.full)
hex := fmt.aprintf("0x%04x ", reg.full)
fmt.printf("%s %*[1]s %s %*[4]s %08b %08b",
full, 18 - len(full), "|", hex, 10 - len(hex), "|", reg.high, reg.low)
fmt.println()
}
path,ok := strings.replace(os.args[1], ".bin", ".txt", 1)
expected_cpu,_ := extract_expected_cpu_state(path)
for reg,i in expected_cpu.registers {
if CPU.registers[i].full != reg.full {
name := get_register_name(RegisterId{idx=i})
msg := "%s register does not match - Expected %04x | Actual %04x"
fmt.eprintfln(msg, name, reg.full, CPU.registers[i].full)
}
}
}
if what_to_print == "instructions" || what_to_print == "all" {
print_instructions_stdout(instructions_list[:])
}
}