|
|
| version 1.6, 2004/08/06 15:03:50 | version 1.8, 2005/02/07 14:46:08 |
|---|---|
| Line 33 static IDEDEV getidedev(void) { | Line 33 static IDEDEV getidedev(void) { |
| static IDEDRV getidedrv(void) { | static IDEDRV getidedrv(void) { |
| IDEDEV dev; | IDEDEV dev; |
| IDEDRV drv; | |
| dev = getidedev(); | dev = getidedev(); |
| if (dev) { | if (dev) { |
| return(dev->drv + dev->drivesel); | drv = dev->drv + dev->drivesel; |
| } | if (drv->device != IDETYPE_NONE) { |
| else { | return(drv); |
| return(NULL); | } |
| } | } |
| return(NULL); | |
| } | } |
| static const char serial[] = "824919341192 "; | static const char serial[] = "824919341192 "; |
| Line 51 static BOOL setidentify(IDEDRV drv) { | Line 53 static BOOL setidentify(IDEDRV drv) { |
| SXSIDEV sxsi; | SXSIDEV sxsi; |
| UINT16 tmp[256]; | UINT16 tmp[256]; |
| BYTE *p; | UINT8 *p; |
| UINT i; | UINT i; |
| UINT32 size; | UINT32 size; |
| Line 102 static BOOL setidentify(IDEDRV drv) { | Line 104 static BOOL setidentify(IDEDRV drv) { |
| p = drv->buf; | p = drv->buf; |
| for (i=0; i<256; i++) { | for (i=0; i<256; i++) { |
| p[0] = (BYTE)tmp[i]; | p[0] = (UINT8)tmp[i]; |
| p[1] = (BYTE)(tmp[i] >> 8); | p[1] = (UINT8)(tmp[i] >> 8); |
| p += 2; | p += 2; |
| } | } |
| drv->bufdir = IDEDIR_IN; | drv->bufdir = IDEDIR_IN; |
| Line 339 static void IOOUTCALL ideio_o64c(UINT po | Line 341 static void IOOUTCALL ideio_o64c(UINT po |
| static void IOOUTCALL ideio_o64e(UINT port, REG8 dat) { | static void IOOUTCALL ideio_o64e(UINT port, REG8 dat) { |
| IDEDRV drv, d; | IDEDRV drv; |
| IDEDEV dev; | 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(); | drv = getidedrv(); |
| if (drv == NULL) { | if (drv == NULL) { |
| Line 352 static void IOOUTCALL ideio_o64e(UINT po | Line 388 static void IOOUTCALL ideio_o64e(UINT po |
| switch(dat) { | switch(dat) { |
| case 0x08: // device reset | case 0x08: // device reset |
| TRACEOUT(("ideio: 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->hd = 0x00; |
| drv->sc = 0x01; | drv->sc = 0x01; |
| drv->sn = 0x01; | drv->sn = 0x01; |
| Line 382 static void IOOUTCALL ideio_o64e(UINT po | Line 422 static void IOOUTCALL ideio_o64e(UINT po |
| } | } |
| } | } |
| } | } |
| if (drv->device != IDETYPE_NONE) { | setintr(drv); |
| setintr(drv); | |
| } | |
| break; | break; |
| case 0x10: // calibrate | case 0x10: // calibrate |
| Line 411 static void IOOUTCALL ideio_o64e(UINT po | Line 449 static void IOOUTCALL ideio_o64e(UINT po |
| readsec(drv); | readsec(drv); |
| break; | 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 | case 0x91: // set parameters |
| TRACEOUT(("ideio: set parameters dh=%x sec=%x", | TRACEOUT(("ideio: set parameters dh=%x sec=%x", |
| drv->dr | drv->hd, drv->sc)); | drv->dr | drv->hd, drv->sc)); |
| if (drv->device) { | if (drv->device != IDETYPE_NONE) { |
| drv->surfaces = drv->hd + 1; | drv->surfaces = drv->hd + 1; |
| drv->sectors = drv->sc; | drv->sectors = drv->sc; |
| drv->status &= ~(IDESTAT_BSY | IDESTAT_DRQ | IDESTAT_ERR); | drv->status &= ~(IDESTAT_BSY | IDESTAT_DRQ | IDESTAT_ERR); |
| Line 726 static REG8 IOINPCALL ideio_i74c(UINT po | Line 721 static REG8 IOINPCALL ideio_i74c(UINT po |
| void IOOUTCALL ideio_w16(UINT port, REG16 value) { | void IOOUTCALL ideio_w16(UINT port, REG16 value) { |
| IDEDRV drv; | IDEDRV drv; |
| BYTE *p; | UINT8 *p; |
| drv = getidedrv(); | drv = getidedrv(); |
| if ((drv != NULL) && | if ((drv != NULL) && |
| (drv->status & IDESTAT_DRQ) && (drv->bufdir == IDEDIR_OUT)) { | (drv->status & IDESTAT_DRQ) && (drv->bufdir == IDEDIR_OUT)) { |
| p = drv->buf + drv->bufpos; | p = drv->buf + drv->bufpos; |
| p[0] = (BYTE)value; | p[0] = (UINT8)value; |
| p[1] = (BYTE)(value >> 8); | p[1] = (UINT8)(value >> 8); |
| TRACEOUT(("ide-data send %4x (%.4x) [%.4x:%.8x]", | TRACEOUT(("ide-data send %4x (%.4x) [%.4x:%.8x]", |
| value, drv->bufpos, CPU_CS, CPU_EIP)); | value, drv->bufpos, CPU_CS, CPU_EIP)); |
| drv->bufpos += 2; | drv->bufpos += 2; |
| Line 753 REG16 IOINPCALL ideio_r16(UINT port) { | Line 748 REG16 IOINPCALL ideio_r16(UINT port) { |
| IDEDRV drv; | IDEDRV drv; |
| REG16 ret; | REG16 ret; |
| BYTE *p; | UINT8 *p; |
| (void)port; | (void)port; |