--- np2/cbus/ideio.c 2004/08/06 15:03:50 1.6 +++ np2/cbus/ideio.c 2005/03/05 06:02:28 1.10 @@ -33,30 +33,32 @@ static IDEDEV getidedev(void) { static IDEDRV getidedrv(void) { IDEDEV dev; + IDEDRV drv; dev = getidedev(); if (dev) { - return(dev->drv + dev->drivesel); - } - else { - return(NULL); + drv = dev->drv + dev->drivesel; + if (drv->device != IDETYPE_NONE) { + return(drv); + } } + return(NULL); } static const char serial[] = "824919341192 "; static const char firm[] = "A5U.1200"; static const char model[] = "QUANTUM FIREBALL CR "; -static BOOL setidentify(IDEDRV drv) { +static BRESULT setidentify(IDEDRV drv) { SXSIDEV sxsi; UINT16 tmp[256]; - BYTE *p; + UINT8 *p; UINT i; UINT32 size; sxsi = sxsi_getptr(drv->sxsidrv); - if ((sxsi == NULL) || (sxsi->fname[0] == '\0')) { + if ((sxsi == NULL) || (!(sxsi->flag & SXSIFLAG_READY))) { return(FAILURE); } @@ -102,8 +104,8 @@ static BOOL setidentify(IDEDRV drv) { p = drv->buf; for (i=0; i<256; i++) { - p[0] = (BYTE)tmp[i]; - p[1] = (BYTE)(tmp[i] >> 8); + p[0] = (UINT8)tmp[i]; + p[1] = (UINT8)(tmp[i] >> 8); p += 2; } drv->bufdir = IDEDIR_IN; @@ -339,9 +341,43 @@ static void IOOUTCALL ideio_o64c(UINT po static void IOOUTCALL ideio_o64e(UINT port, REG8 dat) { - IDEDRV drv, d; + IDEDRV drv; IDEDEV dev; - int i; + + // execute device diagnostic + if (dat == 0x90) { + TRACEOUT(("ideio set cmd %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP)); + TRACEOUT(("ideio: execute device diagnostic")); + dev = getidedev(); + if (dev) { + IDEDRV d; + int i; + + for (i = 0; i < 2; i++) { + d = dev->drv + i; + d->hd = 0x00; + d->sc = 0x01; + d->sn = 0x01; + d->cy = 0x0000; + d->status = IDESTAT_DRDY; + d->error = 0x01; + if (i == 0) { + if (dev->drv[0].device == IDETYPE_NONE) { + d->error = 0x00; + } + if (dev->drv[1].device == IDETYPE_NONE) { + d->error |= 0x80; + } + } + else { + if (dev->drv[1].device == IDETYPE_NONE) { + d->error = 0x00; + } + } + } + } + return; + } drv = getidedrv(); if (drv == NULL) { @@ -352,7 +388,11 @@ static void IOOUTCALL ideio_o64e(UINT po switch(dat) { case 0x08: // device reset TRACEOUT(("ideio: device reset")); - if (drv->device == IDETYPE_HDD) { + if (drv->device == IDETYPE_NONE) { + cmdabort(drv); + break; + } + else if (drv->device == IDETYPE_HDD) { drv->hd = 0x00; drv->sc = 0x01; drv->sn = 0x01; @@ -382,9 +422,7 @@ static void IOOUTCALL ideio_o64e(UINT po } } } - if (drv->device != IDETYPE_NONE) { - setintr(drv); - } + setintr(drv); break; case 0x10: // calibrate @@ -411,53 +449,10 @@ static void IOOUTCALL ideio_o64e(UINT po readsec(drv); break; - case 0x90: // execute device diagnostic - TRACEOUT(("ideio: execute device diagnostic")); - dev = getidedev(); - if (dev) { - for (i = 0; i < 2; i++) { - d = dev->drv + i; - if (d->device == IDETYPE_HDD) { - d->hd = 0x00; - d->sc = 0x01; - d->sn = 0x01; - d->cy = 0x0000; - } - else if (d->device == IDETYPE_CDROM) { - d->hd = 0x10; - d->sc = 0x01; - d->sn = 0x01; - d->cy = 0xeb14; - } - d->status = IDESTAT_DRDY; - d->error = 0x01; - if (i == 0) { - if (dev->drv[0].device == IDETYPE_NONE) { - d->error = 0x00; - } - if (dev->drv[1].device == IDETYPE_NONE) { - d->error |= 0x80; - } - } - else { - if (dev->drv[1].device == IDETYPE_NONE) { - d->error = 0x00; - } - } - } - if (drv->device != IDETYPE_NONE) { - setintr(drv); - } - } - else { - cmdabort(drv); - } - break; - case 0x91: // set parameters TRACEOUT(("ideio: set parameters dh=%x sec=%x", drv->dr | drv->hd, drv->sc)); - if (drv->device) { + if (drv->device != IDETYPE_NONE) { drv->surfaces = drv->hd + 1; drv->sectors = drv->sc; drv->status &= ~(IDESTAT_BSY | IDESTAT_DRQ | IDESTAT_ERR); @@ -726,14 +721,14 @@ static REG8 IOINPCALL ideio_i74c(UINT po void IOOUTCALL ideio_w16(UINT port, REG16 value) { IDEDRV drv; - BYTE *p; + UINT8 *p; drv = getidedrv(); if ((drv != NULL) && (drv->status & IDESTAT_DRQ) && (drv->bufdir == IDEDIR_OUT)) { p = drv->buf + drv->bufpos; - p[0] = (BYTE)value; - p[1] = (BYTE)(value >> 8); + p[0] = (UINT8)value; + p[1] = (UINT8)(value >> 8); TRACEOUT(("ide-data send %4x (%.4x) [%.4x:%.8x]", value, drv->bufpos, CPU_CS, CPU_EIP)); drv->bufpos += 2; @@ -753,7 +748,7 @@ REG16 IOINPCALL ideio_r16(UINT port) { IDEDRV drv; REG16 ret; - BYTE *p; + UINT8 *p; (void)port; @@ -802,9 +797,10 @@ static void devinit(IDEDRV drv, REG8 sxs SXSIDEV sxsi; ZeroMemory(drv, sizeof(_IDEDRV)); + drv->sxsidrv = sxsidrv; sxsi = sxsi_getptr(sxsidrv); - if ((sxsi != NULL) && (sxsi->fname[0] != '\0')) { - drv->sxsidrv = sxsidrv; + if ((sxsi != NULL) && + (sxsi->devtype == SXSIDEV_HDD) && (sxsi->flag & SXSIFLAG_READY)) { drv->status = IDESTAT_DRDY | IDESTAT_DSC; drv->error = IDEERR_AMNF; drv->device = IDETYPE_HDD; @@ -841,18 +837,6 @@ void ideio_reset(void) { drv->device = IDETYPE_CDROM; #endif -#if 0 - ideio.dev[0].drv[0].status = IDE_READY | IDE_SEEKCOMPLETE; - ideio.dev[0].drv[0].error = 1; - ideio.dev[1].drv[0].status = IDE_READY | IDE_SEEKCOMPLETE; - ideio.dev[1].drv[0].error = 1; - - ideio.dev[0].drv[0].sxsidrv = 0x00; - ideio.dev[0].drv[1].sxsidrv = 0x01; - ideio.dev[1].drv[0].sxsidrv = 0x02; - ideio.dev[1].drv[1].sxsidrv = 0x03; -#endif - CopyMemory(mem + 0xd0000, idebios, sizeof(idebios)); TRACEOUT(("use simulate ide.rom")); } @@ -886,4 +870,10 @@ void ideio_bind(void) { } } +void ideio_notify(REG8 sxsidrv, UINT action) { + + (void)sxsidrv; + (void)action; +} + #endif /* SUPPORT_IDEIO */