Browse code

(uxnemu.c) Cache audio values before POKE2

neauoire authored on 30/08/2023 19:12:30
Showing 1 changed files
... ...
@@ -69,10 +69,15 @@ clamp(int v, int min, int max)
69 69
 static Uint8
70 70
 audio_dei(int instance, Uint8 *d, Uint8 port)
71 71
 {
72
+	Uint8 *addr;
73
+	Uint16 vu;
72 74
 	if(!audio_id) return d[port];
73 75
 	switch(port) {
74 76
 	case 0x4: return audio_get_vu(instance);
75
-	case 0x2: POKE2(d + 0x2, audio_get_position(instance)); /* fall through */
77
+	case 0x2:
78
+		addr = d + 2;
79
+		vu = audio_get_position(instance);
80
+		POKE2(addr, vu); /* fall through */
76 81
 	default: return d[port];
77 82
 	}
78 83
 }
... ...
@@ -353,8 +358,10 @@ handle_events(Uxn *u)
353 358
 			SDL_free(event.drop.file);
354 359
 		}
355 360
 		/* Audio */
356
-		else if(event.type >= audio0_event && event.type < audio0_event + POLYPHONY)
357
-			uxn_eval(u, PEEK2(&u->dev[0x30 + 0x10 * (event.type - audio0_event)]));
361
+		else if(event.type >= audio0_event && event.type < audio0_event + POLYPHONY) {
362
+			Uint8 *addr = &u->dev[0x30 + 0x10 * (event.type - audio0_event)];
363
+			uxn_eval(u, PEEK2(addr));
364
+		}
358 365
 		/* Mouse */
359 366
 		else if(event.type == SDL_MOUSEMOTION)
360 367
 			mouse_pos(u, &u->dev[0x90], clamp(event.motion.x - PAD, 0, uxn_screen.width - 1), clamp(event.motion.y - PAD, 0, uxn_screen.height - 1));
... ...
@@ -446,6 +453,7 @@ emu_run(Uxn *u, char *rom)
446 453
 {
447 454
 	Uint64 next_refresh = 0;
448 455
 	Uint64 frame_interval = SDL_GetPerformanceFrequency() / 60;
456
+	Uint8 *vector_addr = &u->dev[0x20];
449 457
 	window_created = 1;
450 458
 	emu_window = SDL_CreateWindow(rom, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, (uxn_screen.width + PAD2) * zoom, (uxn_screen.height + PAD2) * zoom, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI);
451 459
 	if(emu_window == NULL)
... ...
@@ -464,7 +472,7 @@ emu_run(Uxn *u, char *rom)
464 472
 		exec_deadline = now + deadline_interval;
465 473
 		if(!handle_events(u))
466 474
 			return 0;
467
-		screen_vector = PEEK2(&u->dev[0x20]);
475
+		screen_vector = PEEK2(vector_addr);
468 476
 		if(now >= next_refresh) {
469 477
 			now = SDL_GetPerformanceCounter();
470 478
 			next_refresh = now + frame_interval;