aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-08-29 14:46:50 +0200
committerBad Diode <bd@badd10de.dev>2023-08-29 14:46:50 +0200
commit261fffa6e9772efd1c7648f7d11b4da3e19cf5dd (patch)
treeb2ecad33d279108ebd58c7ea2deced69a3aa216b /src
parentb1b6d258cd8b2dae16815ff239bc9db353e170aa (diff)
downloaduxngba-261fffa6e9772efd1c7648f7d11b4da3e19cf5dd.tar.gz
uxngba-261fffa6e9772efd1c7648f7d11b4da3e19cf5dd.zip
Add initial implementation of DEO/DEO2
Diffstat (limited to 'src')
-rw-r--r--src/main.c43
-rw-r--r--src/uxn-core.s77
2 files changed, 113 insertions, 7 deletions
diff --git a/src/main.c b/src/main.c
index 41f3f21..5696b21 100644
--- a/src/main.c
+++ b/src/main.c
@@ -32,7 +32,8 @@ extern void uxn_eval_asm(u16 pc);
32// we will use very often. 32// we will use very often.
33extern u8 wst[256]; 33extern u8 wst[256];
34extern u8 rst[256]; 34extern u8 rst[256];
35extern u8 io_ports[256]; 35extern uintptr_t deo_map[16];
36extern uintptr_t dei_map[16];
36extern uintptr_t wst_ptr; 37extern uintptr_t wst_ptr;
37extern uintptr_t rst_ptr; 38extern uintptr_t rst_ptr;
38 39
@@ -40,6 +41,33 @@ EWRAM_BSS
40u8 uxn_ram[KB(64)]; 41u8 uxn_ram[KB(64)];
41 42
42void 43void
44stub_a(u8 port, u16 val) {
45 (void)port;
46 (void)val;
47 txt_printf("a");
48}
49
50void
51deo_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
63void
64stub_c(u8 port, u16 val) {
65 (void)port;
66 (void)val;
67 txt_printf("c");
68}
69
70void
43init_uxn() { 71init_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
18rst_ptr: .word rst 18rst_ptr: .word rst
19 19
20.global io_ports 20.global device_data
21io_ports: .space 256 21device_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
32uxn_eval_asm: 32uxn_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
159op_table: 162op_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
776dei_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
772dei: 794dei:
773 b uxn_decode 795 b uxn_decode
774 796
775dei2: 797dei2:
776 b uxn_decode 798 b uxn_decode
777 799
800.global deo_map
801deo_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
778deo: 819deo:
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
781deo2: 836deo2:
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
784add: 853add: