MicrOS
stack.h
Go to the documentation of this file.
1 #ifndef V8086_STACK_H
2 #define V8086_STACK_H
3 
4 #include "v8086.h"
5 #include "memory_operations.h"
6 
7 static inline void push_byte(v8086* machine, uint8_t value)
8 {
9  machine->regs.w.sp -= 1;
10  write_byte_to_pointer(machine->Memory, get_absolute_address(machine->sregs.ss, machine->regs.w.sp), value);
11 }
12 
13 static inline void push_word(v8086* machine, uint16_t value)
14 {
15  machine->regs.w.sp -= 2;
16  write_word_to_pointer(machine->Memory, get_absolute_address(machine->sregs.ss, machine->regs.w.sp), value);
17 }
18 
19 static inline void push_dword(v8086* machine, uint32_t value)
20 {
21  machine->regs.w.sp -= 4;
22  write_dword_to_pointer(machine->Memory, get_absolute_address(machine->sregs.ss, machine->regs.w.sp), value);
23 }
24 
25 static inline uint8_t pop_byte(v8086* machine)
26 {
27  uint8_t v = read_byte_from_pointer(machine->Memory, get_absolute_address(machine->sregs.ss, machine->regs.w.sp));
28  machine->regs.w.sp += 1;
29  return v;
30 }
31 
32 static inline uint16_t pop_word(v8086* machine)
33 {
34  uint16_t v = read_word_from_pointer(machine->Memory, get_absolute_address(machine->sregs.ss, machine->regs.w.sp));
35  machine->regs.w.sp += 2;
36  return v;
37 }
38 
40 {
41  uint32_t v = read_dword_from_pointer(machine->Memory, get_absolute_address(machine->sregs.ss, machine->regs.w.sp));
42  machine->regs.w.sp += 4;
43  return v;
44 }
45 
46 #endif //V8086_STACK_H
uint16_t sp
Definition: v8086.h:84
static void write_word_to_pointer(uint8_t *memory, uint32_t absolute_address, uint16_t value)
Definition: memory_operations.h:47
static void push_word(v8086 *machine, uint16_t value)
Definition: stack.h:13
v8086 * machine
Definition: vbe.c:8
static uint16_t pop_word(v8086 *machine)
Definition: stack.h:32
static void push_dword(v8086 *machine, uint32_t value)
Definition: stack.h:19
uint8_t Memory[0x100000]
Definition: v8086.h:161
static uint32_t pop_dword(v8086 *machine)
Definition: stack.h:39
#define get_absolute_address(segment, offset)
Definition: memory_operations.h:7
uint16_t ss
Definition: v8086.h:125
union REGS regs
Definition: v8086.h:157
static void push_byte(v8086 *machine, uint8_t value)
Definition: stack.h:7
Definition: v8086.h:155
#define read_dword_from_pointer(memory, absolute_address)
Definition: memory_operations.h:21
static uint8_t pop_byte(v8086 *machine)
Definition: stack.h:25
#define read_byte_from_pointer(memory, absolute_address)
Definition: memory_operations.h:17
struct WORDREGS w
Definition: v8086.h:118
size_t uint32_t
Unsigned integral type.
Definition: string.h:8
static void write_byte_to_pointer(uint8_t *memory, uint32_t absolute_address, uint8_t value)
Definition: memory_operations.h:42
static void write_dword_to_pointer(uint8_t *memory, uint32_t absolute_address, uint32_t value)
Definition: memory_operations.h:52
struct SREGS sregs
Definition: v8086.h:158
#define read_word_from_pointer(memory, absolute_address)
Definition: memory_operations.h:19