Convert TBD instruction op names to the actual enum variants, rather than strings
This commit is contained in:
parent
fd8f696627
commit
863ccfc583
@ -4,6 +4,64 @@ import "core:fmt"
|
|||||||
import "core:math"
|
import "core:math"
|
||||||
import "core:strings"
|
import "core:strings"
|
||||||
|
|
||||||
|
get_op :: proc(inst: Instruction) -> (Op, bool) {
|
||||||
|
op: Op
|
||||||
|
interseg: bool
|
||||||
|
if inst.opname == .TBD2 {
|
||||||
|
switch inst.raw_data[1] & 0b00111000 >> 3 {
|
||||||
|
case 0b000: op = .INC
|
||||||
|
case 0b001: op = .DEC
|
||||||
|
case 0b010: op = .CALL
|
||||||
|
// TODO: We really have to fix this because we shouldn't be figuring out if this
|
||||||
|
// is an intersegment here
|
||||||
|
case 0b011: op = .CALL; interseg = true
|
||||||
|
case 0b100: op = .JMP
|
||||||
|
case 0b101: op = .JMP; interseg = true
|
||||||
|
case 0b110: op = .PUSH
|
||||||
|
}
|
||||||
|
} else if inst.opname == .TBD5 {
|
||||||
|
switch inst.raw_data[1] & 0b00111000 >> 3 {
|
||||||
|
case 0b000: op = .TEST
|
||||||
|
case 0b001: op = .DEC
|
||||||
|
case 0b010: op = .NOT
|
||||||
|
case 0b011: op = .NEG
|
||||||
|
case 0b100: op = .MUL
|
||||||
|
case 0b101: op = .IMUL
|
||||||
|
case 0b110: op = .DIV
|
||||||
|
case 0b111: op = .IDIV
|
||||||
|
}
|
||||||
|
} else if inst.opname == .TBD6 {
|
||||||
|
switch inst.raw_data[1] & 0b00111000 >> 3 {
|
||||||
|
case 0b000: op = .ROL
|
||||||
|
case 0b001: op = .ROR
|
||||||
|
case 0b010: op = .RCL
|
||||||
|
case 0b011: op = .RCR
|
||||||
|
case 0b100: op = .SHL
|
||||||
|
case 0b101: op = .SHR
|
||||||
|
case 0b111: op = .SAR
|
||||||
|
}
|
||||||
|
} else if inst.opname == .TBD1 || inst.opname == .TBD3 || inst.opname == .TBD4 {
|
||||||
|
bits: u8
|
||||||
|
if inst.opname == .TBD1 || inst.opname == .TBD3 {
|
||||||
|
bits = inst.raw_data[0] & 0b00111000 >> 3
|
||||||
|
} else {
|
||||||
|
bits = inst.raw_data[1] & 0b00111000 >> 3
|
||||||
|
}
|
||||||
|
switch bits {
|
||||||
|
case 0b000: op = .ADD
|
||||||
|
case 0b001: op = .OR
|
||||||
|
case 0b010: op = .ADC
|
||||||
|
case 0b011: op = .SBB
|
||||||
|
case 0b100: op = .AND
|
||||||
|
case 0b101: op = .SUB
|
||||||
|
case 0b110: op = .XOR
|
||||||
|
case 0b111: op = .CMP
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
op = inst.opname
|
||||||
|
}
|
||||||
|
return op, interseg
|
||||||
|
}
|
||||||
parse_operand :: proc(inst: InstructionInfo, opinfo: OperandInfo, data: []u8, processed: ^int, word: bool, has_segreg: Maybe(Register)) -> Operand {
|
parse_operand :: proc(inst: InstructionInfo, opinfo: OperandInfo, data: []u8, processed: ^int, word: bool, has_segreg: Maybe(Register)) -> Operand {
|
||||||
operand: Operand = None{}
|
operand: Operand = None{}
|
||||||
switch opinfo {
|
switch opinfo {
|
||||||
@ -163,7 +221,6 @@ decode_data :: proc(inst_list: ^[dynamic]Instruction, data: []u8, bytes_to_read:
|
|||||||
|
|
||||||
processed += inst.consume_extra_bytes
|
processed += inst.consume_extra_bytes
|
||||||
|
|
||||||
instruction.opname = inst.opname
|
|
||||||
instruction.src = src_opr
|
instruction.src = src_opr
|
||||||
instruction.dst = dst_opr
|
instruction.dst = dst_opr
|
||||||
instruction.is_word = word
|
instruction.is_word = word
|
||||||
@ -173,6 +230,8 @@ decode_data :: proc(inst_list: ^[dynamic]Instruction, data: []u8, bytes_to_read:
|
|||||||
instruction.info = inst
|
instruction.info = inst
|
||||||
instruction.has_lock = has_lock
|
instruction.has_lock = has_lock
|
||||||
instruction.has_segment = has_segment
|
instruction.has_segment = has_segment
|
||||||
|
instruction.opname = inst.opname
|
||||||
|
instruction.opname,instruction.indirect_intersegment = get_op(instruction)
|
||||||
|
|
||||||
// fmt.println(parsed_inst)
|
// fmt.println(parsed_inst)
|
||||||
append(inst_list, instruction)
|
append(inst_list, instruction)
|
||||||
|
@ -31,6 +31,8 @@ Op :: enum {
|
|||||||
SBB,
|
SBB,
|
||||||
DEC,
|
DEC,
|
||||||
NEG,
|
NEG,
|
||||||
|
MUL,
|
||||||
|
IMUL,
|
||||||
CMP,
|
CMP,
|
||||||
AAS,
|
AAS,
|
||||||
DAS,
|
DAS,
|
||||||
@ -40,8 +42,18 @@ Op :: enum {
|
|||||||
AAD,
|
AAD,
|
||||||
CBW,
|
CBW,
|
||||||
CWD,
|
CWD,
|
||||||
|
ROL,
|
||||||
|
ROR,
|
||||||
|
RCL,
|
||||||
|
RCR,
|
||||||
|
SHL,
|
||||||
|
SHR,
|
||||||
|
SAR,
|
||||||
NOT,
|
NOT,
|
||||||
TEST,
|
TEST,
|
||||||
|
OR,
|
||||||
|
AND,
|
||||||
|
XOR,
|
||||||
REP,
|
REP,
|
||||||
RET,
|
RET,
|
||||||
RETF,
|
RETF,
|
||||||
|
@ -194,16 +194,12 @@ get_instruction_string :: proc(inst_info: InstructionInfo, instruction: Instruct
|
|||||||
src_str := get_operand_string(inst.src, inst.has_segment)
|
src_str := get_operand_string(inst.src, inst.has_segment)
|
||||||
opname: string
|
opname: string
|
||||||
is_interseg: bool
|
is_interseg: bool
|
||||||
if inst_info.check_second_encoding {
|
// TODO: Do the RTTI thing here with reflection
|
||||||
opname,is_interseg = get_opname(inst)
|
opname = strings.to_lower(fmt.aprintf("%s", inst.opname))
|
||||||
} else {
|
|
||||||
// TODO: Do the RTTI thing here with reflection
|
|
||||||
opname = strings.to_lower(fmt.aprintf("%s", inst.opname))
|
|
||||||
}
|
|
||||||
|
|
||||||
if dst_str == "" {
|
if dst_str == "" {
|
||||||
interseg_string: string
|
interseg_string: string
|
||||||
if is_interseg {
|
if instruction.indirect_intersegment {
|
||||||
interseg_string = " far"
|
interseg_string = " far"
|
||||||
}
|
}
|
||||||
fmt.sbprintf(&instruction_builder, "%s%s %s%s", opname, interseg_string, size_string, src_str)
|
fmt.sbprintf(&instruction_builder, "%s%s %s%s", opname, interseg_string, size_string, src_str)
|
||||||
|
@ -20,7 +20,6 @@ WordSize :: enum {
|
|||||||
}
|
}
|
||||||
|
|
||||||
None :: struct {}
|
None :: struct {}
|
||||||
|
|
||||||
Disp8 :: i8
|
Disp8 :: i8
|
||||||
Disp16 :: i16
|
Disp16 :: i16
|
||||||
Displacement :: union {
|
Displacement :: union {
|
||||||
@ -118,7 +117,7 @@ Instruction :: struct {
|
|||||||
dst: Operand,
|
dst: Operand,
|
||||||
info: InstructionInfo,
|
info: InstructionInfo,
|
||||||
is_word: bool,
|
is_word: bool,
|
||||||
// indirect_intersegment: bool,
|
indirect_intersegment: bool,
|
||||||
// TODO: This is trickier than I thought, it's more than just the one instruction
|
// TODO: This is trickier than I thought, it's more than just the one instruction
|
||||||
// that uses it
|
// that uses it
|
||||||
has_segment: Maybe(Register),
|
has_segment: Maybe(Register),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user