diff options
author | Bad Diode <bd@badd10de.dev> | 2023-08-30 20:01:45 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-08-30 20:01:45 +0200 |
commit | 3d4cacc3ce77bc027c641dda5270aaaeb088048f (patch) | |
tree | 95b9abd01df50e1895e6efc4e73d47b0888610f2 | |
parent | 38d669a6648a07fd16cde897ae70b276c35dc327 (diff) | |
download | uxngba-3d4cacc3ce77bc027c641dda5270aaaeb088048f.tar.gz uxngba-3d4cacc3ce77bc027c641dda5270aaaeb088048f.zip |
Add file device callbacks
-rw-r--r-- | src/main.c | 83 |
1 files changed, 76 insertions, 7 deletions
@@ -200,9 +200,8 @@ dei_datetime(u8 *dev, u8 port) { | |||
200 | 200 | ||
201 | u16 | 201 | u16 |
202 | dei_audio(u8 *dev, u8 port) { | 202 | dei_audio(u8 *dev, u8 port) { |
203 | // txt_printf("AUDIO DEI!\n"); | 203 | size_t idx = device_data + 0x30 - dev; |
204 | // TODO: Find proper instance. | 204 | AudioChannel *c = &channels[idx]; |
205 | AudioChannel *c = &channels[0]; | ||
206 | switch(port) { | 205 | switch(port) { |
207 | case 0x0: | 206 | case 0x0: |
208 | case 0x8: | 207 | case 0x8: |
@@ -214,7 +213,7 @@ dei_audio(u8 *dev, u8 port) { | |||
214 | // c->pos <<= 12; // fixed point. | 213 | // c->pos <<= 12; // fixed point. |
215 | // break; | 214 | // break; |
216 | // } | 215 | // } |
217 | // case 0x4: return apu_get_vu(instance); | 216 | // case 0x4: return apu_get_vu(idx); |
218 | // TODO: return the current envelope loudness (0x00-0xff). | 217 | // TODO: return the current envelope loudness (0x00-0xff). |
219 | default: return dev[port]; | 218 | default: return dev[port]; |
220 | } | 219 | } |
@@ -223,9 +222,8 @@ dei_audio(u8 *dev, u8 port) { | |||
223 | 222 | ||
224 | void | 223 | void |
225 | deo_audio(u8 *dev, u8 port) { | 224 | deo_audio(u8 *dev, u8 port) { |
226 | // txt_printf("AUDIO DEO!\n"); | 225 | size_t idx = device_data + 0x30 - dev; |
227 | // TODO: Find proper instance. | 226 | AudioChannel *c = &channels[idx]; |
228 | AudioChannel *c = &channels[0]; | ||
229 | if (port == 0xf) { | 227 | if (port == 0xf) { |
230 | u16 length = 0; | 228 | u16 length = 0; |
231 | u16 adsr = 0; | 229 | u16 adsr = 0; |
@@ -241,6 +239,73 @@ deo_audio(u8 *dev, u8 port) { | |||
241 | } | 239 | } |
242 | } | 240 | } |
243 | 241 | ||
242 | u16 | ||
243 | dei_file(u8 *dev, u8 port) { | ||
244 | size_t idx = device_data + 0xa0 - dev; | ||
245 | UxnFile *c = &uxn_file[idx]; | ||
246 | switch(port) { | ||
247 | case 0x0: | ||
248 | case 0x2: | ||
249 | case 0x4: | ||
250 | case 0x8: | ||
251 | case 0xa: | ||
252 | case 0xe: return PEEK2(dev + port); | ||
253 | case 0xc: | ||
254 | case 0xd: { | ||
255 | u16 res = file_read(c, &dev[port], 1); | ||
256 | POKE2(dev + 0x2, res); | ||
257 | return res; | ||
258 | } | ||
259 | } | ||
260 | return dev[port]; | ||
261 | } | ||
262 | |||
263 | void | ||
264 | deo_file(u8 *dev, u8 port) { | ||
265 | size_t idx = device_data + 0xa0 - dev; | ||
266 | u16 a, b, res; | ||
267 | UxnFile *f = &uxn_file[idx]; | ||
268 | switch(port) { | ||
269 | case 0x5: { | ||
270 | a = PEEK2(dev + 0x4); | ||
271 | b = PEEK2(dev + 0xa); | ||
272 | if(b > 0x10000 - a) { | ||
273 | b = 0x10000 - a; | ||
274 | } | ||
275 | res = file_stat(f, &uxn_ram[a], b); | ||
276 | POKE2(dev + 0x2, res); | ||
277 | } break; | ||
278 | case 0x6: { | ||
279 | // TODO: no file deletion for now | ||
280 | // res = file_delete(); | ||
281 | // POKE2(dev + 0x2, res); | ||
282 | } break; | ||
283 | case 0x9: { | ||
284 | a = PEEK2(dev + 0x8); | ||
285 | res = file_init(f, &uxn_ram[a]); | ||
286 | POKE2(dev + 0x2, res); | ||
287 | } break; | ||
288 | case 0xd: { | ||
289 | a = PEEK2(dev + 0xc); | ||
290 | b = PEEK2(dev + 0xa); | ||
291 | if(b > 0x10000 - a) { | ||
292 | b = 0x10000 - a; | ||
293 | } | ||
294 | res = file_read(f, &uxn_ram[a], b); | ||
295 | POKE2(dev + 0x2, res); | ||
296 | } break; | ||
297 | case 0xf: { | ||
298 | a = PEEK2(dev + 0xe); | ||
299 | b = PEEK2(dev + 0xa); | ||
300 | if(b > 0x10000 - a) { | ||
301 | b = 0x10000 - a; | ||
302 | } | ||
303 | res = file_write(f, &uxn_ram[a], b, dev[0x7]); | ||
304 | POKE2(dev + 0x2, res); | ||
305 | } break; | ||
306 | } | ||
307 | } | ||
308 | |||
244 | void | 309 | void |
245 | deo_stub(u8 *dev, u8 port) { | 310 | deo_stub(u8 *dev, u8 port) { |
246 | (void)dev; | 311 | (void)dev; |
@@ -289,6 +354,10 @@ init_uxn() { | |||
289 | dei_map[0x5] = dei_audio; | 354 | dei_map[0x5] = dei_audio; |
290 | deo_map[0x6] = deo_audio; | 355 | deo_map[0x6] = deo_audio; |
291 | dei_map[0x6] = dei_audio; | 356 | dei_map[0x6] = dei_audio; |
357 | deo_map[0xa] = deo_file; | ||
358 | dei_map[0xa] = dei_file; | ||
359 | deo_map[0xb] = deo_file; | ||
360 | dei_map[0xb] = dei_file; | ||
292 | dei_map[0xc] = dei_datetime; | 361 | dei_map[0xc] = dei_datetime; |
293 | dei_map[0x9] = dei_mouse; | 362 | dei_map[0x9] = dei_mouse; |
294 | } | 363 | } |