Encode jump offsets, collect instruction lines as strings, print at end
This commit is contained in:
parent
1f9837b256
commit
6365bd73a0
@ -106,6 +106,8 @@ InstructionInfo :: struct {
|
|||||||
is_jump: bool,
|
is_jump: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Maybe we can get rid of it since I don't have to specify the shift_offset,
|
||||||
|
// not like it changes a lot
|
||||||
reg_first_last := RegInfo{ in_first_byte = true, shift_offset = 0 }
|
reg_first_last := RegInfo{ in_first_byte = true, shift_offset = 0 }
|
||||||
reg_second_middle := RegInfo{ in_first_byte = false, shift_offset = 3 }
|
reg_second_middle := RegInfo{ in_first_byte = false, shift_offset = 3 }
|
||||||
|
|
||||||
@ -345,6 +347,7 @@ main :: proc() {
|
|||||||
// 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-02-39.bin")
|
||||||
f,err := os.open(os.args[1])
|
f,err := os.open(os.args[1])
|
||||||
if err != os.ERROR_NONE {
|
if err != os.ERROR_NONE {
|
||||||
|
fmt.eprintln("ERROR:", err)
|
||||||
os.exit(1)
|
os.exit(1)
|
||||||
}
|
}
|
||||||
defer os.close(f)
|
defer os.close(f)
|
||||||
@ -368,9 +371,11 @@ main :: proc() {
|
|||||||
// fmt.printfln("%d", asdf2)
|
// fmt.printfln("%d", asdf2)
|
||||||
read_next := false
|
read_next := false
|
||||||
src_dst := true
|
src_dst := true
|
||||||
fmt.println("bits 16\n")
|
|
||||||
idx := 0
|
idx := 0
|
||||||
added_label := false
|
added_label := false
|
||||||
|
line_count := 0
|
||||||
|
instruction_builder := strings.builder_make()
|
||||||
|
instruction_list := make([dynamic]string, 128)
|
||||||
for idx < bytes_read {
|
for idx < bytes_read {
|
||||||
processed := 1
|
processed := 1
|
||||||
curr_byte := data[idx]
|
curr_byte := data[idx]
|
||||||
@ -378,7 +383,9 @@ main :: proc() {
|
|||||||
instruction, ok := try_find_instruction(curr_byte)
|
instruction, ok := try_find_instruction(curr_byte)
|
||||||
if !ok {
|
if !ok {
|
||||||
txt := "unknown instruction"
|
txt := "unknown instruction"
|
||||||
fmt.printfln("%s %*[1]s %8b", txt, RIGHT_ALIGN_AMOUNT - len(txt), ";;", curr_byte)
|
line := fmt.aprintf("%s %*[1]s %8b", txt, RIGHT_ALIGN_AMOUNT - len(txt), ";;", curr_byte)
|
||||||
|
instruction_list[line_count] = line
|
||||||
|
line_count += 1
|
||||||
idx += 1
|
idx += 1
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -409,6 +416,7 @@ main :: proc() {
|
|||||||
reg = (b >> reg_info.shift_offset) & 0b111
|
reg = (b >> reg_info.shift_offset) & 0b111
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
data_idx := idx + 1
|
data_idx := idx + 1
|
||||||
|
|
||||||
if instruction.has_address {
|
if instruction.has_address {
|
||||||
@ -474,11 +482,9 @@ main :: proc() {
|
|||||||
opname = strings.to_lower(fmt.aprintf("%s", instruction.opname))
|
opname = strings.to_lower(fmt.aprintf("%s", instruction.opname))
|
||||||
}
|
}
|
||||||
if instruction.is_jump {
|
if instruction.is_jump {
|
||||||
if !added_label {
|
// NOTE: In order to mimic the label offset, you have to take the value you got and add two
|
||||||
fmt.println("\nlabel:")
|
value := (i8)(data[idx+1]) + 2
|
||||||
added_label = true
|
full_inst = fmt.aprintf("%s $%s%d ; %d", strings.to_lower(opname), value >= 0 ? "+" : "", value, value - 2)
|
||||||
}
|
|
||||||
full_inst = fmt.aprintf("%s %s", strings.to_lower(opname), "label")
|
|
||||||
processed += 1
|
processed += 1
|
||||||
} else {
|
} else {
|
||||||
opname = strings.to_lower(opname)
|
opname = strings.to_lower(opname)
|
||||||
@ -488,11 +494,17 @@ main :: proc() {
|
|||||||
full_inst = fmt.aprintf("%s %s%s, %s", opname, size_string, lhs, rhs)
|
full_inst = fmt.aprintf("%s %s%s, %s", opname, size_string, lhs, rhs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fmt.printf("%s %*[1]s", full_inst, RIGHT_ALIGN_AMOUNT - len(full_inst), ";;")
|
fmt.sbprintf(&instruction_builder, "%s %*[1]s", full_inst, RIGHT_ALIGN_AMOUNT - len(full_inst), ";;")
|
||||||
for i in 0..<processed {
|
for i in 0..<processed {
|
||||||
fmt.printf(" %08b", data[idx + i])
|
fmt.sbprintf(&instruction_builder, " %08b", data[idx + i])
|
||||||
}
|
}
|
||||||
fmt.println()
|
instruction_list[line_count] = strings.clone(strings.to_string(instruction_builder))
|
||||||
idx += processed
|
idx += processed
|
||||||
|
line_count += 1
|
||||||
|
strings.builder_reset(&instruction_builder)
|
||||||
|
}
|
||||||
|
fmt.println("bits 16\n")
|
||||||
|
for i in 0..<line_count {
|
||||||
|
fmt.println(instruction_list[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user