Diff for /xmil/fdd/fdd_d88.c between versions 1.9 and 1.10

version 1.9, 2004/08/10 08:28:48 version 1.10, 2004/08/13 01:35:59
Line 18  typedef struct { Line 18  typedef struct {
         UINT    track;          UINT    track;
         long    fptr;          long    fptr;
         UINT    size;          UINT    size;
           UINT    sectors;
         UINT8   buf[D88BUFSIZE];          UINT8   buf[D88BUFSIZE];
 } _D88TRK, *D88TRK;  } _D88TRK, *D88TRK;
   
Line 71  dtfd_err1: Line 72  dtfd_err1:
   
 static D88TRK trackread(D88TRK trk, FDDFILE fdd, REG8 media, UINT track) {  static D88TRK trackread(D88TRK trk, FDDFILE fdd, REG8 media, UINT track) {
   
         FILEH   fh;          FILEH           fh;
         UINT32  fptr;          UINT32          fptr;
         UINT32  size;          UINT            size;
   const _D88SEC   *sec;
           UINT            rem;
           UINT            maxsectors;
           UINT            sectors;
           UINT            secsize;
   
         trackflush(trk);          trackflush(trk);
         if (media != (REG8)((fdd->inf.d88.head.fd_type >> 4))) {          if (media != (REG8)((fdd->inf.d88.head.fd_type >> 4))) {
Line 106  static D88TRK trackread(D88TRK trk, FDDF Line 112  static D88TRK trackread(D88TRK trk, FDDF
         trk->track = track;          trk->track = track;
         trk->fptr = fptr;          trk->fptr = fptr;
         trk->size = size;          trk->size = size;
   
           // セクタ数チェック
           sec = (D88SEC)trk->buf;
           rem = size;
           maxsectors = 0;
           if (rem >= sizeof(_D88SEC)) {
                   maxsectors = LOADINTELWORD(sec->sectors);
           }
           sectors = 0;
           while(sectors < maxsectors) {
                   secsize = LOADINTELWORD(sec->size);
                   secsize += sizeof(_D88SEC);
                   if (rem < secsize) {
                           break;
                   }
                   rem -= secsize;
                   maxsectors = LOADINTELWORD(sec->sectors);
                   sec = (D88SEC)(((UINT8 *)sec) + secsize);
                   sectors++;
           }
           trk->sectors = sectors;
         return(trk);          return(trk);
   
 dtrd_err2:  dtrd_err2:
Line 139  static D88TRK trackseek(FDDFILE fdd, REG Line 166  static D88TRK trackseek(FDDFILE fdd, REG
 static D88SEC sectorseek(const _D88TRK *trk, REG8 r) {  static D88SEC sectorseek(const _D88TRK *trk, REG8 r) {
   
 const _D88SEC   *sec;  const _D88SEC   *sec;
         UINT            rem;  
         UINT            secnum;  
         UINT            sectors;          UINT            sectors;
         UINT            size;          UINT            size;
   
         sec = (D88SEC)trk->buf;          sec = (D88SEC)trk->buf;
         rem = trk->size;          sectors = trk->sectors;
         sectors = LOADINTELWORD(sec->sectors);          while(sectors) {
         if (sectors) {                  sectors--;
                 secnum = 0;                  if (sec->r == r) {
                 do {                          return((D88SEC)sec);
                         size = LOADINTELWORD(sec->size);                  }
                         size += sizeof(_D88SEC);                  size = LOADINTELWORD(sec->size);
                         if (rem < size) {                  size += sizeof(_D88SEC);
                                 break;                  sec = (D88SEC)(((UINT8 *)sec) + size);
                         }  
                         if (sec->r == r) {  
                                 return((D88SEC)sec);  
                         }  
                         secnum++;  
                         sectors = LOADINTELWORD(sec->sectors);  
                         if (secnum >= sectors) {  
                                 break;  
                         }  
                         sec = (D88SEC)(((UINT8 *)sec) + size);  
                 } while(secnum < 40);  
         }          }
         return(NULL);          return(NULL);
 }  }
Line 251  static REG8 fddd88_crc(FDDFILE fdd, REG8 Line 265  static REG8 fddd88_crc(FDDFILE fdd, REG8
   
 const _D88TRK   *trk;  const _D88TRK   *trk;
 const _D88SEC   *sec;  const _D88SEC   *sec;
         UINT            secnum;  
         UINT            rem;  
         UINT            size;  
         UINT            sectors;          UINT            sectors;
           UINT            size;
   
         trk = trackseek(fdd, media, track);          trk = trackseek(fdd, media, track);
         if (trk == NULL) {          if (trk == NULL) {
                 return(FDDSTAT_RECNFND);                  return(FDDSTAT_RECNFND);
         }          }
         sec = (D88SEC)trk->buf;          sec = (D88SEC)trk->buf;
         sectors = LOADINTELWORD(sec->sectors);          sectors = trk->sectors;
         if (sectors == 0) {          if (sectors >= num) {
                 return(FDDSTAT_RECNFND);                  return(FDDSTAT_RECNFND);
         }          }
         secnum = 0;          while(num) {
         rem = trk->size;                  num--;
         while(1) {  
                 size = LOADINTELWORD(sec->size);                  size = LOADINTELWORD(sec->size);
                 size += sizeof(_D88SEC);                  size += sizeof(_D88SEC);
                 if (rem < size) {  
                         return(FDDSTAT_RECNFND);  
                 }  
                 if (num == secnum) {  
                         break;  
                 }  
                 secnum++;  
                 sectors = LOADINTELWORD(sec->sectors);  
                 if (secnum >= sectors) {  
                         return(FDDSTAT_RECNFND);  
                 }  
                 sec = (D88SEC)(((UINT8 *)sec) + size);                  sec = (D88SEC)(((UINT8 *)sec) + size);
         }          }
         ptr[0] = sec->c;          ptr[0] = sec->c;
Line 296  const _D88SEC *sec; Line 296  const _D88SEC *sec;
         return(0x00);          return(0x00);
 }  }
   
   #if defined(SUPPORT_DISKEXT)
   static UINT32 fddd88_sec(FDDFILE fdd, REG8 media, UINT track, REG8 sc) {
   
   const _D88TRK   *trk;
   const _D88SEC   *sec;
           UINT            sectors;
           UINT            num;
           UINT            size;
   
           trk = trackseek(fdd, media, track);
           if (trk == NULL) {
                   return(0);
           }
           sec = (D88SEC)trk->buf;
           sectors = trk->sectors;
           num = 0;
           while(num < sectors) {
                   if (sec->r == sc) {
                           break;
                   }
                   size = LOADINTELWORD(sec->size);
                   size += sizeof(_D88SEC);
                   sec = (D88SEC)(((UINT8 *)sec) + size);
                   num++;
           }
           return((UINT32)(sectors << 16) + num);
   }
   #endif
   
   
 // ----  // ----
   
Line 335  BRESULT fddd88_set(FDDFILE fdd, const OE Line 364  BRESULT fddd88_set(FDDFILE fdd, const OE
         fdd->read = fddd88_read;          fdd->read = fddd88_read;
         fdd->write = fddd88_write;          fdd->write = fddd88_write;
         fdd->crc = fddd88_crc;          fdd->crc = fddd88_crc;
   #if defined(SUPPORT_DISKEXT)
           fdd->sec = fddd88_sec;
   #endif
         return(SUCCESS);          return(SUCCESS);
   
 fdst_err:  fdst_err:

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


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