aboutsummaryrefslogtreecommitdiffstats
path: root/src/uxn-core.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/uxn-core.s')
-rw-r--r--src/uxn-core.s567
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
11wst: .space 256
12.global wst_ptr
13wst_ptr: .word wst
14
15.global rst
16rst: .space 256
17.global rst_ptr
18rst_ptr: .word rst
19
20.global io_ports
21io_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
43uxn_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
65uxn_eval_asm:
66 @ Initialization.
67 push {r4-r7}
68 ldr r1, wst_ptr
69 ldr r2, =uxn_ram
70 add r0, r0, r2
71
72uxn_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
83uxn_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
94brk:
95 b uxn_ret
96
97jci:
98 b uxn_ret
99
100jmi:
101 b uxn_ret
102
103jsi:
104 b uxn_ret
105
106litr:
107 ldrb r3, [r0], #1
108 strb r3, [r1], #1
109 b uxn_decode
110
111lit2r:
112 b uxn_ret
113
114inc:
115 b uxn_ret
116
117inc2:
118 b uxn_ret
119
120pop:
121 b uxn_ret
122
123pop2:
124 b uxn_ret
125
126nip:
127 b uxn_ret
128
129nip2:
130 b uxn_ret
131
132swp:
133 b uxn_ret
134
135swp2:
136 b uxn_ret
137
138rot:
139 b uxn_ret
140
141rot2:
142 b uxn_ret
143
144dup:
145 b uxn_ret
146
147dup2:
148 b uxn_ret
149
150ovr:
151 b uxn_ret
152
153ovr2:
154 b uxn_ret
155
156equ:
157 b uxn_ret
158
159equ2:
160 b uxn_ret
161
162neq:
163 b uxn_ret
164
165neq2:
166 b uxn_ret
167
168gth:
169 b uxn_ret
170
171gth2:
172 b uxn_ret
173
174lth:
175 b uxn_ret
176
177lth2:
178 b uxn_ret
179
180jmp:
181 b uxn_ret
182
183jmp2:
184 b uxn_ret
185
186jcn:
187 b uxn_ret
188
189jcn2:
190 b uxn_ret
191
192jsr:
193 b uxn_ret
194
195jsr2:
196 b uxn_ret
197
198sth:
199 b uxn_ret
200
201sth2:
202 b uxn_ret
203
204ldz:
205 b uxn_ret
206
207ldz2:
208 b uxn_ret
209
210stz:
211 b uxn_ret
212
213stz2:
214 b uxn_ret
215
216ldr:
217 b uxn_ret
218
219ldr2:
220 b uxn_ret
221
222str:
223 b uxn_ret
224
225str2:
226 b uxn_ret
227
228lda:
229 b uxn_ret
230
231lda2:
232 b uxn_ret
233
234sta:
235 b uxn_ret
236
237sta2:
238 b uxn_ret
239
240dei:
241 b uxn_ret
242
243dei2:
244 b uxn_ret
245
246deo:
247 b uxn_ret
248
249deo2:
250 b uxn_ret
251
252add:
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
259add2:
260 b uxn_ret
261
262sub:
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
269sub2:
270 b uxn_ret
271
272mul:
273 b uxn_ret
274
275mul2:
276 b uxn_ret
277
278div:
279 b uxn_ret
280
281div2:
282 b uxn_ret
283
284and:
285 b uxn_ret
286
287and2:
288 b uxn_ret
289
290ora:
291 b uxn_ret
292
293ora2:
294 b uxn_ret
295
296eor:
297 b uxn_ret
298
299eor2:
300 b uxn_ret
301
302sft:
303 b uxn_ret
304
305sft2:
306 b uxn_ret
307
308@ OP table
309op_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