Compare commits

...

2 Commits

Author SHA1 Message Date
904c398911 Completed the first 8086 simulation homework 2023-03-29 22:47:59 +01:00
416df979cf Removed the binaries 2023-03-29 22:47:23 +01:00
7 changed files with 22 additions and 8 deletions

View File

@ -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);

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
И""ЛDDЙffК<66><D09A><EFBFBD>а<EFBFBD>л<EFBFBD>С

View File

@ -2,17 +2,17 @@
#include "include/aliases.h"
#include <stdio.h>
#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) {

Binary file not shown.

View File

@ -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;
}