aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-08-30 19:07:54 +0200
committerBad Diode <bd@badd10de.dev>2023-08-30 19:07:54 +0200
commit38d669a6648a07fd16cde897ae70b276c35dc327 (patch)
tree698b1c501ffe68e293a810ddf6200f980e2a82c8 /src
parentf04783a0e084bf6f16a2c6c18f530d76ffb82eca (diff)
downloaduxngba-38d669a6648a07fd16cde897ae70b276c35dc327.tar.gz
uxngba-38d669a6648a07fd16cde897ae70b276c35dc327.zip
Ensure we are not executing zero vectors
Diffstat (limited to 'src')
-rw-r--r--src/input.c1
-rw-r--r--src/main.c67
-rw-r--r--src/uxn-core.s4
3 files changed, 67 insertions, 5 deletions
diff --git a/src/input.c b/src/input.c
index 375bd23..689479e 100644
--- a/src/input.c
+++ b/src/input.c
@@ -7,6 +7,7 @@ typedef enum {
7const ControlMethod ctrl_methods[] = { 7const ControlMethod ctrl_methods[] = {
8 CONTROL_CONTROLLER, 8 CONTROL_CONTROLLER,
9 CONTROL_MOUSE, 9 CONTROL_MOUSE,
10 CONTROL_KEYBOARD,
10}; 11};
11static ControlMethod ctrl_idx = 0; 12static ControlMethod ctrl_idx = 0;
12 13
diff --git a/src/main.c b/src/main.c
index cb6091f..231d8e7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -163,6 +163,12 @@ deo_system(u8 *dev, u8 port) {
163u16 163u16
164dei_system(u8 *dev, u8 port) { 164dei_system(u8 *dev, u8 port) {
165 switch (port) { 165 switch (port) {
166 case 0x0:
167 case 0x2:
168 case 0x6:
169 case 0x8:
170 case 0xa:
171 case 0xc: return PEEK2(dev + port);
166 case 0x4: { 172 case 0x4: {
167 // TODO: Return wst_ptr, but is it the offset instead? 173 // TODO: Return wst_ptr, but is it the offset instead?
168 } break; 174 } break;
@@ -173,25 +179,68 @@ dei_system(u8 *dev, u8 port) {
173 } 179 }
174} 180}
175 181
176u8 182u16
177dei_datetime(u8 *dev, u8 port) { 183dei_datetime(u8 *dev, u8 port) {
178 struct tm *t = gmtime(&seconds); 184 struct tm *t = gmtime(&seconds);
179 switch(port) { 185 switch(port) {
180 case 0x0: return (t->tm_year + 1900) >> 8; 186 case 0x0: return (t->tm_year + 1900);
181 case 0x1: return (t->tm_year + 1900); 187 case 0x1: return (t->tm_year + 1900) >> 8;
182 case 0x2: return t->tm_mon; 188 case 0x2: return t->tm_mon;
183 case 0x3: return t->tm_mday; 189 case 0x3: return t->tm_mday;
184 case 0x4: return t->tm_hour; 190 case 0x4: return t->tm_hour;
185 case 0x5: return t->tm_min; 191 case 0x5: return t->tm_min;
186 case 0x6: return t->tm_sec; 192 case 0x6: return t->tm_sec;
187 case 0x7: return t->tm_wday; 193 case 0x7: return t->tm_wday;
188 case 0x8: return t->tm_yday >> 8; 194 case 0x8: return t->tm_yday;
189 case 0x9: return t->tm_yday; 195 case 0x9: return t->tm_yday >> 8;
190 case 0xa: return t->tm_isdst; 196 case 0xa: return t->tm_isdst;
191 default: return dev[port]; 197 default: return dev[port];
192 } 198 }
193} 199}
194 200
201u16
202dei_audio(u8 *dev, u8 port) {
203 // txt_printf("AUDIO DEI!\n");
204 // TODO: Find proper instance.
205 AudioChannel *c = &channels[0];
206 switch(port) {
207 case 0x0:
208 case 0x8:
209 case 0xa:
210 case 0x2: // TODO: return the position
211 case 0xc: return PEEK2(dev + port);
212 // case 0x2: {
213 // POKE2(d + 0x2, c->pos);
214 // c->pos <<= 12; // fixed point.
215 // break;
216 // }
217 // case 0x4: return apu_get_vu(instance);
218 // TODO: return the current envelope loudness (0x00-0xff).
219 default: return dev[port];
220 }
221 return dev[port];
222}
223
224void
225deo_audio(u8 *dev, u8 port) {
226 // txt_printf("AUDIO DEO!\n");
227 // TODO: Find proper instance.
228 AudioChannel *c = &channels[0];
229 if (port == 0xf) {
230 u16 length = 0;
231 u16 adsr = 0;
232 u16 addr = 0;
233 u8 pitch = dev[0xf] & 0x7f;
234 adsr = PEEK2(dev + 0x8);
235 length = PEEK2(dev + 0xa);
236 addr = PEEK2(dev + 0xc);
237 u8 *data = &uxn_ram[addr];
238 u32 vol = MAX(dev[0xe] >> 4, dev[0xe] & 0xf) * 4 / 3;
239 bool loop = !(dev[0xf] & 0x80);
240 update_channel(c, data, length, pitch, adsr, vol, loop);
241 }
242}
243
195void 244void
196deo_stub(u8 *dev, u8 port) { 245deo_stub(u8 *dev, u8 port) {
197 (void)dev; 246 (void)dev;
@@ -232,6 +281,14 @@ init_uxn() {
232 deo_map[0x1] = deo_console; 281 deo_map[0x1] = deo_console;
233 deo_map[0x2] = deo_screen; 282 deo_map[0x2] = deo_screen;
234 dei_map[0x2] = dei_screen; 283 dei_map[0x2] = dei_screen;
284 deo_map[0x3] = deo_audio;
285 dei_map[0x3] = dei_audio;
286 deo_map[0x4] = deo_audio;
287 dei_map[0x4] = dei_audio;
288 deo_map[0x5] = deo_audio;
289 dei_map[0x5] = dei_audio;
290 deo_map[0x6] = deo_audio;
291 dei_map[0x6] = dei_audio;
235 dei_map[0xc] = dei_datetime; 292 dei_map[0xc] = dei_datetime;
236 dei_map[0x9] = dei_mouse; 293 dei_map[0x9] = dei_mouse;
237} 294}
diff --git a/src/uxn-core.s b/src/uxn-core.s
index 362f0d4..7d73b18 100644
--- a/src/uxn-core.s
+++ b/src/uxn-core.s
@@ -27,6 +27,10 @@ rst_ptr: .word rst
27@ 27@
28.global uxn_eval_asm 28.global uxn_eval_asm
29uxn_eval_asm: 29uxn_eval_asm:
30 @ Ensure PC is not null.
31 cmp r0, #0
32 bxeq lr
33
30 @ Initialization. 34 @ Initialization.
31 push {r4-r7} 35 push {r4-r7}
32 ldr r1, wst_ptr 36 ldr r1, wst_ptr