forked from LeaoMartelo2/virtual_machine
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVMASM.h
More file actions
99 lines (67 loc) · 1.86 KB
/
Copy pathVMASM.h
File metadata and controls
99 lines (67 loc) · 1.86 KB
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
#ifndef VMASM_H
#define VMASM_H
#ifndef VMASM_INTERNAL
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
typedef int32_t i32;
typedef int32_t WORD;
typedef struct VM VM;
#define UNUSED(x) (void)(x)
#endif /* VMASM_INTERNAL */
typedef void (*set_register_ptr)(VM *, i32, i32);
typedef i32 (*get_register_ptr)(VM *, i32);
typedef struct VMASMObject{
i32 arg_a;
i32 arg_b;
i32 arg_c;
i32 arg_d;
i32 arg_e;
i32 arg_f;
i32 arg_g;
i32 arg_h;
} VMASMObject;
#define VMASMObject_Fmt "%d, %d, %d, %d, %d, %d, %d, %d"
#define VMASMObject_Arg(obj) (obj).arg_a, (obj).arg_b, (obj).arg_c, (obj).arg_d, (obj).arg_e, (obj).arg_f, (obj).arg_g, (obj).arg_h
typedef struct {
char *global_string;
VM *vm;
set_register_ptr set_register;
get_register_ptr get_register;
} __vmasm_internal;
#ifndef VMASM_INTERNAL
__vmasm_internal __internal = {
.global_string = NULL,
};
i32 __vmasm_internal_set_internal(__vmasm_internal external) {
//printf("__vmasm_internal_set_internal called\n");
__internal.vm = external.vm;
__internal.set_register = external.set_register;
__internal.get_register = external.get_register;
return 0;
}
i32 __vmasm_internal_setstring(const char *str) {
if(__internal.global_string != NULL) {
free(__internal.global_string);
__internal.global_string = NULL;
}
if (str == NULL) {
return 0;
}
__internal.global_string = strdup(str);
if(__internal.global_string == NULL) {
return 1;
}
return 0;
}
const char *vmasm_get_globalstring() {
return __internal.global_string;
}
void vmasm_set_register(i32 index, i32 value) {
__internal.set_register(__internal.vm, index, value);
}
i32 vmasm_get_register(i32 index) {
return __internal.get_register(__internal.vm, index);
}
#endif /* VMASM_INTERNAL */
#endif /* VMASM_H */