MicrOS
v8086.h
Go to the documentation of this file.
1 #ifndef V8086_H
2 #define V8086_H
3 
4 #include <stdint.h>
5 #include <stdbool.h>
6 #include "../cpu/timer/timer.h"
7 
8 #define bit_get(p,m) ((p) & (m))
9 #define bit_set(p,m) ((p) |= (m))
10 #define bit_clear(p,m) ((p) &= ~(m))
11 #define bit_flip(p,m) ((p) ^= (m))
12 #define bit_write(p,m,v) ((v) ? bit_set(p,m) : bit_clear(p,m))
13 
14 #define CARRY_FLAG_BIT 0u
15 #define PARITY_FLAG_BIT 2u
16 #define AUX_CARRY_FLAG_BIT 4u
17 #define ZERO_FLAG_BIT 6u
18 #define SIGN_FLAG_BIT 7u
19 #define INTERRUPT_FLAG_BIT 9u
20 #define DIRECTION_FLAG_BIT 10u
21 #define OVERFLOW_FLAG_BIT 11u
22 
23 //#define DEBUG_V8086
24 //#define TEST_V8086
25 
26 typedef enum _segment_register_select {
29 
30 typedef enum _repeat_prefix {
33 
36 };
37 
41 
42 typedef enum _machine_status {
43  V8086_OK = 0,
64 
65 struct DWORDREGS {
75  uint16_t eflags;
76 
77 } __attribute__((packed));
78 
79 struct WORDREGS {
80  uint16_t ax, _upper_ax;
81  uint16_t cx, _upper_cx;
82  uint16_t dx, _upper_dx;
83  uint16_t bx, _upper_bx;
84  uint16_t sp, _upper_sp;
85  uint16_t bp, _upper_bp;
86  uint16_t si, _upper_si;
87  uint16_t di, _upper_di;
88  uint16_t cflag, _upper_cflag;
89  uint16_t flags;
90 
91 } __attribute__((packed));
92 
93 struct BYTEREGS {
94  uint8_t al;
95  uint8_t ah;
96  uint16_t _upper_ax;
97  uint8_t cl;
98  uint8_t ch;
99  uint16_t _upper_cx;
100  uint8_t dl;
101  uint8_t dh;
102  uint16_t _upper_dx;
103  uint8_t bl;
104  uint8_t bh;
105  uint16_t _upper_bx;
106  uint16_t sp, _upper_sp;
107  uint16_t bp, _upper_bp;
108  uint16_t si, _upper_si;
109  uint16_t di, _upper_di;
111  uint16_t flags;
112 
113 } __attribute__((packed));
114 
115 union REGS { /* Compatible with DPMI structure, except cflag */
116  struct DWORDREGS d;
117  struct WORDREGS x;
118  struct WORDREGS w;
119  struct BYTEREGS h;
120 };
121 
122 struct SREGS {
123  uint16_t es;
124  uint16_t cs;
125  uint16_t ss;
126  uint16_t ds;
127  uint16_t fs;
128  uint16_t gs;
129 } __attribute__((packed));
130 
131 struct DWORDIP{
133 } __attribute__((packed));
134 
135 struct WORDIP {
136  uint16_t ip;
137  uint16_t _upper_ip;
138 } __attribute__((packed));
139 
140 union IP {
141  struct DWORDIP d;
142  struct WORDIP w;
143  struct WORDIP x;
144 };
145 
146 typedef struct _is{
151  uint16_t IPOffset;
153 }__attribute__((packed)) _internal_state;
154 
155 typedef struct _v8086
156 {
157  union REGS regs;
158  struct SREGS sregs;
159  union IP IP;
161  uint8_t Memory[0x100000];
162  enum instruction_set_compatibility is_compatibility;
163  int16_t (*operations[256]) (struct _v8086*, uint8_t);
164  int16_t (*operations_0fh[256]) (struct _v8086*, uint8_t);
165 
166 }__attribute__((packed)) v8086;
167 
168 
171 int16_t v8086_call_int(v8086* machine, int16_t num);
175 int16_t v8086_call_com_program(v8086* machine, char* programPath);
176 
177 #ifdef DEBUG_V8086
178  void send_reg_32(uint32_t reg);
179  void send_reg_16(uint16_t reg);
180  void send_regs(v8086* machine);
181  void send_sregs(v8086* machine);
183  uint8_t read_reg_8();
184  uint16_t read_reg_16();
185  uint32_t read_reg_32();
186  void read_regs(v8086* machine);
187  void read_sregs(v8086* machine);
188  void setSkipDebugging(bool value);
189 #endif
190 #endif
Definition: v8086.h:27
Definition: v8086.h:40
Definition: v8086.h:93
uint16_t sp
Definition: v8086.h:84
int16_t v8086_call_int(v8086 *machine, int16_t num)
Definition: v8086.c:405
uint16_t cs
Definition: v8086.h:124
v8086 * v8086_create_machine()
Definition: v8086.c:366
Definition: v8086.h:40
Definition: v8086.h:35
uint16_t _upper_bx
Definition: v8086.h:105
uint8_t bl
Definition: v8086.h:103
uint32_t ebp
Definition: v8086.h:71
uint32_t v8086_get_address_of_int(v8086 *machine, int16_t num)
Definition: v8086.c:418
BYTE_REGISTERS
Definition: v8086.h:38
uint32_t eax
Definition: v8086.h:66
uint16_t _upper_ax
Definition: v8086.h:96
Definition: v8086.h:39
instruction_set_compatibility
Definition: v8086.h:34
Definition: v8086.h:38
pci_in_data d
Definition: pci.c:9
Definition: v8086.h:35
uint32_t operand_32_bit
Definition: v8086.h:147
uint32_t eip
Definition: v8086.h:132
uint8_t cl
Definition: v8086.h:97
repeat_prefix
Definition: v8086.h:30
Definition: v8086.h:39
Definition: v8086.h:43
Definition: v8086.h:38
Definition: v8086.h:27
Definition: v8086.h:58
uint16_t ax
Definition: v8086.h:80
Definition: v8086.h:45
machine_status
Definition: v8086.h:42
uint16_t ip
Definition: v8086.h:136
uint16_t eflags
Definition: v8086.h:75
uint32_t ebx
Definition: v8086.h:69
uint16_t si
Definition: v8086.h:86
uint16_t bx
Definition: v8086.h:83
Definition: v8086.h:46
uint16_t sp
Definition: v8086.h:106
Definition: v8086.h:38
Definition: v8086.h:44
Definition: v8086.h:40
uint16_t di
Definition: v8086.h:87
Definition: v8086.h:39
v8086 * machine
Definition: vbe.c:8
uint8_t ch
Definition: v8086.h:98
Definition: v8086.h:39
Definition: v8086.h:38
uint16_t _upper_dx
Definition: v8086.h:102
Definition: v8086.h:27
repeat_prefix rep_prefix
Definition: v8086.h:150
segment_register_select
Definition: v8086.h:26
uint8_t bh
Definition: v8086.h:104
Definition: v8086.h:27
Definition: v8086.h:31
Definition: v8086.h:49
uint8_t previous_byte_was_prefix
Definition: v8086.h:152
int16_t v8086_call_com_program(v8086 *machine, char *programPath)
Definition: v8086.c:672
_internal_state internal_state
Definition: v8086.h:160
Definition: v8086.h:57
Definition: v8086.h:53
uint16_t _upper_cx
Definition: v8086.h:99
Definition: v8086.h:131
segment_register_select segment_reg_select
Definition: v8086.h:149
Definition: v8086.h:115
uint8_t dl
Definition: v8086.h:100
uint16_t bp
Definition: v8086.h:107
void v8086_set_8086_instruction_set(v8086 *machine)
Definition: v8086.c:126
Definition: v8086.h:38
uint16_t _upper_ip
Definition: v8086.h:137
uint16_t cx
Definition: v8086.h:81
uint16_t dx
Definition: v8086.h:82
uint16_t si
Definition: v8086.h:108
Definition: v8086.h:38
Definition: v8086.h:39
Definition: v8086.h:48
Definition: v8086.h:38
uint32_t edx
Definition: v8086.h:68
Definition: v8086.h:54
uint16_t es
Definition: v8086.h:123
uint8_t dh
Definition: v8086.h:101
void v8086_destroy_machine(v8086 *machine)
Definition: v8086.c:390
uint16_t ss
Definition: v8086.h:125
Definition: v8086.h:51
DWORD_REGISTERS
Definition: v8086.h:40
Definition: v8086.h:59
Definition: v8086.h:65
Definition: v8086.h:61
Definition: v8086.h:39
uint8_t al
Definition: v8086.h:94
Definition: v8086.h:146
uint16_t flags
Definition: v8086.h:111
Definition: v8086.h:135
Definition: v8086.h:40
uint16_t ds
Definition: v8086.h:126
Definition: v8086.h:27
Definition: v8086.h:40
Definition: v8086.h:56
Definition: v8086.h:60
uint32_t address_32_bit
Definition: v8086.h:148
Definition: v8086.h:155
Definition: v8086.h:40
Definition: v8086.h:140
Definition: v8086.h:39
uint16_t fs
Definition: v8086.h:127
uint16_t cflag
Definition: v8086.h:88
uint16_t di
Definition: v8086.h:109
uint32_t edi
Definition: v8086.h:73
Definition: v8086.h:79
Definition: v8086.h:50
Definition: v8086.h:40
uint32_t ecx
Definition: v8086.h:67
Definition: v8086.h:31
Definition: v8086.h:52
Definition: v8086.h:27
int16_t parse_and_execute_instruction(v8086 *machine)
Definition: v8086.c:425
uint32_t cflag
Definition: v8086.h:110
uint16_t bp
Definition: v8086.h:85
uint32_t esi
Definition: v8086.h:72
uint32_t esp
Definition: v8086.h:70
uint8_t ah
Definition: v8086.h:95
Definition: v8086.h:47
uint32_t cflag
Definition: v8086.h:74
uint16_t gs
Definition: v8086.h:128
uint16_t IPOffset
Definition: v8086.h:151
uint16_t flags
Definition: v8086.h:89
Definition: v8086.h:38
void v8086_set_386_instruction_set(v8086 *machine)
Definition: v8086.c:270
WORD_REGISTERS
Definition: v8086.h:39
Definition: v8086.h:40
Definition: v8086.h:62
Definition: v8086.h:27
Definition: v8086.h:39
size_t uint32_t
Unsigned integral type.
Definition: string.h:8
Definition: v8086.h:122
Definition: v8086.h:31