Index: emu/cpu.c
===================================================================
--- emu/cpu.c	(revision bdd5a633c5295089a7d3640f3c1b310dbe247803)
+++ emu/cpu.c	(revision 6e313dd8fff0f62d7e18633080626c5100e39a81)
@@ -656,4 +656,5 @@
 {
 	inf("entering CPU loop");
+	int32_t count = 0;
 
 	while (SDL_AtomicGet(&run) != 0) {
@@ -677,6 +678,12 @@
 		}
 
+		if ((++count & 0x1ff) == 0) {
+			SDL_Delay(0);
+		}
+
 		while (SDL_GetPerformanceCounter() < until) {
-			_mm_pause();
+			for (int32_t i = 0; i < 100; ++i) {
+				_mm_pause();
+			}
 		}
 	}
Index: emu/sdl.c
===================================================================
--- emu/sdl.c	(revision bdd5a633c5295089a7d3640f3c1b310dbe247803)
+++ emu/sdl.c	(revision 6e313dd8fff0f62d7e18633080626c5100e39a81)
@@ -23,4 +23,10 @@
 #define ver2(...) _ver(sdl_verbose, 1, __VA_ARGS__)
 #define ver3(...) _ver(sdl_verbose, 2, __VA_ARGS__)
+
+typedef void (*sdl_func_t)(void);
+
+static sdl_func_t sdl_funcs[] = {
+	ser_sdl
+};
 
 void sdl_init(void)
@@ -61,5 +67,7 @@
 
 	while (SDL_AtomicGet(&run) != 0) {
-		ser_sdl();
+		for (int32_t i = 0; i < ARRAY_COUNT(sdl_funcs); ++i) {
+			sdl_funcs[i]();
+		}
 
 		SDL_Event ev;
