/
vmstate.c
152 lines (129 loc) · 3.09 KB
/
vmstate.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <myvm.h>
struct _VmState {
struct {
enum Register a;
enum Register b;
enum Register c;
enum Register d;
enum Register e;
enum Register f;
} general;
struct {
unsigned int equal:1;
unsigned int greater:1;
unsigned int unused:6;
} flag;
unsigned int ip;
};
VmState vmstate_new(VmFile vmfile)
{
VmState state = calloc(sizeof(*state), 1);
if(state == NULL) {
vmerrno = VM_ENOCREATESTATE;
return NULL;
}
state->general.a = 0x00;
state->general.b = 0x00;
state->general.c = 0x00;
state->general.d = 0x00;
state->general.e = 0x00;
state->general.f = 0x00;
state->flag.equal = 0x0;
state->flag.greater = 0x0;
state->flag.unused = 0x00;
state->ip = vmfile_entry_get(vmfile) - 0x10; /* remove header size to adjust for zero */
return state;
}
unsigned char vmstate_general_get(VmState state, enum Register reg)
{
switch(reg) {
case RA:
return state->general.a;
case RB:
return state->general.b;
case RC:
return state->general.c;
case RD:
return state->general.d;
case RE:
return state->general.e;
case RF:
return state->general.f;
}
return 0;
}
VmState vmstate_general_set(VmState state, enum Register reg, unsigned char data)
{
switch(reg) {
case RA:
state->general.a = data;break;
case RB:
state->general.b = data;break;
case RC:
state->general.c = data;break;
case RD:
state->general.d = data;break;
case RE:
state->general.e = data;break;
case RF:
state->general.f = data;break;
}
return state;
}
VmState vmstate_ip_set(VmState state, unsigned int addr)
{
state->ip = addr;
return state;
}
unsigned int vmstate_ip_get(VmState state)
{
return state->ip;
}
VmState vmstate_ip_inc(VmState state)
{
return vmstate_ip_set(state, state->ip + 1);
}
VmState vmstate_flag_equal_set_true(VmState state)
{
state->flag.equal = 0x1;
return state;
}
VmState vmstate_flag_equal_set_false(VmState state)
{
state->flag.equal = 0x0;
return state;
}
unsigned int vmstate_flag_equal_get(VmState state)
{
return state->flag.equal;
}
VmState vmstate_flag_greater_set_true(VmState state)
{
state->flag.greater = 0x1;
return state;
}
VmState vmstate_flag_greater_set_false(VmState state)
{
state->flag.greater = 0x0;
return state;
}
unsigned int vmstate_flag_greater_get(VmState state)
{
return state->flag.greater;
}
void vmstate_print(VmState state)
{
printf("Virtual Machine Registers\n");
printf(" General: %.2x %.2x %.2x %.2x %.2x %.2x\n", \
state->general.a, state->general.b, \
state->general.c, state->general.d, \
state->general.e, state->general.f);
printf(" Instruction Pointer: %.8x\n", state->ip);
}
void vmstate_del(VmState state)
{
free(state);
}