aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-08-30 20:01:45 +0200
committerBad Diode <bd@badd10de.dev>2023-08-30 20:01:45 +0200
commit3d4cacc3ce77bc027c641dda5270aaaeb088048f (patch)
tree95b9abd01df50e1895e6efc4e73d47b0888610f2 /src
parent38d669a6648a07fd16cde897ae70b276c35dc327 (diff)
downloaduxngba-3d4cacc3ce77bc027c641dda5270aaaeb088048f.tar.gz
uxngba-3d4cacc3ce77bc027c641dda5270aaaeb088048f.zip
Add file device callbacks
Diffstat (limited to 'src')
-rw-r--r--src/main.c83
1 files changed, 76 insertions, 7 deletions
diff --git a/src/main.c b/src/main.c
index 231d8e7..0cbdc1f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -200,9 +200,8 @@ dei_datetime(u8 *dev, u8 port) {
200 200
201u16 201u16
202dei_audio(u8 *dev, u8 port) { 202dei_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
224void 223void
225deo_audio(u8 *dev, u8 port) { 224deo_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
242u16
243dei_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
263void
264deo_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
244void 309void
245deo_stub(u8 *dev, u8 port) { 310deo_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}