diff options
author | Bad Diode <bd@badd10de.dev> | 2023-08-29 17:15:37 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-08-29 17:15:37 +0200 |
commit | 9dc972fd0cdd9f7cac45aa0d0f30ad8751a8c0d5 (patch) | |
tree | 9edbadceba7f587f88888af9d8c7c54173c48d8c /src | |
parent | 19776f5720806bef0f4c6d1439f76da80603f054 (diff) | |
download | uxngba-9dc972fd0cdd9f7cac45aa0d0f30ad8751a8c0d5.tar.gz uxngba-9dc972fd0cdd9f7cac45aa0d0f30ad8751a8c0d5.zip |
Add OPr ops (untested)
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 1 | ||||
-rw-r--r-- | src/uxn-core.s | 923 |
2 files changed, 716 insertions, 208 deletions
@@ -231,7 +231,6 @@ init_uxn() { | |||
231 | } | 231 | } |
232 | 232 | ||
233 | // TODO: | 233 | // TODO: |
234 | // - OPr modes | ||
235 | // - OPk modes | 234 | // - OPk modes |
236 | // - OPrk modes | 235 | // - OPrk modes |
237 | // - Test DEI functions | 236 | // - Test DEI functions |
diff --git a/src/uxn-core.s b/src/uxn-core.s index 333b4a6..71e73da 100644 --- a/src/uxn-core.s +++ b/src/uxn-core.s | |||
@@ -87,8 +87,8 @@ uxn_ret: | |||
87 | ldrb \a, [r1, \b] | 87 | ldrb \a, [r1, \b] |
88 | .endm | 88 | .endm |
89 | 89 | ||
90 | .macro rpush8 a | 90 | .macro rpop8 a |
91 | strb \a, [r2], #1 | 91 | ldrb \a, [r2, #-1]! |
92 | .endm | 92 | .endm |
93 | 93 | ||
94 | .macro rpop8s a | 94 | .macro rpop8s a |
@@ -101,12 +101,20 @@ uxn_ret: | |||
101 | orr \a, \a, \b, lsl #8 | 101 | orr \a, \a, \b, lsl #8 |
102 | .endm | 102 | .endm |
103 | 103 | ||
104 | .macro rpush8 a | ||
105 | strb \a, [r2], #1 | ||
106 | .endm | ||
107 | |||
104 | .macro rpush16 a | 108 | .macro rpush16 a |
105 | strb \a, [r2, #1] | 109 | strb \a, [r2, #1] |
106 | lsr \a, #8 | 110 | lsr \a, #8 |
107 | strb \a, [r2], #2 | 111 | strb \a, [r2], #2 |
108 | .endm | 112 | .endm |
109 | 113 | ||
114 | .macro rpeek a, b | ||
115 | ldrb \a, [r2, \b] | ||
116 | .endm | ||
117 | |||
110 | .macro zsave8 a, off | 118 | .macro zsave8 a, off |
111 | strb \a, [r7, \off] | 119 | strb \a, [r7, \off] |
112 | .endm | 120 | .endm |
@@ -222,69 +230,69 @@ op_table: | |||
222 | .word eor2 @ 0x3e | 230 | .word eor2 @ 0x3e |
223 | .word sft2 @ 0x3f | 231 | .word sft2 @ 0x3f |
224 | .word jmi @ 0x40 | 232 | .word jmi @ 0x40 |
225 | .word brk @ 0x41 | 233 | .word incr @ 0x41 |
226 | .word brk @ 0x42 | 234 | .word popr @ 0x42 |
227 | .word brk @ 0x43 | 235 | .word nipr @ 0x43 |
228 | .word brk @ 0x44 | 236 | .word swpr @ 0x44 |
229 | .word brk @ 0x45 | 237 | .word rotr @ 0x45 |
230 | .word brk @ 0x46 | 238 | .word dupr @ 0x46 |
231 | .word brk @ 0x47 | 239 | .word ovrr @ 0x47 |
232 | .word brk @ 0x48 | 240 | .word equr @ 0x48 |
233 | .word brk @ 0x49 | 241 | .word neqr @ 0x49 |
234 | .word brk @ 0x4a | 242 | .word gthr @ 0x4a |
235 | .word brk @ 0x4b | 243 | .word lthr @ 0x4b |
236 | .word brk @ 0x4c | 244 | .word jmpr @ 0x4c |
237 | .word brk @ 0x4d | 245 | .word jcnr @ 0x4d |
238 | .word brk @ 0x4e | 246 | .word jsrr @ 0x4e |
239 | .word brk @ 0x4f | 247 | .word sthr @ 0x4f |
240 | .word brk @ 0x50 | 248 | .word ldzr @ 0x50 |
241 | .word brk @ 0x51 | 249 | .word stzr @ 0x51 |
242 | .word brk @ 0x52 | 250 | .word ldrr @ 0x52 |
243 | .word brk @ 0x53 | 251 | .word strr @ 0x53 |
244 | .word brk @ 0x54 | 252 | .word ldar @ 0x54 |
245 | .word brk @ 0x55 | 253 | .word star @ 0x55 |
246 | .word brk @ 0x56 | 254 | .word deir @ 0x56 |
247 | .word brk @ 0x57 | 255 | .word deor @ 0x57 |
248 | .word brk @ 0x58 | 256 | .word addr @ 0x58 |
249 | .word brk @ 0x59 | 257 | .word subr @ 0x59 |
250 | .word brk @ 0x5a | 258 | .word mulr @ 0x5a |
251 | .word brk @ 0x5b | 259 | .word divr @ 0x5b |
252 | .word brk @ 0x5c | 260 | .word andr @ 0x5c |
253 | .word brk @ 0x5d | 261 | .word orar @ 0x5d |
254 | .word brk @ 0x5e | 262 | .word eorr @ 0x5e |
255 | .word brk @ 0x5f | 263 | .word sftr @ 0x5f |
256 | .word jsi @ 0x60 | 264 | .word jsi @ 0x60 |
257 | .word brk @ 0x61 | 265 | .word inc2r @ 0x61 |
258 | .word brk @ 0x62 | 266 | .word pop2r @ 0x62 |
259 | .word brk @ 0x63 | 267 | .word nip2r @ 0x63 |
260 | .word brk @ 0x64 | 268 | .word swp2r @ 0x64 |
261 | .word brk @ 0x65 | 269 | .word rot2r @ 0x65 |
262 | .word brk @ 0x66 | 270 | .word dup2r @ 0x66 |
263 | .word brk @ 0x67 | 271 | .word ovr2r @ 0x67 |
264 | .word brk @ 0x68 | 272 | .word equ2r @ 0x68 |
265 | .word brk @ 0x69 | 273 | .word neq2r @ 0x69 |
266 | .word brk @ 0x6a | 274 | .word gth2r @ 0x6a |
267 | .word brk @ 0x6b | 275 | .word lth2r @ 0x6b |
268 | .word jmp2r @ 0x6c | 276 | .word jmp2r @ 0x6c |
269 | .word brk @ 0x6d | 277 | .word jcn2r @ 0x6d |
270 | .word brk @ 0x6e | 278 | .word jsr2r @ 0x6e |
271 | .word brk @ 0x6f | 279 | .word sth2r @ 0x6f |
272 | .word brk @ 0x70 | 280 | .word ldz2r @ 0x70 |
273 | .word brk @ 0x71 | 281 | .word stz2r @ 0x71 |
274 | .word brk @ 0x72 | 282 | .word ldr2r @ 0x72 |
275 | .word brk @ 0x73 | 283 | .word str2r @ 0x73 |
276 | .word brk @ 0x74 | 284 | .word lda2r @ 0x74 |
277 | .word brk @ 0x75 | 285 | .word sta2r @ 0x75 |
278 | .word brk @ 0x76 | 286 | .word dei2r @ 0x76 |
279 | .word brk @ 0x77 | 287 | .word deo2r @ 0x77 |
280 | .word brk @ 0x78 | 288 | .word add2r @ 0x78 |
281 | .word brk @ 0x79 | 289 | .word sub2r @ 0x79 |
282 | .word brk @ 0x7a | 290 | .word mul2r @ 0x7a |
283 | .word brk @ 0x7b | 291 | .word div2r @ 0x7b |
284 | .word brk @ 0x7c | 292 | .word and2r @ 0x7c |
285 | .word brk @ 0x7d | 293 | .word ora2r @ 0x7d |
286 | .word brk @ 0x7e | 294 | .word eor2r @ 0x7e |
287 | .word brk @ 0x7f | 295 | .word sft2r @ 0x7f |
288 | .word lit @ 0x80 | 296 | .word lit @ 0x80 |
289 | .word brk @ 0x81 | 297 | .word brk @ 0x81 |
290 | .word brk @ 0x82 | 298 | .word brk @ 0x82 |
@@ -418,6 +426,238 @@ op_table: | |||
418 | @ OP implementations. | 426 | @ OP implementations. |
419 | @ | 427 | @ |
420 | 428 | ||
429 | dei: | ||
430 | wpop8 r3 | ||
431 | mov r4, r3, lsr #4 @ idx | ||
432 | and r3, #0x0f @ port | ||
433 | adr r6, dei_map | ||
434 | ldr r6, [r6, r4, lsl #2] | ||
435 | stmfd sp!, {r0, r7, lr} | ||
436 | adr r0, device_data | ||
437 | lsl r4, #4 | ||
438 | add r0, r4 | ||
439 | mov r1, r3 | ||
440 | mov lr, pc | ||
441 | bx r6 | ||
442 | ldr r1, wst_ptr | ||
443 | ldr r2, rst_ptr | ||
444 | wpush8 r0 | ||
445 | ldmfd sp!, {r0, r7, lr} | ||
446 | b uxn_decode | ||
447 | |||
448 | dei2: | ||
449 | wpop8 r3 | ||
450 | mov r4, r3, lsr #4 @ idx | ||
451 | and r3, #0x0f @ port | ||
452 | adr r6, dei_map | ||
453 | ldr r6, [r6, r4, lsl #2] | ||
454 | stmfd sp!, {r0, r7, lr} | ||
455 | adr r0, device_data | ||
456 | lsl r4, #4 | ||
457 | add r0, r4 | ||
458 | mov r1, r3 | ||
459 | mov lr, pc | ||
460 | bx r6 | ||
461 | ldr r1, wst_ptr | ||
462 | ldr r2, rst_ptr | ||
463 | wpush16 r0 | ||
464 | ldmfd sp!, {r0, r7, lr} | ||
465 | b uxn_decode | ||
466 | |||
467 | deo: | ||
468 | wpop8 r3 | ||
469 | mov r4, r3, lsr #4 @ idx | ||
470 | and r3, #0x0f @ port | ||
471 | wpop8 r5 @ value | ||
472 | adr r6, deo_map | ||
473 | ldr r6, [r6, r4, lsl #2] | ||
474 | stmfd sp!, {r0, r7, lr} | ||
475 | adr r0, device_data | ||
476 | lsl r4, #4 | ||
477 | add r0, r4 | ||
478 | strb r5, [r0, r3] | ||
479 | mov r1, r3 | ||
480 | mov lr, pc | ||
481 | bx r6 | ||
482 | ldmfd sp!, {r0, r7, lr} | ||
483 | ldr r1, wst_ptr | ||
484 | ldr r2, rst_ptr | ||
485 | b uxn_decode | ||
486 | |||
487 | deo2: | ||
488 | wpop8 r3 | ||
489 | mov r4, r3, lsr #4 @ idx | ||
490 | and r3, #0x0f @ port | ||
491 | wpop16 r5, r6 @ value | ||
492 | adr r6, deo_map | ||
493 | ldr r6, [r6, r4, lsl #2] | ||
494 | stmfd sp!, {r0, r7, lr} | ||
495 | adr r0, device_data | ||
496 | lsl r4, #4 | ||
497 | add r0, r4 | ||
498 | strh r5, [r0, r3] | ||
499 | mov r1, r3 | ||
500 | mov lr, pc | ||
501 | bx r6 | ||
502 | ldmfd sp!, {r0, r7, lr} | ||
503 | ldr r1, wst_ptr | ||
504 | ldr r2, rst_ptr | ||
505 | b uxn_decode | ||
506 | |||
507 | deir: | ||
508 | wpop8 r3 | ||
509 | mov r4, r3, lsr #4 @ idx | ||
510 | and r3, #0x0f @ port | ||
511 | adr r6, dei_map | ||
512 | ldr r6, [r6, r4, lsl #2] | ||
513 | stmfd sp!, {r0, r7, lr} | ||
514 | adr r0, device_data | ||
515 | lsl r4, #4 | ||
516 | add r0, r4 | ||
517 | mov r1, r3 | ||
518 | mov lr, pc | ||
519 | bx r6 | ||
520 | ldr r1, wst_ptr | ||
521 | ldr r2, rst_ptr | ||
522 | wpush8 r0 | ||
523 | ldmfd sp!, {r0, r7, lr} | ||
524 | b uxn_decode | ||
525 | |||
526 | dei2r: | ||
527 | wpop8 r3 | ||
528 | mov r4, r3, lsr #4 @ idx | ||
529 | and r3, #0x0f @ port | ||
530 | adr r6, dei_map | ||
531 | ldr r6, [r6, r4, lsl #2] | ||
532 | stmfd sp!, {r0, r7, lr} | ||
533 | adr r0, device_data | ||
534 | lsl r4, #4 | ||
535 | add r0, r4 | ||
536 | mov r1, r3 | ||
537 | mov lr, pc | ||
538 | bx r6 | ||
539 | ldr r1, wst_ptr | ||
540 | ldr r2, rst_ptr | ||
541 | wpush16 r0 | ||
542 | ldmfd sp!, {r0, r7, lr} | ||
543 | b uxn_decode | ||
544 | |||
545 | deor: | ||
546 | wpop8 r3 | ||
547 | mov r4, r3, lsr #4 @ idx | ||
548 | and r3, #0x0f @ port | ||
549 | wpop8 r5 @ value | ||
550 | adr r6, deo_map | ||
551 | ldr r6, [r6, r4, lsl #2] | ||
552 | stmfd sp!, {r0, r7, lr} | ||
553 | adr r0, device_data | ||
554 | lsl r4, #4 | ||
555 | add r0, r4 | ||
556 | strb r5, [r0, r3] | ||
557 | mov r1, r3 | ||
558 | mov lr, pc | ||
559 | bx r6 | ||
560 | ldmfd sp!, {r0, r7, lr} | ||
561 | ldr r1, wst_ptr | ||
562 | ldr r2, rst_ptr | ||
563 | b uxn_decode | ||
564 | |||
565 | deo2r: | ||
566 | wpop8 r3 | ||
567 | mov r4, r3, lsr #4 @ idx | ||
568 | and r3, #0x0f @ port | ||
569 | wpop16 r5, r6 @ value | ||
570 | adr r6, deo_map | ||
571 | ldr r6, [r6, r4, lsl #2] | ||
572 | stmfd sp!, {r0, r7, lr} | ||
573 | adr r0, device_data | ||
574 | lsl r4, #4 | ||
575 | add r0, r4 | ||
576 | strh r5, [r0, r3] | ||
577 | mov r1, r3 | ||
578 | mov lr, pc | ||
579 | bx r6 | ||
580 | ldmfd sp!, {r0, r7, lr} | ||
581 | ldr r1, wst_ptr | ||
582 | ldr r2, rst_ptr | ||
583 | b uxn_decode | ||
584 | |||
585 | .ltorg | ||
586 | .align 2 | ||
587 | |||
588 | .global device_data | ||
589 | device_data: | ||
590 | .global device_0 | ||
591 | device_0: .space 16 | ||
592 | .global device_1 | ||
593 | device_1: .space 16 | ||
594 | .global device_2 | ||
595 | device_2: .space 16 | ||
596 | .global device_3 | ||
597 | device_3: .space 16 | ||
598 | .global device_4 | ||
599 | device_4: .space 16 | ||
600 | .global device_5 | ||
601 | device_5: .space 16 | ||
602 | .global device_6 | ||
603 | device_6: .space 16 | ||
604 | .global device_7 | ||
605 | device_7: .space 16 | ||
606 | .global device_8 | ||
607 | device_8: .space 16 | ||
608 | .global device_9 | ||
609 | device_9: .space 16 | ||
610 | .global device_a | ||
611 | device_a: .space 16 | ||
612 | .global device_b | ||
613 | device_b: .space 16 | ||
614 | .global device_c | ||
615 | device_c: .space 16 | ||
616 | .global device_d | ||
617 | device_d: .space 16 | ||
618 | .global device_e | ||
619 | device_e: .space 16 | ||
620 | .global device_f | ||
621 | device_f: .space 16 | ||
622 | |||
623 | .global dei_map | ||
624 | dei_map: | ||
625 | .word uxn_ret | ||
626 | .word uxn_ret | ||
627 | .word uxn_ret | ||
628 | .word uxn_ret | ||
629 | .word uxn_ret | ||
630 | .word uxn_ret | ||
631 | .word uxn_ret | ||
632 | .word uxn_ret | ||
633 | .word uxn_ret | ||
634 | .word uxn_ret | ||
635 | .word uxn_ret | ||
636 | .word uxn_ret | ||
637 | .word uxn_ret | ||
638 | .word uxn_ret | ||
639 | .word uxn_ret | ||
640 | .word uxn_ret | ||
641 | |||
642 | .global deo_map | ||
643 | deo_map: | ||
644 | .word uxn_ret | ||
645 | .word uxn_ret | ||
646 | .word uxn_ret | ||
647 | .word uxn_ret | ||
648 | .word uxn_ret | ||
649 | .word uxn_ret | ||
650 | .word uxn_ret | ||
651 | .word uxn_ret | ||
652 | .word uxn_ret | ||
653 | .word uxn_ret | ||
654 | .word uxn_ret | ||
655 | .word uxn_ret | ||
656 | .word uxn_ret | ||
657 | .word uxn_ret | ||
658 | .word uxn_ret | ||
659 | .word uxn_ret | ||
660 | |||
421 | brk: | 661 | brk: |
422 | b uxn_ret | 662 | b uxn_ret |
423 | 663 | ||
@@ -640,12 +880,6 @@ jmp2: | |||
640 | add r0, r0, r3 | 880 | add r0, r0, r3 |
641 | b uxn_decode | 881 | b uxn_decode |
642 | 882 | ||
643 | jmp2r: | ||
644 | rpop16 r3, r5 | ||
645 | mov r0, r7 | ||
646 | add r0, r0, r3 | ||
647 | b uxn_decode | ||
648 | |||
649 | jcn: | 883 | jcn: |
650 | wpop8s r3 | 884 | wpop8s r3 |
651 | wpop8 r4 | 885 | wpop8 r4 |
@@ -897,153 +1131,428 @@ sft2: | |||
897 | wpush16 r3 | 1131 | wpush16 r3 |
898 | b uxn_decode | 1132 | b uxn_decode |
899 | 1133 | ||
900 | dei: | 1134 | .ltorg |
901 | wpop8 r3 | 1135 | .align 2 |
902 | mov r4, r3, lsr #4 @ idx | 1136 | |
903 | and r3, #0x0f @ port | 1137 | incr: |
904 | adr r6, dei_map | 1138 | rpop8 r3 |
905 | ldr r6, [r6, r4, lsl #2] | 1139 | add r3, #1 |
906 | stmfd sp!, {r0, r7, lr} | 1140 | rpush8 r3 |
907 | adr r0, device_data | ||
908 | lsl r4, #4 | ||
909 | add r0, r4 | ||
910 | mov r1, r3 | ||
911 | mov lr, pc | ||
912 | bx r6 | ||
913 | ldr r1, wst_ptr | ||
914 | ldr r2, rst_ptr | ||
915 | wpush8 r0 | ||
916 | ldmfd sp!, {r0, r7, lr} | ||
917 | b uxn_decode | 1141 | b uxn_decode |
918 | 1142 | ||
919 | dei2: | 1143 | inc2r: |
920 | wpop8 r3 | 1144 | rpop16 r3, r5 |
921 | mov r4, r3, lsr #4 @ idx | 1145 | add r3, r3, #1 |
922 | and r3, #0x0f @ port | 1146 | rpush16 r3 |
923 | adr r6, dei_map | ||
924 | ldr r6, [r6, r4, lsl #2] | ||
925 | stmfd sp!, {r0, r7, lr} | ||
926 | adr r0, device_data | ||
927 | lsl r4, #4 | ||
928 | add r0, r4 | ||
929 | mov r1, r3 | ||
930 | mov lr, pc | ||
931 | bx r6 | ||
932 | ldr r1, wst_ptr | ||
933 | ldr r2, rst_ptr | ||
934 | wpush16 r0 | ||
935 | ldmfd sp!, {r0, r7, lr} | ||
936 | b uxn_decode | 1147 | b uxn_decode |
937 | 1148 | ||
938 | deo: | 1149 | popr: |
939 | wpop8 r3 | 1150 | sub r1, #1 |
940 | mov r4, r3, lsr #4 @ idx | 1151 | b uxn_decode |
941 | and r3, #0x0f @ port | 1152 | |
942 | wpop8 r5 @ value | 1153 | pop2r: |
943 | adr r6, deo_map | 1154 | sub r1, #2 |
944 | ldr r6, [r6, r4, lsl #2] | 1155 | b uxn_decode |
945 | stmfd sp!, {r0, r7, lr} | 1156 | |
946 | adr r0, device_data | 1157 | nipr: |
947 | lsl r4, #4 | 1158 | rpop8 r3 |
948 | add r0, r4 | 1159 | strb r3, [r1, #-1] |
949 | strb r5, [r0, r3] | 1160 | b uxn_decode |
1161 | |||
1162 | nip2r: | ||
1163 | rpop16 r3, r5 | ||
1164 | strb r3, [r1, #-1] | ||
1165 | lsr r3, #8 | ||
1166 | strb r3, [r1, #-2] | ||
1167 | b uxn_decode | ||
1168 | |||
1169 | swpr: | ||
1170 | rpop8 r3 | ||
1171 | rpop8 r4 | ||
1172 | rpush8 r3 | ||
1173 | rpush8 r4 | ||
1174 | b uxn_decode | ||
1175 | |||
1176 | swp2r: | ||
1177 | rpop16 r3, r5 | ||
1178 | rpop16 r4, r5 | ||
1179 | rpush16 r3 | ||
1180 | rpush16 r4 | ||
1181 | b uxn_decode | ||
1182 | |||
1183 | rotr: | ||
1184 | rpop8 r5 | ||
1185 | rpop8 r4 | ||
1186 | rpop8 r3 | ||
1187 | rpush8 r4 | ||
1188 | rpush8 r5 | ||
1189 | rpush8 r3 | ||
1190 | b uxn_decode | ||
1191 | |||
1192 | rot2r: | ||
1193 | rpop16 r5, r6 | ||
1194 | rpop16 r4, r6 | ||
1195 | rpop16 r3, r6 | ||
1196 | rpush16 r4 | ||
1197 | rpush16 r5 | ||
1198 | rpush16 r3 | ||
1199 | b uxn_decode | ||
1200 | |||
1201 | dupr: | ||
1202 | rpeek r3, #-1 | ||
1203 | rpush8 r3 | ||
1204 | b uxn_decode | ||
1205 | |||
1206 | dup2r: | ||
1207 | rpeek r3, #-2 | ||
1208 | rpeek r4, #-1 | ||
1209 | rpush8 r3 | ||
1210 | rpush8 r4 | ||
1211 | b uxn_decode | ||
1212 | |||
1213 | ovrr: | ||
1214 | rpeek r3, #-2 | ||
1215 | rpush8 r3 | ||
1216 | b uxn_decode | ||
1217 | |||
1218 | ovr2r: | ||
1219 | rpeek r3, #-4 | ||
1220 | rpeek r4, #-3 | ||
1221 | rpush8 r3 | ||
1222 | rpush8 r4 | ||
1223 | b uxn_decode | ||
1224 | |||
1225 | equr: | ||
1226 | rpop8 r3 | ||
1227 | rpop8 r4 | ||
1228 | sub r3, r4, r3 | ||
1229 | rsbs r4, r3, #0 | ||
1230 | adc r4, r4, r3 | ||
1231 | rpush8 r4 | ||
1232 | b uxn_decode | ||
1233 | |||
1234 | equ2r: | ||
1235 | rpop16 r3, r5 | ||
1236 | rpop16 r4, r5 | ||
1237 | sub r3, r4, r3 | ||
1238 | rsbs r4, r3, #0 | ||
1239 | adc r4, r4, r3 | ||
1240 | rpush8 r4 | ||
1241 | b uxn_decode | ||
1242 | |||
1243 | neqr: | ||
1244 | rpop8 r3 | ||
1245 | rpop8 r4 | ||
1246 | subs r3, r4, r3 | ||
1247 | movne r3, #1 | ||
1248 | rpush8 r3 | ||
1249 | b uxn_decode | ||
1250 | |||
1251 | neq2r: | ||
1252 | rpop16 r3, r5 | ||
1253 | rpop16 r4, r5 | ||
1254 | subs r3, r4, r3 | ||
1255 | movne r3, #1 | ||
1256 | rpush8 r3 | ||
1257 | b uxn_decode | ||
1258 | |||
1259 | gthr: | ||
1260 | rpop8 r3 | ||
1261 | rpop8 r4 | ||
1262 | cmp r4, r3 | ||
1263 | movls r3, #0 | ||
1264 | movhi r3, #1 | ||
1265 | rpush8 r3 | ||
1266 | b uxn_decode | ||
1267 | |||
1268 | gth2r: | ||
1269 | rpop16 r3, r5 | ||
1270 | rpop16 r4, r5 | ||
1271 | cmp r4, r3 | ||
1272 | movls r3, #0 | ||
1273 | movhi r3, #1 | ||
1274 | rpush8 r3 | ||
1275 | b uxn_decode | ||
1276 | |||
1277 | lthr: | ||
1278 | rpop8 r3 | ||
1279 | rpop8 r4 | ||
1280 | cmp r4, r3 | ||
1281 | movcs r3, #0 | ||
1282 | movcc r3, #1 | ||
1283 | rpush8 r3 | ||
1284 | b uxn_decode | ||
1285 | |||
1286 | lth2r: | ||
1287 | rpop16 r3, r5 | ||
1288 | rpop16 r4, r5 | ||
1289 | cmp r4, r3 | ||
1290 | movcs r3, #0 | ||
1291 | movcc r3, #1 | ||
1292 | rpush8 r3 | ||
1293 | b uxn_decode | ||
1294 | |||
1295 | jmpr: | ||
1296 | rpop8s r3 | ||
1297 | add r0, r3 | ||
1298 | b uxn_decode | ||
1299 | |||
1300 | jmp2r: | ||
1301 | rpop16 r3, r5 | ||
1302 | mov r0, r7 | ||
1303 | add r0, r0, r3 | ||
1304 | b uxn_decode | ||
1305 | |||
1306 | jcnr: | ||
1307 | rpop8s r3 | ||
1308 | rpop8 r4 | ||
1309 | cmp r4, #0 | ||
1310 | addne r0, r3 | ||
1311 | b uxn_decode | ||
1312 | |||
1313 | jcn2r: | ||
1314 | rpop16 r3, r5 | ||
1315 | rpop8 r4 | ||
1316 | cmp r4, #0 | ||
1317 | movne r0, r7 | ||
1318 | cmp r4, #0 | ||
1319 | addne r0, r0, r3 | ||
1320 | b uxn_decode | ||
1321 | |||
1322 | jsrr: | ||
1323 | mov r3, r0 | ||
1324 | sub r3, r3, r7 | ||
1325 | rpush16 r3 | ||
1326 | rpop8s r3 | ||
1327 | add r0, r3 | ||
1328 | b uxn_decode | ||
1329 | |||
1330 | jsr2r: | ||
1331 | mov r3, r0 | ||
1332 | sub r3, r3, r7 | ||
1333 | rpop16 r3, r5 | ||
1334 | mov r0, r7 | ||
1335 | add r0, r0, r3 | ||
1336 | b uxn_decode | ||
1337 | |||
1338 | sthr: | ||
1339 | rpop8 r3 | ||
1340 | rpush8 r3 | ||
1341 | b uxn_decode | ||
1342 | |||
1343 | sth2r: | ||
1344 | rpop16 r3, r5 | ||
1345 | rpush16 r3 | ||
1346 | b uxn_decode | ||
1347 | |||
1348 | ldzr: | ||
1349 | rpop8 r3 | ||
1350 | zload8 r4, r3 | ||
1351 | rpush8 r4 | ||
1352 | b uxn_decode | ||
1353 | |||
1354 | ldz2r: | ||
1355 | rpop8 r3 | ||
1356 | zload8 r4, r3 | ||
1357 | rpush8 r4 | ||
1358 | add r3, #1 | ||
1359 | zload8 r4, r3 | ||
1360 | rpush8 r4 | ||
1361 | b uxn_decode | ||
1362 | |||
1363 | stzr: | ||
1364 | rpop8 r3 | ||
1365 | rpop8 r4 | ||
1366 | zsave8 r4, r3 | ||
1367 | b uxn_decode | ||
1368 | |||
1369 | stz2r: | ||
1370 | rpop8 r3 | ||
1371 | rpop16 r4, r5 | ||
1372 | zsave16 r4, r3 | ||
1373 | b uxn_decode | ||
1374 | |||
1375 | ldrr: | ||
1376 | rpop8s r4 | ||
1377 | rload8 r3, r4 | ||
1378 | rpush8 r3 | ||
1379 | b uxn_decode | ||
1380 | |||
1381 | ldr2r: | ||
1382 | rpop8s r4 | ||
1383 | rload8 r3, r4 | ||
1384 | rpush8 r3 | ||
1385 | add r4, #1 | ||
1386 | rload8 r3, r4 | ||
1387 | rpush8 r3 | ||
1388 | b uxn_decode | ||
1389 | |||
1390 | strr: | ||
1391 | rpop8s r4 | ||
1392 | rpop8 r3 | ||
1393 | rsave8 r3, r4 | ||
1394 | b uxn_decode | ||
1395 | |||
1396 | str2r: | ||
1397 | rpop8s r4 | ||
1398 | rpop16 r3, r5 | ||
1399 | rsave16 r3, r4 | ||
1400 | b uxn_decode | ||
1401 | |||
1402 | ldar: | ||
1403 | rpop16 r4, r5 | ||
1404 | aload8 r3, r4 | ||
1405 | rpush8 r3 | ||
1406 | b uxn_decode | ||
1407 | |||
1408 | lda2r: | ||
1409 | rpop16 r4, r5 | ||
1410 | aload8 r3, r4 | ||
1411 | rpush8 r3 | ||
1412 | add r4, #1 | ||
1413 | aload8 r3, r4 | ||
1414 | rpush8 r3 | ||
1415 | b uxn_decode | ||
1416 | |||
1417 | star: | ||
1418 | rpop16 r4, r5 | ||
1419 | rpop8 r3 | ||
1420 | asave8 r3, r4 | ||
1421 | b uxn_decode | ||
1422 | |||
1423 | sta2r: | ||
1424 | rpop16 r4, r5 | ||
1425 | rpop16 r3, r5 | ||
1426 | asave16 r3, r4 | ||
1427 | b uxn_decode | ||
1428 | |||
1429 | addr: | ||
1430 | rpop8 r3 | ||
1431 | rpop8 r4 | ||
1432 | add r3, r3, r4 | ||
1433 | rpush8 r3 | ||
1434 | b uxn_decode | ||
1435 | |||
1436 | add2r: | ||
1437 | rpop16 r3, r5 | ||
1438 | rpop16 r4, r5 | ||
1439 | add r3, r3, r4 | ||
1440 | rpush16 r3 | ||
1441 | b uxn_decode | ||
1442 | |||
1443 | subr: | ||
1444 | rpop8 r3 | ||
1445 | rpop8 r4 | ||
1446 | sub r4, r4, r3 | ||
1447 | rpush8 r4 | ||
1448 | b uxn_decode | ||
1449 | |||
1450 | sub2r: | ||
1451 | rpop16 r3, r5 | ||
1452 | rpop16 r4, r5 | ||
1453 | sub r3, r4, r3 | ||
1454 | rpush16 r3 | ||
1455 | b uxn_decode | ||
1456 | |||
1457 | mulr: | ||
1458 | rpop8 r3 | ||
1459 | rpop8 r4 | ||
1460 | mul r4, r3, r4 | ||
1461 | rpush8 r4 | ||
1462 | b uxn_decode | ||
1463 | |||
1464 | mul2r: | ||
1465 | rpop16 r3, r5 | ||
1466 | rpop16 r4, r5 | ||
1467 | mul r3, r4, r3 | ||
1468 | rpush16 r3 | ||
1469 | b uxn_decode | ||
1470 | |||
1471 | divr: | ||
1472 | rpop8 r3 | ||
1473 | rpop8 r4 | ||
1474 | push {r0, r1, r2, r7, lr} | ||
950 | mov r1, r3 | 1475 | mov r1, r3 |
951 | mov lr, pc | 1476 | mov r0, r4 |
952 | bx r6 | 1477 | bl __aeabi_uidiv |
953 | ldmfd sp!, {r0, r7, lr} | 1478 | mov r3, r0 |
954 | ldr r1, wst_ptr | 1479 | pop {r0, r1, r2, r7, lr} |
955 | ldr r2, rst_ptr | 1480 | rpush8 r3 |
956 | b uxn_decode | 1481 | b uxn_decode |
957 | 1482 | ||
958 | deo2: | 1483 | div2r: |
959 | wpop8 r3 | 1484 | rpop16 r3, r5 |
960 | mov r4, r3, lsr #4 @ idx | 1485 | rpop16 r4, r5 |
961 | and r3, #0x0f @ port | 1486 | push {r0, r1, r2, r7, lr} |
962 | wpop16 r5, r6 @ value | ||
963 | adr r6, deo_map | ||
964 | ldr r6, [r6, r4, lsl #2] | ||
965 | stmfd sp!, {r0, r7, lr} | ||
966 | adr r0, device_data | ||
967 | lsl r4, #4 | ||
968 | add r0, r4 | ||
969 | strh r5, [r0, r3] | ||
970 | mov r1, r3 | 1487 | mov r1, r3 |
971 | mov lr, pc | 1488 | mov r0, r4 |
972 | bx r6 | 1489 | bl __aeabi_uidiv |
973 | ldmfd sp!, {r0, r7, lr} | 1490 | mov r3, r0 |
974 | ldr r1, wst_ptr | 1491 | pop {r0, r1, r2, r7, lr} |
975 | ldr r2, rst_ptr | 1492 | rpush16 r3 |
976 | b uxn_decode | 1493 | b uxn_decode |
977 | 1494 | ||
978 | .global device_data | 1495 | andr: |
979 | device_data: | 1496 | rpop8 r3 |
980 | .global device_0 | 1497 | rpop8 r4 |
981 | device_0: .space 16 | 1498 | and r3, r3, r4 |
982 | .global device_1 | 1499 | rpush8 r3 |
983 | device_1: .space 16 | 1500 | b uxn_decode |
984 | .global device_2 | ||
985 | device_2: .space 16 | ||
986 | .global device_3 | ||
987 | device_3: .space 16 | ||
988 | .global device_4 | ||
989 | device_4: .space 16 | ||
990 | .global device_5 | ||
991 | device_5: .space 16 | ||
992 | .global device_6 | ||
993 | device_6: .space 16 | ||
994 | .global device_7 | ||
995 | device_7: .space 16 | ||
996 | .global device_8 | ||
997 | device_8: .space 16 | ||
998 | .global device_9 | ||
999 | device_9: .space 16 | ||
1000 | .global device_a | ||
1001 | device_a: .space 16 | ||
1002 | .global device_b | ||
1003 | device_b: .space 16 | ||
1004 | .global device_c | ||
1005 | device_c: .space 16 | ||
1006 | .global device_d | ||
1007 | device_d: .space 16 | ||
1008 | .global device_e | ||
1009 | device_e: .space 16 | ||
1010 | .global device_f | ||
1011 | device_f: .space 16 | ||
1012 | 1501 | ||
1013 | .global dei_map | 1502 | and2r: |
1014 | dei_map: | 1503 | rpop16 r3, r5 |
1015 | .word uxn_ret | 1504 | rpop16 r4, r5 |
1016 | .word uxn_ret | 1505 | and r3, r3, r4 |
1017 | .word uxn_ret | 1506 | rpush16 r3 |
1018 | .word uxn_ret | 1507 | b uxn_decode |
1019 | .word uxn_ret | ||
1020 | .word uxn_ret | ||
1021 | .word uxn_ret | ||
1022 | .word uxn_ret | ||
1023 | .word uxn_ret | ||
1024 | .word uxn_ret | ||
1025 | .word uxn_ret | ||
1026 | .word uxn_ret | ||
1027 | .word uxn_ret | ||
1028 | .word uxn_ret | ||
1029 | .word uxn_ret | ||
1030 | .word uxn_ret | ||
1031 | 1508 | ||
1032 | .global deo_map | 1509 | orar: |
1033 | deo_map: | 1510 | rpop8 r3 |
1034 | .word uxn_ret | 1511 | rpop8 r4 |
1035 | .word uxn_ret | 1512 | orr r3, r3, r4 |
1036 | .word uxn_ret | 1513 | rpush8 r3 |
1037 | .word uxn_ret | 1514 | b uxn_decode |
1038 | .word uxn_ret | 1515 | |
1039 | .word uxn_ret | 1516 | ora2r: |
1040 | .word uxn_ret | 1517 | rpop16 r3, r5 |
1041 | .word uxn_ret | 1518 | rpop16 r4, r5 |
1042 | .word uxn_ret | 1519 | orr r3, r3, r4 |
1043 | .word uxn_ret | 1520 | rpush16 r3 |
1044 | .word uxn_ret | 1521 | b uxn_decode |
1045 | .word uxn_ret | 1522 | |
1046 | .word uxn_ret | 1523 | eorr: |
1047 | .word uxn_ret | 1524 | rpop8 r3 |
1048 | .word uxn_ret | 1525 | rpop8 r4 |
1049 | .word uxn_ret | 1526 | eor r3, r3, r4 |
1527 | rpush8 r3 | ||
1528 | b uxn_decode | ||
1529 | |||
1530 | eor2r: | ||
1531 | rpop16 r3, r5 | ||
1532 | rpop16 r4, r5 | ||
1533 | eor r3, r3, r4 | ||
1534 | rpush16 r3 | ||
1535 | b uxn_decode | ||
1536 | |||
1537 | sftr: | ||
1538 | rpop8 r4 | ||
1539 | rpop8 r3 | ||
1540 | lsr r5, r4, #4 | ||
1541 | and r4, #0x0f | ||
1542 | lsr r3, r3, r4 | ||
1543 | lsl r3, r3, r5 | ||
1544 | rpush8 r3 | ||
1545 | b uxn_decode | ||
1546 | |||
1547 | sft2r: | ||
1548 | rpop8 r4 | ||
1549 | rpop16 r3, r5 | ||
1550 | lsr r5, r4, #4 | ||
1551 | and r4, #0x0f | ||
1552 | lsr r3, r3, r4 | ||
1553 | lsl r3, r3, r5 | ||
1554 | rpush16 r3 | ||
1555 | b uxn_decode | ||
1556 | |||
1557 | .ltorg | ||
1558 | .align 2 | ||