|
|
| version 1.4, 2004/08/04 15:18:26 | version 1.5, 2004/08/05 11:30:12 |
|---|---|
| Line 7 | Line 7 |
| #include "fdd_mtr.h" | #include "fdd_mtr.h" |
| static D88_HEADER d88head[4]; | // static D88_HEADER d88head[4]; |
| static _D88SEC cursec; | static _D88SEC cursec; |
| static REG8 curdrv = (REG8)-1; | static REG8 curdrv = (REG8)-1; |
| static UINT curtrk = (UINT)-1; | static UINT curtrk = (UINT)-1; |
| Line 69 static BYTE TAO_BUF[0x3000]; | Line 69 static BYTE TAO_BUF[0x3000]; |
| //---------------------------------------------------------------------- | //---------------------------------------------------------------------- |
| static UINT32 nexttrackp(D88_HEADER *head, UINT32 fptr, UINT32 last) { | static UINT32 nexttrackptr(FDDFILE fdd, UINT32 fptr, UINT32 last) { |
| UINT t; | UINT t; |
| const DWORD *trkp; | |
| UINT32 cur; | UINT32 cur; |
| trkp = (DWORD *)head->trackp; | |
| for (t=0; t<164; t++) { | for (t=0; t<164; t++) { |
| cur = trkp[t]; | cur = fdd->inf.d88.ptr[t]; |
| if ((cur > fptr) && (cur < last)) { | if ((cur > fptr) && (cur < last)) { |
| last = cur; | last = cur; |
| } | } |
| Line 130 static DWORD read_d88track(REG8 drv, UIN | Line 128 static DWORD read_d88track(REG8 drv, UIN |
| crcnum = 0; | crcnum = 0; |
| crcerror = 0; | crcerror = 0; |
| fdd = fddfile + drv; | |
| if ((drv < 0) || (drv > 3) || (track > 163) || | if ((drv < 0) || (drv > 3) || (track > 163) || |
| ((type == 0) && (d88head[drv].fd_type == 0x20)) || | ((type == 0) && (fdd->inf.d88.head.fd_type == 0x20)) || |
| ((type == 1) && (d88head[drv].fd_type != 0x20)) || | ((type == 1) && (fdd->inf.d88.head.fd_type != 0x20)) || |
| ((curfp = d88head[drv].trackp[track]) == 0) || | ((curfp = fdd->inf.d88.ptr[track]) == 0) || |
| ((cursize = nexttrackp(&d88head[drv], curfp, | ((cursize = nexttrackptr(fdd, curfp, |
| d88head[drv].fd_size) - curfp) > 0x4000)) { | fdd->inf.d88.fd_size) - curfp) > 0x4000)) { |
| goto readd88_err; | goto readd88_err; |
| } | } |
| fdd = fddfile + drv; | |
| if ((hdr = file_open(fdd->fname)) == FILEH_INVALID) { | if ((hdr = file_open(fdd->fname)) == FILEH_INVALID) { |
| goto readd88_err; | goto readd88_err; |
| } | } |
| Line 411 BYTE fdd_incoff_d88(void) { | Line 409 BYTE fdd_incoff_d88(void) { |
| void init_tao_d88(void) { | void init_tao_d88(void) { |
| if ((fdc.media == 0) && (d88head[fdc.drv].fd_type != 0x20)) { | FDDFILE fdd; |
| fdd = fddfile + fdc.drv; | |
| if ((fdc.media == 0) && (fdd->inf.d88.head.fd_type != 0x20)) { | |
| tao = WID_2D; | tao = WID_2D; |
| } | } |
| else if ((fdc.media == 1) && (d88head[fdc.drv].fd_type == 0x20)) { | else if ((fdc.media == 1) && (fdd->inf.d88.head.fd_type == 0x20)) { |
| tao = WID_2HD; | tao = WID_2HD; |
| } | } |
| else { | else { |
| Line 422 void init_tao_d88(void) { | Line 423 void init_tao_d88(void) { |
| } | } |
| } | } |
| int fileappend(FILEH hdr, D88_HEADER *head, | static int fileappend(FILEH hdl, FDDFILE fdd, |
| long ptr, long last, long apsize) { | UINT32 ptr, long last, long apsize) { |
| long length; | long length; |
| WORD size; | UINT size; |
| WORD rsize; | UINT rsize; |
| int t; | UINT t; |
| long *trkp; | BYTE tmp[0x400]; |
| UINT32 cur; | |
| if ((length = last - ptr) <= 0) { // 書き換える必要なし | length = last - ptr; |
| if (length <= 0) { // 書き換える必要なし | |
| return(0); | return(0); |
| } | } |
| while(length) { | while(length) { |
| if (length >= 0x4000) { | if (length >= (long)(sizeof(tmp))) { |
| size = 0x4000; | size = sizeof(tmp); |
| } | } |
| else { | else { |
| size = (WORD)length; | size = length; |
| } | } |
| length -= (long)size; | length -= size; |
| file_seek(hdr, ptr+length, 0); | file_seek(hdl, ptr + length, FSEEK_SET); |
| rsize = file_read(hdr, D88_BUF, size); | rsize = file_read(hdl, tmp, size); |
| file_seek(hdr, ptr+length+apsize, 0); | file_seek(hdl, ptr + length + apsize, FSEEK_SET); |
| file_write(hdr, D88_BUF, rsize); | file_write(hdl, tmp, rsize); |
| } | } |
| for (t=0; t<164; t++) { | |
| trkp = head->trackp; | cur = fdd->inf.d88.ptr[t]; |
| for (t=0; t<164; t++, trkp++) { | if ((cur) && (cur >= ptr)) { |
| if ((*trkp) && (*trkp >= ptr)) { | fdd->inf.d88.ptr[t] = cur + apsize; |
| (*trkp) += apsize; | |
| } | } |
| } | } |
| return(0); | return(0); |
| } | } |
| void endoftrack(void) { | void endoftrack(void) { |
| FDDFILE fdd; | FDDFILE fdd; |
| FILEH hdr; | FILEH hdr; |
| int i; | int i; |
| WORD trk; | UINT trk; |
| D88_HEADER *head; | long fpointer; |
| long fpointer; | long endpointer; |
| long endpointer; | long lastpointer; |
| long lastpointer; | long trksize; |
| long trksize; | long apsize; |
| long apsize; | D88SEC p; |
| D88SEC p; | UINT secsize; |
| UINT secsize; | UINT8 ptr[D88_TRACKMAX][4]; |
| if (!tao.sector) { | if (!tao.sector) { |
| tao.flag = 4; | tao.flag = 4; |
| Line 483 void endoftrack(void) { | Line 483 void endoftrack(void) { |
| curdataflush(); // write cache flush & | curdataflush(); // write cache flush & |
| curdrv = (REG8)-1; // use D88_BUF[] for temp | curdrv = (REG8)-1; // use D88_BUF[] for temp |
| head = &d88head[fdc.drv]; | fdd = fddfile + fdc.drv; |
| trk = (fdc.c << 1) + fdc.h; | trk = (fdc.c << 1) + fdc.h; |
| p = (D88SEC)TAO_BUF; | p = (D88SEC)TAO_BUF; |
| Line 493 void endoftrack(void) { | Line 493 void endoftrack(void) { |
| p = (D88SEC)(((UINT8 *)(p + 1)) + secsize); | p = (D88SEC)(((UINT8 *)(p + 1)) + secsize); |
| } | } |
| fdd = fddfile + fdc.drv; | |
| if ((hdr = file_open(fdd->fname)) == FILEH_INVALID) { | if ((hdr = file_open(fdd->fname)) == FILEH_INVALID) { |
| return; | return; |
| } | } |
| lastpointer = file_seek(hdr, 0, 2); | lastpointer = file_seek(hdr, 0, 2); |
| if ((fpointer = head->trackp[trk]) == 0) { | fpointer = fdd->inf.d88.ptr[trk]; |
| fpointer = 0; // 新規トラック | if (fpointer = 0) { |
| for (i=trk; i>=0; i--) { | for (i=trk; i>=0; i--) { // 新規トラック |
| if (head->trackp[i]) { | fpointer = fdd->inf.d88.ptr[i]; |
| fpointer = head->trackp[i]; | if (fpointer) { |
| break; | break; |
| } | } |
| } | } |
| if (fpointer) { // ヒットした | if (fpointer) { // ヒットした |
| fpointer = nexttrackp(head, fpointer, lastpointer); | fpointer = nexttrackptr(fdd, fpointer, lastpointer); |
| } | } |
| else { | else { |
| fpointer = sizeof(D88_HEADER); | fpointer = D88_HEADERSIZE; |
| } | } |
| endpointer = fpointer; | endpointer = fpointer; |
| } | } |
| else { // トラックデータは既にある | else { // トラックデータは既にある |
| endpointer = nexttrackp(head, fpointer, lastpointer); | endpointer = nexttrackptr(fdd, fpointer, lastpointer); |
| } | } |
| trksize = endpointer - fpointer; | trksize = endpointer - fpointer; |
| if ((apsize = (long)tao.size - trksize) > 0) { | if ((apsize = (long)tao.size - trksize) > 0) { |
| // 書き込むデータのほーが大きい | // 書き込むデータのほーが大きい |
| fileappend(hdr, head, endpointer, lastpointer, apsize); | fileappend(hdr, fdd, endpointer, lastpointer, apsize); |
| head->fd_size += apsize; | fdd->inf.d88.fd_size += apsize; |
| } | } |
| head->trackp[trk] = fpointer; | STOREINTELDWORD(fdd->inf.d88.head.fd_size, fdd->inf.d88.fd_size); |
| file_seek(hdr, fpointer, 0); | fdd->inf.d88.ptr[trk] = fpointer; |
| for (i=0; i<D88_TRACKMAX; i++) { | |
| STOREINTELDWORD(ptr[i], fdd->inf.d88.ptr[i]); | |
| } | |
| file_seek(hdr, 0, FSEEK_SET); | |
| file_write(hdr, &fdd->inf.d88.head, sizeof(fdd->inf.d88.head)); | |
| file_write(hdr, ptr, sizeof(ptr)); | |
| file_seek(hdr, fpointer, FSEEK_SET); | |
| file_write(hdr, TAO_BUF, tao.size); | file_write(hdr, TAO_BUF, tao.size); |
| file_seek(hdr, 0, 0); | |
| file_write(hdr, head, sizeof(D88_HEADER)); | |
| file_close(hdr); | file_close(hdr); |
| } | } |
| void fdd_wtao_d88(BYTE data) { | void fdd_wtao_d88(BYTE data) { |
| D88SEC p; | D88SEC p; |
| Line 654 void fdd_wtao_d88(BYTE data) { | Line 657 void fdd_wtao_d88(BYTE data) { |
| BRESULT fddd88_eject(FDDFILE fdd, REG8 drv) { | BRESULT fddd88_eject(FDDFILE fdd, REG8 drv) { |
| drvflush(drv); | drvflush(drv); |
| ZeroMemory(&d88head[drv], sizeof(D88_HEADER)); | ZeroMemory(&fdd->inf.d88, sizeof(fdd->inf.d88)); |
| fdd->fname[0] = '\0'; | fdd->fname[0] = '\0'; |
| fdd->type = DISKTYPE_NOTREADY; | fdd->type = DISKTYPE_NOTREADY; |
| return(SUCCESS); | return(SUCCESS); |
| Line 664 BRESULT fddd88_set(FDDFILE fdd, REG8 drv | Line 667 BRESULT fddd88_set(FDDFILE fdd, REG8 drv |
| short attr; | short attr; |
| FILEH fh; | FILEH fh; |
| UINT rsize; | BOOL r; |
| UINT8 ptr[D88_TRACKMAX][4]; | |
| UINT i; | |
| attr = file_attr(fname); | attr = file_attr(fname); |
| if (attr & 0x18) { | if (attr & 0x18) { |
| goto fdst_err; | goto fdst_err; |
| } | } |
| fh = file_open(fname); | fh = file_open_rb(fname); |
| if (fh == FILEH_INVALID) { | if (fh == FILEH_INVALID) { |
| goto fdst_err; | goto fdst_err; |
| } | } |
| rsize = file_read(fh, &d88head[drv], sizeof(D88_HEADER)); | r = (file_read(fh, &fdd->inf.d88.head, sizeof(fdd->inf.d88.head)) |
| != sizeof(fdd->inf.d88.head)) || | |
| (file_read(fh, ptr, sizeof(ptr)) != sizeof(ptr)); | |
| file_close(fh); | file_close(fh); |
| if (rsize != sizeof(D88_HEADER)) { | if (r) { |
| goto fdst_err; | goto fdst_err; |
| } | } |
| if (d88head[drv].protect & 0x10) { | fdd->inf.d88.fd_size = LOADINTELDWORD(fdd->inf.d88.head.fd_size); |
| for (i=0; i<D88_TRACKMAX; i++) { | |
| fdd->inf.d88.ptr[i] = LOADINTELDWORD(ptr[i]); | |
| } | |
| if (fdd->inf.d88.head.protect & 0x10) { | |
| attr |= 1; | attr |= 1; |
| } | } |
| milstr_ncpy(fdd->fname, fname, NELEMENTS(fdd->fname)); | |
| fdd->type = DISKTYPE_D88; | fdd->type = DISKTYPE_D88; |
| fdd->protect = (UINT8)(attr & 1); | fdd->protect = (UINT8)(attr & 1); |
| milstr_ncpy(fdd->fname, fname, NELEMENTS(fdd->fname)); | |
| return(SUCCESS); | return(SUCCESS); |
| fdst_err: | fdst_err: |