--- np2/fdd/fdd_d88.c 2003/10/16 17:58:29 1.1 +++ np2/fdd/fdd_d88.c 2005/02/07 14:46:09 1.9 @@ -6,7 +6,7 @@ #include "fdd_d88.h" -#define D88BUFSIZE 0x6000 // テグザー対策 +#define D88BUFSIZE 0x6000 #define D88TRACKMAX 10600 @@ -28,13 +28,13 @@ static UINT32 nexttrackptr(FDDFILE fdd, // ---- typedef struct { - FDDFILE fdd; - UINT track; - BYTE type; - long fptr; - UINT size; - BOOL write; - BYTE buf[D88BUFSIZE]; + FDDFILE fdd; + UINT track; + UINT type; + long fptr; + UINT size; + BOOL write; + UINT8 buf[D88BUFSIZE]; } _D88TRK, *D88TRK; static _D88TRK d88trk; @@ -59,6 +59,7 @@ static BOOL d88trk_flushdata(D88TRK trk) goto dtfd_err2; } file_close(fh); + trk->write = FALSE; dtfd_exit: return(SUCCESS); @@ -70,9 +71,9 @@ dtfd_err1: 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; UINT32 fptr; UINT32 size; @@ -82,9 +83,10 @@ static BOOL d88trk_read(D88TRK trk, FDDF goto dtrd_err1; } - rpm = fdc.rpm; + rpm = fdc.rpm[fdc.us]; switch(fdd->inf.d88.fdtype_major) { case DISKTYPE_2D: + TRACEOUT(("DISKTYPE_2D")); if ((rpm) || (type != DISKTYPE_2DD) || (track & 2)) { goto dtrd_err1; } @@ -147,9 +149,9 @@ dtrd_err1: static BOOL rpmcheck(D88SEC sec) { FDDFILE fdd = fddfile + fdc.us; - BYTE rpm; + UINT8 rpm; - rpm = fdc.rpm; + rpm = fdc.rpm[fdc.us]; switch(fdd->inf.d88.fdtype_major) { case DISKTYPE_2D: case DISKTYPE_2DD: @@ -178,48 +180,6 @@ static BOOL rpmcheck(D88SEC sec) { } -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); -} - - // ---- static void drvflush(FDDFILE fdd) { @@ -229,6 +189,7 @@ static void drvflush(FDDFILE fdd) { trk = &d88trk; if (trk->fdd == fdd) { d88trk_flushdata(trk); + trk->fdd = NULL; } } @@ -251,7 +212,7 @@ static BOOL trkseek(FDDFILE fdd, UINT tr static D88SEC searchsector_d88(BOOL check) { // ver0.29 - BYTE *p; + UINT8 *p; UINT sec; UINT pos = 0; UINT nsize; @@ -324,7 +285,7 @@ BOOL fddd88_set(FDDFILE fdd, const char goto fdst_err; } 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) || (ro))?TRUE:FALSE; fdd->inf.d88.fdtype_major = fdd->inf.d88.head.fd_type >> 4; @@ -352,9 +313,9 @@ BOOL fddd88_eject(FDDFILE fdd) { BOOL fdd_diskaccess_d88(void) { // ver0.31 FDDFILE fdd = fddfile + fdc.us; - BYTE rpm; + UINT8 rpm; - rpm = fdc.rpm; + rpm = fdc.rpm[fdc.us]; switch(fdd->inf.d88.fdtype_major) { case DISKTYPE_2D: case DISKTYPE_2DD: @@ -408,12 +369,12 @@ BOOL fdd_read_d88(void) { fddlasterror = 0x00; if (trkseek(fdd, (fdc.treg[fdc.us] << 1) + fdc.hd)) { - fddlasterror = 0xe0; // ver0.28 + fddlasterror = 0xe0; return(FAILURE); } p = searchsector_d88(TRUE); if (!p) { - fddlasterror = 0xc0; // ver0.28 + fddlasterror = 0xc0; return(FAILURE); } if (fdc.N < 8) { @@ -442,14 +403,14 @@ BOOL fdd_write_d88(void) { UINT size; UINT secsize; - fddlasterror = 0x00; // ver0.28 + fddlasterror = 0x00; if (trkseek(fdd, (fdc.treg[fdc.us] << 1) + fdc.hd)) { - fddlasterror = 0xe0; // ver0.28 + fddlasterror = 0xe0; return(FAILURE); } p = searchsector_d88(FALSE); if (!p) { - fddlasterror = 0xc0; // ver0.28 + fddlasterror = 0xc0; return(FAILURE); } if (fdc.N < 8) { @@ -466,81 +427,22 @@ BOOL fdd_write_d88(void) { CopyMemory(p+1, fdc.buf, size); d88trk.write = TRUE; } - fddlasterror = 0x00; // ver0.28 + fddlasterror = 0x00; 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) { FDDFILE fdd = fddfile + fdc.us; - BYTE *p; + UINT8 *p; UINT sec; UINT pos = 0; UINT sectors; UINT secsize; - fddlasterror = 0x00; // ver0.28 + fddlasterror = 0x00; if (trkseek(fdd, (fdc.treg[fdc.us] << 1) + fdc.hd)) { - fddlasterror = 0xe0; // ver0.28 + fddlasterror = 0xe0; return(FAILURE); } p = d88trk.buf; @@ -549,7 +451,7 @@ BOOL fdd_readid_d88(void) { break; } 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.H = ((D88SEC)p)->h; fdc.R = ((D88SEC)p)->r; @@ -558,10 +460,9 @@ BOOL fdd_readid_d88(void) { if (fdc.crcn >= sectors) { fdc.crcn = 0; } - // ver0.29 if ((fdc.mf == 0xff) || ((fdc.mf ^ (((D88SEC)p)->mfm_flg)) & 0x40)) { - fddlasterror = 0x00; // ver0.28 + fddlasterror = 0x00; return(SUCCESS); } } @@ -573,16 +474,18 @@ BOOL fdd_readid_d88(void) { pos += secsize; p += secsize; } - fdc.crcn = 0x00; // ver0.29 - fddlasterror = 0xe0; // ver0.31 + fdc.crcn = 0x00; + fddlasterror = 0xe0; // ver0.31 return(FAILURE); } + // -------------------------------------------------------------------------- +// えーと…こんなところにあって大丈夫? static BOOL formating = FALSE; -static BYTE formatsec = 0; -static BYTE formatwrt = 0; +static UINT8 formatsec = 0; +static UINT8 formatwrt = 0; static UINT formatpos = 0; static int fileappend(FILEH hdl, FDDFILE fdd, @@ -592,14 +495,14 @@ static int fileappend(FILEH hdl, FDDFILE UINT size; UINT rsize; int t; - BYTE tmp[0x1000]; + UINT8 tmp[0x400]; // Stack 0x1000->0x400 UINT32 cur; if ((length = last - ptr) <= 0) { // 書き換える必要なし return(0); } while(length) { - if (length >= sizeof(tmp)) { + if (length >= (long)(sizeof(tmp))) { size = sizeof(tmp); } else { @@ -624,26 +527,28 @@ 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; - FILEH hdl; - int i; - UINT trk; - long fpointer; - long endpointer; - long lastpointer; - long trksize; - int ptr; - long apsize; + D88SEC d88sec; + FILEH hdl; + int i; + UINT trk; + long fpointer; + long endpointer; + long lastpointer; + long trksize; + int ptr; + long apsize; trk = (fdc.treg[fdc.us] << 1) + fdc.hd; ptr = 0; for (i=0; i<(int)sectors; i++) { - STOREINTELWORD(((D88SEC)(&d88trk.buf[ptr]))->sectors, sectors); - ptr += LOADINTELWORD(((D88SEC)(&d88trk.buf[ptr]))->size); + d88sec = (D88SEC)(d88trk.buf + ptr); + STOREINTELWORD(d88sec->sectors, sectors); + ptr += LOADINTELWORD(d88sec->size); ptr += sizeof(_D88SEC); } @@ -651,7 +556,7 @@ static void endoftrack(UINT fmtsize, BYT if (hdl == FILEH_INVALID) { return; } - lastpointer = file_seek(hdl, 0, 2); + lastpointer = file_seek(hdl, 0, FSEEK_END); fpointer = fdd->inf.d88.ptr[trk]; if (fpointer == 0) { for (i=trk; i>=0; i--) { // 新規トラック @@ -682,9 +587,10 @@ static void endoftrack(UINT fmtsize, BYT STOREINTELDWORD(fdd->inf.d88.head.trackp[trk], fpointer); file_seek(hdl, fpointer, 0); 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_close(hdl); +// TRACEOUT(("fmt %d %d", fpointer, fmtsize)); } @@ -695,14 +601,14 @@ BOOL fdd_formatinit_d88(void) { formatsec = 0; formatpos = 0; formatwrt = 0; - drvflush(NULL); + drvflush(fddfile + fdc.us); return(SUCCESS); } return(FAILURE); } // todo アンフォーマットとか ディスク1周した時の切り捨てとか… -BOOL fdd_formating_d88(const BYTE *ID) { +BOOL fdd_formating_d88(const UINT8 *ID) { FDDFILE fdd = fddfile + fdc.us; @@ -728,7 +634,7 @@ BOOL fdd_formating_d88(const BYTE *ID) { STOREINTELWORD(d88sec->size, size); if ((fdd->inf.d88.fdtype_major == DISKTYPE_2HD) && (fdd->inf.d88.fdtype_minor != 0)) { - d88sec->rpm_flg = fdc.rpm; + d88sec->rpm_flg = fdc.rpm[fdc.us]; } FillMemory(d88sec + 1, size, fdc.d); formatpos += sizeof(_D88SEC);