--- np2/cbus/ideio.c 2004/03/22 05:38:47 1.2 +++ np2/cbus/ideio.c 2004/08/04 15:04:51 1.4 @@ -1,6 +1,6 @@ #include "compiler.h" -// winでidentifyまでは取得に行くんだけどな… +// winでidentifyまでは取得に行くんだけどな…ってAnex86も同じか #if defined(SUPPORT_IDEIO) @@ -62,17 +62,14 @@ static BOOL setidentify(IDEDRV drv) { ZeroMemory(tmp, sizeof(tmp)); // とりあえず使ってる部分だけ - tmp[0] = 0x045a; + tmp[0] = 0x0040; tmp[1] = sxsi->cylinders; tmp[3] = sxsi->surfaces; tmp[4] = sxsi->sectors * 512; -// tmp[5] = 0; // ??? tmp[6] = sxsi->sectors; for (i=0; i<10; i++) { tmp[10+i] = (serial[i*2] << 8) + serial[i*2+1]; } - tmp[20] = 3; - tmp[21] = 16; tmp[22] = 4; for (i=0; i<4; i++) { tmp[23+i] = (firm[i*2] << 8) + firm[i*2+1]; @@ -80,12 +77,10 @@ static BOOL setidentify(IDEDRV drv) { for (i=0; i<20; i++) { tmp[27+i] = (model[i*2] << 8) + model[i*2+1]; } -// tmp[47] = 0; // multiple - tmp[49] = 0x0f00; - tmp[50] = 0x4000; + tmp[47] = 0x00; // multiple + tmp[49] = 0x0000; // LBA(1 << 9) tmp[51] = 0x0200; - tmp[52] = 0x0200; - tmp[53] = 0x0007; + tmp[53] = 0x0001; tmp[54] = sxsi->cylinders; tmp[55] = sxsi->surfaces; tmp[56] = sxsi->sectors; @@ -95,10 +90,10 @@ static BOOL setidentify(IDEDRV drv) { // tmp[59] = 0; tmp[60] = (UINT16)size; tmp[61] = (UINT16)(size >> 16); - tmp[63] = 0x0407; + tmp[63] = 0; // multi word DMA - tmp[80] = 0x001e; - tmp[81] = 0x0011; + tmp[80] = 0x0006; // support ATA-1/2 + tmp[81] = 0; p = drv->buf; for (i=0; i<256; i++) { @@ -106,6 +101,7 @@ static BOOL setidentify(IDEDRV drv) { p[1] = (BYTE)(tmp[i] >> 8); p += 2; } + drv->bufdir = IDEDIR_IN; drv->bufpos = 0; drv->bufsize = 512; return(SUCCESS); @@ -113,16 +109,18 @@ static BOOL setidentify(IDEDRV drv) { static void setintr(IDEDRV drv) { - ideio.bank[0] = ideio.bank[1] | 0x80; // ???? - pic_setirq(IDE_IRQ); + if (!(drv->ctrl & IDECTRL_NIEN)) { + TRACEOUT(("ideio: setintr()")); + ideio.bank[0] = ideio.bank[1] | 0x80; // ???? + pic_setirq(IDE_IRQ); + } } static void cmdabort(IDEDRV drv) { drv->status = IDESTAT_DRDY | IDESTAT_ERR; drv->error = IDEERR_ABRT; - ideio.bank[0] = ideio.bank[1] | 0x80; // ???? - pic_setirq(IDE_IRQ); + setintr(drv); } static void panic(const char *str, ...) { @@ -143,36 +141,50 @@ static void panic(const char *str, ...) static void incsec(IDEDRV drv) { - if (drv->dr & IDEDEV_LBA) { - TRACEOUT(("ideio: incsec() LBA mode?")); - return; - } - drv->sn++; - if (drv->sn <= drv->sectors) { - return; + if (!(drv->dr & IDEDEV_LBA)) { + drv->sn++; + if (drv->sn <= drv->sectors) { + return; + } + drv->sn = 1; + drv->hd++; + if (drv->hd < drv->surfaces) { + return; + } + drv->hd = 0; + drv->cy++; } - drv->sn = 1; - drv->hd++; - if (drv->hd < drv->surfaces) { - return; + else { + TRACEOUT(("ideio: incsec() LBA mode?")); + drv->sn++; + if (drv->sn) { + return; + } + drv->cy++; + if (drv->cy) { + return; + } + drv->hd++; } - drv->hd = 0; - drv->cy++; } static long getcursec(const _IDEDRV *drv) { long ret; - if (drv->dr & IDEDEV_LBA) { + if (!(drv->dr & IDEDEV_LBA)) { + ret = drv->cy; + ret *= drv->surfaces; + ret += drv->hd; + ret *= drv->sectors; + ret += (drv->sn - 1); + } + else { TRACEOUT(("ideio: getcursec() LBA mode?")); - return(-1); + ret = drv->sn; + ret |= (drv->cy << 8); + ret |= (drv->hd << 24); } - ret = drv->cy; - ret *= drv->surfaces; - ret += drv->hd; - ret *= drv->sectors; - ret += (drv->sn - 1); return(ret); } @@ -186,7 +198,7 @@ static void readsec(IDEDRV drv) { sec = getcursec(drv); TRACEOUT(("readsec->drv %d sec %x", drv->sxsidrv, sec)); if (sxsi_read(drv->sxsidrv, sec, drv->buf, 512)) { - TRACEOUT(("readerror!")); + TRACEOUT(("read error!")); goto read_err; } drv->bufdir = IDEDIR_IN; @@ -379,6 +391,7 @@ static void IOOUTCALL ideio_o64e(UINT po } break; + case 0xa1: // identify case 0xec: // identify TRACEOUT(("ideio: identify")); if (setidentify(drv) == SUCCESS) { @@ -427,7 +440,8 @@ static void IOOUTCALL ideio_o74c(UINT po } } } - TRACEOUT(("ideio %.4x,%.2x [%.4x:%.8x]", port, dat, CPU_CS, CPU_EIP)); + TRACEOUT(("ideio interrupt %sable", (dat & IDECTRL_NIEN) ? "di" : "en")); + TRACEOUT(("ideio devctrl %.4x,%.2x [%.4x:%.8x]", port, dat, CPU_CS, CPU_EIP)); } static void IOOUTCALL ideio_o74e(UINT port, REG8 dat) { @@ -534,6 +548,10 @@ static REG8 IOINPCALL ideio_i64e(UINT po if (drv) { TRACEOUT(("ideio status %.2x [%.4x:%.8x]", drv->status, CPU_CS, CPU_EIP)); + if (!(drv->ctrl & IDECTRL_NIEN)) { + TRACEOUT(("ideio: resetirq")); + pic_resetirq(IDE_IRQ); + } return(drv->status); } else { @@ -543,8 +561,17 @@ static REG8 IOINPCALL ideio_i64e(UINT po static REG8 IOINPCALL ideio_i74c(UINT port) { - TRACEOUT(("ideio %.4x [%.4x:%.8x]", port, CPU_CS, CPU_EIP)); - return(0xff); + IDEDRV drv; + + drv = getidedrv(); + if (drv) { + TRACEOUT(("ideio alt status %.2x [%.4x:%.8x]", + drv->status, CPU_CS, CPU_EIP)); + return(drv->status); + } + else { + return(0xff); + } } @@ -575,7 +602,7 @@ void IOOUTCALL ideio_w16(UINT port, REG1 } } -REG16 IOOUTCALL ideio_r16(UINT port) { +REG16 IOINPCALL ideio_r16(UINT port) { IDEDRV drv; REG16 ret;