/
juna.asm
223 lines (203 loc) · 5.01 KB
/
juna.asm
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
#once
#subruledef register
{
; General purpose
r0 => 0x0
r1 => 0x1
r2 => 0x2
r3 => 0x3
r4 => 0x4
r5 => 0x5
r6 => 0x6
r7 => 0x7
r8 => 0x8
r9 => 0x9
r10 => 0xA
r11 => 0xB
; Reserved for helper instructions
i2 => 0xC
i1 => 0xD
; Special meaning
sp => 0xE
pc => 0xF
}
#ruledef
{
nop => asm { and r0, r0, r0 }
mov {d: register}, {a: register} => asm { and {d}, {a}, {a} }
add {d: register}, {a: register}, {b: register} => b @ d @ 0b0000 @ a
sub {d: register}, {a: register}, {b: register} => b @ d @ 0b0001 @ a
xor {d: register}, {a: register}, {b: register} => b @ d @ 0b0010 @ a
and {d: register}, {a: register}, {b: register} => b @ d @ 0b0011 @ a
orr {d: register}, {a: register}, {b: register} => b @ d @ 0b0100 @ a
shf {d: register}, {a: register}, {b: register} => b @ d @ 0b0101 @ a
; TODO: ROT
; TODO: ASH
brn {d: register} => asm { beq {d}, r0, r0 }
beq {d: register}, {a: register}, {b: register} => b @ d @ 0b1011 @ a
; bne {d: register}, {a: register}, {b: register} => b @ d @ 0b1100 @ a
blt {d: register}, {a: register}, {b: register} => b @ d @ 0b1100 @ a
ble {d: register}, {a: register}, {b: register} => b @ d @ 0b1101 @ a
blts {d: register}, {a: register}, {b: register} => b @ d @ 0b1110 @ a
lcb {d: register}, {value: u8} => {value}[3:0] @ d @ 0b1010 @ {value}[7:4]
ldb {d: register}, {a: register} => a @ d @ 0b1111 @ 0b0000
stb {d: register}, {a: register} => a @ d @ 0b1111 @ 0b0001
lds {d: register}, {a: register} => a @ d @ 0b1111 @ 0b0010
sts {d: register}, {a: register} => a @ d @ 0b1111 @ 0b0011
ldw {d: register}, {a: register} => a @ d @ 0b1111 @ 0b0100
stw {d: register}, {a: register} => a @ d @ 0b1111 @ 0b0101
tcp {d: register}, {a: register} => a @ d @ 0b1111 @ 0b0110
ldb {d: register}, {a} => asm {
ldc i1, {a}
ldb {d}, i1
}
stb {d: register}, {a} => asm {
ldc i1, {a}
stb {d}, i1
}
lds {d: register}, {a} => asm {
ldc i1, {a}
lds {d}, i1
}
sts {d: register}, {a} => asm {
ldc i1, {a}
sts {d}, i1
}
ldw {d: register}, {a} => asm {
ldc i1, {a}
ldw {d}, i1
}
stw {d: register}, {a} => asm {
ldc i1, {a}
stw {d}, i1
}
ldc {d: register}, {value} => {
assert(value >= 0)
assert(value <= 0xff)
asm {
lcb {d}, {value}
}
}
ldc {d: register}, {value} => {
assert(value >= 0)
assert(value <= 0xffff)
asm {
lds {d}, pc
} @ {value}[7:0] @ {value}[15:8]
}
ldc {d: register}, {value} => {
assert(value >= 0)
assert(value <= 0xffffffff)
asm {
ldw {d}, pc
} @ {value}[7:0] @ {value}[15:8] @ {value}[23:16] @ {value}[31:24]
}
; Jump to address
brn {d} => asm { ldc pc, {d} }
beq {d}, {a: register}, {b: register} => asm {
ldc i1, {d}
beq i1, {a}, {b}
}
; jne {d}, {a: register}, {b: register} => asm {
; ldc i1, {d}
; bne i1, {a}, {b}
; }
blt {d}, {a: register}, {b: register} => asm {
ldc i1, {d}
blt i1, {a}, {b}
}
ble {d}, {a: register}, {b: register} => asm {
ldc i1, {d}
ble i1, {a}, {b}
}
blts {d}, {a: register}, {b: register} => asm {
ldc i1, {d}
blts i1, {a}, {b}
}
; Stack ops
pushb {r: register} => asm {
lcb i1, 1
sub sp, sp, i1
stb {r}, sp
}
popb {r: register} => asm {
ldb {r}, sp
lcb i1, 1
add sp, sp, i1
}
pushs {r: register} => asm {
lcb i1, 2
sub sp, sp, i1
sts {r}, sp
}
pops {r: register} => asm {
lds {r}, sp
lcb i1, 2
add sp, sp, i1
}
pushw {r: register} => asm {
lcb i1, 4
sub sp, sp, i1
stw {r}, sp
}
popw {r: register} => asm {
ldw {r}, sp
lcb i1, 4
add sp, sp, i1
}
pushall => asm {
pushw r0
pushw r1
pushw r2
pushw r3
pushw r4
pushw r5
pushw r6
pushw r7
pushw r8
pushw r9
pushw r10
pushw r11
}
popall => asm {
popw r11
popw r10
popw r9
popw r8
popw r7
popw r6
popw r5
popw r4
popw r3
popw r2
popw r1
popw r0
}
; Function calls
call {d} => asm {
lcb i1, 4
lcb i2, 6 ; Offset from add to after brn
add i2, i2, pc
sub sp, sp, i1
stw i2, sp
brn {d}
}
call {d: register} => asm {
lcb i1, 4
lcb i2, 6 ; Offset from add to after brn
add i2, i2, pc
sub sp, sp, i1
stw i2, sp
brn {d}
}
ret => asm {
ldw i2, sp
lcb i1, 4
add sp, sp, i1
brn i2
}
; Busy loop
hlt => asm {
ldc pc, $
}
}