aboutsummaryrefslogtreecommitdiffstats
path: root/src/uxn-core.s
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-08-30 07:29:50 +0200
committerBad Diode <bd@badd10de.dev>2023-08-30 07:29:50 +0200
commit033b0d78a5081e86fdfb70ca23fab627f8cf2ce0 (patch)
tree2730450ebd2193350763b8828166eb924e49d198 /src/uxn-core.s
parentb4e6d175934513d4b0bd611d321a5d031dafc1a9 (diff)
downloaduxngba-033b0d78a5081e86fdfb70ca23fab627f8cf2ce0.tar.gz
uxngba-033b0d78a5081e86fdfb70ca23fab627f8cf2ce0.zip
Fix DEI/DEO not saving stack pointers
Diffstat (limited to 'src/uxn-core.s')
-rw-r--r--src/uxn-core.s87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/uxn-core.s b/src/uxn-core.s
index f110b61..c2ba5bb 100644
--- a/src/uxn-core.s
+++ b/src/uxn-core.s
@@ -453,6 +453,10 @@ dei:
453 ldr r6, =dei_map 453 ldr r6, =dei_map
454 ldr r6, [r6, r4, lsl #2] 454 ldr r6, [r6, r4, lsl #2]
455 stmfd sp!, {r0, r7, lr} 455 stmfd sp!, {r0, r7, lr}
456 ldr r0, =wst_ptr
457 str r1, [r0]
458 ldr r0, =rst_ptr
459 str r2, [r0]
456 ldr r0, =device_data 460 ldr r0, =device_data
457 lsl r4, #4 461 lsl r4, #4
458 add r0, r4 462 add r0, r4
@@ -472,6 +476,10 @@ dei2:
472 ldr r6, =dei_map 476 ldr r6, =dei_map
473 ldr r6, [r6, r4, lsl #2] 477 ldr r6, [r6, r4, lsl #2]
474 stmfd sp!, {r0, r7, lr} 478 stmfd sp!, {r0, r7, lr}
479 ldr r0, =wst_ptr
480 str r1, [r0]
481 ldr r0, =rst_ptr
482 str r2, [r0]
475 ldr r0, =device_data 483 ldr r0, =device_data
476 lsl r4, #4 484 lsl r4, #4
477 add r0, r4 485 add r0, r4
@@ -518,13 +526,24 @@ deo:
518 b uxn_decode 526 b uxn_decode
519 527
520deo2: 528deo2:
529 @ Get args (idx/port/value).
521 wpop8 r3 530 wpop8 r3
522 mov r4, r3, lsr #4 @ idx 531 mov r4, r3, lsr #4 @ idx
523 and r3, #0x0f @ port 532 and r3, #0x0f @ port
524 wpop16 r5, r6 @ value 533 wpop16 r5, r6 @ value
534
535 @ Find current devide.
525 ldr r6, =deo_map 536 ldr r6, =deo_map
526 ldr r6, [r6, r4, lsl #2] 537 ldr r6, [r6, r4, lsl #2]
538
539 @ Save registers that can be affected.
527 stmfd sp!, {r0, r7, lr} 540 stmfd sp!, {r0, r7, lr}
541 ldr r0, =wst_ptr
542 str r1, [r0]
543 ldr r0, =rst_ptr
544 str r2, [r0]
545
546 @ Call the deo function.
528 ldr r0, =device_data 547 ldr r0, =device_data
529 lsl r4, #4 548 lsl r4, #4
530 add r0, r4 549 add r0, r4
@@ -532,6 +551,8 @@ deo2:
532 mov r1, r3 551 mov r1, r3
533 mov lr, pc 552 mov lr, pc
534 bx r6 553 bx r6
554
555 @ Restore saved variables.
535 ldmfd sp!, {r0, r7, lr} 556 ldmfd sp!, {r0, r7, lr}
536 ldr r1, wst_ptr 557 ldr r1, wst_ptr
537 ldr r2, rst_ptr 558 ldr r2, rst_ptr
@@ -544,6 +565,10 @@ deir:
544 ldr r6, =dei_map 565 ldr r6, =dei_map
545 ldr r6, [r6, r4, lsl #2] 566 ldr r6, [r6, r4, lsl #2]
546 stmfd sp!, {r0, r7, lr} 567 stmfd sp!, {r0, r7, lr}
568 ldr r0, =wst_ptr
569 str r1, [r0]
570 ldr r0, =rst_ptr
571 str r2, [r0]
547 ldr r0, =device_data 572 ldr r0, =device_data
548 lsl r4, #4 573 lsl r4, #4
549 add r0, r4 574 add r0, r4
@@ -563,6 +588,10 @@ dei2r:
563 ldr r6, =dei_map 588 ldr r6, =dei_map
564 ldr r6, [r6, r4, lsl #2] 589 ldr r6, [r6, r4, lsl #2]
565 stmfd sp!, {r0, r7, lr} 590 stmfd sp!, {r0, r7, lr}
591 ldr r0, =wst_ptr
592 str r1, [r0]
593 ldr r0, =rst_ptr
594 str r2, [r0]
566 ldr r0, =device_data 595 ldr r0, =device_data
567 lsl r4, #4 596 lsl r4, #4
568 add r0, r4 597 add r0, r4
@@ -576,13 +605,24 @@ dei2r:
576 b uxn_decode 605 b uxn_decode
577 606
578deor: 607deor:
608 @ Get args (idx/port/value).
579 rpop8 r3 609 rpop8 r3
580 mov r4, r3, lsr #4 @ idx 610 mov r4, r3, lsr #4 @ idx
581 and r3, #0x0f @ port 611 and r3, #0x0f @ port
582 rpop8 r5 @ value 612 rpop8 r5 @ value
613
614 @ Find current devide.
583 ldr r6, =deo_map 615 ldr r6, =deo_map
584 ldr r6, [r6, r4, lsl #2] 616 ldr r6, [r6, r4, lsl #2]
617
618 @ Save registers that can be affected.
585 stmfd sp!, {r0, r7, lr} 619 stmfd sp!, {r0, r7, lr}
620 ldr r0, =wst_ptr
621 str r1, [r0]
622 ldr r0, =rst_ptr
623 str r2, [r0]
624
625 @ Call the deo function.
586 ldr r0, =device_data 626 ldr r0, =device_data
587 lsl r4, #4 627 lsl r4, #4
588 add r0, r4 628 add r0, r4
@@ -590,19 +630,32 @@ deor:
590 mov r1, r3 630 mov r1, r3
591 mov lr, pc 631 mov lr, pc
592 bx r6 632 bx r6
633
634 @ Restore saved variables.
593 ldmfd sp!, {r0, r7, lr} 635 ldmfd sp!, {r0, r7, lr}
594 ldr r1, wst_ptr 636 ldr r1, wst_ptr
595 ldr r2, rst_ptr 637 ldr r2, rst_ptr
596 b uxn_decode 638 b uxn_decode
597 639
598deo2r: 640deo2r:
641 @ Get args (idx/port/value).
599 rpop8 r3 642 rpop8 r3
600 mov r4, r3, lsr #4 @ idx 643 mov r4, r3, lsr #4 @ idx
601 and r3, #0x0f @ port 644 and r3, #0x0f @ port
602 rpop16 r5, r6 @ value 645 rpop16 r5, r6 @ value
646
647 @ Find current devide.
603 ldr r6, =deo_map 648 ldr r6, =deo_map
604 ldr r6, [r6, r4, lsl #2] 649 ldr r6, [r6, r4, lsl #2]
650
651 @ Save registers that can be affected.
605 stmfd sp!, {r0, r7, lr} 652 stmfd sp!, {r0, r7, lr}
653 ldr r0, =wst_ptr
654 str r1, [r0]
655 ldr r0, =rst_ptr
656 str r2, [r0]
657
658 @ Call the deo function.
606 ldr r0, =device_data 659 ldr r0, =device_data
607 lsl r4, #4 660 lsl r4, #4
608 add r0, r4 661 add r0, r4
@@ -610,6 +663,8 @@ deo2r:
610 mov r1, r3 663 mov r1, r3
611 mov lr, pc 664 mov lr, pc
612 bx r6 665 bx r6
666
667 @ Restore saved variables.
613 ldmfd sp!, {r0, r7, lr} 668 ldmfd sp!, {r0, r7, lr}
614 ldr r1, wst_ptr 669 ldr r1, wst_ptr
615 ldr r2, rst_ptr 670 ldr r2, rst_ptr
@@ -622,6 +677,10 @@ deik:
622 ldr r6, =dei_map 677 ldr r6, =dei_map
623 ldr r6, [r6, r4, lsl #2] 678 ldr r6, [r6, r4, lsl #2]
624 stmfd sp!, {r0, r7, lr} 679 stmfd sp!, {r0, r7, lr}
680 ldr r0, =wst_ptr
681 str r1, [r0]
682 ldr r0, =rst_ptr
683 str r2, [r0]
625 ldr r0, =device_data 684 ldr r0, =device_data
626 lsl r4, #4 685 lsl r4, #4
627 add r0, r4 686 add r0, r4
@@ -641,6 +700,10 @@ dei2k:
641 ldr r6, =dei_map 700 ldr r6, =dei_map
642 ldr r6, [r6, r4, lsl #2] 701 ldr r6, [r6, r4, lsl #2]
643 stmfd sp!, {r0, r7, lr} 702 stmfd sp!, {r0, r7, lr}
703 ldr r0, =wst_ptr
704 str r1, [r0]
705 ldr r0, =rst_ptr
706 str r2, [r0]
644 ldr r0, =device_data 707 ldr r0, =device_data
645 lsl r4, #4 708 lsl r4, #4
646 add r0, r4 709 add r0, r4
@@ -661,6 +724,10 @@ deok:
661 ldr r6, =deo_map 724 ldr r6, =deo_map
662 ldr r6, [r6, r4, lsl #2] 725 ldr r6, [r6, r4, lsl #2]
663 stmfd sp!, {r0, r7, lr} 726 stmfd sp!, {r0, r7, lr}
727 ldr r0, =wst_ptr
728 str r1, [r0]
729 ldr r0, =rst_ptr
730 str r2, [r0]
664 ldr r0, =device_data 731 ldr r0, =device_data
665 lsl r4, #4 732 lsl r4, #4
666 add r0, r4 733 add r0, r4
@@ -681,6 +748,10 @@ deo2k:
681 ldr r6, =deo_map 748 ldr r6, =deo_map
682 ldr r6, [r6, r4, lsl #2] 749 ldr r6, [r6, r4, lsl #2]
683 stmfd sp!, {r0, r7, lr} 750 stmfd sp!, {r0, r7, lr}
751 ldr r0, =wst_ptr
752 str r1, [r0]
753 ldr r0, =rst_ptr
754 str r2, [r0]
684 ldr r0, =device_data 755 ldr r0, =device_data
685 lsl r4, #4 756 lsl r4, #4
686 add r0, r4 757 add r0, r4
@@ -700,6 +771,10 @@ deikr:
700 ldr r6, =dei_map 771 ldr r6, =dei_map
701 ldr r6, [r6, r4, lsl #2] 772 ldr r6, [r6, r4, lsl #2]
702 stmfd sp!, {r0, r7, lr} 773 stmfd sp!, {r0, r7, lr}
774 ldr r0, =wst_ptr
775 str r1, [r0]
776 ldr r0, =rst_ptr
777 str r2, [r0]
703 ldr r0, =device_data 778 ldr r0, =device_data
704 lsl r4, #4 779 lsl r4, #4
705 add r0, r4 780 add r0, r4
@@ -719,6 +794,10 @@ dei2kr:
719 ldr r6, =dei_map 794 ldr r6, =dei_map
720 ldr r6, [r6, r4, lsl #2] 795 ldr r6, [r6, r4, lsl #2]
721 stmfd sp!, {r0, r7, lr} 796 stmfd sp!, {r0, r7, lr}
797 ldr r0, =wst_ptr
798 str r1, [r0]
799 ldr r0, =rst_ptr
800 str r2, [r0]
722 ldr r0, =device_data 801 ldr r0, =device_data
723 lsl r4, #4 802 lsl r4, #4
724 add r0, r4 803 add r0, r4
@@ -739,6 +818,10 @@ deokr:
739 ldr r6, =deo_map 818 ldr r6, =deo_map
740 ldr r6, [r6, r4, lsl #2] 819 ldr r6, [r6, r4, lsl #2]
741 stmfd sp!, {r0, r7, lr} 820 stmfd sp!, {r0, r7, lr}
821 ldr r0, =wst_ptr
822 str r1, [r0]
823 ldr r0, =rst_ptr
824 str r2, [r0]
742 ldr r0, =device_data 825 ldr r0, =device_data
743 lsl r4, #4 826 lsl r4, #4
744 add r0, r4 827 add r0, r4
@@ -759,6 +842,10 @@ deo2kr:
759 ldr r6, =deo_map 842 ldr r6, =deo_map
760 ldr r6, [r6, r4, lsl #2] 843 ldr r6, [r6, r4, lsl #2]
761 stmfd sp!, {r0, r7, lr} 844 stmfd sp!, {r0, r7, lr}
845 ldr r0, =wst_ptr
846 str r1, [r0]
847 ldr r0, =rst_ptr
848 str r2, [r0]
762 ldr r0, =device_data 849 ldr r0, =device_data
763 lsl r4, #4 850 lsl r4, #4
764 add r0, r4 851 add r0, r4