aboutsummaryrefslogtreecommitdiffstats
path: root/src
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
parentb4e6d175934513d4b0bd611d321a5d031dafc1a9 (diff)
downloaduxngba-033b0d78a5081e86fdfb70ca23fab627f8cf2ce0.tar.gz
uxngba-033b0d78a5081e86fdfb70ca23fab627f8cf2ce0.zip
Fix DEI/DEO not saving stack pointers
Diffstat (limited to 'src')
-rw-r--r--src/main.c48
-rw-r--r--src/uxn-core.s87
2 files changed, 111 insertions, 24 deletions
diff --git a/src/main.c b/src/main.c
index 08da0aa..c6e5b7d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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
243int 243int
244main(void) { 244main(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
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