|
|
| version 1.5, 2004/01/29 09:41:50 | version 1.7, 2004/06/19 14:39:22 |
|---|---|
| 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; |
| 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 BOOL 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 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 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 445 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 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 | |
| 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 541 BOOL fdd_readid_d88(void) { | Line 440 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 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 BYTE formatsec = 0; |
| static BYTE formatwrt = 0; | static BYTE formatwrt = 0; |
| Line 631 static void endoftrack(UINT fmtsize, BYT | Line 531 static void endoftrack(UINT fmtsize, BYT |
| 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; |