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 | |
parent | b4e6d175934513d4b0bd611d321a5d031dafc1a9 (diff) | |
download | uxngba-033b0d78a5081e86fdfb70ca23fab627f8cf2ce0.tar.gz uxngba-033b0d78a5081e86fdfb70ca23fab627f8cf2ce0.zip |
Fix DEI/DEO not saving stack pointers
-rw-r--r-- | src/main.c | 48 | ||||
-rw-r--r-- | src/uxn-core.s | 87 |
2 files changed, 111 insertions, 24 deletions
@@ -213,9 +213,9 @@ init_uxn() { | |||
213 | // // 0x6c, 0x80, 0x18, 0x17, 0x80, 0x6f, 0x80, 0x18, 0x17, 0x80, 0x0a, 0x80, 0x18, 0x17, | 213 | // // 0x6c, 0x80, 0x18, 0x17, 0x80, 0x6f, 0x80, 0x18, 0x17, 0x80, 0x0a, 0x80, 0x18, 0x17, |
214 | // // 0xa0, 0x2c, 0xe9, 0x80, 0x08, 0x37, | 214 | // // 0xa0, 0x2c, 0xe9, 0x80, 0x08, 0x37, |
215 | // // 0xa0, 0x6b, 0x4f, 0x80, 0x18, 0x17, 0x80, 0x18, 0x17, 0xa0, 0x0a, 0x18, 0x17, | 215 | // // 0xa0, 0x6b, 0x4f, 0x80, 0x18, 0x17, 0x80, 0x18, 0x17, 0xa0, 0x0a, 0x18, 0x17, |
216 | // 0xc0, 0x6b, 0x80, 0x4f, | 216 | // 0xc0, 0x6b, 0x80, 0x4f, |
217 | // 0x0f, | 217 | // 0x0f, |
218 | // 0x6f, | 218 | // 0x6f, |
219 | // 0x80, 0x18, | 219 | // 0x80, 0x18, |
220 | // 0x17, 0x80, 0x18, 0x17, 0xa0, 0x0a, 0x18, 0x17, | 220 | // 0x17, 0x80, 0x18, 0x17, 0xa0, 0x0a, 0x18, 0x17, |
221 | // // 0x00, 0x00, | 221 | // // 0x00, 0x00, |
@@ -238,7 +238,7 @@ init_uxn() { | |||
238 | } | 238 | } |
239 | 239 | ||
240 | // TODO: | 240 | // TODO: |
241 | // - Test DEI functions | 241 | // - Change rom include using objcopy instead of my flimsy bin2carr rom |
242 | 242 | ||
243 | int | 243 | int |
244 | main(void) { | 244 | main(void) { |
@@ -273,14 +273,14 @@ main(void) { | |||
273 | 273 | ||
274 | uxn_eval_asm(PAGE_PROGRAM); | 274 | uxn_eval_asm(PAGE_PROGRAM); |
275 | 275 | ||
276 | // txt_printf("\nROM"); | 276 | txt_printf("\nROM"); |
277 | // for (size_t i = 0; i < 32; i++) { | 277 | for (size_t i = 0; i < 32; i++) { |
278 | // if (i % 8 == 0) { | 278 | if (i % 8 == 0) { |
279 | // txt_printf("\n"); | 279 | txt_printf("\n"); |
280 | // } | 280 | } |
281 | // txt_printf("%02x ", uxn_ram[i + PAGE_PROGRAM]); | 281 | txt_printf("%02x ", uxn_ram[i + PAGE_PROGRAM]); |
282 | // } | 282 | } |
283 | // txt_printf("\n"); | 283 | txt_printf("\n"); |
284 | 284 | ||
285 | txt_printf("\nWST ("); | 285 | txt_printf("\nWST ("); |
286 | txt_printf("SIZE: %d)", wst_ptr - (uintptr_t)wst); | 286 | txt_printf("SIZE: %d)", wst_ptr - (uintptr_t)wst); |
@@ -295,18 +295,18 @@ main(void) { | |||
295 | } | 295 | } |
296 | } | 296 | } |
297 | txt_printf("\n\n"); | 297 | txt_printf("\n\n"); |
298 | txt_printf("RST ("); | 298 | // txt_printf("RST ("); |
299 | txt_printf("SIZE: %d)", rst_ptr - (uintptr_t)rst); | 299 | // txt_printf("SIZE: %d)", rst_ptr - (uintptr_t)rst); |
300 | for (size_t i = 0; i < 32; i++) { | 300 | // for (size_t i = 0; i < 32; i++) { |
301 | if (i % 8 == 0) { | 301 | // if (i % 8 == 0) { |
302 | txt_printf("\n"); | 302 | // txt_printf("\n"); |
303 | } | 303 | // } |
304 | if (i >= (rst_ptr - (uintptr_t)rst)) { | 304 | // if (i >= (rst_ptr - (uintptr_t)rst)) { |
305 | txt_printf("%02x ", 0); | 305 | // txt_printf("%02x ", 0); |
306 | } else { | 306 | // } else { |
307 | txt_printf("%02x ", rst[i]); | 307 | // txt_printf("%02x ", rst[i]); |
308 | } | 308 | // } |
309 | } | 309 | // } |
310 | // txt_printf("\n\n"); | 310 | // txt_printf("\n\n"); |
311 | // txt_printf("RAM (ZP)\n"); | 311 | // txt_printf("RAM (ZP)\n"); |
312 | // for (size_t i = 0; i < 64; i++) { | 312 | // for (size_t i = 0; i < 64; i++) { |
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 |