| version 1.3, 2003/10/18 01:21:58 | version 1.10, 2005/02/09 20:11:34 | 
| 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 303  static D88SEC searchsector_d88(BOOL chec | Line 263  static D88SEC searchsector_d88(BOOL chec | 
 |  |  | 
 | // ---- | // ---- | 
 |  |  | 
| BOOL fddd88_set(FDDFILE fdd, const char *fname, int ro) { | BOOL fddd88_set(FDDFILE fdd, const OEMCHAR *fname, int ro) { | 
 |  |  | 
 | short   attr; | short   attr; | 
 | FILEH   fh; | FILEH   fh; | 
| 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); |