|
|
| version 1.2, 2003/10/17 03:52:24 | 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 325 BOOL fddd88_set(FDDFILE fdd, const char | Line 285 BOOL fddd88_set(FDDFILE fdd, const char |
| goto fdst_err; | goto fdst_err; |
| } | } |
| fdd->type = DISKTYPE_D88; | 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) || | fdd->protect = ((attr & 1) || (fdd->inf.d88.head.protect & 0x10) || |
| (ro))?TRUE:FALSE; | (ro))?TRUE:FALSE; |
| fdd->inf.d88.fdtype_major = fdd->inf.d88.head.fd_type >> 4; | fdd->inf.d88.fdtype_major = fdd->inf.d88.head.fd_type >> 4; |
| 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); |