1.1 --- a/src/wd2010.c Sat Nov 17 22:15:23 2012 +0000 1.2 +++ b/src/wd2010.c Sat Nov 17 22:26:53 2012 +0000 1.3 @@ -102,6 +102,8 @@ 1.4 ctx->cylinder_low_reg = 0; 1.5 ctx->cylinder_high_reg = 0; 1.6 ctx->sdh = 0; 1.7 + ctx->mcr2_hdsel3 = 0; 1.8 + ctx->mcr2_ddrive1 = 0; 1.9 } 1.10 1.11 void wd2010_done(WD2010_CTX *ctx) 1.12 @@ -260,6 +262,17 @@ 1.13 1.14 /*cpu_log_enabled = 1;*/ 1.15 1.16 + if (addr == UNIXPC_REG_MCR2) { 1.17 + // The UNIX PC has an "MCR2" register with the following format: 1.18 + // [ 7..2 ][1][0] 1.19 + // Bits 7..2: Not used 1.20 + // Bit 1: DDRIVE1 (hard disk drive 1 select - not used?) 1.21 + // Bit 0: HDSEL3 (head-select bit 3) 1.22 + ctx->mcr2_hdsel3 = ((val & 1) == 1); 1.23 + ctx->mcr2_ddrive1 = ((val & 2) == 2); 1.24 + return; 1.25 + } 1.26 + 1.27 switch (addr & 0x07) { 1.28 case WD2010_REG_WRITE_PRECOMP_CYLINDER: 1.29 break; 1.30 @@ -313,7 +326,8 @@ 1.31 ctx->irq = true; 1.32 break; 1.33 } 1.34 - ctx->head = ctx->sdh & 0x07; 1.35 + // The SDH register provides 3 head select bits; the 4th comes from MCR2. 1.36 + ctx->head = (ctx->sdh & 0x07) + (ctx->mcr2_hdsel3 ? 8 : 0); 1.37 ctx->sector = ctx->sector_number; 1.38 1.39 ctx->formatting = cmd == CMD_WRITE_FORMAT;