Move registers to CPU struct, start working on testing code
This commit is contained in:
parent
b511c6a620
commit
305ac557fa
@ -4,6 +4,8 @@ import "core:fmt"
|
|||||||
import "core:math"
|
import "core:math"
|
||||||
import "core:strings"
|
import "core:strings"
|
||||||
|
|
||||||
|
SEGMENT_REGISTER_START :: 8
|
||||||
|
|
||||||
get_i16 :: proc(data: []u8) -> i16 {
|
get_i16 :: proc(data: []u8) -> i16 {
|
||||||
return (i16)(data[1]) << 8 | (i16)(data[0])
|
return (i16)(data[1]) << 8 | (i16)(data[0])
|
||||||
}
|
}
|
||||||
@ -201,7 +203,7 @@ decode_data :: proc(inst_list: ^[dynamic]Instruction, data: []u8, bytes_to_read:
|
|||||||
continue
|
continue
|
||||||
} else if inst.opname == .SEGMENT {
|
} else if inst.opname == .SEGMENT {
|
||||||
reg := (curr_byte & 0b11000) >> 3
|
reg := (curr_byte & 0b11000) >> 3
|
||||||
has_segment = registers[SEGMENT_REGISTER_START+reg]
|
has_segment = CPU.registers[SEGMENT_REGISTER_START+reg]
|
||||||
idx += 1
|
idx += 1
|
||||||
continue
|
continue
|
||||||
} else if inst.opname == .AAM {
|
} else if inst.opname == .AAM {
|
||||||
|
@ -12,10 +12,10 @@ get_operand_value :: proc(operand: Operand) -> u16 {
|
|||||||
case RegisterId:
|
case RegisterId:
|
||||||
switch opr.access {
|
switch opr.access {
|
||||||
case .Low, .High:
|
case .Low, .High:
|
||||||
val := opr.access == .Low ? registers[opr.id].value.low : registers[opr.id].value.high
|
val := opr.access == .Low ? CPU.registers[opr.id].value.low : CPU.registers[opr.id].value.high
|
||||||
return u16(val)
|
return u16(val)
|
||||||
case .Full:
|
case .Full:
|
||||||
return registers[opr.id].value.full
|
return CPU.registers[opr.id].value.full
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
@ -24,11 +24,11 @@ get_operand_value :: proc(operand: Operand) -> u16 {
|
|||||||
set_register_value :: proc(reg_id: RegisterId, value: u16) {
|
set_register_value :: proc(reg_id: RegisterId, value: u16) {
|
||||||
switch reg_id.access {
|
switch reg_id.access {
|
||||||
case .Low:
|
case .Low:
|
||||||
registers[reg_id.id].value.low = u8(value)
|
CPU.registers[reg_id.id].value.low = u8(value)
|
||||||
case .High:
|
case .High:
|
||||||
registers[reg_id.id].value.high = u8(value)
|
CPU.registers[reg_id.id].value.high = u8(value)
|
||||||
case .Full:
|
case .Full:
|
||||||
registers[reg_id.id].value.full = u16(value)
|
CPU.registers[reg_id.id].value.full = u16(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,19 +48,19 @@ execute_instruction :: proc(inst: Instruction) {
|
|||||||
set_register_value(reg, src_val)
|
set_register_value(reg, src_val)
|
||||||
case .ADD:
|
case .ADD:
|
||||||
src_val := get_operand_value(inst.src)
|
src_val := get_operand_value(inst.src)
|
||||||
val := registers[reg.id].value.full + src_val
|
val := CPU.registers[reg.id].value.full + src_val
|
||||||
set_register_value(reg, val)
|
set_register_value(reg, val)
|
||||||
check_zero_flag(val)
|
check_zero_flag(val)
|
||||||
check_sign_flag(val)
|
check_sign_flag(val)
|
||||||
case .SUB:
|
case .SUB:
|
||||||
src_val := get_operand_value(inst.src)
|
src_val := get_operand_value(inst.src)
|
||||||
val := registers[reg.id].value.full - src_val
|
val := CPU.registers[reg.id].value.full - src_val
|
||||||
set_register_value(reg, val)
|
set_register_value(reg, val)
|
||||||
check_zero_flag(val)
|
check_zero_flag(val)
|
||||||
check_sign_flag(val)
|
check_sign_flag(val)
|
||||||
case .CMP:
|
case .CMP:
|
||||||
src_val := get_operand_value(inst.src)
|
src_val := get_operand_value(inst.src)
|
||||||
val := registers[reg.id].value.full - src_val
|
val := CPU.registers[reg.id].value.full - src_val
|
||||||
check_zero_flag(val)
|
check_zero_flag(val)
|
||||||
check_sign_flag(val)
|
check_sign_flag(val)
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ get_register_name :: proc(reg_id: RegisterId) -> string {
|
|||||||
low_names := [?]string{"al", "cl", "dl", "bl"}
|
low_names := [?]string{"al", "cl", "dl", "bl"}
|
||||||
high_names := [?]string{"ah", "ch", "dh", "bh"}
|
high_names := [?]string{"ah", "ch", "dh", "bh"}
|
||||||
switch reg_id.access {
|
switch reg_id.access {
|
||||||
case .Full: return registers[reg_id.id].fullname
|
case .Full: return CPU.registers[reg_id.id].fullname
|
||||||
case .Low: return low_names[reg_id.id]
|
case .Low: return low_names[reg_id.id]
|
||||||
case .High: return high_names[reg_id.id % 4]
|
case .High: return high_names[reg_id.id % 4]
|
||||||
}
|
}
|
||||||
|
47
sim8086.odin
47
sim8086.odin
@ -1,33 +1,32 @@
|
|||||||
package sim_8086
|
package sim_8086
|
||||||
|
|
||||||
import "core:os"
|
import "core:os"
|
||||||
|
import "core:path"
|
||||||
import "core:fmt"
|
import "core:fmt"
|
||||||
import "core:math"
|
import "core:math"
|
||||||
import "core:strings"
|
import "core:strings"
|
||||||
|
|
||||||
registers := [?]Register {
|
|
||||||
{fullname = "ax", code = 0b000},
|
|
||||||
{fullname = "cx", code = 0b001},
|
|
||||||
{fullname = "dx", code = 0b010},
|
|
||||||
{fullname = "bx", code = 0b011},
|
|
||||||
{fullname = "sp", code = 0b100},
|
|
||||||
{fullname = "bp", code = 0b101},
|
|
||||||
{fullname = "si", code = 0b110},
|
|
||||||
{fullname = "di", code = 0b111},
|
|
||||||
{fullname = "es", code = 0b000},
|
|
||||||
{fullname = "cs", code = 0b001},
|
|
||||||
{fullname = "ss", code = 0b010},
|
|
||||||
{fullname = "ds", code = 0b011},
|
|
||||||
}
|
|
||||||
|
|
||||||
variable_port := registers[2]
|
|
||||||
|
|
||||||
SEGMENT_REGISTER_START :: 8
|
|
||||||
|
|
||||||
CPU := Cpu {
|
CPU := Cpu {
|
||||||
memory = make([dynamic]u8, 65536)
|
registers = [12]Register {
|
||||||
|
{fullname = "ax", code = 0b000},
|
||||||
|
{fullname = "cx", code = 0b001},
|
||||||
|
{fullname = "dx", code = 0b010},
|
||||||
|
{fullname = "bx", code = 0b011},
|
||||||
|
{fullname = "sp", code = 0b100},
|
||||||
|
{fullname = "bp", code = 0b101},
|
||||||
|
{fullname = "si", code = 0b110},
|
||||||
|
{fullname = "di", code = 0b111},
|
||||||
|
{fullname = "es", code = 0b000},
|
||||||
|
{fullname = "cs", code = 0b001},
|
||||||
|
{fullname = "ss", code = 0b010},
|
||||||
|
{fullname = "ds", code = 0b011},
|
||||||
|
},
|
||||||
|
memory = make([dynamic]u8, 65536),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variable_port := CPU.registers[2]
|
||||||
|
|
||||||
|
|
||||||
main :: proc() {
|
main :: proc() {
|
||||||
f,err := os.open(os.args[1])
|
f,err := os.open(os.args[1])
|
||||||
if err != os.ERROR_NONE {
|
if err != os.ERROR_NONE {
|
||||||
@ -67,9 +66,15 @@ main :: proc() {
|
|||||||
full, 18 - len(full), "|", hex, 10 - len(hex), "|", reg.value.high, reg.value.low)
|
full, 18 - len(full), "|", hex, 10 - len(hex), "|", reg.value.high, reg.value.low)
|
||||||
fmt.println()
|
fmt.println()
|
||||||
}
|
}
|
||||||
for reg in registers {
|
for reg in CPU.registers {
|
||||||
print_reg(reg)
|
print_reg(reg)
|
||||||
}
|
}
|
||||||
|
// fmt.println("Checking Against Expected State")
|
||||||
|
|
||||||
|
// fmt.println(os.args[1])
|
||||||
|
// path := path.base_no_ext(os.args[1])
|
||||||
|
// fmt.println(path)
|
||||||
|
// extract_expected_cpu_state(path)
|
||||||
}
|
}
|
||||||
if what_to_print == "instructions" || what_to_print == "all" {
|
if what_to_print == "instructions" || what_to_print == "all" {
|
||||||
print_instructions_stdout(instructions_list[:])
|
print_instructions_stdout(instructions_list[:])
|
||||||
|
38
testing.odin
Normal file
38
testing.odin
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package sim_8086
|
||||||
|
|
||||||
|
import "core:os"
|
||||||
|
import "core:fmt"
|
||||||
|
import "core:math"
|
||||||
|
import "core:strings"
|
||||||
|
import "core:text/regex"
|
||||||
|
|
||||||
|
extract_expected_cpu_state :: proc(listing_num: int) -> (Cpu, bool) {
|
||||||
|
cpu: Cpu
|
||||||
|
|
||||||
|
// filename := fmt.aprintf("./asm_files/list-%04d.txt", listing_num)
|
||||||
|
// fmt.println(filename)
|
||||||
|
// data,ok := os.read_entire_file(filename)
|
||||||
|
// if !ok {
|
||||||
|
// return cpu, false
|
||||||
|
// }
|
||||||
|
// defer delete(data)
|
||||||
|
|
||||||
|
// content := string(data)
|
||||||
|
// lines := strings.split(content, "\n")
|
||||||
|
// defer delete(lines)
|
||||||
|
|
||||||
|
// for line in lines {
|
||||||
|
// for c in line {
|
||||||
|
// if c != ' ' {
|
||||||
|
// continue
|
||||||
|
// } else {
|
||||||
|
// fmt.print(c)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// fmt.println()
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
// cpu.registers[]
|
||||||
|
return cpu, true
|
||||||
|
}
|
@ -134,6 +134,7 @@ Instruction :: struct {
|
|||||||
|
|
||||||
Cpu :: struct {
|
Cpu :: struct {
|
||||||
flags: Flags,
|
flags: Flags,
|
||||||
|
registers: [12]Register,
|
||||||
memory: [dynamic]u8,
|
memory: [dynamic]u8,
|
||||||
total_bytes_processed: int
|
total_bytes_processed: int
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user