diff options
author | Bad Diode <bd@badd10de.dev> | 2023-08-29 14:46:50 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-08-29 14:46:50 +0200 |
commit | 261fffa6e9772efd1c7648f7d11b4da3e19cf5dd (patch) | |
tree | b2ecad33d279108ebd58c7ea2deced69a3aa216b | |
parent | b1b6d258cd8b2dae16815ff239bc9db353e170aa (diff) | |
download | uxngba-261fffa6e9772efd1c7648f7d11b4da3e19cf5dd.tar.gz uxngba-261fffa6e9772efd1c7648f7d11b4da3e19cf5dd.zip |
Add initial implementation of DEO/DEO2
-rw-r--r-- | src/main.c | 43 | ||||
-rw-r--r-- | src/uxn-core.s | 77 |
2 files changed, 113 insertions, 7 deletions
@@ -32,7 +32,8 @@ extern void uxn_eval_asm(u16 pc); | |||
32 | // we will use very often. | 32 | // we will use very often. |
33 | extern u8 wst[256]; | 33 | extern u8 wst[256]; |
34 | extern u8 rst[256]; | 34 | extern u8 rst[256]; |
35 | extern u8 io_ports[256]; | 35 | extern uintptr_t deo_map[16]; |
36 | extern uintptr_t dei_map[16]; | ||
36 | extern uintptr_t wst_ptr; | 37 | extern uintptr_t wst_ptr; |
37 | extern uintptr_t rst_ptr; | 38 | extern uintptr_t rst_ptr; |
38 | 39 | ||
@@ -40,6 +41,33 @@ EWRAM_BSS | |||
40 | u8 uxn_ram[KB(64)]; | 41 | u8 uxn_ram[KB(64)]; |
41 | 42 | ||
42 | void | 43 | void |
44 | stub_a(u8 port, u16 val) { | ||
45 | (void)port; | ||
46 | (void)val; | ||
47 | txt_printf("a"); | ||
48 | } | ||
49 | |||
50 | void | ||
51 | deo_console(u8 port, u16 val) { | ||
52 | switch(port) { | ||
53 | case 0x8: | ||
54 | txt_putc(val); | ||
55 | return; | ||
56 | case 0x9: | ||
57 | txt_printf("ERROR: %c"); | ||
58 | txt_putc(val); | ||
59 | return; | ||
60 | } | ||
61 | } | ||
62 | |||
63 | void | ||
64 | stub_c(u8 port, u16 val) { | ||
65 | (void)port; | ||
66 | (void)val; | ||
67 | txt_printf("c"); | ||
68 | } | ||
69 | |||
70 | void | ||
43 | init_uxn() { | 71 | init_uxn() { |
44 | // Initialize uxn. | 72 | // Initialize uxn. |
45 | u32 fill = 0; | 73 | u32 fill = 0; |
@@ -160,7 +188,12 @@ init_uxn() { | |||
160 | // 0x40, 0x00, 0x03, 0x80, 0xff, 0x00, 0xa0, 0xaa, 0xbb, 0xa0, 0xcc, 0xdd, | 188 | // 0x40, 0x00, 0x03, 0x80, 0xff, 0x00, 0xa0, 0xaa, 0xbb, 0xa0, 0xcc, 0xdd, |
161 | // 0x60, 0x00, 0x03, 0x80, 0xff, 0x00, 0xa0, 0xaa, 0xbb, 0xa0, 0xcc, 0xdd, | 189 | // 0x60, 0x00, 0x03, 0x80, 0xff, 0x00, 0xa0, 0xaa, 0xbb, 0xa0, 0xcc, 0xdd, |
162 | // 0x60, 0x00, 0x03, 0x80, 0xff, 0x00, 0xa0, 0xaa, 0xbb, 0xa0, 0xcc, 0xdd, 0x6c | 190 | // 0x60, 0x00, 0x03, 0x80, 0xff, 0x00, 0xa0, 0xaa, 0xbb, 0xa0, 0xcc, 0xdd, 0x6c |
163 | 0x80, 0x01, 0x20, 0x00, 0x03, 0x80, 0xff, 0x00, 0xa0, 0xaa, 0xbb, 0xa0, 0xcc, 0xdd, | 191 | // 0x80, 0x01, 0x20, 0x00, 0x03, 0x80, 0xff, 0x00, 0xa0, 0xaa, 0xbb, 0xa0, 0xcc, 0xdd, |
192 | // DEO/DEO2 | ||
193 | // 0x80, 0x68, 0x80, 0x18, 0x17, 0x80, 0x65, 0x80, 0x18, 0x17, 0x80, 0x6c, 0x80, 0x18, 0x17, 0x80, | ||
194 | // 0x6c, 0x80, 0x18, 0x17, 0x80, 0x6f, 0x80, 0x18, 0x17, 0x80, 0x0a, 0x80, 0x18, 0x17, | ||
195 | 0xa0, 0x00, 0x68, 0x80, 0x18, 0x37, 0x80, 0x65, 0x80, 0x18, 0x17, 0x80, 0x6c, 0x80, 0x18, 0x17, 0x80, | ||
196 | 0x6c, 0x80, 0x18, 0x17, 0x80, 0x6f, 0x80, 0x18, 0x17, 0x80, 0x0a, 0x80, 0x18, 0x17, | ||
164 | }; | 197 | }; |
165 | memcpy(uxn_ram + PAGE_PROGRAM, uxn_rom, sizeof(uxn_rom)); | 198 | memcpy(uxn_ram + PAGE_PROGRAM, uxn_rom, sizeof(uxn_rom)); |
166 | } | 199 | } |
@@ -209,8 +242,12 @@ main(void) { | |||
209 | for (size_t i = 0; i < 256; i++) { | 242 | for (size_t i = 0; i < 256; i++) { |
210 | wst[i] = 0; | 243 | wst[i] = 0; |
211 | rst[i] = 0; | 244 | rst[i] = 0; |
212 | io_ports[i] = 0; | 245 | // TODO: Init device memory. |
213 | } | 246 | } |
247 | deo_map[0] = stub_a; | ||
248 | deo_map[1] = deo_console; | ||
249 | deo_map[2] = stub_c; | ||
250 | // ... | ||
214 | 251 | ||
215 | uxn_eval_asm(PAGE_PROGRAM); | 252 | uxn_eval_asm(PAGE_PROGRAM); |
216 | 253 | ||
diff --git a/src/uxn-core.s b/src/uxn-core.s index d32f303..c73d44c 100644 --- a/src/uxn-core.s +++ b/src/uxn-core.s | |||
@@ -17,16 +17,16 @@ rst: .space 256 | |||
17 | .global rst_ptr | 17 | .global rst_ptr |
18 | rst_ptr: .word rst | 18 | rst_ptr: .word rst |
19 | 19 | ||
20 | .global io_ports | 20 | .global device_data |
21 | io_ports: .space 256 | 21 | device_data: .space 256 |
22 | 22 | ||
23 | @ UXN evaluation function. | 23 | @ UXN evaluation function. |
24 | @ | 24 | @ |
25 | @ r0: PC pointer (argument is offset from RAM). | 25 | @ r0: PC pointer (argument for this function is the offset from UXN RAM). |
26 | @ r1: Stack pointer (wst). | 26 | @ r1: Stack pointer (wst). |
27 | @ r2: Stack pointer (rst). | 27 | @ r2: Stack pointer (rst). |
28 | @ r7: Ram ptr. | ||
29 | @ r3-r6: Scratch registers. | 28 | @ r3-r6: Scratch registers. |
29 | @ r7: Ram ptr. | ||
30 | @ | 30 | @ |
31 | .global uxn_eval_asm | 31 | .global uxn_eval_asm |
32 | uxn_eval_asm: | 32 | uxn_eval_asm: |
@@ -155,7 +155,10 @@ uxn_ret: | |||
155 | strb \a, [\off] | 155 | strb \a, [\off] |
156 | .endm | 156 | .endm |
157 | 157 | ||
158 | @ | ||
158 | @ OP table | 159 | @ OP table |
160 | @ | ||
161 | |||
159 | op_table: | 162 | op_table: |
160 | .word brk @ 0x00 | 163 | .word brk @ 0x00 |
161 | .word inc @ 0x01 | 164 | .word inc @ 0x01 |
@@ -769,16 +772,82 @@ sta2: | |||
769 | asave16 r3, r4 | 772 | asave16 r3, r4 |
770 | b uxn_decode | 773 | b uxn_decode |
771 | 774 | ||
775 | .global dei_map | ||
776 | dei_map: | ||
777 | .word uxn_ret | ||
778 | .word uxn_ret | ||
779 | .word uxn_ret | ||
780 | .word uxn_ret | ||
781 | .word uxn_ret | ||
782 | .word uxn_ret | ||
783 | .word uxn_ret | ||
784 | .word uxn_ret | ||
785 | .word uxn_ret | ||
786 | .word uxn_ret | ||
787 | .word uxn_ret | ||
788 | .word uxn_ret | ||
789 | .word uxn_ret | ||
790 | .word uxn_ret | ||
791 | .word uxn_ret | ||
792 | .word uxn_ret | ||
793 | |||
772 | dei: | 794 | dei: |
773 | b uxn_decode | 795 | b uxn_decode |
774 | 796 | ||
775 | dei2: | 797 | dei2: |
776 | b uxn_decode | 798 | b uxn_decode |
777 | 799 | ||
800 | .global deo_map | ||
801 | deo_map: | ||
802 | .word uxn_ret | ||
803 | .word uxn_ret | ||
804 | .word uxn_ret | ||
805 | .word uxn_ret | ||
806 | .word uxn_ret | ||
807 | .word uxn_ret | ||
808 | .word uxn_ret | ||
809 | .word uxn_ret | ||
810 | .word uxn_ret | ||
811 | .word uxn_ret | ||
812 | .word uxn_ret | ||
813 | .word uxn_ret | ||
814 | .word uxn_ret | ||
815 | .word uxn_ret | ||
816 | .word uxn_ret | ||
817 | .word uxn_ret | ||
818 | |||
778 | deo: | 819 | deo: |
820 | wpop8 r3 | ||
821 | mov r4, r3, lsr #4 @ idx | ||
822 | and r3, #0x0f @ port | ||
823 | wpop8 r5 @ value | ||
824 | adr r6, deo_map | ||
825 | ldr r6, [r6, r4, lsl #2] | ||
826 | stmfd sp!, {r0, r7, lr} | ||
827 | mov r0, r3 | ||
828 | mov r1, r5 | ||
829 | mov lr, pc | ||
830 | bx r6 | ||
831 | ldmfd sp!, {r0, r7, lr} | ||
832 | ldr r1, wst_ptr | ||
833 | ldr r2, rst_ptr | ||
779 | b uxn_decode | 834 | b uxn_decode |
780 | 835 | ||
781 | deo2: | 836 | deo2: |
837 | wpop8 r3 | ||
838 | mov r4, r3, lsr #4 @ idx | ||
839 | and r3, #0x0f @ port | ||
840 | wpop16 r5, r6 @ value | ||
841 | adr r6, deo_map | ||
842 | ldr r6, [r6, r4, lsl #2] | ||
843 | stmfd sp!, {r0, r7, lr} | ||
844 | mov r0, r3 | ||
845 | mov r1, r5 | ||
846 | mov lr, pc | ||
847 | bx r6 | ||
848 | ldmfd sp!, {r0, r7, lr} | ||
849 | ldr r1, wst_ptr | ||
850 | ldr r2, rst_ptr | ||
782 | b uxn_decode | 851 | b uxn_decode |
783 | 852 | ||
784 | add: | 853 | add: |