diff --git a/8086_sim/include/reg_access.h b/8086_sim/include/reg_access.h index d6a3d1a..b1c1383 100644 --- a/8086_sim/include/reg_access.h +++ b/8086_sim/include/reg_access.h @@ -4,6 +4,8 @@ #include "aliases.h" #include "sim86_instruction.h" +#define REGISTER_COUNT 13 + void set_register(register_access reg, u16 new_value); u16 get_register(register_access reg); const char *get_register_name(register_access reg); diff --git a/8086_sim/reg_access.cpp b/8086_sim/reg_access.cpp index 113953a..b5b7dfe 100644 --- a/8086_sim/reg_access.cpp +++ b/8086_sim/reg_access.cpp @@ -2,17 +2,17 @@ #include "include/aliases.h" #include -#define REGISTER_COUNT 13 - static u16 registers[REGISTER_COUNT] = {0}; +#define BIT_PER_BYTE 8 + void set_register(register_access reg, u16 new_value) { if (reg.Count == 2) { registers[reg.Index] = new_value; return; } - u16 shift = (u16)(reg.Offset) * (u16)sizeof(u8); + u16 shift = (u16)(reg.Offset) * BIT_PER_BYTE; u16 mask = 0xff00; registers[reg.Index] &= (mask >> shift); @@ -24,8 +24,10 @@ u16 get_register(register_access reg) { return registers[reg.Index]; } - // TODO (Abdelrahman): Implement this - return 0; + u16 shift = (u16)(reg.Offset) * BIT_PER_BYTE; + u16 mask = 0x00ff; + + return (registers[reg.Index] >> shift) & mask; } const char *get_register_name(register_access reg) { diff --git a/8086_sim/sim86 b/8086_sim/sim86 index 30946de..e4249f1 100644 Binary files a/8086_sim/sim86 and b/8086_sim/sim86 differ diff --git a/8086_sim/sim86.cpp b/8086_sim/sim86.cpp index 9229eec..b9e578d 100644 --- a/8086_sim/sim86.cpp +++ b/8086_sim/sim86.cpp @@ -42,6 +42,8 @@ int main(int argc, char *argv[]) { u32 offset = 0; + bool accessed_registers[REGISTER_COUNT] = {false}; + while (offset < size) { instruction decoded; Sim86_Decode8086Instruction(size - offset, buffer + offset, &decoded); @@ -55,13 +57,22 @@ int main(int argc, char *argv[]) { if (dest.Type == Operand_Register) { mov_to_register(dest.Register, source); - printf("%s: 0x%04x\n", get_register_name(dest.Register), - get_register(dest.Register)); + + accessed_registers[dest.Register.Index] = true; } } } } + for (u32 i = 0; i < REGISTER_COUNT; ++i) { + if (accessed_registers[i]) { + register_access reg = {i, 0, 2}; + u16 value = get_register(reg); + + printf("%s: 0x%04x (%d)\n", get_register_name(reg), value, value); + } + } + return 0; }