Add more instructions, add segment registers, move types up, read more data
This commit is contained in:
parent
c7ee622847
commit
390fedc848
108
decoder8086.odin
108
decoder8086.odin
@ -20,6 +20,9 @@ Register :: struct {
|
||||
OpName :: enum {
|
||||
TBD,
|
||||
MOV,
|
||||
PUSH,
|
||||
POP,
|
||||
XCHG,
|
||||
ADD,
|
||||
SUB,
|
||||
CMP,
|
||||
@ -69,6 +72,13 @@ registers := [8]Register {
|
||||
{fullname = "di", bytename = "bh", code = 0b111},
|
||||
}
|
||||
|
||||
segment_registers := [4]Register {
|
||||
{fullname = "es", code = 0b000},
|
||||
{fullname = "cs", code = 0b001},
|
||||
{fullname = "ss", code = 0b010},
|
||||
{fullname = "ds", code = 0b011},
|
||||
}
|
||||
|
||||
RegInfo :: struct {
|
||||
in_first_byte: bool,
|
||||
shift_offset: u8,
|
||||
@ -82,11 +92,61 @@ OpCodeId :: enum {
|
||||
|
||||
LastBit :: struct{}
|
||||
FourthBit :: struct{}
|
||||
Force :: struct{}
|
||||
|
||||
WordSize :: union {
|
||||
None,
|
||||
LastBit,
|
||||
FourthBit,
|
||||
Force,
|
||||
}
|
||||
|
||||
None :: struct {}
|
||||
|
||||
Disp8 :: i8
|
||||
Disp16 :: i16
|
||||
Displacement :: union {
|
||||
None,
|
||||
Disp8,
|
||||
Disp16
|
||||
}
|
||||
|
||||
Value8 :: i8
|
||||
Value16 :: i16
|
||||
Data :: union {
|
||||
None,
|
||||
Value8,
|
||||
Value16
|
||||
}
|
||||
|
||||
ModMemory :: struct {}
|
||||
Mod8BitDisp :: i8
|
||||
Mod16BitDisp :: i16
|
||||
ModRegister :: struct {}
|
||||
|
||||
ModMode :: union {
|
||||
ModMemory,
|
||||
Mod8BitDisp,
|
||||
Mod16BitDisp,
|
||||
ModRegister,
|
||||
}
|
||||
|
||||
RegisterId :: distinct u8
|
||||
Immediate8 :: distinct i8
|
||||
Immediate16 :: distinct i16
|
||||
MemoryAddr :: struct {
|
||||
addr_id: u8,
|
||||
displacement: Displacement
|
||||
}
|
||||
Accumulator :: distinct i16
|
||||
SegmentRegister :: distinct i8
|
||||
OperandType :: union {
|
||||
RegisterId,
|
||||
Immediate8,
|
||||
Immediate16,
|
||||
MemoryAddr,
|
||||
Accumulator,
|
||||
SegmentRegister,
|
||||
}
|
||||
|
||||
InstructionInfo :: struct {
|
||||
@ -182,52 +242,6 @@ instructions := [?]InstructionInfo {
|
||||
{ opname = .JCXZ, desc = "Jump on not zero", mask = 0b11111111, encoding = 0b11100011, is_jump = true},
|
||||
}
|
||||
|
||||
None :: struct {}
|
||||
|
||||
Disp8 :: i8
|
||||
Disp16 :: i16
|
||||
Displacement :: union {
|
||||
None,
|
||||
Disp8,
|
||||
Disp16
|
||||
}
|
||||
|
||||
Value8 :: i8
|
||||
Value16 :: i16
|
||||
Data :: union {
|
||||
None,
|
||||
Value8,
|
||||
Value16
|
||||
}
|
||||
|
||||
ModMemory :: struct {}
|
||||
Mod8BitDisp :: i8
|
||||
Mod16BitDisp :: i16
|
||||
ModRegister :: struct {}
|
||||
|
||||
ModMode :: union {
|
||||
ModMemory,
|
||||
Mod8BitDisp,
|
||||
Mod16BitDisp,
|
||||
ModRegister,
|
||||
}
|
||||
|
||||
RegisterId :: distinct u8
|
||||
Immediate8 :: distinct i8
|
||||
Immediate16 :: distinct i16
|
||||
MemoryAddr :: struct {
|
||||
addr_id: u8,
|
||||
displacement: Displacement
|
||||
}
|
||||
Accumulator :: distinct i16
|
||||
OperandType :: union {
|
||||
RegisterId,
|
||||
Immediate8,
|
||||
Immediate16,
|
||||
MemoryAddr,
|
||||
Accumulator,
|
||||
}
|
||||
|
||||
inst_map := make(map[u8]InstructionInfo)
|
||||
RIGHT_ALIGN_AMOUNT := 35
|
||||
|
||||
@ -352,7 +366,7 @@ main :: proc() {
|
||||
}
|
||||
defer os.close(f)
|
||||
|
||||
data := make([]u8, 512)
|
||||
data := make([]u8, 1024)
|
||||
bytes_read, err2 := os.read(f, data)
|
||||
if err2 != nil {
|
||||
// ...
|
||||
|
Loading…
x
Reference in New Issue
Block a user