Compare commits
	
		
			2 Commits
		
	
	
		
			96d1381303
			...
			904c398911
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 904c398911 | |||
| 416df979cf | 
@@ -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.
										
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
<EFBFBD>""<22>DD<44>ff<66><66><EFBFBD><EFBFBD>Ўێ<D08E>
 | 
			
		||||
@@ -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) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								8086_sim/sim86
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								8086_sim/sim86
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user