Index: emu/all.h
===================================================================
--- emu/all.h	(revision caff4914edce0b543d571453cecab105d16d5b36)
+++ emu/all.h	(revision 1efc42c86bda0ca43906d7ba53e9155f41293a6d)
@@ -62,8 +62,11 @@
 extern int32_t kbd_verbose;
 
+extern const char *bios;
+extern const char *disk;
+
 extern void sdl_init(void);
 extern void sdl_quit(void);
 
-extern void cpu_loop(const char *bios);
+extern void cpu_loop(void);
 
 extern void fpu_init(void);
Index: emu/cpu.c
===================================================================
--- emu/cpu.c	(revision caff4914edce0b543d571453cecab105d16d5b36)
+++ emu/cpu.c	(revision 1efc42c86bda0ca43906d7ba53e9155f41293a6d)
@@ -131,5 +131,5 @@
 }
 
-static void bios_init(const char *bios)
+static void bios_init(void)
 {
 	inf("loading BIOS file %s", bios);
@@ -611,8 +611,8 @@
 }
 
-void cpu_loop(const char *bios)
+void cpu_loop(void)
 {
 	hw_init();
-	bios_init(bios);
+	bios_init();
 
 	inf("entering CPU loop");
Index: emu/fdd.c
===================================================================
--- emu/fdd.c	(revision caff4914edce0b543d571453cecab105d16d5b36)
+++ emu/fdd.c	(revision 1efc42c86bda0ca43906d7ba53e9155f41293a6d)
@@ -24,7 +24,37 @@
 int32_t fdd_verbose = 0;
 
+#define N_CYL 80
+#define N_SID 2
+#define N_SEC 18
+#define SZ_SEC 512
+
+#define SZ_DISK (N_CYL * N_SID * N_SEC * SZ_SEC)
+
+static uint8_t image[SZ_DISK];
+
 void fdd_init(void)
 {
 	ver("fdd init");
+	inf("loading disk image file %s", disk);
+
+	SDL_RWops *ops = SDL_RWFromFile(disk, "rb");
+
+	if (ops == NULL) {
+		fail("error while opening disk image file %s", disk);
+	}
+
+	size_t loaded = 0;
+
+	while (loaded < SZ_DISK) {
+		size_t n_rd = SDL_RWread(ops, image + loaded, 1, SZ_DISK - loaded);
+
+		if (n_rd == 0) {
+			fail("error while reading disk image file %s", disk);
+		}
+
+		loaded += n_rd;
+	}
+
+	SDL_RWclose(ops);
 }
 
Index: emu/main.c
===================================================================
--- emu/main.c	(revision caff4914edce0b543d571453cecab105d16d5b36)
+++ emu/main.c	(revision 1efc42c86bda0ca43906d7ba53e9155f41293a6d)
@@ -38,9 +38,10 @@
 };
 
-static const char *bios = "bios.abs";
+const char *bios = "bios.abs";
+const char *disk = "buchla.disk";
 
 static void usage(FILE *fh)
 {
-	fprintf(fh, "usage: buchla [-h] [-v comp [-v comp [...]]] [-b bios]\n");
+	fprintf(fh, "usage: buchla [-h] [-v comp [-v comp [...]]] [-b bios] [-d disk]\n");
 	fprintf(fh, "where comp is one of: ");
 
@@ -68,4 +69,15 @@
 
 			bios = argv[i];
+			continue;
+		}
+
+		if (strcmp(argv[i], "-d") == 0) {
+			if (++i == argc) {
+				usage(stderr);
+				fprintf(stderr, "missing argument to -d\n");
+				exit(1);
+			}
+
+			disk = argv[i];
 			continue;
 		}
@@ -111,5 +123,5 @@
 	sdl_init();
 
-	cpu_loop(bios);
+	cpu_loop();
 
 	sdl_quit();
