Diff for /np2/cbus/atapicmd.c between versions 1.7 and 1.10

version 1.7, 2005/04/05 13:48:09 version 1.10, 2005/04/06 17:44:09
Line 117  static void atapi_cmd_mode_select(IDEDRV Line 117  static void atapi_cmd_mode_select(IDEDRV
 static void atapi_cmd_mode_sense(IDEDRV drv);  static void atapi_cmd_mode_sense(IDEDRV drv);
 static void atapi_cmd_readsubch(IDEDRV drv);  static void atapi_cmd_readsubch(IDEDRV drv);
 static void atapi_cmd_readtoc(IDEDRV drv);  static void atapi_cmd_readtoc(IDEDRV drv);
   static void atapi_cmd_playaudiomsf(IDEDRV drv);
   static void atapi_cmd_pauseresume(IDEDRV drv);
   
 void atapicmd_a0(IDEDRV drv) {  void atapicmd_a0(IDEDRV drv) {
   
Line 205  void atapicmd_a0(IDEDRV drv) { Line 207  void atapicmd_a0(IDEDRV drv) {
                 atapi_cmd_readtoc(drv);                  atapi_cmd_readtoc(drv);
                 break;                  break;
   
           case 0x47:              // Play Audio MSF
                   TRACEOUT(("atapicmd: Play Audio MSF"));
                   atapi_cmd_playaudiomsf(drv);
                   break;
   
           case 0x4b:
                   TRACEOUT(("atapicmd: pause resume"));
                   atapi_cmd_pauseresume(drv);
                   break;
   
         default:          default:
                 TRACEOUT(("atapicmd: unknown command = %.2x", cmd));                  TRACEOUT(("atapicmd: unknown command = %.2x", cmd));
                 sendabort(drv);                  sendabort(drv);
Line 509  length_exceeded: Line 521  length_exceeded:
 }  }
   
   
   // ---- Audio
   
   static void storemsf(UINT8 *ptr, UINT32 pos) {
   
           UINT    f;
           UINT    m;
   
           f = pos % 75;
           pos = pos / 75;
           m = pos % 60;
           pos = pos / 60;
           ptr[0] = 0;
           ptr[1] = (UINT8)pos;
           ptr[2] = (UINT8)m;
           ptr[3] = (UINT8)f;
   }
   
   
   // 0x42: READ SUB CHANNEL
 static void atapi_cmd_readsubch(IDEDRV drv) {  static void atapi_cmd_readsubch(IDEDRV drv) {
   
         SXSIDEV sxsi;          SXSIDEV sxsi;
           UINT    subq;
           UINT    cmd;
         UINT    leng;          UINT    leng;
           CDTRK   trk;
           UINT    tracks;
           UINT    r;
           UINT32  pos;
   
         sxsi = sxsi_getptr(drv->sxsidrv);          sxsi = sxsi_getptr(drv->sxsidrv);
         if ((sxsi == NULL) || (sxsi->devtype != SXSIDEV_CDROM) ||          if ((sxsi == NULL) || (sxsi->devtype != SXSIDEV_CDROM) ||
Line 520  static void atapi_cmd_readsubch(IDEDRV d Line 557  static void atapi_cmd_readsubch(IDEDRV d
                 senderror(drv);                  senderror(drv);
                 return;                  return;
         }          }
           trk = sxsicd_gettrk(sxsi, &tracks);
         leng = (drv->buf[7] << 8) + drv->buf[8];          leng = (drv->buf[7] << 8) + drv->buf[8];
         switch(drv->buf[3]) {          subq = drv->buf[2] & 0x40;
           cmd = drv->buf[3];
   
           drv->buf[0] = 0;
           drv->buf[1] = (UINT8)drv->daflag;
           drv->buf[2] = 0;
           drv->buf[3] = 0;
           if (!subq) {
                   senddata(drv, 4, leng);
                   return;
           }
           switch(cmd) {
                 case 0x01:                      // CD-ROM current pos                  case 0x01:                      // CD-ROM current pos
                         ZeroMemory(drv->buf, 16);                          ZeroMemory(drv->buf + 4, 12);
                           drv->buf[3] = 0x12;
                         drv->buf[4] = 0x01;                          drv->buf[4] = 0x01;
                           if (drv->daflag != 0x15) {
                                   pos = drv->dacurpos;
                                   if ((drv->daflag == 0x12) || (drv->daflag == 0x13)) {
                                           pos += (rand() & 7);
                                   }
                                   r = tracks;
                                   while(r) {
                                           r--;
                                           if (trk[r].pos <= pos) {
                                                   break;
                                           }
                                   }
                                   drv->buf[5] = trk[r].type;
                                   drv->buf[6] = trk[r].track;
                                   drv->buf[7] = 1;
                                   storemsf(drv->buf + 8, pos + 150);
                                   storemsf(drv->buf + 12, pos - trk[r].pos);
                           }
                         senddata(drv, 16, leng);                          senddata(drv, 16, leng);
                         break;                          break;
   
Line 534  static void atapi_cmd_readsubch(IDEDRV d Line 602  static void atapi_cmd_readsubch(IDEDRV d
         }          }
 }  }
   
   // 0x43: READ TOC
 static void atapi_cmd_readtoc(IDEDRV drv) {  static void atapi_cmd_readtoc(IDEDRV drv) {
   
         SXSIDEV sxsi;          SXSIDEV sxsi;
         UINT    leng;          UINT    leng;
         UINT    format;          UINT    format;
           CDTRK   trk;
           UINT    tracks;
         UINT    datasize;          UINT    datasize;
           UINT8   *ptr;
           UINT    i;
   
         sxsi = sxsi_getptr(drv->sxsidrv);          sxsi = sxsi_getptr(drv->sxsidrv);
         if ((sxsi == NULL) || (sxsi->devtype != SXSIDEV_CDROM) ||          if ((sxsi == NULL) || (sxsi->devtype != SXSIDEV_CDROM) ||
Line 547  static void atapi_cmd_readtoc(IDEDRV drv Line 620  static void atapi_cmd_readtoc(IDEDRV drv
                 senderror(drv);                  senderror(drv);
                 return;                  return;
         }          }
           trk = sxsicd_gettrk(sxsi, &tracks);
   
         leng = (drv->buf[7] << 8) + drv->buf[8];          leng = (drv->buf[7] << 8) + drv->buf[8];
         format = (drv->buf[9] >> 6);          format = (drv->buf[9] >> 6);
Line 554  static void atapi_cmd_readtoc(IDEDRV drv Line 628  static void atapi_cmd_readtoc(IDEDRV drv
   
         switch (format) {          switch (format) {
         case 0: // track info          case 0: // track info
                 datasize = sxsicd_gettocinfo(sxsi, drv->buf + 2);                  datasize = (tracks * 8) + 10;
                 drv->buf[0] = (UINT8)(datasize >> 8);                  drv->buf[0] = (UINT8)(datasize >> 8);
                 drv->buf[1] = (UINT8)(datasize >> 0);                  drv->buf[1] = (UINT8)(datasize >> 0);
                 senddata(drv, datasize + 2, leng);                  drv->buf[2] = 1;
                   drv->buf[3] = (UINT8)tracks;
                   ptr = drv->buf + 4;
                   for (i=0; i<=tracks; i++) {
                           ptr[0] = 0;
                           ptr[1] = trk[i].type;
                           ptr[2] = trk[i].track;
                           ptr[3] = 0;
                           storemsf(ptr + 4, trk[i].pos + 150);
                           ptr += 8;
                   }
                   senddata(drv, (tracks * 8) + 12, leng);
                 break;                  break;
   
         case 1: // multi session          case 1: // multi session
Line 577  static void atapi_cmd_readtoc(IDEDRV drv Line 662  static void atapi_cmd_readtoc(IDEDRV drv
         }          }
 }  }
   
   // 0x47: Play Audio MSF
   static void atapi_cmd_playaudiomsf(IDEDRV drv) {
   
           UINT32  pos;
           UINT32  leng;
   
           pos = (((drv->buf[3] * 60) + drv->buf[4]) * 75) + drv->buf[5];
           leng = (((drv->buf[6] * 60) + drv->buf[7]) * 75) + drv->buf[8];
           if (leng > pos) {
                   leng -= pos;
           }
           else {
                   leng = 0;
           }
           if (pos >= 150) {
                   pos -= 150;
           }
           else {
                   pos = 0;
           }
           ideio.daplaying |= 1 << (drv->sxsidrv & 3);
           drv->daflag = 0x11;
           drv->dacurpos = pos;
           drv->dalength = leng;
           drv->dabufrem = 0;
           cmddone(drv);
   }
   
   // 0x4B: PAUSE RESUME
   static void atapi_cmd_pauseresume(IDEDRV drv) {
   
           if (drv->buf[8] & 1) {
                   // resume
                   if (drv->daflag == 0x12) {
                           ideio.daplaying |= 1 << (drv->sxsidrv & 3);
                           drv->daflag = 0x11;
                   }
           }
           else {
                   // pause
                   if (drv->daflag == 0x11) {
                           ideio.daplaying &= ~(1 << (drv->sxsidrv & 3));
                           drv->daflag = 0x12;
                   }
           }
           cmddone(drv);
   }
   
 #endif  /* SUPPORT_IDEIO */  #endif  /* SUPPORT_IDEIO */
   

Removed from v.1.7  
changed lines
  Added in v.1.10


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