Index: emu/all.h
===================================================================
--- emu/all.h	(revision 2147e536e31b1a98bdf98a79f30538a99211e64a)
+++ emu/all.h	(revision ebc8f6995bded615353b05eef97258804ab37fe5)
@@ -21,4 +21,6 @@
 #include <stdio.h>
 #include <unistd.h>
+
+#include <xmmintrin.h>
 
 #include <m68k.h>
Index: emu/cpu.c
===================================================================
--- emu/cpu.c	(revision 2147e536e31b1a98bdf98a79f30538a99211e64a)
+++ emu/cpu.c	(revision ebc8f6995bded615353b05eef97258804ab37fe5)
@@ -26,5 +26,6 @@
 bool cpu_verbose = false;
 
-#define CYCLES 70
+#define CPU_FREQ 7000000
+#define PER_SEC 100000
 
 #define APP_START 0x10000
@@ -450,8 +451,14 @@
 	m68k_pulse_reset();
 
+	uint64_t freq = SDL_GetPerformanceFrequency();
+	uint64_t quan = freq / PER_SEC;
+	inf("freq %" PRIu64 " quan %" PRIu64, freq, quan);
+
 	bool run = true;
 
 	while (run) {
-		m68k_execute(CYCLES);
+		uint64_t until = SDL_GetPerformanceCounter() + quan;
+
+		m68k_execute(CPU_FREQ / PER_SEC);
 		hw_exec();
 
@@ -461,7 +468,10 @@
 			if (ev.type == SDL_QUIT) {
 				run = false;
-				break;
 			}
 		}
+
+		while (SDL_GetPerformanceCounter() < until) {
+			_mm_pause();
+		}
 	}
 
Index: emu/sdl.c
===================================================================
--- emu/sdl.c	(revision 2147e536e31b1a98bdf98a79f30538a99211e64a)
+++ emu/sdl.c	(revision ebc8f6995bded615353b05eef97258804ab37fe5)
@@ -28,5 +28,5 @@
 void sdl_init(void)
 {
-	if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS) < 0) {
+	if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS | SDL_INIT_TIMER) < 0) {
 		fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError());
 		exit(1);
