Index: emu/all.h
===================================================================
--- emu/all.h	(revision f9963876d9494b72796d2cebe041b8724fd0e301)
+++ emu/all.h	(revision f9963876d9494b72796d2cebe041b8724fd0e301)
@@ -0,0 +1,25 @@
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <m68k.h>
+
+#include <SDL2/SDL.h>
+
+#define inf(...) SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, __VA_ARGS__);
+#define err(...) SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, __VA_ARGS__);
+
+#define fail(...) { \
+	SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, __VA_ARGS__); \
+	exit(1); \
+}
+
+extern bool cpu_verbose;
+extern bool sdl_verbose;
+
+extern void sdl_init(void);
+extern void sdl_quit(void);
+
+extern void cpu_loop(void);
Index: emu/cpu.c
===================================================================
--- emu/cpu.c	(revision f9963876d9494b72796d2cebe041b8724fd0e301)
+++ emu/cpu.c	(revision f9963876d9494b72796d2cebe041b8724fd0e301)
@@ -0,0 +1,101 @@
+#include <all.h>
+
+#define ver(...) { \
+	if (cpu_verbose) { \
+		SDL_LogVerbose(SDL_LOG_CATEGORY_APPLICATION, __VA_ARGS__); \
+	} \
+}
+
+#define CYCLES 10
+
+#define RESET_PC 0x100000
+#define RESET_SP 0x100000
+
+bool cpu_verbose = false;
+static bool reset = true;
+
+uint32_t m68k_read_disassembler_8(uint32_t addr)
+{
+	ver("mem rd 0x%08x:8", addr);
+	return 0;
+}
+
+uint32_t m68k_read_disassembler_16(uint32_t addr)
+{
+	ver("mem rd 0x%08x:16", addr);
+	return 0;
+}
+
+uint32_t m68k_read_disassembler_32(uint32_t addr)
+{
+	ver("mem rd 0x%08x:32", addr);
+	return 0;
+}
+
+uint32_t m68k_read_memory_8(uint32_t addr)
+{
+	ver("mem rd 0x%08x:8", addr);
+	return 0;
+}
+
+uint32_t m68k_read_memory_16(uint32_t addr)
+{
+	ver("mem rd 0x%08x:16", addr);
+
+	if (addr < 0x100000) {
+	}
+
+	if (addr < 0x110000) {
+		return 0x60fe;
+	}
+
+	return 0;
+}
+
+uint32_t m68k_read_memory_32(uint32_t addr)
+{
+	ver("mem rd 0x%08x:32", addr);
+
+	if (reset) {
+		if (addr == 0) {
+			return RESET_SP;
+		}
+
+		if (addr == 4) {
+			reset = false;
+			return RESET_PC;
+		}
+
+		fail("invalid reset sequence");
+	}
+
+	return 0;
+}
+
+void m68k_write_memory_8(uint32_t addr, uint32_t val)
+{
+	ver("mem wr 0x%08x:8 0x%02x", addr, val);
+}
+
+void m68k_write_memory_16(uint32_t addr, uint32_t val)
+{
+	ver("mem wr 0x%08x:16 0x%04x", addr, val);
+}
+
+void m68k_write_memory_32(uint32_t addr, uint32_t val)
+{
+	ver("mem wr 0x%08x:32 0x%08x", addr, val);
+}
+
+void cpu_loop(void)
+{
+	ver("entering CPU loop");
+
+	m68k_init();
+	m68k_set_cpu_type(M68K_CPU_TYPE_68000);
+	m68k_pulse_reset();
+
+	for (int32_t i = 0; i < 5; ++i) {
+		m68k_execute(CYCLES);
+	}
+}
Index: emu/main.c
===================================================================
--- emu/main.c	(revision d54045b2d3ceca9ebfd5cfdcb077cd5381a2454c)
+++ emu/main.c	(revision f9963876d9494b72796d2cebe041b8724fd0e301)
@@ -1,61 +1,3 @@
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include <m68k.h>
-
-uint32_t m68k_read_disassembler_8(uint32_t addr)
-{
-	(void)addr;
-	return 0;
-}
-
-uint32_t m68k_read_disassembler_16(uint32_t addr)
-{
-	(void)addr;
-	return 0;
-}
-
-uint32_t m68k_read_disassembler_32(uint32_t addr)
-{
-	(void)addr;
-	return 0;
-}
-
-uint32_t m68k_read_memory_8(uint32_t addr)
-{
-	(void)addr;
-	return 0;
-}
-
-uint32_t m68k_read_memory_16(uint32_t addr)
-{
-	(void)addr;
-	return 0;
-}
-
-uint32_t m68k_read_memory_32(uint32_t addr)
-{
-	(void)addr;
-	return 0;
-}
-
-void m68k_write_memory_8(uint32_t addr, uint32_t val)
-{
-	(void)addr;
-	(void)val;
-}
-
-void m68k_write_memory_16(uint32_t addr, uint32_t val)
-{
-	(void)addr;
-	(void)val;
-}
-
-void m68k_write_memory_32(uint32_t addr, uint32_t val)
-{
-	(void)addr;
-	(void)val;
-}
+#include <all.h>
 
 int32_t main(int32_t argc, char *argv[])
@@ -63,5 +5,11 @@
 	(void)argc;
 	(void)argv;
+
+	sdl_init();
+
+	cpu_verbose = true;
+	cpu_loop();
+
+	sdl_quit();
 	return 0;
 }
-
Index: emu/sdl.c
===================================================================
--- emu/sdl.c	(revision f9963876d9494b72796d2cebe041b8724fd0e301)
+++ emu/sdl.c	(revision f9963876d9494b72796d2cebe041b8724fd0e301)
@@ -0,0 +1,24 @@
+#include <all.h>
+
+bool sdl_verbose = false;
+
+#define ver(...) { \
+	if (sdl_verbose) { \
+		SDL_LogVerbose(SDL_LOG_CATEGORY_APPLICATION, __VA_ARGS__); \
+	} \
+}
+
+void sdl_init(void)
+{
+	if (SDL_Init(SDL_INIT_VIDEO) < 0) {
+		fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError());
+		exit(1);
+	}
+
+	SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_VERBOSE);
+}
+
+void sdl_quit(void)
+{
+	SDL_Quit();
+}
