Diff for /np2/cbus/ideio.c between versions 1.3 and 1.5

version 1.3, 2004/03/23 13:32:50 version 1.5, 2004/08/04 16:28:46
Line 62  static BOOL setidentify(IDEDRV drv) { Line 62  static BOOL setidentify(IDEDRV drv) {
   
         ZeroMemory(tmp, sizeof(tmp));          ZeroMemory(tmp, sizeof(tmp));
         // とりあえず使ってる部分だけ          // とりあえず使ってる部分だけ
         tmp[0] = 0x045a;          tmp[0] = 0x0040;
         tmp[1] = sxsi->cylinders;          tmp[1] = sxsi->cylinders;
         tmp[3] = sxsi->surfaces;          tmp[3] = sxsi->surfaces;
         tmp[4] = sxsi->sectors * 512;          tmp[4] = sxsi->sectors * 512;
 //      tmp[5] = 0;                                     // ???  
         tmp[6] = sxsi->sectors;          tmp[6] = sxsi->sectors;
         for (i=0; i<10; i++) {          for (i=0; i<10; i++) {
                 tmp[10+i] = (serial[i*2] << 8) + serial[i*2+1];                  tmp[10+i] = (serial[i*2] << 8) + serial[i*2+1];
         }          }
         tmp[20] = 3;  
         tmp[21] = 16;  
         tmp[22] = 4;          tmp[22] = 4;
         for (i=0; i<4; i++) {          for (i=0; i<4; i++) {
                 tmp[23+i] = (firm[i*2] << 8) + firm[i*2+1];                  tmp[23+i] = (firm[i*2] << 8) + firm[i*2+1];
Line 80  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] = 0;                            // multiple          tmp[47] = 0x00;                         // multiple
         tmp[49] = 0x0f00;          tmp[49] = 0x0000;                       // LBA(1 << 9)
         tmp[50] = 0x4000;  
         tmp[51] = 0x0200;          tmp[51] = 0x0200;
         tmp[52] = 0x0200;          tmp[53] = 0x0001;
         tmp[53] = 0x0007;  
         tmp[54] = sxsi->cylinders;          tmp[54] = sxsi->cylinders;
         tmp[55] = sxsi->surfaces;          tmp[55] = sxsi->surfaces;
         tmp[56] = sxsi->sectors;          tmp[56] = sxsi->sectors;
Line 95  static BOOL setidentify(IDEDRV drv) { Line 90  static BOOL setidentify(IDEDRV drv) {
 //      tmp[59] = 0;  //      tmp[59] = 0;
         tmp[60] = (UINT16)size;          tmp[60] = (UINT16)size;
         tmp[61] = (UINT16)(size >> 16);          tmp[61] = (UINT16)(size >> 16);
         tmp[63] = 0x0407;          tmp[63] = 0;                            // multi word DMA
   
         tmp[80] = 0x001e;          tmp[80] = 0x0006;                       // support ATA-1/2
         tmp[81] = 0x0011;          tmp[81] = 0;
   
         p = drv->buf;          p = drv->buf;
         for (i=0; i<256; i++) {          for (i=0; i<256; i++) {
Line 114  static BOOL setidentify(IDEDRV drv) { Line 109  static BOOL setidentify(IDEDRV drv) {
   
 static void setintr(IDEDRV drv) {  static void setintr(IDEDRV drv) {
   
         ideio.bank[0] = ideio.bank[1] | 0x80;                   // ????          if (!(drv->ctrl & IDECTRL_NIEN)) {
         pic_setirq(IDE_IRQ);                  TRACEOUT(("ideio: setintr()"));
                   ideio.bank[0] = ideio.bank[1] | 0x80;                   // ????
                   pic_setirq(IDE_IRQ);
           }
 }  }
   
 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;
         ideio.bank[0] = ideio.bank[1] | 0x80;                   // ????          setintr(drv);
         pic_setirq(IDE_IRQ);  
 }  }
   
 static void panic(const char *str, ...) {  static void panic(const char *str, ...) {
Line 254  static void IOOUTCALL ideio_o642(UINT po Line 252  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 276  static void IOOUTCALL ideio_o646(UINT po Line 277  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 288  static void IOOUTCALL ideio_o648(UINT po Line 290  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 300  static void IOOUTCALL ideio_o64a(UINT po Line 303  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 321  static void IOOUTCALL ideio_o64c(UINT po Line 325  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;
           IDEDEV  dev;
   
         drv = getidedrv();          drv = getidedrv();
         if (drv == NULL) {          if (drv == NULL) {
Line 334  static void IOOUTCALL ideio_o64e(UINT po Line 340  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) {                          if (drv->device == IDETYPE_CDROM) {
                                 drv->hd = 0;                                  drv->hd = 0x10;
                                 drv->sc = 1;                                  drv->sc = 0x01;
                                 drv->sn = 1;                                  drv->sn = 0x01;
                                 drv->cy = 0xeb14;                                  drv->cy = 0xeb14;
                                 drv->status = 0;                                  drv->status = 0x00;
                                 drv->error = 0;                                  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;
                                                   }
                                           }
                                   }
                         }                          }
                         break;                          break;
   
Line 365  static void IOOUTCALL ideio_o64e(UINT po Line 387  static void IOOUTCALL ideio_o64e(UINT po
                         readsec(drv);                          readsec(drv);
                         break;                          break;
   
                   case 0x90:              // execute device diagnostic
                           TRACEOUT(("ideio execute device diagnostic [%.4x:%.8x]",
                                                                                           CPU_CS, CPU_EIP));
                           dev = getidedev();
                           if (dev) {
                                   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 = IDESTAT_DRDY;
                                   drv->error = 0x01;
                                   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;
                                           }
                                   }
                           }
                           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 411  static void IOOUTCALL ideio_o64e(UINT po Line 468  static void IOOUTCALL ideio_o64e(UINT po
                         panic("command:%.2x", dat);                          panic("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 443  static void IOOUTCALL ideio_o74c(UINT po Line 501  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) ? "dis" : "en"));
           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 458  static REG8 IOINPCALL ideio_i642(UINT po Line 520  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 474  static REG8 IOINPCALL ideio_i644(UINT po Line 538  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 488  static REG8 IOINPCALL ideio_i646(UINT po Line 554  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 502  static REG8 IOINPCALL ideio_i648(UINT po Line 570  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 516  static REG8 IOINPCALL ideio_i64a(UINT po Line 586  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 531  static REG8 IOINPCALL ideio_i64c(UINT po Line 603  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 546  static REG8 IOINPCALL ideio_i64e(UINT po Line 620  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]",
                                                                                         drv->status, CPU_CS, CPU_EIP));                                                                                          drv->status, CPU_CS, CPU_EIP));
                   if (!(drv->ctrl & IDECTRL_NIEN)) {
                           TRACEOUT(("ideio: resetirq"));
                           pic_resetirq(IDE_IRQ);
                   }
                 return(drv->status);                  return(drv->status);
         }          }
         else {          else {
Line 559  static REG8 IOINPCALL ideio_i64e(UINT po Line 639  static REG8 IOINPCALL ideio_i64e(UINT po
   
 static REG8 IOINPCALL ideio_i74c(UINT port) {  static REG8 IOINPCALL ideio_i74c(UINT port) {
   
         TRACEOUT(("ideio %.4x [%.4x:%.8x]", port, CPU_CS, CPU_EIP));          IDEDRV  drv;
         return(0xff);  
           (void)port;
   
           drv = getidedrv();
           if (drv) {
                   TRACEOUT(("ideio alt status %.2x [%.4x:%.8x]",
                                                                                           drv->status, CPU_CS, CPU_EIP));
                   return(drv->status);
           }
           else {
                   return(0xff);
           }
 }  }
   
   
Line 589  void IOOUTCALL ideio_w16(UINT port, REG1 Line 680  void IOOUTCALL ideio_w16(UINT port, REG1
                         }                          }
                 }                  }
         }          }
           (void)port;
 }  }
   
 REG16 IOOUTCALL ideio_r16(UINT port) {  REG16 IOINPCALL ideio_r16(UINT port) {
   
         IDEDRV  drv;          IDEDRV  drv;
         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 605  REG16 IOOUTCALL ideio_r16(UINT port) { Line 699  REG16 IOOUTCALL 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 722  void ideio_bind(void) { Line 816  void ideio_bind(void) {
                 iocore_attachinp(0x074c, ideio_i74c);                  iocore_attachinp(0x074c, ideio_i74c);
         }          }
 }  }
 #endif  
   
   #endif  /* SUPPORT_IDEIO */

Removed from v.1.3  
changed lines
  Added in v.1.5


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