...
|
...
|
@@ -432,20 +432,28 @@ handle_events(Uxn *u)
|
432
|
432
|
static int
|
433
|
433
|
run(Uxn *u)
|
434
|
434
|
{
|
435
|
|
- Uint64 now = SDL_GetPerformanceCounter(), frame_end = now, frame_interval = SDL_GetPerformanceFrequency() / 60;
|
436
|
|
- for(; !u->dev[0x0f]; now = SDL_GetPerformanceCounter()) {
|
|
435
|
+ Uint64 now = SDL_GetPerformanceCounter(), frame_end, frame_interval = SDL_GetPerformanceFrequency() / 60;
|
|
436
|
+ for(;;) {
|
|
437
|
+ /* .System/halt */
|
|
438
|
+ if(u->dev[0x0f])
|
|
439
|
+ return error("Run", "Ended.");
|
|
440
|
+ frame_end = now + frame_interval;
|
437
|
441
|
exec_deadline = now + deadline_interval;
|
438
|
442
|
if(!handle_events(u))
|
439
|
443
|
return 0;
|
440
|
|
- if(((Sint64)(frame_end - SDL_GetPerformanceCounter())) <= 0) {
|
441
|
|
- frame_end = now + frame_interval;
|
442
|
|
- uxn_eval(u, GETVEC(&u->dev[0x20]));
|
443
|
|
- }
|
|
444
|
+ uxn_eval(u, GETVEC(&u->dev[0x20]));
|
444
|
445
|
if(uxn_screen.fg.changed || uxn_screen.bg.changed)
|
445
|
446
|
redraw();
|
446
|
|
- SDL_WaitEventTimeout(NULL, GETVEC(&u->dev[0x20]) ? (frame_end - SDL_GetPerformanceCounter()) / ms_interval : 0x100000);
|
|
447
|
+ now = SDL_GetPerformanceCounter();
|
|
448
|
+ if(u->dev[0x20]) {
|
|
449
|
+ if(!BENCH && ((Sint64)(frame_end - now)) > 0) {
|
|
450
|
+ SDL_Delay((frame_end - now) / ms_interval);
|
|
451
|
+ now = frame_end;
|
|
452
|
+ }
|
|
453
|
+ } else
|
|
454
|
+ SDL_WaitEvent(NULL);
|
447
|
455
|
}
|
448
|
|
- return error("Run", "Ended.");
|
|
456
|
+ return error("SDL_WaitEvent", SDL_GetError());;
|
449
|
457
|
}
|
450
|
458
|
|
451
|
459
|
int
|