-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstructions.c
More file actions
156 lines (155 loc) · 2.84 KB
/
instructions.c
File metadata and controls
156 lines (155 loc) · 2.84 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
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
153
154
155
156
#include "instructions.h"
#include "opcode.h"
#include <stdio.h>
#include <stdlib.h>
extern uint16_t reg[14];
#define fl reg[8]
#define ip reg[9]
#define sp reg[10]
#define pr reg[11]
#define tmp0 reg[12]
#define tmp1 reg[13]
extern uint8_t ram[1 << 16];
#define check_signed(val)\
if((*val >> 15) == 1)\
fl |= (1 << 2);\
else\
fl &= ~(1 << 2);
#define check_zero(val)\
if(*val0 == 0)\
fl |= (1 << 3);\
else\
fl &= ~(1 << 3);
void _mov(uint16_t* const val0, const uint16_t val1)
{
*val0 = val1;
};
void _add(uint16_t* const val0, const uint16_t val1)
{
*val0 += val1;
check_signed(val0);
check_zero(val0);
};
void _sub(uint16_t* const val0, const uint16_t val1)
{
*val0 -= val1;
check_signed(val0);
check_zero(val0);
};
void _mul(uint16_t* const val0, const uint16_t val1)
{
*val0 *= val1;
check_signed(val0);
check_zero(val0);
};
void _div(uint16_t* const val0, const uint16_t val1)
{
*val0 /= val1;
check_signed(val0);
check_zero(val0);
};
void _mod(uint16_t* const val0, const uint16_t val1)
{
*val0 %= val1;
check_signed(val0);
check_zero(val0);
};
void _sal(uint16_t* const val0, const uint16_t val1)
{
*val0 = *val0 << val1;
};
void _sar(uint16_t* const val0, const uint16_t val1)
{
*val0 = *val0 >> val1;
};
void _and(uint16_t* const val0, const uint16_t val1)
{
fl |= (val0 && val1) << 3;
};
void _or(uint16_t* const val0, const uint16_t val1)
{
fl |= (val0 || val1) << 3;
};
void _not()
{
fl = (fl & 8) == 0 ? 1 << 3 : 0;
};
void _bnot(uint16_t* const val)
{
*val = ~(*val);
};
void _band(uint16_t* const val0, const uint16_t val1)
{
*val0 &= val1;
};
void _bor(uint16_t* const val0, const uint16_t val1)
{
*val0 |= val1;
};
void _xor(uint16_t* const val0, const uint16_t val1)
{
*val0 ^= val1;
};
void _cmp(uint16_t* const val0, const uint16_t val1)
{
fl = (*val0 == val1) ? fl | (1 << 2) : 0;
};
void _jmp(const uint16_t val)
{
ip = val;
};
void _jz(const uint16_t val)
{
ip = (fl & 1) == 0 ? val : ip;
ip = (fl & 4) == 0 ? val : ip;
printf("ip = %d\n", ip);
};
void _jnz(const uint16_t val)
{
ip = (fl & 1) == 1 ? val : ip;
ip = (fl & 4) == 4 ? val : ip;
printf("ip = %d\n", ip);
};
void _js(const uint16_t val)
{
ip = (fl & 2) == 2 ? val : ip;
};
void _jns(const uint16_t val)
{
ip = (fl & 2) == 0 ? val : ip;
};
void _jl(const uint16_t val)
{
ip = (fl & 8) == 8 ? val : ip;
};
void _jnl(const uint16_t val)
{
ip = (fl & 8) == 0 ? val : ip;
};
void _push(const uint16_t val)
{
((uint16_t*)ram)[sp / 2] = val;
sp -= 2;
};
void _pop(uint16_t* const val)
{
sp += 2;
*val = ((uint16_t*)ram)[sp / 2];
};
void _call(const uint16_t label)
{
_push(ip);
ip = label;
};
void _ret()
{
_pop(&ip);
};
void _int(const uint16_t val)
{
_call(ram[val]);
};
void _abort()
{
exit(0);
};