aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-08-29 17:15:37 +0200
committerBad Diode <bd@badd10de.dev>2023-08-29 17:15:37 +0200
commit9dc972fd0cdd9f7cac45aa0d0f30ad8751a8c0d5 (patch)
tree9edbadceba7f587f88888af9d8c7c54173c48d8c /src
parent19776f5720806bef0f4c6d1439f76da80603f054 (diff)
downloaduxngba-9dc972fd0cdd9f7cac45aa0d0f30ad8751a8c0d5.tar.gz
uxngba-9dc972fd0cdd9f7cac45aa0d0f30ad8751a8c0d5.zip
Add OPr ops (untested)
Diffstat (limited to 'src')
-rw-r--r--src/main.c1
-rw-r--r--src/uxn-core.s923
2 files changed, 716 insertions, 208 deletions
diff --git a/src/main.c b/src/main.c
index 8ea0106..084c3ab 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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
429dei:
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
448dei2:
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
467deo:
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
487deo2:
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
507deir:
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
526dei2r:
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
545deor:
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
565deo2r:
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
589device_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
624dei_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
643deo_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
421brk: 661brk:
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
643jmp2r:
644 rpop16 r3, r5
645 mov r0, r7
646 add r0, r0, r3
647 b uxn_decode
648
649jcn: 883jcn:
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
900dei: 1134.ltorg
901 wpop8 r3 1135.align 2
902 mov r4, r3, lsr #4 @ idx 1136
903 and r3, #0x0f @ port 1137incr:
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
919dei2: 1143inc2r:
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
938deo: 1149popr:
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 1153pop2r:
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 1157nipr:
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
1162nip2r:
1163 rpop16 r3, r5
1164 strb r3, [r1, #-1]
1165 lsr r3, #8
1166 strb r3, [r1, #-2]
1167 b uxn_decode
1168
1169swpr:
1170 rpop8 r3
1171 rpop8 r4
1172 rpush8 r3
1173 rpush8 r4
1174 b uxn_decode
1175
1176swp2r:
1177 rpop16 r3, r5
1178 rpop16 r4, r5
1179 rpush16 r3
1180 rpush16 r4
1181 b uxn_decode
1182
1183rotr:
1184 rpop8 r5
1185 rpop8 r4
1186 rpop8 r3
1187 rpush8 r4
1188 rpush8 r5
1189 rpush8 r3
1190 b uxn_decode
1191
1192rot2r:
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
1201dupr:
1202 rpeek r3, #-1
1203 rpush8 r3
1204 b uxn_decode
1205
1206dup2r:
1207 rpeek r3, #-2
1208 rpeek r4, #-1
1209 rpush8 r3
1210 rpush8 r4
1211 b uxn_decode
1212
1213ovrr:
1214 rpeek r3, #-2
1215 rpush8 r3
1216 b uxn_decode
1217
1218ovr2r:
1219 rpeek r3, #-4
1220 rpeek r4, #-3
1221 rpush8 r3
1222 rpush8 r4
1223 b uxn_decode
1224
1225equr:
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
1234equ2r:
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
1243neqr:
1244 rpop8 r3
1245 rpop8 r4
1246 subs r3, r4, r3
1247 movne r3, #1
1248 rpush8 r3
1249 b uxn_decode
1250
1251neq2r:
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
1259gthr:
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
1268gth2r:
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
1277lthr:
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
1286lth2r:
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
1295jmpr:
1296 rpop8s r3
1297 add r0, r3
1298 b uxn_decode
1299
1300jmp2r:
1301 rpop16 r3, r5
1302 mov r0, r7
1303 add r0, r0, r3
1304 b uxn_decode
1305
1306jcnr:
1307 rpop8s r3
1308 rpop8 r4
1309 cmp r4, #0
1310 addne r0, r3
1311 b uxn_decode
1312
1313jcn2r:
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
1322jsrr:
1323 mov r3, r0
1324 sub r3, r3, r7
1325 rpush16 r3
1326 rpop8s r3
1327 add r0, r3
1328 b uxn_decode
1329
1330jsr2r:
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
1338sthr:
1339 rpop8 r3
1340 rpush8 r3
1341 b uxn_decode
1342
1343sth2r:
1344 rpop16 r3, r5
1345 rpush16 r3
1346 b uxn_decode
1347
1348ldzr:
1349 rpop8 r3
1350 zload8 r4, r3
1351 rpush8 r4
1352 b uxn_decode
1353
1354ldz2r:
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
1363stzr:
1364 rpop8 r3
1365 rpop8 r4
1366 zsave8 r4, r3
1367 b uxn_decode
1368
1369stz2r:
1370 rpop8 r3
1371 rpop16 r4, r5
1372 zsave16 r4, r3
1373 b uxn_decode
1374
1375ldrr:
1376 rpop8s r4
1377 rload8 r3, r4
1378 rpush8 r3
1379 b uxn_decode
1380
1381ldr2r:
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
1390strr:
1391 rpop8s r4
1392 rpop8 r3
1393 rsave8 r3, r4
1394 b uxn_decode
1395
1396str2r:
1397 rpop8s r4
1398 rpop16 r3, r5
1399 rsave16 r3, r4
1400 b uxn_decode
1401
1402ldar:
1403 rpop16 r4, r5
1404 aload8 r3, r4
1405 rpush8 r3
1406 b uxn_decode
1407
1408lda2r:
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
1417star:
1418 rpop16 r4, r5
1419 rpop8 r3
1420 asave8 r3, r4
1421 b uxn_decode
1422
1423sta2r:
1424 rpop16 r4, r5
1425 rpop16 r3, r5
1426 asave16 r3, r4
1427 b uxn_decode
1428
1429addr:
1430 rpop8 r3
1431 rpop8 r4
1432 add r3, r3, r4
1433 rpush8 r3
1434 b uxn_decode
1435
1436add2r:
1437 rpop16 r3, r5
1438 rpop16 r4, r5
1439 add r3, r3, r4
1440 rpush16 r3
1441 b uxn_decode
1442
1443subr:
1444 rpop8 r3
1445 rpop8 r4
1446 sub r4, r4, r3
1447 rpush8 r4
1448 b uxn_decode
1449
1450sub2r:
1451 rpop16 r3, r5
1452 rpop16 r4, r5
1453 sub r3, r4, r3
1454 rpush16 r3
1455 b uxn_decode
1456
1457mulr:
1458 rpop8 r3
1459 rpop8 r4
1460 mul r4, r3, r4
1461 rpush8 r4
1462 b uxn_decode
1463
1464mul2r:
1465 rpop16 r3, r5
1466 rpop16 r4, r5
1467 mul r3, r4, r3
1468 rpush16 r3
1469 b uxn_decode
1470
1471divr:
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
958deo2: 1483div2r:
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 1495andr:
979device_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 1502and2r:
1014dei_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 1509orar:
1033deo_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 1516ora2r:
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 1523eorr:
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
1530eor2r:
1531 rpop16 r3, r5
1532 rpop16 r4, r5
1533 eor r3, r3, r4
1534 rpush16 r3
1535 b uxn_decode
1536
1537sftr:
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
1547sft2r:
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