Diff for /np2/fdd/fdd_d88.c between versions 1.3 and 1.9

version 1.3, 2003/10/18 01:21:58 version 1.9, 2005/02/07 14:46:09
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 30  static UINT32 nexttrackptr(FDDFILE fdd,  Line 30  static UINT32 nexttrackptr(FDDFILE fdd, 
 typedef struct {  typedef struct {
         FDDFILE fdd;          FDDFILE fdd;
         UINT    track;          UINT    track;
         BYTE    type;          UINT    type;
         long    fptr;          long    fptr;
         UINT    size;          UINT    size;
         BOOL    write;          BOOL    write;
         BYTE    buf[D88BUFSIZE];          UINT8   buf[D88BUFSIZE];
 } _D88TRK, *D88TRK;  } _D88TRK, *D88TRK;
   
 static  _D88TRK         d88trk;  static  _D88TRK         d88trk;
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 70  dtfd_err1: Line 71  dtfd_err1:
         return(FAILURE);          return(FAILURE);
 }  }
   
 static BOOL d88trk_read(D88TRK trk, FDDFILE fdd, UINT track, BYTE type) {  static BOOL d88trk_read(D88TRK trk, FDDFILE fdd, UINT track, UINT 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];
         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 149  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 179  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 189  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 252  static BOOL trkseek(FDDFILE fdd, UINT tr Line 212  static BOOL trkseek(FDDFILE fdd, UINT tr
   
 static D88SEC searchsector_d88(BOOL check) {                    // ver0.29  static D88SEC searchsector_d88(BOOL check) {                    // ver0.29
   
         BYTE    *p;          UINT8   *p;
         UINT    sec;          UINT    sec;
         UINT    pos = 0;          UINT    pos = 0;
         UINT    nsize;          UINT    nsize;
Line 353  BOOL fddd88_eject(FDDFILE fdd) { Line 313  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 369  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 403  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 427  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;
         BYTE    *p;          UINT8   *p;
         UINT    sec;          UINT    sec;
         UINT    pos = 0;          UINT    pos = 0;
         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 451  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 460  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 474  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 UINT8 formatsec = 0;
 static BYTE formatwrt = 0;  static UINT8 formatwrt = 0;
 static UINT formatpos = 0;  static UINT formatpos = 0;
   
 static int fileappend(FILEH hdl, FDDFILE fdd,  static int fileappend(FILEH hdl, FDDFILE fdd,
Line 593  static int fileappend(FILEH hdl, FDDFILE Line 495  static int fileappend(FILEH hdl, FDDFILE
         UINT    size;          UINT    size;
         UINT    rsize;          UINT    rsize;
         int             t;          int             t;
         BYTE    tmp[0x1000];          UINT8   tmp[0x400];                                                     // Stack 0x1000->0x400
         UINT32  cur;          UINT32  cur;
   
         if ((length = last - ptr) <= 0) {                       // 書き換える必要なし          if ((length = last - ptr) <= 0) {                       // 書き換える必要なし
Line 625  static int fileappend(FILEH hdl, FDDFILE Line 527  static int fileappend(FILEH hdl, FDDFILE
 }  }
   
   
 static void endoftrack(UINT fmtsize, BYTE sectors) {  static void endoftrack(UINT fmtsize, UINT8 sectors) {
   
         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 556  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 587  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 601  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);
 }  }
   
         // todo アンフォーマットとか ディスク1周した時の切り捨てとか…          // todo アンフォーマットとか ディスク1周した時の切り捨てとか…
 BOOL fdd_formating_d88(const BYTE *ID) {  BOOL fdd_formating_d88(const UINT8 *ID) {
   
         FDDFILE fdd = fddfile + fdc.us;          FDDFILE fdd = fddfile + fdc.us;
   
Line 729  BOOL fdd_formating_d88(const BYTE *ID) { Line 634  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.3  
changed lines
  Added in v.1.9


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