|
|
| version 1.10, 2005/03/05 06:02:28 | version 1.11, 2005/03/05 11:58:02 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #ifdef TRACEOUT | |
| #undef TRACEOUT | |
| #endif | |
| #define TRACEOUT(s) trace_fmt s | |
| // winでidentifyまでは取得に行くんだけどな…ってAnex86も同じか | // winでidentifyまでは取得に行くんだけどな…ってAnex86も同じか |
| #if defined(SUPPORT_IDEIO) | #if defined(SUPPORT_IDEIO) |
| Line 49 static const char serial[] = "8249193411 | Line 54 static const char serial[] = "8249193411 |
| static const char firm[] = "A5U.1200"; | static const char firm[] = "A5U.1200"; |
| static const char model[] = "QUANTUM FIREBALL CR "; | static const char model[] = "QUANTUM FIREBALL CR "; |
| static const char cdrom_serial[] = "1.0 "; | |
| static const char cdrom_firm[] = " "; | |
| static const char cdrom_model[] = "NP2 VIRTUAL CD-ROM DRIVE "; | |
| static BRESULT setidentify(IDEDRV drv) { | static BRESULT setidentify(IDEDRV drv) { |
| SXSIDEV sxsi; | SXSIDEV sxsi; |
| Line 64 static BRESULT setidentify(IDEDRV drv) { | Line 73 static BRESULT setidentify(IDEDRV drv) { |
| ZeroMemory(tmp, sizeof(tmp)); | ZeroMemory(tmp, sizeof(tmp)); |
| // とりあえず使ってる部分だけ | // とりあえず使ってる部分だけ |
| tmp[0] = 0x0040; | if (drv->device == IDETYPE_HDD) { |
| tmp[1] = sxsi->cylinders; | tmp[0] = 0x0040; // non removable device |
| tmp[3] = sxsi->surfaces; | tmp[1] = sxsi->cylinders; |
| tmp[4] = sxsi->sectors * 512; | tmp[3] = sxsi->surfaces; |
| tmp[6] = sxsi->sectors; | tmp[4] = sxsi->sectors * 512; |
| for (i=0; i<10; i++) { | tmp[6] = sxsi->sectors; |
| tmp[10+i] = (serial[i*2] << 8) + serial[i*2+1]; | for (i=0; i<10; i++) { |
| } | tmp[10+i] = (serial[i*2] << 8) + serial[i*2+1]; |
| tmp[22] = 4; | } |
| for (i=0; i<4; i++) { | tmp[22] = 4; |
| tmp[23+i] = (firm[i*2] << 8) + firm[i*2+1]; | for (i=0; i<4; i++) { |
| } | tmp[23+i] = (firm[i*2] << 8) + firm[i*2+1]; |
| for (i=0; i<20; i++) { | } |
| tmp[27+i] = (model[i*2] << 8) + model[i*2+1]; | for (i=0; i<20; i++) { |
| } | tmp[27+i] = (model[i*2] << 8) + model[i*2+1]; |
| } | |
| #if IDEIO_MULTIPLE_MAX > 0 | #if IDEIO_MULTIPLE_MAX > 0 |
| tmp[47] = 0x8000 | IDEIO_MULTIPLE_MAX; // multiple | tmp[47] = 0x8000 | IDEIO_MULTIPLE_MAX; // multiple |
| #endif | #endif |
| tmp[49] = 0x0000; // LBA(1 << 9) | tmp[49] = 0x0200; // support LBA |
| tmp[51] = 0x0200; | tmp[51] = 0x0200; |
| tmp[53] = 0x0001; | tmp[53] = 0x0001; |
| tmp[54] = sxsi->cylinders; | tmp[54] = sxsi->cylinders; |
| tmp[55] = sxsi->surfaces; | tmp[55] = sxsi->surfaces; |
| tmp[56] = sxsi->sectors; | tmp[56] = sxsi->sectors; |
| size = sxsi->cylinders * sxsi->surfaces * sxsi->sectors; | size = sxsi->cylinders * sxsi->surfaces * sxsi->sectors; |
| tmp[57] = (UINT16)size; | tmp[57] = (UINT16)size; |
| tmp[58] = (UINT16)(size >> 16); | tmp[58] = (UINT16)(size >> 16); |
| #if IDEIO_MULTIPLE_MAX > 0 | #if IDEIO_MULTIPLE_MAX > 0 |
| tmp[59] = 0x0100 | drv->mulmode; // current multiple mode | tmp[59] = 0x0100 | drv->mulmode; // current multiple mode |
| #endif | #endif |
| tmp[60] = (UINT16)size; | tmp[60] = (UINT16)size; |
| tmp[61] = (UINT16)(size >> 16); | tmp[61] = (UINT16)(size >> 16); |
| tmp[63] = 0x0000; // no support multiword DMA | tmp[63] = 0x0000; // no support multiword DMA |
| tmp[80] = 0x0006; // only support ATA-1/2 | tmp[80] = 0x0006; // only support ATA-1/2 |
| tmp[81] = 0; | tmp[81] = 0; |
| tmp[82] = 0x0000; // DEVICE RESET(1 << 9) | tmp[82] = 0x0200; // support DEVICE RESET |
| } | |
| else if (drv->device == IDETYPE_CDROM) { | |
| tmp[0] = 0x8580; // ATAPI,CD-ROM,removable,12bytes PACKET | |
| for (i=0; i<10; i++) { | |
| tmp[10+i] = (cdrom_serial[i*2] << 8) + cdrom_serial[i*2+1]; | |
| } | |
| for (i=0; i<4; i++) { | |
| tmp[23+i] = (cdrom_firm[i*2] << 8) + cdrom_firm[i*2+1]; | |
| } | |
| for (i=0; i<20; i++) { | |
| tmp[27+i] = (cdrom_model[i*2] << 8) + cdrom_model[i*2+1]; | |
| } | |
| tmp[49] = 0x0200; // support LBA | |
| tmp[53] = 0x0001; | |
| tmp[63] = 0x0000; // no support multiword DMA | |
| tmp[80] = 0x000e; // only support ATA-1/2 | |
| tmp[82] = 0x0210; // support PACKET/DEVICE RESET | |
| tmp[126] = 0x0000; // ATAPI byte count | |
| } | |
| p = drv->buf; | p = drv->buf; |
| for (i=0; i<256; i++) { | for (i=0; i<256; i++) { |
| Line 109 static BRESULT setidentify(IDEDRV drv) { | Line 138 static BRESULT setidentify(IDEDRV drv) { |
| p += 2; | p += 2; |
| } | } |
| drv->bufdir = IDEDIR_IN; | drv->bufdir = IDEDIR_IN; |
| drv->buftc = IDETC_TRANSFEREND; | |
| drv->bufpos = 0; | drv->bufpos = 0; |
| drv->bufsize = 512; | drv->bufsize = 512; |
| return(SUCCESS); | return(SUCCESS); |
| Line 131 static void cmdabort(IDEDRV drv) { | Line 161 static void cmdabort(IDEDRV drv) { |
| setintr(drv); | setintr(drv); |
| } | } |
| static void drvreset(IDEDRV drv) { | |
| if (drv->device == IDETYPE_CDROM) { | |
| drv->hd = 0x10; | |
| drv->sc = 0x01; | |
| drv->sn = 0x01; | |
| drv->cy = 0xeb14; | |
| drv->status = 0; | |
| } | |
| else { | |
| drv->hd = 0x00; | |
| drv->sc = 0x01; | |
| drv->sn = 0x01; | |
| drv->cy = 0x0000; | |
| drv->status = IDESTAT_DRDY; | |
| } | |
| } | |
| static void panic(const char *str, ...) { | static void panic(const char *str, ...) { |
| char buf[2048]; | char buf[2048]; |
| Line 163 static void incsec(IDEDRV drv) { | Line 211 static void incsec(IDEDRV drv) { |
| drv->cy++; | drv->cy++; |
| } | } |
| else { | else { |
| TRACEOUT(("ideio: incsec() LBA mode?")); | |
| drv->sn++; | drv->sn++; |
| if (drv->sn) { | if (drv->sn) { |
| return; | return; |
| Line 188 static long getcursec(const IDEDRV drv) | Line 235 static long getcursec(const IDEDRV drv) |
| ret += (drv->sn - 1); | ret += (drv->sn - 1); |
| } | } |
| else { | else { |
| TRACEOUT(("ideio: getcursec() LBA mode?")); | |
| ret = drv->sn; | ret = drv->sn; |
| ret |= (drv->cy << 8); | ret |= (drv->cy << 8); |
| ret |= (drv->hd << 24); | ret |= (drv->hd << 24); |
| Line 200 static void readsec(IDEDRV drv) { | Line 246 static void readsec(IDEDRV drv) { |
| long sec; | long sec; |
| if (!drv->device) { | if (drv->device != IDETYPE_HDD) { |
| goto read_err; | goto read_err; |
| } | } |
| sec = getcursec(drv); | sec = getcursec(drv); |
| Line 211 static void readsec(IDEDRV drv) { | Line 257 static void readsec(IDEDRV drv) { |
| goto read_err; | goto read_err; |
| } | } |
| drv->bufdir = IDEDIR_IN; | drv->bufdir = IDEDIR_IN; |
| drv->buftc = IDETC_TRANSFEREND; | |
| drv->bufpos = 0; | drv->bufpos = 0; |
| drv->bufsize = 512; | drv->bufsize = 512; |
| Line 226 read_err: | Line 273 read_err: |
| cmdabort(drv); | cmdabort(drv); |
| } | } |
| static void writesec(IDEDRV drv) { | |
| if (drv->device == IDETYPE_NONE) { | |
| goto write_err; | |
| } | |
| drv->bufdir = IDEDIR_OUT; | |
| drv->buftc = IDETC_TRANSFEREND; | |
| drv->bufpos = 0; | |
| drv->bufsize = 512; | |
| if ((drv->mulcnt & (drv->multhr - 1)) == 0) { | |
| drv->status = IDESTAT_DRDY | IDESTAT_DSC | IDESTAT_DRQ; | |
| drv->error = 0; | |
| setintr(drv); | |
| } | |
| return; | |
| write_err: | |
| cmdabort(drv); | |
| } | |
| // ---- | // ---- |
| Line 341 static void IOOUTCALL ideio_o64c(UINT po | Line 410 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; | IDEDRV drv, d; |
| IDEDEV dev; | IDEDEV dev; |
| int i; | |
| // execute device diagnostic | // execute device diagnostic |
| if (dat == 0x90) { | if (dat == 0x90) { |
| Line 350 static void IOOUTCALL ideio_o64e(UINT po | Line 420 static void IOOUTCALL ideio_o64e(UINT po |
| TRACEOUT(("ideio: execute device diagnostic")); | TRACEOUT(("ideio: execute device diagnostic")); |
| dev = getidedev(); | dev = getidedev(); |
| if (dev) { | if (dev) { |
| IDEDRV d; | |
| int i; | |
| for (i = 0; i < 2; i++) { | for (i = 0; i < 2; i++) { |
| d = dev->drv + i; | d = dev->drv + i; |
| d->hd = 0x00; | drvreset(d); |
| d->sc = 0x01; | |
| d->sn = 0x01; | |
| d->cy = 0x0000; | |
| d->status = IDESTAT_DRDY; | |
| d->error = 0x01; | d->error = 0x01; |
| if (dev->drv[i].device == IDETYPE_NONE) { | |
| d->error = 0x00; | |
| } | |
| if (i == 0) { | if (i == 0) { |
| if (dev->drv[0].device == IDETYPE_NONE) { | |
| d->error = 0x00; | |
| } | |
| if (dev->drv[1].device == IDETYPE_NONE) { | if (dev->drv[1].device == IDETYPE_NONE) { |
| d->error |= 0x80; | d->error |= 0x80; |
| } | } |
| } | } |
| else { | |
| if (dev->drv[1].device == IDETYPE_NONE) { | |
| d->error = 0x00; | |
| } | |
| } | |
| } | } |
| } | } |
| return; | return; |
| Line 388 static void IOOUTCALL ideio_o64e(UINT po | Line 446 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_NONE) { | drvreset(drv); |
| cmdabort(drv); | |
| break; | |
| } | |
| else if (drv->device == IDETYPE_HDD) { | |
| drv->hd = 0x00; | |
| drv->sc = 0x01; | |
| drv->sn = 0x01; | |
| drv->cy = 0x0000; | |
| } | |
| else if (drv->device == IDETYPE_CDROM) { | |
| drv->hd = 0x10; | |
| drv->sc = 0x01; | |
| drv->sn = 0x01; | |
| drv->cy = 0xeb14; | |
| } | |
| drv->status = 0x00; | |
| drv->error = 0x01; | drv->error = 0x01; |
| dev = getidedev(); | dev = getidedev(); |
| if (dev) { | if (dev) { |
| if (dev->drv[dev->drivesel].device == IDETYPE_NONE) { | |
| drv->error = 0x00; | |
| } | |
| if (dev->drivesel == 0) { | if (dev->drivesel == 0) { |
| if (dev->drv[0].device == IDETYPE_NONE) { | |
| drv->error = 0x00; | |
| } | |
| if (dev->drv[1].device == IDETYPE_NONE) { | if (dev->drv[1].device == IDETYPE_NONE) { |
| drv->error |= 0x80; | drv->error |= 0x80; |
| } | } |
| } | } |
| else { | |
| if (dev->drv[1].device == IDETYPE_NONE) { | |
| drv->error = 0x00; | |
| } | |
| } | |
| } | } |
| setintr(drv); | setintr(drv); |
| break; | break; |
| case 0x10: // calibrate | case 0x10: case 0x11: case 0x12: case 0x13: // recalibrate |
| // case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: | case 0x14: case 0x15: case 0x16: case 0x17: |
| // case 0x16: case 0x17: case 0x18: case 0x19: case 0x1a: | case 0x18: case 0x19: case 0x1a: case 0x1b: |
| // case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: | case 0x1c: case 0x1d: case 0x1e: case 0x1f: |
| TRACEOUT(("ideio: calibrate")); | TRACEOUT(("ideio: recalibrate")); |
| if (drv->device) { | if (drv->device == IDETYPE_HDD) { |
| drv->hd = 0x00; | |
| drv->sc = 0x00; | |
| drv->cy = 0x0000; | |
| if (!(drv->dr & IDEDEV_LBA)) { | |
| drv->sn = 0x01; | |
| } | |
| else { | |
| drv->sn = 0x00; | |
| } | |
| drv->status = IDESTAT_DRDY | IDESTAT_DSC; | drv->status = IDESTAT_DRDY | IDESTAT_DSC; |
| drv->error = 0; | drv->error = 0; |
| setintr(drv); | |
| } | } |
| else { | else { |
| drv->status = IDESTAT_DRDY | IDESTAT_ERR; | cmdabort(drv); |
| drv->error = IDEERR_TR0; | |
| } | } |
| setintr(drv); | |
| break; | break; |
| case 0x20: // read (with retry) | case 0x20: // read (with retry) |
| case 0x21: // read | case 0x21: // read |
| TRACEOUT(("ideio: read sector")); | TRACEOUT(("ideio: read sector")); |
| drv->mulcnt = 0; | if (drv->device == IDETYPE_HDD) { |
| drv->multhr = 1; | drv->mulcnt = 0; |
| readsec(drv); | drv->multhr = 1; |
| readsec(drv); | |
| } | |
| else { | |
| cmdabort(drv); | |
| } | |
| break; | |
| case 0x30: // write (with retry) | |
| case 0x31: // write | |
| TRACEOUT(("ideio: write sector")); | |
| if (drv->device == IDETYPE_HDD) { | |
| drv->mulcnt = 0; | |
| drv->multhr = 1; | |
| writesec(drv); | |
| } | |
| else { | |
| cmdabort(drv); | |
| } | |
| break; | 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 != IDETYPE_NONE) { | if (drv->device == IDETYPE_HDD) { |
| 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 465 static void IOOUTCALL ideio_o64e(UINT po | Line 528 static void IOOUTCALL ideio_o64e(UINT po |
| break; | break; |
| case 0xa0: // send packet | case 0xa0: // send packet |
| TRACEOUT(("ideio: packet")); | |
| if (drv->device == IDETYPE_CDROM) { | if (drv->device == IDETYPE_CDROM) { |
| drv->status &= ~(IDESTAT_BSY | IDESTAT_DWF | IDESTAT_ERR); | drv->sc &= ~(IDEINTR_REL | IDEINTR_IO); |
| drv->sc |= IDEINTR_CD; | |
| drv->status &= ~(IDESTAT_BSY | IDESTAT_DMRD | IDESTAT_SERV | IDESTAT_CHK); | |
| drv->status |= IDESTAT_DRQ; | drv->status |= IDESTAT_DRQ; |
| drv->error = 0; | drv->error = 0; |
| drv->bufpos = 0; | drv->bufpos = 0; |
| drv->bufsize = 12; | drv->bufsize = 12; |
| drv->bufdir = IDEDIR_OUT; | drv->bufdir = IDEDIR_OUT; |
| drv->buftc = IDETC_TRANSFEREND; | |
| break; | |
| } | } |
| else { | cmdabort(drv); |
| cmdabort(drv); | |
| } | |
| break; | break; |
| case 0xa1: // identify | case 0xa1: // identify packet device |
| case 0xec: // identify | TRACEOUT(("ideio: identify packet device")); |
| TRACEOUT(("ideio: identify")); | if (drv->device == IDETYPE_CDROM && setidentify(drv) == SUCCESS) { |
| if (setidentify(drv) == SUCCESS) { | |
| drv->status = IDESTAT_DRDY | IDESTAT_DSC | IDESTAT_DRQ; | drv->status = IDESTAT_DRDY | IDESTAT_DSC | IDESTAT_DRQ; |
| drv->error = 0; | drv->error = 0; |
| setintr(drv); | setintr(drv); |
| Line 490 static void IOOUTCALL ideio_o64e(UINT po | Line 555 static void IOOUTCALL ideio_o64e(UINT po |
| cmdabort(drv); | cmdabort(drv); |
| } | } |
| break; | break; |
| break; | |
| case 0xc4: // read multiple | case 0xc4: // read multiple |
| #if IDEIO_MULTIPLE_MAX > 0 | |
| TRACEOUT(("ideio: read multiple")); | TRACEOUT(("ideio: read multiple")); |
| drv->mulcnt = 0; | #if IDEIO_MULTIPLE_MAX > 0 |
| drv->multhr = drv->mulmode; | if (drv->device == IDETYPE_HDD) { |
| readsec(drv); | drv->mulcnt = 0; |
| #else | drv->multhr = drv->mulmode; |
| readsec(drv); | |
| break; | |
| } | |
| #endif | |
| cmdabort(drv); | cmdabort(drv); |
| break; | |
| case 0xc5: // write multiple | |
| TRACEOUT(("ideio: write multiple")); | |
| #if IDEIO_MULTIPLE_MAX > 0 | |
| if (drv->device == IDETYPE_HDD) { | |
| drv->mulcnt = 0; | |
| drv->multhr = drv->mulmode; | |
| writesec(drv); | |
| break; | |
| } | |
| #endif | #endif |
| cmdabort(drv); | |
| break; | break; |
| case 0xc6: // set multiple mode | case 0xc6: // set multiple mode |
| TRACEOUT(("ideio: set multiple mode")); | TRACEOUT(("ideio: set multiple mode")); |
| switch(drv->sc) { | if (drv->device == IDETYPE_HDD) { |
| switch(drv->sc) { | |
| #if IDEIO_MULTIPLE_MAX > 0 | #if IDEIO_MULTIPLE_MAX > 0 |
| case 2: case 4: case 8: case 16: case 32: case 64: case 128: | case 2: case 4: case 8: case 16: case 32: case 64: case 128: |
| if (drv->sc <= IDEIO_MULTIPLE_MAX) { | if (drv->sc <= IDEIO_MULTIPLE_MAX) { |
| Line 517 static void IOOUTCALL ideio_o64e(UINT po | Line 599 static void IOOUTCALL ideio_o64e(UINT po |
| default: | default: |
| cmdabort(drv); | cmdabort(drv); |
| break; | break; |
| } | |
| } | |
| else { | |
| cmdabort(drv); | |
| } | |
| break; | |
| case 0xe7: // flush cache | |
| TRACEOUT(("ideio: flush cache")); | |
| drv->status = IDESTAT_DRDY; | |
| drv->error = 0; | |
| setintr(drv); | |
| break; | |
| case 0xec: // identify device | |
| TRACEOUT(("ideio: identify device")); | |
| if (drv->device == IDETYPE_HDD && setidentify(drv) == SUCCESS) { | |
| drv->status = IDESTAT_DRDY | IDESTAT_DSC | IDESTAT_DRQ; | |
| drv->error = 0; | |
| setintr(drv); | |
| } | |
| else { | |
| cmdabort(drv); | |
| } | } |
| break; | break; |
| Line 552 static void IOOUTCALL ideio_o74c(UINT po | Line 657 static void IOOUTCALL ideio_o74c(UINT po |
| dev->drv[1].error = 0; | dev->drv[1].error = 0; |
| } | } |
| else { | else { |
| if (dev->drv[0].device) { | drvreset(&dev->drv[0]); |
| if (dev->drv[0].device == IDETYPE_HDD) { | |
| dev->drv[0].status = IDESTAT_DRDY | IDESTAT_DSC; | dev->drv[0].status = IDESTAT_DRDY | IDESTAT_DSC; |
| dev->drv[0].error = IDEERR_AMNF; | dev->drv[0].error = IDEERR_AMNF; |
| } | } |
| if (dev->drv[1].device) { | drvreset(&dev->drv[1]); |
| if (dev->drv[1].device == IDETYPE_HDD) { | |
| dev->drv[1].status = IDESTAT_DRDY | IDESTAT_DSC; | dev->drv[1].status = IDESTAT_DRDY | IDESTAT_DSC; |
| dev->drv[1].error = IDEERR_AMNF; | dev->drv[1].error = IDEERR_AMNF; |
| } | } |
| Line 721 static REG8 IOINPCALL ideio_i74c(UINT po | Line 828 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; |
| UINT8 *p; | BYTE *p; |
| long sec; | |
| 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] = (UINT8)value; | p[0] = (BYTE)value; |
| p[1] = (UINT8)(value >> 8); | p[1] = (BYTE)(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; |
| if (drv->bufpos >= drv->bufsize) { | if (drv->bufpos >= drv->bufsize) { |
| drv->status &= ~IDESTAT_DRQ; | drv->status &= ~IDESTAT_DRQ; |
| switch(drv->cmd) { | switch(drv->cmd) { |
| case 0x30: | |
| case 0x31: | |
| case 0xc5: | |
| sec = getcursec(drv); | |
| TRACEOUT(("writesec->drv %d sec %x cnt %d thr %d", | |
| drv->sxsidrv, sec, drv->mulcnt, drv->multhr)); | |
| if (sxsi_write(drv->sxsidrv, sec, drv->buf, drv->bufsize)) { | |
| TRACEOUT(("write error!")); | |
| cmdabort(drv); | |
| break; | |
| } | |
| drv->mulcnt++; | |
| incsec(drv); | |
| drv->sc--; | |
| if (drv->sc) { | |
| writesec(drv); | |
| } | |
| break; | |
| case 0xa0: | case 0xa0: |
| TRACEOUT(("ideio: execute atapi packet command")); | |
| atapicmd_a0(drv); | atapicmd_a0(drv); |
| break; | break; |
| } | } |
| Line 777 REG16 IOINPCALL ideio_r16(UINT port) { | Line 905 REG16 IOINPCALL ideio_r16(UINT port) { |
| break; | break; |
| case 0xa0: | case 0xa0: |
| if (drv->buftc == IDETC_ATAPIREAD) { | |
| atapi_dataread(drv); | |
| break; | |
| } | |
| drv->sc = IDEINTR_IO | IDEINTR_CD; | drv->sc = IDEINTR_IO | IDEINTR_CD; |
| drv->status &= ~(IDESTAT_BSY | IDESTAT_DRQ | IDESTAT_ERR); | drv->status &= ~(IDESTAT_BSY | IDESTAT_SERV | IDESTAT_CHK); |
| drv->status |= IDESTAT_DRDY; | drv->status |= IDESTAT_DRDY; |
| drv->error = 0; | drv->error = 0; |
| setintr(drv); | setintr(drv); |
| Line 806 static void devinit(IDEDRV drv, REG8 sxs | Line 938 static void devinit(IDEDRV drv, REG8 sxs |
| drv->device = IDETYPE_HDD; | drv->device = IDETYPE_HDD; |
| drv->surfaces = sxsi->surfaces; | drv->surfaces = sxsi->surfaces; |
| drv->sectors = sxsi->sectors; | drv->sectors = sxsi->sectors; |
| drv->mulmode = 1; | drv->mulmode = IDEIO_MULTIPLE_MAX; |
| } | |
| else if ((sxsi != NULL) && (sxsi->devtype == SXSIDEV_CDROM)) { | |
| drv->device = IDETYPE_CDROM; | |
| drvreset(drv); | |
| drv->error = 0; | |
| drv->media = IDEIO_MEDIA_EJECTABLE; | |
| if (sxsi->flag & SXSIFLAG_READY) { | |
| drv->media |= (IDEIO_MEDIA_CHANGED | IDEIO_MEDIA_LOADED); | |
| } | |
| } | } |
| else { | else { |
| drv->status = IDESTAT_ERR; | drv->status = IDESTAT_ERR; |
| Line 826 void ideio_reset(void) { | Line 967 void ideio_reset(void) { |
| devinit(drv, i); | devinit(drv, i); |
| } | } |
| #if 0 // CD-ROM test | |
| drv = ideio.dev[1].drv; | |
| drv->hd = 0; | |
| drv->sc = 1; | |
| drv->sn = 1; | |
| drv->cy = 0xeb14; | |
| drv->status = 0; | |
| drv->error = 0; | |
| drv->device = IDETYPE_CDROM; | |
| #endif | |
| CopyMemory(mem + 0xd0000, idebios, sizeof(idebios)); | CopyMemory(mem + 0xd0000, idebios, sizeof(idebios)); |
| TRACEOUT(("use simulate ide.rom")); | TRACEOUT(("use simulate ide.rom")); |
| } | } |
| Line 872 void ideio_bind(void) { | Line 1002 void ideio_bind(void) { |
| void ideio_notify(REG8 sxsidrv, UINT action) { | void ideio_notify(REG8 sxsidrv, UINT action) { |
| (void)sxsidrv; | IDEDRV drv; |
| (void)action; | |
| if ((sxsidrv >= 0) && (sxsidrv < 4)) { | |
| drv = ideio.dev[sxsidrv >> 1].drv + (sxsidrv & 1); | |
| switch(action) { | |
| case 1: | |
| drv->media |= (IDEIO_MEDIA_CHANGED | IDEIO_MEDIA_LOADED); | |
| break; | |
| case 0: | |
| drv->media &= ~IDEIO_MEDIA_LOADED; | |
| break; | |
| } | |
| } | |
| } | } |
| #endif /* SUPPORT_IDEIO */ | #endif /* SUPPORT_IDEIO */ |