diff options
author | Bad Diode <bd@badd10de.dev> | 2023-08-30 19:07:54 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-08-30 19:07:54 +0200 |
commit | 38d669a6648a07fd16cde897ae70b276c35dc327 (patch) | |
tree | 698b1c501ffe68e293a810ddf6200f980e2a82c8 /src | |
parent | f04783a0e084bf6f16a2c6c18f530d76ffb82eca (diff) | |
download | uxngba-38d669a6648a07fd16cde897ae70b276c35dc327.tar.gz uxngba-38d669a6648a07fd16cde897ae70b276c35dc327.zip |
Ensure we are not executing zero vectors
Diffstat (limited to 'src')
-rw-r--r-- | src/input.c | 1 | ||||
-rw-r--r-- | src/main.c | 67 | ||||
-rw-r--r-- | src/uxn-core.s | 4 |
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 { | |||
7 | const ControlMethod ctrl_methods[] = { | 7 | const ControlMethod ctrl_methods[] = { |
8 | CONTROL_CONTROLLER, | 8 | CONTROL_CONTROLLER, |
9 | CONTROL_MOUSE, | 9 | CONTROL_MOUSE, |
10 | CONTROL_KEYBOARD, | ||
10 | }; | 11 | }; |
11 | static ControlMethod ctrl_idx = 0; | 12 | static ControlMethod ctrl_idx = 0; |
12 | 13 | ||
@@ -163,6 +163,12 @@ deo_system(u8 *dev, u8 port) { | |||
163 | u16 | 163 | u16 |
164 | dei_system(u8 *dev, u8 port) { | 164 | dei_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 | ||
176 | u8 | 182 | u16 |
177 | dei_datetime(u8 *dev, u8 port) { | 183 | dei_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 | ||
201 | u16 | ||
202 | dei_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 | |||
224 | void | ||
225 | deo_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 | |||
195 | void | 244 | void |
196 | deo_stub(u8 *dev, u8 port) { | 245 | deo_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 |
29 | uxn_eval_asm: | 29 | uxn_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 |