Diff for /np2/cbus/ideio.c between versions 1.4 and 1.6

version 1.4, 2004/08/04 15:04:51 version 1.6, 2004/08/06 15:03:50
Line 77  static BOOL setidentify(IDEDRV drv) { Line 77  static BOOL setidentify(IDEDRV drv) {
         for (i=0; i<20; i++) {          for (i=0; i<20; i++) {
                 tmp[27+i] = (model[i*2] << 8) + model[i*2+1];                  tmp[27+i] = (model[i*2] << 8) + model[i*2+1];
         }          }
         tmp[47] = 0x00;                         // multiple  #if IDEIO_MULTIPLE_MAX > 0
           tmp[47] = 0x8000 | IDEIO_MULTIPLE_MAX;  // multiple
   #endif
         tmp[49] = 0x0000;                       // LBA(1 << 9)          tmp[49] = 0x0000;                       // LBA(1 << 9)
         tmp[51] = 0x0200;          tmp[51] = 0x0200;
         tmp[53] = 0x0001;          tmp[53] = 0x0001;
Line 87  static BOOL setidentify(IDEDRV drv) { Line 89  static BOOL setidentify(IDEDRV drv) {
         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);
 //      tmp[59] = 0;  #if IDEIO_MULTIPLE_MAX > 0
           tmp[59] = 0x0100 | drv->mulmode;        // current multiple mode
   #endif
         tmp[60] = (UINT16)size;          tmp[60] = (UINT16)size;
         tmp[61] = (UINT16)(size >> 16);          tmp[61] = (UINT16)(size >> 16);
         tmp[63] = 0;                            // multi word DMA          tmp[63] = 0x0000;                       // no support multiword DMA
   
         tmp[80] = 0x0006;                       // 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)
   
         p = drv->buf;          p = drv->buf;
         for (i=0; i<256; i++) {          for (i=0; i<256; i++) {
Line 118  static void setintr(IDEDRV drv) { Line 123  static void setintr(IDEDRV drv) {
   
 static void cmdabort(IDEDRV drv) {  static void cmdabort(IDEDRV drv) {
   
           TRACEOUT(("ideio: cmdabort()"));
         drv->status = IDESTAT_DRDY | IDESTAT_ERR;          drv->status = IDESTAT_DRDY | IDESTAT_ERR;
         drv->error = IDEERR_ABRT;          drv->error = IDEERR_ABRT;
         setintr(drv);          setintr(drv);
Line 168  static void incsec(IDEDRV drv) { Line 174  static void incsec(IDEDRV drv) {
         }          }
 }  }
   
 static long getcursec(const _IDEDRV *drv) {  static long getcursec(const IDEDRV drv) {
   
         long    ret;          long    ret;
   
Line 196  static void readsec(IDEDRV drv) { Line 202  static void readsec(IDEDRV drv) {
                 goto read_err;                  goto read_err;
         }          }
         sec = getcursec(drv);          sec = getcursec(drv);
         TRACEOUT(("readsec->drv %d sec %x", drv->sxsidrv, sec));          TRACEOUT(("readsec->drv %d sec %x cnt %d thr %d",
                                                                   drv->sxsidrv, sec, drv->mulcnt, drv->multhr));
         if (sxsi_read(drv->sxsidrv, sec, drv->buf, 512)) {          if (sxsi_read(drv->sxsidrv, sec, drv->buf, 512)) {
                 TRACEOUT(("read error!"));                  TRACEOUT(("read error!"));
                 goto read_err;                  goto read_err;
Line 205  static void readsec(IDEDRV drv) { Line 212  static void readsec(IDEDRV drv) {
         drv->bufpos = 0;          drv->bufpos = 0;
         drv->bufsize = 512;          drv->bufsize = 512;
   
         drv->status = IDESTAT_DRDY | IDESTAT_DSC | IDESTAT_DRQ;          if ((drv->mulcnt & (drv->multhr - 1)) == 0) {
         drv->error = 0;                  drv->status = IDESTAT_DRDY | IDESTAT_DSC | IDESTAT_DRQ;
         setintr(drv);                  drv->error = 0;
                   setintr(drv);
           }
           drv->mulcnt++;
         return;          return;
   
 read_err:  read_err:
Line 251  static void IOOUTCALL ideio_o642(UINT po Line 261  static void IOOUTCALL ideio_o642(UINT po
                 drv->wp = dat;                  drv->wp = dat;
                 TRACEOUT(("ideio set WP %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));                  TRACEOUT(("ideio set WP %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));
         }          }
           (void)port;
 }  }
   
 static void IOOUTCALL ideio_o644(UINT port, REG8 dat) {  static void IOOUTCALL ideio_o644(UINT port, REG8 dat) {
   
         IDEDRV  drv;          IDEDRV  drv;
   
           (void)port;
         drv = getidedrv();          drv = getidedrv();
         if (drv) {          if (drv) {
                 drv->sc = dat;                  drv->sc = dat;
                 TRACEOUT(("ideio set SC %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));                  TRACEOUT(("ideio set SC %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));
         }          }
           (void)port;
 }  }
   
 static void IOOUTCALL ideio_o646(UINT port, REG8 dat) {  static void IOOUTCALL ideio_o646(UINT port, REG8 dat) {
Line 273  static void IOOUTCALL ideio_o646(UINT po Line 286  static void IOOUTCALL ideio_o646(UINT po
                 drv->sn = dat;                  drv->sn = dat;
                 TRACEOUT(("ideio set SN %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));                  TRACEOUT(("ideio set SN %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));
         }          }
           (void)port;
 }  }
   
 static void IOOUTCALL ideio_o648(UINT port, REG8 dat) {  static void IOOUTCALL ideio_o648(UINT port, REG8 dat) {
Line 285  static void IOOUTCALL ideio_o648(UINT po Line 299  static void IOOUTCALL ideio_o648(UINT po
                 drv->cy |= dat;                  drv->cy |= dat;
                 TRACEOUT(("ideio set CYL %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));                  TRACEOUT(("ideio set CYL %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));
         }          }
           (void)port;
 }  }
   
 static void IOOUTCALL ideio_o64a(UINT port, REG8 dat) {  static void IOOUTCALL ideio_o64a(UINT port, REG8 dat) {
Line 297  static void IOOUTCALL ideio_o64a(UINT po Line 312  static void IOOUTCALL ideio_o64a(UINT po
                 drv->cy |= dat << 8;                  drv->cy |= dat << 8;
                 TRACEOUT(("ideio set CYH %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));                  TRACEOUT(("ideio set CYH %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));
         }          }
           (void)port;
 }  }
   
 static void IOOUTCALL ideio_o64c(UINT port, REG8 dat) {  static void IOOUTCALL ideio_o64c(UINT port, REG8 dat) {
Line 318  static void IOOUTCALL ideio_o64c(UINT po Line 334  static void IOOUTCALL ideio_o64c(UINT po
         dev->drv[drvnum].dr = dat & 0xf0;          dev->drv[drvnum].dr = dat & 0xf0;
         dev->drv[drvnum].hd = dat & 0x0f;          dev->drv[drvnum].hd = dat & 0x0f;
         TRACEOUT(("ideio set DRHD %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));          TRACEOUT(("ideio set DRHD %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));
           (void)port;
 }  }
   
 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;
           int             i;
   
         drv = getidedrv();          drv = getidedrv();
         if (drv == NULL) {          if (drv == NULL) {
Line 331  static void IOOUTCALL ideio_o64e(UINT po Line 350  static void IOOUTCALL ideio_o64e(UINT po
         drv->cmd = dat;          drv->cmd = dat;
         TRACEOUT(("ideio set cmd %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));          TRACEOUT(("ideio set cmd %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));
         switch(dat) {          switch(dat) {
                 case 0x08:              // atapi reset                  case 0x08:              // device reset
                         if (drv->device == IDETYPE_CDROM) {                          TRACEOUT(("ideio: device reset"));
                                 drv->hd = 0;                          if (drv->device == IDETYPE_HDD) {
                                 drv->sc = 1;                                  drv->hd = 0x00;
                                 drv->sn = 1;                                  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->cy = 0xeb14;
                                 drv->status = 0;                          }
                                 drv->error = 0;                          drv->status = 0x00;
                           drv->error = 0x01;
                           dev = getidedev();
                           if (dev) {
                                   if (dev->drivesel == 0) {
                                           if (dev->drv[0].device == IDETYPE_NONE) {
                                                   drv->error = 0x00;
                                           }
                                           if (dev->drv[1].device == IDETYPE_NONE) {
                                                   drv->error |= 0x80;
                                           }
                                   }
                                   else {
                                           if (dev->drv[1].device == IDETYPE_NONE) {
                                                   drv->error = 0x00;
                                           }
                                   }
                           }
                           if (drv->device != IDETYPE_NONE) {
                                   setintr(drv);
                         }                          }
                         break;                          break;
   
Line 346  static void IOOUTCALL ideio_o64e(UINT po Line 391  static void IOOUTCALL ideio_o64e(UINT po
 //              case 0x11: case 0x12: case 0x13: case 0x14: case 0x15:  //              case 0x11: case 0x12: case 0x13: case 0x14: case 0x15:
 //              case 0x16: case 0x17: case 0x18: case 0x19: case 0x1a:  //              case 0x16: case 0x17: case 0x18: case 0x19: case 0x1a:
 //              case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:  //              case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:
                           TRACEOUT(("ideio: calibrate"));
                         if (drv->device) {                          if (drv->device) {
                                 drv->status = IDESTAT_DRDY | IDESTAT_DSC;                                  drv->status = IDESTAT_DRDY | IDESTAT_DSC;
                                 drv->error = 0;                                  drv->error = 0;
Line 359  static void IOOUTCALL ideio_o64e(UINT po Line 405  static void IOOUTCALL ideio_o64e(UINT po
   
                 case 0x20:              // read (with retry)                  case 0x20:              // read (with retry)
                 case 0x21:              // read                  case 0x21:              // read
                           TRACEOUT(("ideio: read sector"));
                           drv->mulcnt = 0;
                           drv->multhr = 1;
                         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));
Line 404  static void IOOUTCALL ideio_o64e(UINT po Line 496  static void IOOUTCALL ideio_o64e(UINT po
                         }                          }
                         break;                          break;
   
                   case 0xc4:              // read multiple
   #if IDEIO_MULTIPLE_MAX > 0
                           TRACEOUT(("ideio: read multiple"));
                           drv->mulcnt = 0;
                           drv->multhr = drv->mulmode;
                           readsec(drv);
   #else
                           cmdabort(drv);
   #endif
                           break;
   
                   case 0xc6:              // set multiple mode
                           TRACEOUT(("ideio: set multiple mode"));
                           switch(drv->sc) {
   #if IDEIO_MULTIPLE_MAX > 0
                                   case 2: case 4: case 8: case 16: case 32: case 64: case 128:
                                           if (drv->sc <= IDEIO_MULTIPLE_MAX) {
                                                   drv->mulmode = drv->sc;
                                                   setintr(drv);
                                                   break;
                                           }
                                           /*FALLTHROUGH*/
   #endif
                                   default:
                                           cmdabort(drv);
                                           break;
                           }
                           break;
   
                   case 0xef:              // set features
                           TRACEOUT(("ideio: set features reg = %.2x", drv->wp));
                           cmdabort(drv);
                           break;
   
                 default:                  default:
                         panic("command:%.2x", dat);                          panic("ideio: unknown command %.2x", dat);
                         break;                          break;
         }          }
           (void)port;
 }  }
   
 static void IOOUTCALL ideio_o74c(UINT port, REG8 dat) {  static void IOOUTCALL ideio_o74c(UINT port, REG8 dat) {
Line 440  static void IOOUTCALL ideio_o74c(UINT po Line 567  static void IOOUTCALL ideio_o74c(UINT po
                         }                          }
                 }                  }
         }          }
         TRACEOUT(("ideio interrupt %sable", (dat & IDECTRL_NIEN) ? "di" : "en"));          TRACEOUT(("ideio interrupt %sable", (dat & IDECTRL_NIEN) ? "dis" : "en"));
         TRACEOUT(("ideio devctrl %.4x,%.2x [%.4x:%.8x]", port, dat, CPU_CS, CPU_EIP));          TRACEOUT(("ideio devctrl %.2x [%.4x:%.8x]", dat, CPU_CS, CPU_EIP));
           (void)port;
 }  }
   
 static void IOOUTCALL ideio_o74e(UINT port, REG8 dat) {  static void IOOUTCALL ideio_o74e(UINT port, REG8 dat) {
   
         TRACEOUT(("ideio %.4x,%.2x [%.4x:%.8x]", port, dat, CPU_CS, CPU_EIP));          TRACEOUT(("ideio %.4x,%.2x [%.4x:%.8x]", port, dat, CPU_CS, CPU_EIP));
           (void)port;
           (void)dat;
 }  }
   
   
Line 456  static REG8 IOINPCALL ideio_i642(UINT po Line 586  static REG8 IOINPCALL ideio_i642(UINT po
   
         IDEDRV  drv;          IDEDRV  drv;
   
           (void)port;
   
         drv = getidedrv();          drv = getidedrv();
         if (drv) {          if (drv) {
                 drv->status &= ~IDESTAT_ERR;                  drv->status &= ~IDESTAT_ERR;
Line 472  static REG8 IOINPCALL ideio_i644(UINT po Line 604  static REG8 IOINPCALL ideio_i644(UINT po
   
         IDEDRV  drv;          IDEDRV  drv;
   
           (void)port;
   
         drv = getidedrv();          drv = getidedrv();
         if (drv) {          if (drv) {
                 TRACEOUT(("ideio get SC %.2x [%.4x:%.8x]", drv->sc, CPU_CS, CPU_EIP));                  TRACEOUT(("ideio get SC %.2x [%.4x:%.8x]", drv->sc, CPU_CS, CPU_EIP));
Line 486  static REG8 IOINPCALL ideio_i646(UINT po Line 620  static REG8 IOINPCALL ideio_i646(UINT po
   
         IDEDRV  drv;          IDEDRV  drv;
   
           (void)port;
   
         drv = getidedrv();          drv = getidedrv();
         if (drv) {          if (drv) {
                 TRACEOUT(("ideio get SN %.2x [%.4x:%.8x]", drv->sn, CPU_CS, CPU_EIP));                  TRACEOUT(("ideio get SN %.2x [%.4x:%.8x]", drv->sn, CPU_CS, CPU_EIP));
Line 500  static REG8 IOINPCALL ideio_i648(UINT po Line 636  static REG8 IOINPCALL ideio_i648(UINT po
   
         IDEDRV  drv;          IDEDRV  drv;
   
           (void)port;
   
         drv = getidedrv();          drv = getidedrv();
         if (drv) {          if (drv) {
                 TRACEOUT(("ideio get CYL %.4x [%.4x:%.8x]", drv->cy, CPU_CS, CPU_EIP));                  TRACEOUT(("ideio get CYL %.4x [%.4x:%.8x]", drv->cy, CPU_CS, CPU_EIP));
Line 514  static REG8 IOINPCALL ideio_i64a(UINT po Line 652  static REG8 IOINPCALL ideio_i64a(UINT po
   
         IDEDRV  drv;          IDEDRV  drv;
   
           (void)port;
   
         drv = getidedrv();          drv = getidedrv();
         if (drv) {          if (drv) {
                 TRACEOUT(("ideio get CYH %.4x [%.4x:%.8x]", drv->cy, CPU_CS, CPU_EIP));                  TRACEOUT(("ideio get CYH %.4x [%.4x:%.8x]", drv->cy, CPU_CS, CPU_EIP));
Line 529  static REG8 IOINPCALL ideio_i64c(UINT po Line 669  static REG8 IOINPCALL ideio_i64c(UINT po
         IDEDRV  drv;          IDEDRV  drv;
         REG8    ret;          REG8    ret;
   
           (void)port;
   
         drv = getidedrv();          drv = getidedrv();
         if (drv) {          if (drv) {
                 ret = drv->dr | drv->hd;                  ret = drv->dr | drv->hd;
Line 544  static REG8 IOINPCALL ideio_i64e(UINT po Line 686  static REG8 IOINPCALL ideio_i64e(UINT po
   
         IDEDRV  drv;          IDEDRV  drv;
   
           (void)port;
   
         drv = getidedrv();          drv = getidedrv();
         if (drv) {          if (drv) {
                 TRACEOUT(("ideio status %.2x [%.4x:%.8x]",                  TRACEOUT(("ideio status %.2x [%.4x:%.8x]",
Line 563  static REG8 IOINPCALL ideio_i74c(UINT po Line 707  static REG8 IOINPCALL ideio_i74c(UINT po
   
         IDEDRV  drv;          IDEDRV  drv;
   
           (void)port;
   
         drv = getidedrv();          drv = getidedrv();
         if (drv) {          if (drv) {
                 TRACEOUT(("ideio alt status %.2x [%.4x:%.8x]",                  TRACEOUT(("ideio alt status %.2x [%.4x:%.8x]",
Line 600  void IOOUTCALL ideio_w16(UINT port, REG1 Line 746  void IOOUTCALL ideio_w16(UINT port, REG1
                         }                          }
                 }                  }
         }          }
           (void)port;
 }  }
   
 REG16 IOINPCALL ideio_r16(UINT port) {  REG16 IOINPCALL ideio_r16(UINT port) {
Line 608  REG16 IOINPCALL ideio_r16(UINT port) { Line 755  REG16 IOINPCALL ideio_r16(UINT port) {
         REG16   ret;          REG16   ret;
         BYTE    *p;          BYTE    *p;
   
           (void)port;
   
         drv = getidedrv();          drv = getidedrv();
         if (drv == NULL) {          if (drv == NULL) {
                 return(0xff);                  return(0xff);
Line 616  REG16 IOINPCALL ideio_r16(UINT port) { Line 765  REG16 IOINPCALL ideio_r16(UINT port) {
         if ((drv->status & IDESTAT_DRQ) && (drv->bufdir == IDEDIR_IN)) {          if ((drv->status & IDESTAT_DRQ) && (drv->bufdir == IDEDIR_IN)) {
                 p = drv->buf + drv->bufpos;                  p = drv->buf + drv->bufpos;
                 ret = p[0] + (p[1] << 8);                  ret = p[0] + (p[1] << 8);
                 TRACEOUT(("ide-data recv %4x (%.4x) [%.4x:%.8x]",                  TRACEOUT(("ide-data recv %.4x (%.4x) [%.4x:%.8x]",
                                                                                 ret, drv->bufpos, CPU_CS, CPU_EIP));                                                                                  ret, drv->bufpos, CPU_CS, CPU_EIP));
                 drv->bufpos += 2;                  drv->bufpos += 2;
                 if (drv->bufpos >= drv->bufsize) {                  if (drv->bufpos >= drv->bufsize) {
Line 624  REG16 IOINPCALL ideio_r16(UINT port) { Line 773  REG16 IOINPCALL ideio_r16(UINT port) {
                         switch(drv->cmd) {                          switch(drv->cmd) {
                                 case 0x20:                                  case 0x20:
                                 case 0x21:                                  case 0x21:
                                   case 0xc4:
                                         incsec(drv);                                          incsec(drv);
                                         drv->sc--;                                          drv->sc--;
                                         if (drv->sc) {                                          if (drv->sc) {
Line 660  static void devinit(IDEDRV drv, REG8 sxs Line 810  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;
         }          }
         else {          else {
                 drv->status = IDESTAT_ERR;                  drv->status = IDESTAT_ERR;
                 drv->error = IDEERR_TR0;                  drv->error = IDEERR_TR0;
                   drv->device = IDETYPE_NONE;
         }          }
 }  }
   
Line 733  void ideio_bind(void) { Line 885  void ideio_bind(void) {
                 iocore_attachinp(0x074c, ideio_i74c);                  iocore_attachinp(0x074c, ideio_i74c);
         }          }
 }  }
 #endif  
   
   #endif  /* SUPPORT_IDEIO */

Removed from v.1.4  
changed lines
  Added in v.1.6


RetroPC.NET-CVS <cvs@retropc.net>