| 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: |