diff options
author | Bad Diode <bd@badd10de.dev> | 2023-08-30 07:29:50 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-08-30 07:29:50 +0200 |
commit | 033b0d78a5081e86fdfb70ca23fab627f8cf2ce0 (patch) | |
tree | 2730450ebd2193350763b8828166eb924e49d198 /src/uxn-core.s | |
parent | b4e6d175934513d4b0bd611d321a5d031dafc1a9 (diff) | |
download | uxngba-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.s | 87 |
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 | ||
520 | deo2: | 528 | deo2: |
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 | ||
578 | deor: | 607 | deor: |
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 | ||
598 | deo2r: | 640 | deo2r: |
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 |