Diff for /np2/fdd/fdd_d88.c between versions 1.2 and 1.6

version 1.2, 2003/10/17 03:52:24 version 1.6, 2004/06/18 07:42:13
Line 6 Line 6
 #include        "fdd_d88.h"  #include        "fdd_d88.h"
   
   
 #define         D88BUFSIZE              0x6000                  // テグザー対策  #define         D88BUFSIZE              0x6000
 #define         D88TRACKMAX             10600  #define         D88TRACKMAX             10600
   
   
Line 59  static BOOL d88trk_flushdata(D88TRK trk) Line 59  static BOOL d88trk_flushdata(D88TRK trk)
                 goto dtfd_err2;                  goto dtfd_err2;
         }          }
         file_close(fh);          file_close(fh);
           trk->write = FALSE;
   
 dtfd_exit:  dtfd_exit:
         return(SUCCESS);          return(SUCCESS);
Line 72  dtfd_err1: Line 73  dtfd_err1:
   
 static BOOL d88trk_read(D88TRK trk, FDDFILE fdd, UINT track, BYTE type) {  static BOOL d88trk_read(D88TRK trk, FDDFILE fdd, UINT track, BYTE type) {
   
         BYTE    rpm;          UINT8   rpm;
         FILEH   fh;          FILEH   fh;
         UINT32  fptr;          UINT32  fptr;
         UINT32  size;          UINT32  size;
Line 82  static BOOL d88trk_read(D88TRK trk, FDDF Line 83  static BOOL d88trk_read(D88TRK trk, FDDF
                 goto dtrd_err1;                  goto dtrd_err1;
         }          }
   
         rpm = fdc.rpm;          rpm = fdc.rpm[fdc.us];
           TRACEOUT(("d88trk_read(%d,%d)", rpm, track));
         switch(fdd->inf.d88.fdtype_major) {          switch(fdd->inf.d88.fdtype_major) {
                 case DISKTYPE_2D:                  case DISKTYPE_2D:
                           TRACEOUT(("DISKTYPE_2D"));
                         if ((rpm) || (type != DISKTYPE_2DD) || (track & 2)) {                          if ((rpm) || (type != DISKTYPE_2DD) || (track & 2)) {
                                 goto dtrd_err1;                                  goto dtrd_err1;
                         }                          }
Line 147  dtrd_err1: Line 150  dtrd_err1:
 static BOOL rpmcheck(D88SEC sec) {  static BOOL rpmcheck(D88SEC sec) {
   
         FDDFILE fdd = fddfile + fdc.us;          FDDFILE fdd = fddfile + fdc.us;
         BYTE    rpm;          UINT8   rpm;
   
         rpm = fdc.rpm;          rpm = fdc.rpm[fdc.us];
         switch(fdd->inf.d88.fdtype_major) {          switch(fdd->inf.d88.fdtype_major) {
                 case DISKTYPE_2D:                  case DISKTYPE_2D:
                 case DISKTYPE_2DD:                  case DISKTYPE_2DD:
Line 177  static BOOL rpmcheck(D88SEC sec) { Line 180  static BOOL rpmcheck(D88SEC sec) {
         return(SUCCESS);          return(SUCCESS);
 }  }
   
 #if 0  
 static D88SEC d88trk_seasector(BOOL check) {  
   
         D88TRK  trk;  
         BYTE    *ptr;  
         BYTE    *ptrend;  
         D88SEC  ret;  
         UINT    sec;  
         UINT    size;  
         UINT    sectors;  
   
         trk = &d88trk;  
         ptr = trk->buf;  
         ptrend = ptr + trk->size;  
         for (sec=0; sec<40; ) {  
                 ret = (D88SEC)ptr;  
                 ptr += sizeof(_D88SEC);  
                 if (ptr > ptrend) {  
                         break;  
                 }  
                 size = LOADINTELWORD(ret->size);  
                 ptr += size;  
                 if (ptr > ptrend) {  
                         break;  
                 }  
                 if ((ret->c == fdc.C) && (ret->h == fdc.H) &&  
                         (ret->r == fdc.R) && (ret->n == fdc.N) && (!rpmcheck(ret))) {  
                         if (check) {  
                                 if ((fdc.mf != 0xff) && (!((fdc.mf ^ ret->mfm_flg) & 0x40))) {  
                                         break;  
                                 }  
                         }  
                         return(ret);  
                 }  
                 sectors = LOADINTELWORD(ret->sectors);  
                 if (++sec >= sectors) {  
                         break;  
                 }  
         }  
         return(NULL);  
 }  
 #endif  
   
   
 // ----  // ----
   
Line 230  static void drvflush(FDDFILE fdd) { Line 190  static void drvflush(FDDFILE fdd) {
         trk = &d88trk;          trk = &d88trk;
         if (trk->fdd == fdd) {          if (trk->fdd == fdd) {
                 d88trk_flushdata(trk);                  d88trk_flushdata(trk);
                   trk->fdd = NULL;
         }          }
 }  }
   
Line 325  BOOL fddd88_set(FDDFILE fdd, const char  Line 286  BOOL fddd88_set(FDDFILE fdd, const char 
                 goto fdst_err;                  goto fdst_err;
         }          }
         fdd->type = DISKTYPE_D88;          fdd->type = DISKTYPE_D88;
         milstr_ncpy(fdd->fname, fname, sizeof(fdd->fname));          file_cpyname(fdd->fname, fname, sizeof(fdd->fname));
         fdd->protect = ((attr & 1) || (fdd->inf.d88.head.protect & 0x10) ||          fdd->protect = ((attr & 1) || (fdd->inf.d88.head.protect & 0x10) ||
                                                                                                                         (ro))?TRUE:FALSE;                                                                                                                          (ro))?TRUE:FALSE;
         fdd->inf.d88.fdtype_major = fdd->inf.d88.head.fd_type >> 4;          fdd->inf.d88.fdtype_major = fdd->inf.d88.head.fd_type >> 4;
Line 353  BOOL fddd88_eject(FDDFILE fdd) { Line 314  BOOL fddd88_eject(FDDFILE fdd) {
 BOOL fdd_diskaccess_d88(void) {                                                                         // ver0.31  BOOL fdd_diskaccess_d88(void) {                                                                         // ver0.31
   
         FDDFILE fdd = fddfile + fdc.us;          FDDFILE fdd = fddfile + fdc.us;
         BYTE    rpm;          UINT8   rpm;
   
         rpm = fdc.rpm;          rpm = fdc.rpm[fdc.us];
         switch(fdd->inf.d88.fdtype_major) {          switch(fdd->inf.d88.fdtype_major) {
                 case DISKTYPE_2D:                  case DISKTYPE_2D:
                 case DISKTYPE_2DD:                  case DISKTYPE_2DD:
Line 409  BOOL fdd_read_d88(void) { Line 370  BOOL fdd_read_d88(void) {
   
         fddlasterror = 0x00;          fddlasterror = 0x00;
         if (trkseek(fdd, (fdc.treg[fdc.us] << 1) + fdc.hd)) {          if (trkseek(fdd, (fdc.treg[fdc.us] << 1) + fdc.hd)) {
                 fddlasterror = 0xe0;                                                                    // ver0.28                  fddlasterror = 0xe0;
                 return(FAILURE);                  return(FAILURE);
         }          }
         p = searchsector_d88(TRUE);          p = searchsector_d88(TRUE);
         if (!p) {          if (!p) {
                 fddlasterror = 0xc0;                                                                    // ver0.28                  fddlasterror = 0xc0;
                 return(FAILURE);                  return(FAILURE);
         }          }
         if (fdc.N < 8) {          if (fdc.N < 8) {
Line 443  BOOL fdd_write_d88(void) { Line 404  BOOL fdd_write_d88(void) {
         UINT            size;          UINT            size;
         UINT            secsize;          UINT            secsize;
   
         fddlasterror = 0x00;                                                                            // ver0.28          fddlasterror = 0x00;
         if (trkseek(fdd, (fdc.treg[fdc.us] << 1) + fdc.hd)) {          if (trkseek(fdd, (fdc.treg[fdc.us] << 1) + fdc.hd)) {
                 fddlasterror = 0xe0;                                                                    // ver0.28                  fddlasterror = 0xe0;
                 return(FAILURE);                  return(FAILURE);
         }          }
         p = searchsector_d88(FALSE);          p = searchsector_d88(FALSE);
         if (!p) {          if (!p) {
                 fddlasterror = 0xc0;                                                                    // ver0.28                  fddlasterror = 0xc0;
                 return(FAILURE);                  return(FAILURE);
         }          }
         if (fdc.N < 8) {          if (fdc.N < 8) {
Line 467  BOOL fdd_write_d88(void) { Line 428  BOOL fdd_write_d88(void) {
                 CopyMemory(p+1, fdc.buf, size);                  CopyMemory(p+1, fdc.buf, size);
                 d88trk.write = TRUE;                  d88trk.write = TRUE;
         }          }
         fddlasterror = 0x00;                                                                            // ver0.28          fddlasterror = 0x00;
         return(SUCCESS);          return(SUCCESS);
 }  }
   
 #if 0  
 BOOL fddd88_readid(void) {  
   
         FDDFILE         fdd = fddfile + fdc.us;  
   
         D88TRK  trk;  
         BYTE    *ptr;  
         BYTE    *ptrend;  
         D88SEC  cur;  
         UINT    sec;  
         UINT    size;  
         UINT    sectors;  
   
         fddlasterror = 0x00;                                                                            // ver0.28  
         if (trkseek(fdd, (fdc.treg[fdc.us] << 1) + fdc.hd)) {  
                 fddlasterror = 0xe0;                                                                    // ver0.28  
                 return(FAILURE);  
         }  
   
         trk = &d88trk;  
         ptr = trk->buf;  
         ptrend = ptr + trk->size;  
         for (sec=0; sec<40; ) {  
                 cur = (D88SEC)ptr;  
                 ptr += sizeof(_D88SEC);  
                 if (ptr > ptrend) {  
                         break;  
                 }  
                 size = LOADINTELWORD(cur->size);  
                 ptr += size;  
                 if (ptr > ptrend) {  
                         break;  
                 }  
                 sectors = LOADINTELWORD(cur->sectors);  
                 if ((sec == (UINT)fdc.crcn) && (!rpmcheck(cur))) {  
                         fdc.C = cur->c;  
                         fdc.H = cur->h;  
                         fdc.R = cur->r;  
                         fdc.N = cur->n;  
                         fdc.crcn++;  
                         if ((UINT)fdc.crcn >= sectors) {  
                                 fdc.crcn = 0;  
                         }  
                         if ((fdc.mf == 0xff) || ((fdc.mf ^ cur->mfm_flg) & 0x40)) {  
                                 fddlasterror = 0x00;  
                                 return(SUCCESS);  
                         }  
                 }  
                 sec++;  
                 if (sec >= sectors) {  
                         break;  
                 }  
         }  
         fdc.crcn = 0x00;  
         fddlasterror = 0xe0;  
         return(FAILURE);  
 }  
 #endif  
   
 BOOL fdd_readid_d88(void) {  BOOL fdd_readid_d88(void) {
   
         FDDFILE fdd = fddfile + fdc.us;          FDDFILE fdd = fddfile + fdc.us;
Line 539  BOOL fdd_readid_d88(void) { Line 441  BOOL fdd_readid_d88(void) {
         UINT    sectors;          UINT    sectors;
         UINT    secsize;          UINT    secsize;
   
         fddlasterror = 0x00;                                                                            // ver0.28          fddlasterror = 0x00;
         if (trkseek(fdd, (fdc.treg[fdc.us] << 1) + fdc.hd)) {          if (trkseek(fdd, (fdc.treg[fdc.us] << 1) + fdc.hd)) {
                 fddlasterror = 0xe0;                                                                    // ver0.28                  fddlasterror = 0xe0;
                 return(FAILURE);                  return(FAILURE);
         }          }
         p = d88trk.buf;          p = d88trk.buf;
Line 550  BOOL fdd_readid_d88(void) { Line 452  BOOL fdd_readid_d88(void) {
                         break;                          break;
                 }                  }
                 sectors = LOADINTELWORD(((D88SEC)p)->sectors);                  sectors = LOADINTELWORD(((D88SEC)p)->sectors);
                 if ((sec == fdc.crcn) && (!rpmcheck((D88SEC)p))) {      // ver0.31                  if ((sec == fdc.crcn) && (!rpmcheck((D88SEC)p))) {                      // ver0.31
                         fdc.C = ((D88SEC)p)->c;                          fdc.C = ((D88SEC)p)->c;
                         fdc.H = ((D88SEC)p)->h;                          fdc.H = ((D88SEC)p)->h;
                         fdc.R = ((D88SEC)p)->r;                          fdc.R = ((D88SEC)p)->r;
Line 559  BOOL fdd_readid_d88(void) { Line 461  BOOL fdd_readid_d88(void) {
                         if (fdc.crcn >= sectors) {                          if (fdc.crcn >= sectors) {
                                 fdc.crcn = 0;                                  fdc.crcn = 0;
                         }                          }
                                                                                                                                 // ver0.29  
                         if ((fdc.mf == 0xff) ||                          if ((fdc.mf == 0xff) ||
                                         ((fdc.mf ^ (((D88SEC)p)->mfm_flg)) & 0x40)) {                                          ((fdc.mf ^ (((D88SEC)p)->mfm_flg)) & 0x40)) {
                                 fddlasterror = 0x00;                                                    // ver0.28                                  fddlasterror = 0x00;
                                 return(SUCCESS);                                  return(SUCCESS);
                         }                          }
                 }                  }
Line 574  BOOL fdd_readid_d88(void) { Line 475  BOOL fdd_readid_d88(void) {
                 pos += secsize;                  pos += secsize;
                 p += secsize;                  p += secsize;
         }          }
         fdc.crcn = 0x00;                                                                                        // ver0.29          fdc.crcn = 0x00;
         fddlasterror = 0xe0;                                                                            // ver0.31          fddlasterror = 0xe0;                                                                                    // ver0.31
         return(FAILURE);          return(FAILURE);
 }  }
   
   
 // --------------------------------------------------------------------------  // --------------------------------------------------------------------------
   
   // えーと…こんなところにあって大丈夫?
 static BOOL formating = FALSE;  static BOOL formating = FALSE;
 static BYTE formatsec = 0;  static BYTE formatsec = 0;
 static BYTE formatwrt = 0;  static BYTE formatwrt = 0;
Line 629  static void endoftrack(UINT fmtsize, BYT Line 532  static void endoftrack(UINT fmtsize, BYT
   
         FDDFILE fdd = fddfile + fdc.us;          FDDFILE fdd = fddfile + fdc.us;
   
         FILEH           hdl;          D88SEC  d88sec;
         int                     i;          FILEH   hdl;
         UINT            trk;          int             i;
         long            fpointer;          UINT    trk;
         long            endpointer;          long    fpointer;
         long            lastpointer;          long    endpointer;
         long            trksize;          long    lastpointer;
         int                     ptr;          long    trksize;
         long            apsize;          int             ptr;
           long    apsize;
   
         trk = (fdc.treg[fdc.us] << 1) + fdc.hd;          trk = (fdc.treg[fdc.us] << 1) + fdc.hd;
   
         ptr = 0;          ptr = 0;
         for (i=0; i<(int)sectors; i++) {          for (i=0; i<(int)sectors; i++) {
                 STOREINTELWORD(((D88SEC)(&d88trk.buf[ptr]))->sectors, sectors);                  d88sec = (D88SEC)(d88trk.buf + ptr);
                 ptr += LOADINTELWORD(((D88SEC)(&d88trk.buf[ptr]))->size);                  STOREINTELWORD(d88sec->sectors, sectors);
                   ptr += LOADINTELWORD(d88sec->size);
                 ptr += sizeof(_D88SEC);                  ptr += sizeof(_D88SEC);
         }          }
   
Line 652  static void endoftrack(UINT fmtsize, BYT Line 557  static void endoftrack(UINT fmtsize, BYT
         if (hdl == FILEH_INVALID) {          if (hdl == FILEH_INVALID) {
                 return;                  return;
         }          }
         lastpointer = file_seek(hdl, 0, 2);          lastpointer = file_seek(hdl, 0, FSEEK_END);
         fpointer = fdd->inf.d88.ptr[trk];          fpointer = fdd->inf.d88.ptr[trk];
         if (fpointer == 0) {          if (fpointer == 0) {
                 for (i=trk; i>=0; i--) {                                        // 新規トラック                  for (i=trk; i>=0; i--) {                                        // 新規トラック
Line 683  static void endoftrack(UINT fmtsize, BYT Line 588  static void endoftrack(UINT fmtsize, BYT
         STOREINTELDWORD(fdd->inf.d88.head.trackp[trk], fpointer);          STOREINTELDWORD(fdd->inf.d88.head.trackp[trk], fpointer);
         file_seek(hdl, fpointer, 0);          file_seek(hdl, fpointer, 0);
         file_write(hdl, d88trk.buf, fmtsize);          file_write(hdl, d88trk.buf, fmtsize);
         file_seek(hdl, 0, 0);          file_seek(hdl, 0, FSEEK_SET);
         file_write(hdl, &fdd->inf.d88.head, sizeof(fdd->inf.d88.head));          file_write(hdl, &fdd->inf.d88.head, sizeof(fdd->inf.d88.head));
         file_close(hdl);          file_close(hdl);
   //      TRACEOUT(("fmt %d %d", fpointer, fmtsize));
 }  }
   
   
Line 696  BOOL fdd_formatinit_d88(void) { Line 602  BOOL fdd_formatinit_d88(void) {
                 formatsec = 0;                  formatsec = 0;
                 formatpos = 0;                  formatpos = 0;
                 formatwrt = 0;                  formatwrt = 0;
                 drvflush(NULL);                  drvflush(fddfile + fdc.us);
                 return(SUCCESS);                  return(SUCCESS);
         }          }
         return(FAILURE);          return(FAILURE);
Line 729  BOOL fdd_formating_d88(const BYTE *ID) { Line 635  BOOL fdd_formating_d88(const BYTE *ID) {
                 STOREINTELWORD(d88sec->size, size);                  STOREINTELWORD(d88sec->size, size);
                 if ((fdd->inf.d88.fdtype_major == DISKTYPE_2HD) &&                  if ((fdd->inf.d88.fdtype_major == DISKTYPE_2HD) &&
                         (fdd->inf.d88.fdtype_minor != 0)) {                          (fdd->inf.d88.fdtype_minor != 0)) {
                         d88sec->rpm_flg = fdc.rpm;                          d88sec->rpm_flg = fdc.rpm[fdc.us];
                 }                  }
                 FillMemory(d88sec + 1, size, fdc.d);                  FillMemory(d88sec + 1, size, fdc.d);
                 formatpos += sizeof(_D88SEC);                  formatpos += sizeof(_D88SEC);

Removed from v.1.2  
changed lines
  Added in v.1.6


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