diff options
Diffstat (limited to 'src/uxn-core.s')
-rw-r--r-- | src/uxn-core.s | 567 |
1 files changed, 567 insertions, 0 deletions
diff --git a/src/uxn-core.s b/src/uxn-core.s new file mode 100644 index 0000000..2e7a165 --- /dev/null +++ b/src/uxn-core.s | |||
@@ -0,0 +1,567 @@ | |||
1 | .file "uxn-core.s" | ||
2 | .section .iwram, "ax", %progbits | ||
3 | .extern uxn_ram | ||
4 | .align | ||
5 | |||
6 | @ | ||
7 | @ Core variables | ||
8 | @ | ||
9 | |||
10 | .global wst | ||
11 | wst: .space 256 | ||
12 | .global wst_ptr | ||
13 | wst_ptr: .word wst | ||
14 | |||
15 | .global rst | ||
16 | rst: .space 256 | ||
17 | .global rst_ptr | ||
18 | rst_ptr: .word rst | ||
19 | |||
20 | .global io_ports | ||
21 | io_ports: .space 256 | ||
22 | |||
23 | @ | ||
24 | @ r0 is our custom stack pointer | ||
25 | @ r1 is the value we want to insert/extract | ||
26 | @ | ||
27 | @ When the stack grows downwards: | ||
28 | @ push {r1} == str r1, [sp, #-4]! | ||
29 | @ pop {r1} == ldr r1, [sp], #4 | ||
30 | @ | ||
31 | @ In our case the stack grow upwards: | ||
32 | @ | ||
33 | @ 8bit: | ||
34 | @ push {r1} == strb r1, [sp], #1 | ||
35 | @ pop {r1} == ldrb r1, [sp, #-1]! | ||
36 | @ | ||
37 | @ 32bit: | ||
38 | @ push {r1} == str r1, [sp], #4 | ||
39 | @ pop {r1} == ldr r1, [sp, #-4]! | ||
40 | @ | ||
41 | |||
42 | .global uxn_init_asm | ||
43 | uxn_init_asm: | ||
44 | @ DEBUG: Initialize the stack for testing purposes. | ||
45 | ldr r0, wst_ptr | ||
46 | mov r1, #4 | ||
47 | strb r1, [r0], #1 | ||
48 | sub r1, r1, #1 | ||
49 | strb r1, [r0], #1 | ||
50 | sub r1, r1, #1 | ||
51 | strb r1, [r0], #1 | ||
52 | sub r1, r1, #1 | ||
53 | strb r1, [r0], #1 | ||
54 | adr r1, wst_ptr | ||
55 | str r0, [r1] | ||
56 | bx lr | ||
57 | |||
58 | @ UXN evaluation function. | ||
59 | @ | ||
60 | @ r0: PC pointer (argument is offset from RAM). | ||
61 | @ r1: Stack pointer (wst/rst). | ||
62 | @ r2: Ram ptr. | ||
63 | @ r3-r7: Scratch registers. | ||
64 | .global uxn_eval_asm | ||
65 | uxn_eval_asm: | ||
66 | @ Initialization. | ||
67 | push {r4-r7} | ||
68 | ldr r1, wst_ptr | ||
69 | ldr r2, =uxn_ram | ||
70 | add r0, r0, r2 | ||
71 | |||
72 | uxn_decode: | ||
73 | ldrb r3, [r0], #1 @ current OP value / table index | ||
74 | |||
75 | @ TODO: Setup wst/rst? or fill operations accordingly? | ||
76 | @ str r3, [r1], #1 @ Push to stack: Debugging | ||
77 | |||
78 | @ Decode OP based on table lookup. | ||
79 | adr r4, op_table @ decoding table | ||
80 | ldr r4, [r4, r3, lsl #2] @ op_table[idx * 4] | ||
81 | bx r4 @ op_table[idx * 4]() | ||
82 | |||
83 | uxn_ret: | ||
84 | @ Update stack pointer and return. | ||
85 | adr r0, wst_ptr | ||
86 | str r1, [r0] | ||
87 | pop {r4-r7} | ||
88 | bx lr | ||
89 | |||
90 | @ | ||
91 | @ OP implementations. | ||
92 | @ | ||
93 | |||
94 | brk: | ||
95 | b uxn_ret | ||
96 | |||
97 | jci: | ||
98 | b uxn_ret | ||
99 | |||
100 | jmi: | ||
101 | b uxn_ret | ||
102 | |||
103 | jsi: | ||
104 | b uxn_ret | ||
105 | |||
106 | litr: | ||
107 | ldrb r3, [r0], #1 | ||
108 | strb r3, [r1], #1 | ||
109 | b uxn_decode | ||
110 | |||
111 | lit2r: | ||
112 | b uxn_ret | ||
113 | |||
114 | inc: | ||
115 | b uxn_ret | ||
116 | |||
117 | inc2: | ||
118 | b uxn_ret | ||
119 | |||
120 | pop: | ||
121 | b uxn_ret | ||
122 | |||
123 | pop2: | ||
124 | b uxn_ret | ||
125 | |||
126 | nip: | ||
127 | b uxn_ret | ||
128 | |||
129 | nip2: | ||
130 | b uxn_ret | ||
131 | |||
132 | swp: | ||
133 | b uxn_ret | ||
134 | |||
135 | swp2: | ||
136 | b uxn_ret | ||
137 | |||
138 | rot: | ||
139 | b uxn_ret | ||
140 | |||
141 | rot2: | ||
142 | b uxn_ret | ||
143 | |||
144 | dup: | ||
145 | b uxn_ret | ||
146 | |||
147 | dup2: | ||
148 | b uxn_ret | ||
149 | |||
150 | ovr: | ||
151 | b uxn_ret | ||
152 | |||
153 | ovr2: | ||
154 | b uxn_ret | ||
155 | |||
156 | equ: | ||
157 | b uxn_ret | ||
158 | |||
159 | equ2: | ||
160 | b uxn_ret | ||
161 | |||
162 | neq: | ||
163 | b uxn_ret | ||
164 | |||
165 | neq2: | ||
166 | b uxn_ret | ||
167 | |||
168 | gth: | ||
169 | b uxn_ret | ||
170 | |||
171 | gth2: | ||
172 | b uxn_ret | ||
173 | |||
174 | lth: | ||
175 | b uxn_ret | ||
176 | |||
177 | lth2: | ||
178 | b uxn_ret | ||
179 | |||
180 | jmp: | ||
181 | b uxn_ret | ||
182 | |||
183 | jmp2: | ||
184 | b uxn_ret | ||
185 | |||
186 | jcn: | ||
187 | b uxn_ret | ||
188 | |||
189 | jcn2: | ||
190 | b uxn_ret | ||
191 | |||
192 | jsr: | ||
193 | b uxn_ret | ||
194 | |||
195 | jsr2: | ||
196 | b uxn_ret | ||
197 | |||
198 | sth: | ||
199 | b uxn_ret | ||
200 | |||
201 | sth2: | ||
202 | b uxn_ret | ||
203 | |||
204 | ldz: | ||
205 | b uxn_ret | ||
206 | |||
207 | ldz2: | ||
208 | b uxn_ret | ||
209 | |||
210 | stz: | ||
211 | b uxn_ret | ||
212 | |||
213 | stz2: | ||
214 | b uxn_ret | ||
215 | |||
216 | ldr: | ||
217 | b uxn_ret | ||
218 | |||
219 | ldr2: | ||
220 | b uxn_ret | ||
221 | |||
222 | str: | ||
223 | b uxn_ret | ||
224 | |||
225 | str2: | ||
226 | b uxn_ret | ||
227 | |||
228 | lda: | ||
229 | b uxn_ret | ||
230 | |||
231 | lda2: | ||
232 | b uxn_ret | ||
233 | |||
234 | sta: | ||
235 | b uxn_ret | ||
236 | |||
237 | sta2: | ||
238 | b uxn_ret | ||
239 | |||
240 | dei: | ||
241 | b uxn_ret | ||
242 | |||
243 | dei2: | ||
244 | b uxn_ret | ||
245 | |||
246 | deo: | ||
247 | b uxn_ret | ||
248 | |||
249 | deo2: | ||
250 | b uxn_ret | ||
251 | |||
252 | add: | ||
253 | ldr r3, [r1, #-1]! | ||
254 | ldr r4, [r1, #-1]! | ||
255 | add r3, r3, r4 | ||
256 | strb r3, [r1], #1 | ||
257 | b uxn_ret @ NOTE: This should return to the next loop iteration. | ||
258 | |||
259 | add2: | ||
260 | b uxn_ret | ||
261 | |||
262 | sub: | ||
263 | @ ldr r2, [r0, #-1]! | ||
264 | @ ldr r1, [r0, #-1]! | ||
265 | @ sub r1, r1, r2 | ||
266 | @ strb r1, [r0], #1 | ||
267 | b uxn_ret @ NOTE: This should return to the next loop iteration. | ||
268 | |||
269 | sub2: | ||
270 | b uxn_ret | ||
271 | |||
272 | mul: | ||
273 | b uxn_ret | ||
274 | |||
275 | mul2: | ||
276 | b uxn_ret | ||
277 | |||
278 | div: | ||
279 | b uxn_ret | ||
280 | |||
281 | div2: | ||
282 | b uxn_ret | ||
283 | |||
284 | and: | ||
285 | b uxn_ret | ||
286 | |||
287 | and2: | ||
288 | b uxn_ret | ||
289 | |||
290 | ora: | ||
291 | b uxn_ret | ||
292 | |||
293 | ora2: | ||
294 | b uxn_ret | ||
295 | |||
296 | eor: | ||
297 | b uxn_ret | ||
298 | |||
299 | eor2: | ||
300 | b uxn_ret | ||
301 | |||
302 | sft: | ||
303 | b uxn_ret | ||
304 | |||
305 | sft2: | ||
306 | b uxn_ret | ||
307 | |||
308 | @ OP table | ||
309 | op_table: | ||
310 | .word brk @ 0x00 | ||
311 | .word inc @ 0x01 | ||
312 | .word pop @ 0x02 | ||
313 | .word nip @ 0x03 | ||
314 | .word swp @ 0x04 | ||
315 | .word rot @ 0x05 | ||
316 | .word dup @ 0x06 | ||
317 | .word ovr @ 0x07 | ||
318 | .word equ @ 0x08 | ||
319 | .word neq @ 0x09 | ||
320 | .word gth @ 0x0a | ||
321 | .word lth @ 0x0b | ||
322 | .word jmp @ 0x0c | ||
323 | .word jcn @ 0x0d | ||
324 | .word jsr @ 0x0e | ||
325 | .word sth @ 0x0f | ||
326 | .word ldz @ 0x00 | ||
327 | .word stz @ 0x11 | ||
328 | .word ldr @ 0x12 | ||
329 | .word str @ 0x13 | ||
330 | .word lda @ 0x14 | ||
331 | .word sta @ 0x15 | ||
332 | .word dei @ 0x16 | ||
333 | .word deo @ 0x17 | ||
334 | .word add @ 0x18 | ||
335 | .word sub @ 0x19 | ||
336 | .word mul @ 0x1a | ||
337 | .word div @ 0x1b | ||
338 | .word and @ 0x1c | ||
339 | .word ora @ 0x1d | ||
340 | .word eor @ 0x1e | ||
341 | .word sft @ 0x1f | ||
342 | .word brk @ 0x20 | ||
343 | .word inc2 @ 0x21 | ||
344 | .word pop2 @ 0x22 | ||
345 | .word nip2 @ 0x23 | ||
346 | .word swp2 @ 0x24 | ||
347 | .word rot2 @ 0x25 | ||
348 | .word dup2 @ 0x26 | ||
349 | .word ovr2 @ 0x27 | ||
350 | .word equ2 @ 0x28 | ||
351 | .word neq2 @ 0x29 | ||
352 | .word gth2 @ 0x2a | ||
353 | .word lth2 @ 0x2b | ||
354 | .word jmp2 @ 0x2c | ||
355 | .word jcn2 @ 0x2d | ||
356 | .word jsr2 @ 0x2e | ||
357 | .word sth2 @ 0x2f | ||
358 | .word ldz2 @ 0x30 | ||
359 | .word stz2 @ 0x31 | ||
360 | .word ldr2 @ 0x32 | ||
361 | .word str2 @ 0x33 | ||
362 | .word lda2 @ 0x34 | ||
363 | .word sta2 @ 0x35 | ||
364 | .word dei2 @ 0x36 | ||
365 | .word deo2 @ 0x37 | ||
366 | .word add2 @ 0x38 | ||
367 | .word sub2 @ 0x39 | ||
368 | .word mul2 @ 0x3a | ||
369 | .word div2 @ 0x3b | ||
370 | .word and2 @ 0x3c | ||
371 | .word ora2 @ 0x3d | ||
372 | .word eor2 @ 0x3e | ||
373 | .word sft2 @ 0x3f | ||
374 | @ TODO: Can we mask this instead of having empty space? | ||
375 | .word brk @ 0x40 | ||
376 | .word brk @ 0x41 | ||
377 | .word brk @ 0x42 | ||
378 | .word brk @ 0x43 | ||
379 | .word brk @ 0x44 | ||
380 | .word brk @ 0x45 | ||
381 | .word brk @ 0x46 | ||
382 | .word brk @ 0x47 | ||
383 | .word brk @ 0x48 | ||
384 | .word brk @ 0x49 | ||
385 | .word brk @ 0x4a | ||
386 | .word brk @ 0x4b | ||
387 | .word brk @ 0x4c | ||
388 | .word brk @ 0x4d | ||
389 | .word brk @ 0x4e | ||
390 | .word brk @ 0x4f | ||
391 | .word brk @ 0x50 | ||
392 | .word brk @ 0x51 | ||
393 | .word brk @ 0x52 | ||
394 | .word brk @ 0x53 | ||
395 | .word brk @ 0x54 | ||
396 | .word brk @ 0x55 | ||
397 | .word brk @ 0x56 | ||
398 | .word brk @ 0x57 | ||
399 | .word brk @ 0x58 | ||
400 | .word brk @ 0x59 | ||
401 | .word brk @ 0x5a | ||
402 | .word brk @ 0x5b | ||
403 | .word brk @ 0x5c | ||
404 | .word brk @ 0x5d | ||
405 | .word brk @ 0x5e | ||
406 | .word brk @ 0x5f | ||
407 | .word brk @ 0x60 | ||
408 | .word brk @ 0x61 | ||
409 | .word brk @ 0x62 | ||
410 | .word brk @ 0x63 | ||
411 | .word brk @ 0x64 | ||
412 | .word brk @ 0x65 | ||
413 | .word brk @ 0x66 | ||
414 | .word brk @ 0x67 | ||
415 | .word brk @ 0x68 | ||
416 | .word brk @ 0x69 | ||
417 | .word brk @ 0x6a | ||
418 | .word brk @ 0x6b | ||
419 | .word brk @ 0x6c | ||
420 | .word brk @ 0x6d | ||
421 | .word brk @ 0x6e | ||
422 | .word brk @ 0x6f | ||
423 | .word brk @ 0x70 | ||
424 | .word brk @ 0x71 | ||
425 | .word brk @ 0x72 | ||
426 | .word brk @ 0x73 | ||
427 | .word brk @ 0x74 | ||
428 | .word brk @ 0x75 | ||
429 | .word brk @ 0x76 | ||
430 | .word brk @ 0x77 | ||
431 | .word brk @ 0x78 | ||
432 | .word brk @ 0x79 | ||
433 | .word brk @ 0x7a | ||
434 | .word brk @ 0x7b | ||
435 | .word brk @ 0x7c | ||
436 | .word brk @ 0x7d | ||
437 | .word brk @ 0x7e | ||
438 | .word brk @ 0x7f | ||
439 | .word litr @ 0x80 | ||
440 | .word brk @ 0x81 | ||
441 | .word brk @ 0x82 | ||
442 | .word brk @ 0x83 | ||
443 | .word brk @ 0x84 | ||
444 | .word brk @ 0x85 | ||
445 | .word brk @ 0x86 | ||
446 | .word brk @ 0x87 | ||
447 | .word brk @ 0x88 | ||
448 | .word brk @ 0x89 | ||
449 | .word brk @ 0x8a | ||
450 | .word brk @ 0x8b | ||
451 | .word brk @ 0x8c | ||
452 | .word brk @ 0x8d | ||
453 | .word brk @ 0x8e | ||
454 | .word brk @ 0x8f | ||
455 | .word brk @ 0x90 | ||
456 | .word brk @ 0x91 | ||
457 | .word brk @ 0x92 | ||
458 | .word brk @ 0x93 | ||
459 | .word brk @ 0x94 | ||
460 | .word brk @ 0x95 | ||
461 | .word brk @ 0x96 | ||
462 | .word brk @ 0x97 | ||
463 | .word brk @ 0x98 | ||
464 | .word brk @ 0x99 | ||
465 | .word brk @ 0x9a | ||
466 | .word brk @ 0x9b | ||
467 | .word brk @ 0x9c | ||
468 | .word brk @ 0x9d | ||
469 | .word brk @ 0x9e | ||
470 | .word brk @ 0x9f | ||
471 | .word brk @ 0xa0 | ||
472 | .word brk @ 0xa1 | ||
473 | .word brk @ 0xa2 | ||
474 | .word brk @ 0xa3 | ||
475 | .word brk @ 0xa4 | ||
476 | .word brk @ 0xa5 | ||
477 | .word brk @ 0xa6 | ||
478 | .word brk @ 0xa7 | ||
479 | .word brk @ 0xa8 | ||
480 | .word brk @ 0xa9 | ||
481 | .word brk @ 0xaa | ||
482 | .word brk @ 0xab | ||
483 | .word brk @ 0xac | ||
484 | .word brk @ 0xad | ||
485 | .word brk @ 0xae | ||
486 | .word brk @ 0xaf | ||
487 | .word brk @ 0xb0 | ||
488 | .word brk @ 0xb1 | ||
489 | .word brk @ 0xb2 | ||
490 | .word brk @ 0xb3 | ||
491 | .word brk @ 0xb4 | ||
492 | .word brk @ 0xb5 | ||
493 | .word brk @ 0xb6 | ||
494 | .word brk @ 0xb7 | ||
495 | .word brk @ 0xb8 | ||
496 | .word brk @ 0xb9 | ||
497 | .word brk @ 0xba | ||
498 | .word brk @ 0xbb | ||
499 | .word brk @ 0xbc | ||
500 | .word brk @ 0xbd | ||
501 | .word brk @ 0xbe | ||
502 | .word brk @ 0xbf | ||
503 | .word brk @ 0xc0 | ||
504 | .word brk @ 0xc1 | ||
505 | .word brk @ 0xc2 | ||
506 | .word brk @ 0xc3 | ||
507 | .word brk @ 0xc4 | ||
508 | .word brk @ 0xc5 | ||
509 | .word brk @ 0xc6 | ||
510 | .word brk @ 0xc7 | ||
511 | .word brk @ 0xc8 | ||
512 | .word brk @ 0xc9 | ||
513 | .word brk @ 0xca | ||
514 | .word brk @ 0xcb | ||
515 | .word brk @ 0xcc | ||
516 | .word brk @ 0xcd | ||
517 | .word brk @ 0xce | ||
518 | .word brk @ 0xcf | ||
519 | .word brk @ 0xd0 | ||
520 | .word brk @ 0xd1 | ||
521 | .word brk @ 0xd2 | ||
522 | .word brk @ 0xd3 | ||
523 | .word brk @ 0xd4 | ||
524 | .word brk @ 0xd5 | ||
525 | .word brk @ 0xd6 | ||
526 | .word brk @ 0xd7 | ||
527 | .word brk @ 0xd8 | ||
528 | .word brk @ 0xd9 | ||
529 | .word brk @ 0xda | ||
530 | .word brk @ 0xdb | ||
531 | .word brk @ 0xdc | ||
532 | .word brk @ 0xdd | ||
533 | .word brk @ 0xde | ||
534 | .word brk @ 0xdf | ||
535 | .word brk @ 0xe0 | ||
536 | .word brk @ 0xe1 | ||
537 | .word brk @ 0xe2 | ||
538 | .word brk @ 0xe3 | ||
539 | .word brk @ 0xe4 | ||
540 | .word brk @ 0xe5 | ||
541 | .word brk @ 0xe6 | ||
542 | .word brk @ 0xe7 | ||
543 | .word brk @ 0xe8 | ||
544 | .word brk @ 0xe9 | ||
545 | .word brk @ 0xea | ||
546 | .word brk @ 0xeb | ||
547 | .word brk @ 0xec | ||
548 | .word brk @ 0xed | ||
549 | .word brk @ 0xee | ||
550 | .word brk @ 0xef | ||
551 | .word brk @ 0xf0 | ||
552 | .word brk @ 0xf1 | ||
553 | .word brk @ 0xf2 | ||
554 | .word brk @ 0xf3 | ||
555 | .word brk @ 0xf4 | ||
556 | .word brk @ 0xf5 | ||
557 | .word brk @ 0xf6 | ||
558 | .word brk @ 0xf7 | ||
559 | .word brk @ 0xf8 | ||
560 | @ TODO: Can we mask this instead of having empty space? | ||
561 | .word lit2r @ 0xf9 | ||
562 | .word litr @ 0xfa | ||
563 | .word lit2r @ 0xfb | ||
564 | .word litr @ 0xfc | ||
565 | .word jsi @ 0xfd | ||
566 | .word jmi @ 0xfe | ||
567 | .word jci @ 0xff | ||