Diff for /np2/fdd/sxsicd.c between versions 1.4 and 1.8

version 1.4, 2005/04/05 09:12:24 version 1.8, 2011/01/15 18:04:43
Line 11 Line 11
 static const UINT8 cd001[7] = {0x01,'C','D','0','0','1',0x01};  static const UINT8 cd001[7] = {0x01,'C','D','0','0','1',0x01};
   
 typedef struct {  typedef struct {
         UINT    type;  
         UINT32  pos;  
 } CDTRK;  
   
 typedef struct {  
         FILEH   fh;          FILEH   fh;
         UINT    type;          UINT    type;
         UINT32  lastpos;          UINT    trks;
         CDTRK   trk[99];          _CDTRK  trk[100];
         OEMCHAR path[MAX_PATH];          OEMCHAR path[MAX_PATH];
 } _CDINFO, *CDINFO;  } _CDINFO, *CDINFO;
   
Line 193  static const OEMCHAR str_audio[] = OEMTE Line 188  static const OEMCHAR str_audio[] = OEMTE
   
   
 static BRESULT openimg(SXSIDEV sxsi, const OEMCHAR *path,  static BRESULT openimg(SXSIDEV sxsi, const OEMCHAR *path,
                                                                                                 const CDTRK *trk, UINT trks) {                                                                                                  const _CDTRK *trk, UINT trks) {
   
         FILEH   fh;          FILEH   fh;
         UINT    type;          UINT    type;
         long    totals;          long    totals;
         CDINFO  cdinfo;          CDINFO  cdinfo;
           UINT    mediatype;
           UINT    i;
   
         fh = file_open_rb(path);          fh = file_open_rb(path);
         if (fh == FILEH_INVALID) {          if (fh == FILEH_INVALID) {
Line 220  static BRESULT openimg(SXSIDEV sxsi, con Line 217  static BRESULT openimg(SXSIDEV sxsi, con
         ZeroMemory(cdinfo, sizeof(_CDINFO));          ZeroMemory(cdinfo, sizeof(_CDINFO));
         cdinfo->fh = fh;          cdinfo->fh = fh;
         cdinfo->type = type;          cdinfo->type = type;
         cdinfo->lastpos = totals;  
         if ((trk != NULL) && (trks != 0)) {          if ((trk != NULL) && (trks != 0)) {
                 trks = min(trks, NELEMENTS(cdinfo->trk));                  trks = min(trks, NELEMENTS(cdinfo->trk) - 1);
                 CopyMemory(cdinfo->trk, trk, trks * sizeof(CDTRK));                  CopyMemory(cdinfo->trk, trk, trks * sizeof(_CDTRK));
         }          }
         else {          else {
                 cdinfo->trk[0].type = 0x14;                  cdinfo->trk[0].type = 0x14;
                   cdinfo->trk[0].track = 1;
 //              cdinfo->trk[0].pos = 0;  //              cdinfo->trk[0].pos = 0;
                   trks = 1;
           }
           mediatype = 0;
           for (i=0; i<trks; i++) {
                   if (cdinfo->trk[i].type == 0x14) {
                           mediatype |= SXSIMEDIA_DATA;
                   }
                   else if (cdinfo->trk[i].type == 0x10) {
                           mediatype |= SXSIMEDIA_AUDIO;
                   }
         }          }
           cdinfo->trk[trks].type = 0x10;
           cdinfo->trk[trks].track = 0xaa;
           cdinfo->trk[trks].pos = totals;
           cdinfo->trks = trks;
         file_cpyname(cdinfo->path, path, NELEMENTS(cdinfo->path));          file_cpyname(cdinfo->path, path, NELEMENTS(cdinfo->path));
   
         sxsi->reopen = cd_reopen;          sxsi->reopen = cd_reopen;
Line 247  static BRESULT openimg(SXSIDEV sxsi, con Line 258  static BRESULT openimg(SXSIDEV sxsi, con
         sxsi->sectors = 1;          sxsi->sectors = 1;
         sxsi->surfaces = 1;          sxsi->surfaces = 1;
         sxsi->headersize = 0;          sxsi->headersize = 0;
         sxsi->mediatype = SXSIMEDIA_DATA;          sxsi->mediatype = mediatype;
         return(SUCCESS);          return(SUCCESS);
   
 sxsiope_err2:  sxsiope_err2:
Line 269  static BRESULT getint2(const OEMCHAR *st Line 280  static BRESULT getint2(const OEMCHAR *st
         return(SUCCESS);          return(SUCCESS);
 }  }
   
 static BRESULT getpos(const OEMCHAR *str, UINT32 *pos) {  static UINT32 getpos(const OEMCHAR *str) {
   
         UINT    m;          UINT    m;
         UINT    s;          UINT    s;
Line 278  static BRESULT getpos(const OEMCHAR *str Line 289  static BRESULT getpos(const OEMCHAR *str
         if ((getint2(str + 0, &m) != SUCCESS) || (str[2] != ':') ||          if ((getint2(str + 0, &m) != SUCCESS) || (str[2] != ':') ||
                 (getint2(str + 3, &s) != SUCCESS) || (str[5] != ':') ||                  (getint2(str + 3, &s) != SUCCESS) || (str[5] != ':') ||
                 (getint2(str + 6, &f) != SUCCESS)) {                  (getint2(str + 6, &f) != SUCCESS)) {
                 return(FAILURE);                  return(0);
         }  
         if (pos) {  
                 *pos = (((m * 60) + s) * 75) + f;  
         }          }
         return(SUCCESS);          return((((m * 60) + s) * 75) + f);
 }  }
   
 static BRESULT opencue(SXSIDEV sxsi, const OEMCHAR *fname) {  static BRESULT opencue(SXSIDEV sxsi, const OEMCHAR *fname) {
   
         CDTRK           trk[99];          _CDTRK          trk[99];
         OEMCHAR         path[MAX_PATH];          OEMCHAR         path[MAX_PATH];
         UINT            curtrk;          UINT            idx;
           UINT8           curtrk;
           UINT            curtype;
         TEXTFILEH       tfh;          TEXTFILEH       tfh;
         OEMCHAR         buf[512];          OEMCHAR         buf[512];
         OEMCHAR         *argv[8];          OEMCHAR         *argv[8];
         int                     argc;          int                     argc;
         UINT            type;  
   
         ZeroMemory(trk, sizeof(trk));          ZeroMemory(trk, sizeof(trk));
         path[0] = '\0';          path[0] = '\0';
         curtrk = -1;          idx = 0;
           curtrk = 1;
           curtype = 0x14;
         tfh = textfile_open(fname, 0x800);          tfh = textfile_open(fname, 0x800);
         if (tfh == NULL) {          if (tfh == NULL) {
                 return(FAILURE);                  return(FAILURE);
Line 307  static BRESULT opencue(SXSIDEV sxsi, con Line 318  static BRESULT opencue(SXSIDEV sxsi, con
         while(textfile_read(tfh, buf, NELEMENTS(buf)) == SUCCESS) {          while(textfile_read(tfh, buf, NELEMENTS(buf)) == SUCCESS) {
                 argc = milstr_getarg(buf, argv, NELEMENTS(argv));                  argc = milstr_getarg(buf, argv, NELEMENTS(argv));
                 if ((argc >= 3) && (!milstr_cmp(argv[0], str_file))) {                  if ((argc >= 3) && (!milstr_cmp(argv[0], str_file))) {
                         file_cpyname(path, argv[1], NELEMENTS(path));                          file_cpyname(path, fname, NELEMENTS(path));
                           file_cutname(path);
                           file_catname(path, argv[1], NELEMENTS(path));
                 }                  }
                 else if ((argc >= 3) && (!milstr_cmp(argv[0], str_track))) {                  else if ((argc >= 3) && (!milstr_cmp(argv[0], str_track))) {
                         curtrk = milstr_solveINT(argv[1]) - 1;                          curtrk = (UINT8)milstr_solveINT(argv[1]);
                         type = 0;  
                         if (!milstr_cmp(argv[2], str_mode1)) {                          if (!milstr_cmp(argv[2], str_mode1)) {
                                 type = 0x14;                                  curtype = 0x14;
                         }                          }
                         else if (!milstr_cmp(argv[2], str_audio)) {                          else if (!milstr_cmp(argv[2], str_audio)) {
                                 type = 0x10;                                  curtype = 0x10;
                         }  
                         if ((curtrk < NELEMENTS(trk)) && (type != 0)) {  
                                 trk[curtrk].type = type;  
                         }                          }
                 }                  }
                 else if ((argc >= 3) && (!milstr_cmp(argv[0], str_index))) {                  else if ((argc >= 3) && (!milstr_cmp(argv[0], str_index))) {
                         if (curtrk < NELEMENTS(trk)) {                          if (idx < NELEMENTS(trk)) {
                                 getpos(argv[2], &trk[curtrk].pos);                                  trk[idx].type = curtype;
                                   trk[idx].track = curtrk;
                                   trk[idx].pos = getpos(argv[2]);
                                   idx++;
                         }                          }
                 }                  }
         }          }
         textfile_close(tfh);          textfile_close(tfh);
 #if 0          return(openimg(sxsi, path, trk, idx));
 {  
         UINT i;  
         for (i=0; i<NELEMENTS(trk); i++) {  
                 if (trk[i].type) {  
                         TRACEOUT(("%.2d: %.4x %d", i+1, trk[i].type, trk[i].pos));  
                 }  
         }  
 }  
 #endif  
         return(openimg(sxsi, path, trk, NELEMENTS(trk)));  
 }  }
   
 BRESULT sxsicd_open(SXSIDEV sxsi, const OEMCHAR *fname) {  BRESULT sxsicd_open(SXSIDEV sxsi, const OEMCHAR *fname) {
Line 353  const OEMCHAR *ext; Line 355  const OEMCHAR *ext;
         return(openimg(sxsi, fname, NULL, 0));          return(openimg(sxsi, fname, NULL, 0));
 }  }
   
   CDTRK sxsicd_gettrk(SXSIDEV sxsi, UINT *tracks) {
   
           CDINFO  cdinfo;
   
           cdinfo = (CDINFO)sxsi->hdl;
           if (tracks) {
                   *tracks = cdinfo->trks;
           }
           return(cdinfo->trk);
   }
   
   BRESULT sxsicd_readraw(SXSIDEV sxsi, long pos, void *buf) {
   
           CDINFO  cdinfo;
           FILEH   fh;
           long    fpos;
   
           cdinfo = (CDINFO)sxsi->hdl;
           if (cdinfo->type != 2352) {
                   return(FAILURE);
           }
           if (sxsi_prepare(sxsi) != SUCCESS) {
                   return(FAILURE);
           }
           if ((pos < 0) || (pos >= sxsi->totals)) {
                   return(FAILURE);
           }
           fh = ((CDINFO)sxsi->hdl)->fh;
           fpos = pos * 2352;
           if ((file_seek(fh, fpos, FSEEK_SET) != fpos) ||
                   (file_read(fh, buf, 2352) != 2352)) {
                   return(FAILURE);
           }
           return(SUCCESS);
   }
   

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


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