Index: emu/fdd.c
===================================================================
--- emu/fdd.c	(revision c5b6c90c4ed6faebc6ff7dc5cffe12481a279503)
+++ emu/fdd.c	(revision 1489228fd0246834c42c84a1bbe13f80af0bc642)
@@ -46,6 +46,6 @@
 #define COM_WR_TRA 0xf0
 
-#define COM_LAT_CYC 10
-#define COM_EXE_CYC 10
+#define COM_LAT_CYC 5
+#define COM_EXE_CYC 5
 
 typedef enum {
@@ -256,15 +256,24 @@
 
 		rv = *state.dat;
-		size_t addr = (size_t)(state.dat - image);
+		int32_t addr = (int32_t)(state.dat - image);
 
 		if ((addr & (SZ_SEC - 1)) == 0) {
-			ver2("addr 0x%06zx -> 0x%02x", addr, rv);
+			ver2("addr 0x%06x -> 0x%02x", addr, rv);
 		}
 		else {
-			ver3("addr 0x%06zx -> 0x%02x", addr, rv);
+			ver3("addr 0x%06x -> 0x%02x", addr, rv);
 		}
 
 		++state.dat;
-		state.cyc = COM_EXE_CYC;
+		++addr;
+
+		if ((addr & (SZ_SEC - 1)) == 0 && state.com == COM_RD_SEC) {
+			state.step = STEP_IDLE;
+			state.cyc = 0;
+		}
+		else {
+			state.cyc = COM_EXE_CYC;
+		}
+
 		break;
 
@@ -349,15 +358,23 @@
 				(state.com == COM_WR_SEC || state.com == COM_WR_SEC_WP)) {
 			*state.dat = (uint8_t)val;
-			size_t addr = (size_t)(state.dat - image);
+			int32_t addr = (int32_t)(state.dat - image);
 
 			if ((addr & (SZ_SEC - 1)) == 0) {
-				ver2("addr 0x%06zx <- 0x%02x", addr, val);
+				ver2("addr 0x%06x <- 0x%02x", addr, val);
 			}
 			else {
-				ver3("addr 0x%06zx <- 0x%02x", addr, val);
+				ver3("addr 0x%06x <- 0x%02x", addr, val);
 			}
 
 			++state.dat;
-			state.cyc = COM_EXE_CYC;
+			++addr;
+
+			if ((addr & (SZ_SEC - 1)) == 0) {
+				state.step = STEP_IDLE;
+				state.cyc = 0;
+			}
+			else {
+				state.cyc = COM_EXE_CYC;
+			}
 		}
 		else {
