| version 1.5, 2004/01/29 09:41:50 | version 1.11, 2005/02/12 12:40:39 | 
| 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; | 
 |  |  | 
 |  |  | 
| static BOOL d88trk_flushdata(D88TRK trk) { | static BRESULT d88trk_flushdata(D88TRK trk) { | 
 |  |  | 
 | FDDFILE         fdd; | FDDFILE         fdd; | 
 | FILEH           fh; | FILEH           fh; | 
| Line 71  dtfd_err1: | Line 71  dtfd_err1: | 
 | return(FAILURE); | return(FAILURE); | 
 | } | } | 
 |  |  | 
| static BOOL d88trk_read(D88TRK trk, FDDFILE fdd, UINT track, BYTE type) { | static BRESULT d88trk_read(D88TRK trk, FDDFILE fdd, UINT track, UINT type) { | 
 |  |  | 
 | UINT8   rpm; | UINT8   rpm; | 
 | FILEH   fh; | FILEH   fh; | 
| Line 86  static BOOL d88trk_read(D88TRK trk, FDDF | Line 86  static BOOL d88trk_read(D88TRK trk, FDDF | 
 | rpm = fdc.rpm[fdc.us]; | 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 145  dtrd_err1: | Line 146  dtrd_err1: | 
 | } | } | 
 |  |  | 
 |  |  | 
| static BOOL rpmcheck(D88SEC sec) { | static BRESULT rpmcheck(D88SEC sec) { | 
 |  |  | 
 | FDDFILE fdd = fddfile + fdc.us; | FDDFILE fdd = fddfile + fdc.us; | 
 | UINT8   rpm; | UINT8   rpm; | 
| Line 178  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 235  static void drvflush(FDDFILE fdd) { | Line 193  static void drvflush(FDDFILE fdd) { | 
 | } | } | 
 | } | } | 
 |  |  | 
| static BOOL trkseek(FDDFILE fdd, UINT track) { | static BRESULT trkseek(FDDFILE fdd, UINT track) { | 
 |  |  | 
 | D88TRK  trk; | D88TRK  trk; | 
 | BOOL    r; | BOOL    r; | 
| Line 254  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 305  static D88SEC searchsector_d88(BOOL chec | Line 263  static D88SEC searchsector_d88(BOOL chec | 
 |  |  | 
 | // ---- | // ---- | 
 |  |  | 
| BOOL fddd88_set(FDDFILE fdd, const char *fname, int ro) { | BRESULT fddd88_set(FDDFILE fdd, const OEMCHAR *fname, int ro) { | 
 |  |  | 
 | short   attr; | short   attr; | 
 | FILEH   fh; | FILEH   fh; | 
| Line 342  fdst_err: | Line 300  fdst_err: | 
 | return(FAILURE); | return(FAILURE); | 
 | } | } | 
 |  |  | 
| BOOL fddd88_eject(FDDFILE fdd) { | BRESULT fddd88_eject(FDDFILE fdd) { | 
 |  |  | 
 | drvflush(fdd); | drvflush(fdd); | 
 | fdd->fname[0] = '\0'; | fdd->fname[0] = '\0'; | 
| Line 352  BOOL fddd88_eject(FDDFILE fdd) { | Line 310  BOOL fddd88_eject(FDDFILE fdd) { | 
 | } | } | 
 |  |  | 
 |  |  | 
| BOOL fdd_diskaccess_d88(void) {                                                                         // ver0.31 | BRESULT fdd_diskaccess_d88(void) {                                                                      // ver0.31 | 
 |  |  | 
 | FDDFILE fdd = fddfile + fdc.us; | FDDFILE fdd = fddfile + fdc.us; | 
 | UINT8   rpm; | UINT8   rpm; | 
| Line 382  BOOL fdd_diskaccess_d88(void) { | Line 340  BOOL fdd_diskaccess_d88(void) { | 
 | return(SUCCESS); | return(SUCCESS); | 
 | } | } | 
 |  |  | 
| BOOL fdd_seek_d88(void) { | BRESULT fdd_seek_d88(void) { | 
 |  |  | 
 | FDDFILE fdd = fddfile + fdc.us; | FDDFILE fdd = fddfile + fdc.us; | 
 |  |  | 
 | return(trkseek(fdd, (fdc.ncn << 1) + fdc.hd)); | return(trkseek(fdd, (fdc.ncn << 1) + fdc.hd)); | 
 | } | } | 
 |  |  | 
| BOOL fdd_seeksector_d88(void) { | BRESULT fdd_seeksector_d88(void) { | 
 |  |  | 
 | FDDFILE fdd = fddfile + fdc.us; | FDDFILE fdd = fddfile + fdc.us; | 
 |  |  | 
| Line 402  BOOL fdd_seeksector_d88(void) { | Line 360  BOOL fdd_seeksector_d88(void) { | 
 | return(SUCCESS); | return(SUCCESS); | 
 | } | } | 
 |  |  | 
| BOOL fdd_read_d88(void) { | BRESULT fdd_read_d88(void) { | 
 |  |  | 
 | FDDFILE         fdd = fddfile + fdc.us; | FDDFILE         fdd = fddfile + fdc.us; | 
 | D88SEC          p; | D88SEC          p; | 
| Line 411  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 438  BOOL fdd_read_d88(void) { | Line 396  BOOL fdd_read_d88(void) { | 
 | return(SUCCESS); | return(SUCCESS); | 
 | } | } | 
 |  |  | 
| BOOL fdd_write_d88(void) { | BRESULT fdd_write_d88(void) { | 
 |  |  | 
 | FDDFILE         fdd = fddfile + fdc.us; | FDDFILE         fdd = fddfile + fdc.us; | 
 | D88SEC          p; | D88SEC          p; | 
 | 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 469  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 | BRESULT fdd_readid_d88(void) { | 
| 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) { |  | 
 |  |  | 
 | 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 552  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 561  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 576  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 595  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 627  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; | 
 |  |  | 
| D88SEC          d88sec; | D88SEC  d88sec; | 
| FILEH           hdl; | FILEH   hdl; | 
| int                     i; | int             i; | 
| UINT            trk; | UINT    trk; | 
| long            fpointer; | long    fpointer; | 
| long            endpointer; | long    endpointer; | 
| long            lastpointer; | long    lastpointer; | 
| long            trksize; | long    trksize; | 
| int                     ptr; | int             ptr; | 
| long            apsize; | long    apsize; | 
 |  |  | 
 | trk = (fdc.treg[fdc.us] << 1) + fdc.hd; | trk = (fdc.treg[fdc.us] << 1) + fdc.hd; | 
 |  |  | 
| Line 694  static void endoftrack(UINT fmtsize, BYT | Line 594  static void endoftrack(UINT fmtsize, BYT | 
 | } | } | 
 |  |  | 
 |  |  | 
| BOOL fdd_formatinit_d88(void) { | BRESULT fdd_formatinit_d88(void) { | 
 |  |  | 
 | if (fdc.treg[fdc.us] < 82) { | if (fdc.treg[fdc.us] < 82) { | 
 | formating = TRUE; | formating = TRUE; | 
| Line 708  BOOL fdd_formatinit_d88(void) { | Line 608  BOOL fdd_formatinit_d88(void) { | 
 | } | } | 
 |  |  | 
 | // todo アンフォーマットとか ディスク1周した時の切り捨てとか… | // todo アンフォーマットとか ディスク1周した時の切り捨てとか… | 
| BOOL fdd_formating_d88(const BYTE *ID) { | BRESULT fdd_formating_d88(const UINT8 *ID) { | 
 |  |  | 
 | FDDFILE fdd = fddfile + fdc.us; | FDDFILE fdd = fddfile + fdc.us; | 
 |  |  |