|
|
| version 1.6, 2004/08/08 12:32:58 | version 1.9, 2004/08/10 08:28:48 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "dosio.h" | #include "dosio.h" |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | |
| #include "fddfile.h" | #include "fddfile.h" |
| #include "fdd_d88.h" | #include "fdd_d88.h" |
| #include "fdd_mtr.h" | #include "fdd_mtr.h" |
| // static D88_HEADER d88head[4]; | enum { |
| D88BUFSIZE = 0x4000 | |
| }; | |
| typedef struct { | |
| FDDFILE fdd; | |
| UINT8 media; | |
| UINT8 write; | |
| UINT8 padding[2]; | |
| UINT track; | |
| long fptr; | |
| UINT size; | |
| UINT8 buf[D88BUFSIZE]; | |
| } _D88TRK, *D88TRK; | |
| static _D88TRK d88trk; | |
| static UINT32 nexttrackptr(FDDFILE fdd, UINT32 fptr, UINT32 last) { | |
| UINT t; | |
| UINT32 cur; | |
| for (t=0; t<164; t++) { | |
| cur = fdd->inf.d88.ptr[t]; | |
| if ((cur > fptr) && (cur < last)) { | |
| last = cur; | |
| } | |
| } | |
| return(last); | |
| } | |
| static BRESULT trackflush(D88TRK trk) { | |
| FDDFILE fdd; | |
| FILEH fh; | |
| fdd = trk->fdd; | |
| trk->fdd = NULL; | |
| if ((fdd == NULL) || (trk->size == 0) || (!trk->write)) { | |
| goto dtfd_exit; | |
| } | |
| fh = file_open(fdd->fname); | |
| if (fh == FILEH_INVALID) { | |
| goto dtfd_err1; | |
| } | |
| if ((file_seek(fh, trk->fptr, FSEEK_SET) != trk->fptr) || | |
| (file_write(fh, trk->buf, trk->size) != trk->size)) { | |
| goto dtfd_err2; | |
| } | |
| file_close(fh); | |
| trk->write = FALSE; | |
| dtfd_exit: | |
| return(SUCCESS); | |
| dtfd_err2: | |
| file_close(fh); | |
| dtfd_err1: | |
| return(FAILURE); | |
| } | |
| static D88TRK trackread(D88TRK trk, FDDFILE fdd, REG8 media, UINT track) { | |
| FILEH fh; | |
| UINT32 fptr; | |
| UINT32 size; | |
| trackflush(trk); | |
| if (media != (REG8)((fdd->inf.d88.head.fd_type >> 4))) { | |
| goto dtrd_err1; | |
| } | |
| if (track >= 164) { | |
| goto dtrd_err1; | |
| } | |
| fptr = fdd->inf.d88.ptr[track]; | |
| if (fptr == 0) { | |
| goto dtrd_err1; | |
| } | |
| size = nexttrackptr(fdd, fptr, fdd->inf.d88.fd_size) - fptr; | |
| if (size > D88BUFSIZE) { | |
| size = D88BUFSIZE; | |
| } | |
| fh = file_open_rb(fdd->fname); | |
| if (fh == FILEH_INVALID) { | |
| goto dtrd_err1; | |
| } | |
| if ((file_seek(fh, (long)fptr, FSEEK_SET) != (long)fptr) || | |
| (file_read(fh, trk->buf, size) != size)) { | |
| goto dtrd_err2; | |
| } | |
| file_close(fh); | |
| trk->fdd = fdd; | |
| trk->media = media; | |
| trk->write = FALSE; | |
| trk->track = track; | |
| trk->fptr = fptr; | |
| trk->size = size; | |
| return(trk); | |
| dtrd_err2: | |
| file_close(fh); | |
| dtrd_err1: | |
| return(NULL); | |
| } | |
| static void drvflush(FDDFILE fdd) { | |
| D88TRK trk; | |
| trk = &d88trk; | |
| if (trk->fdd == fdd) { | |
| trackflush(trk); | |
| } | |
| } | |
| static D88TRK trackseek(FDDFILE fdd, REG8 media, UINT track) { | |
| D88TRK trk; | |
| trk = &d88trk; | |
| if ((trk->fdd != fdd) || (trk->media != media) || (trk->track != track)) { | |
| trk = trackread(trk, fdd, media, track); | |
| } | |
| return(trk); | |
| } | |
| static D88SEC sectorseek(const _D88TRK *trk, REG8 r) { | |
| const _D88SEC *sec; | |
| UINT rem; | |
| UINT secnum; | |
| UINT sectors; | |
| UINT size; | |
| sec = (D88SEC)trk->buf; | |
| rem = trk->size; | |
| sectors = LOADINTELWORD(sec->sectors); | |
| if (sectors) { | |
| secnum = 0; | |
| do { | |
| size = LOADINTELWORD(sec->size); | |
| size += sizeof(_D88SEC); | |
| if (rem < size) { | |
| break; | |
| } | |
| if (sec->r == r) { | |
| return((D88SEC)sec); | |
| } | |
| secnum++; | |
| sectors = LOADINTELWORD(sec->sectors); | |
| if (secnum >= sectors) { | |
| break; | |
| } | |
| sec = (D88SEC)(((UINT8 *)sec) + size); | |
| } while(secnum < 40); | |
| } | |
| return(NULL); | |
| } | |
| // ---- | |
| static REG8 fddd88_seek(FDDFILE fdd, REG8 media, UINT track) { | |
| if (trackseek(fdd, media, track) != NULL) { | |
| return(0x00); | |
| } | |
| else { | |
| return(FDDSTAT_SEEKERR); | |
| } | |
| } | |
| static REG8 fddd88_read(FDDFILE fdd, REG8 media, UINT track, REG8 sc, | |
| UINT8 *ptr, UINT *size) { | |
| const _D88TRK *trk; | |
| const _D88SEC *sec; | |
| UINT secsize; | |
| REG8 ret; | |
| TRACEOUT(("d88 read %d:%.2x", track, sc)); | |
| trk = trackseek(fdd, media, track); | |
| if (trk == NULL) { | |
| goto fd8r_err; | |
| } | |
| sec = sectorseek(trk, sc); | |
| if (sec == NULL) { | |
| goto fd8r_err; | |
| } | |
| ret = 0x00; | |
| if (sec->del_flg) { | |
| ret |= FDDSTAT_RECTYPE; | |
| } | |
| if (sec->stat) { | |
| ret |= FDDSTAT_CRCERR; | |
| } | |
| secsize = LOADINTELWORD(sec->size); | |
| secsize = min(secsize, *size); | |
| if ((ptr) && (secsize)) { | |
| CopyMemory(ptr, sec + 1, secsize); | |
| } | |
| *size = secsize; | |
| return(ret); | |
| fd8r_err: | |
| return(FDDSTAT_RECNFND); | |
| } | |
| static REG8 fddd88_write(FDDFILE fdd, REG8 media, UINT track, REG8 sc, | |
| const UINT8 *ptr, UINT size) { | |
| D88TRK trk; | |
| D88SEC sec; | |
| UINT secsize; | |
| TRACEOUT(("d88 write %d:%.2x", track, sc)); | |
| trk = trackseek(fdd, media, track); | |
| if (trk == NULL) { | |
| goto fd8w_err; | |
| } | |
| sec = sectorseek(trk, sc); | |
| if (sec == NULL) { | |
| goto fd8w_err; | |
| } | |
| secsize = LOADINTELWORD(sec->size); | |
| size = min(size, secsize); | |
| if (size) { | |
| CopyMemory(sec + 1, ptr, size); | |
| trk->write = TRUE; | |
| } | |
| return(0x00); | |
| fd8w_err: | |
| return(FDDSTAT_RECNFND | FDDSTAT_WRITEFAULT); | |
| } | |
| static REG8 fddd88_crc(FDDFILE fdd, REG8 media, UINT track, UINT num, | |
| UINT8 *ptr) { | |
| const _D88TRK *trk; | |
| const _D88SEC *sec; | |
| UINT secnum; | |
| UINT rem; | |
| UINT size; | |
| UINT sectors; | |
| trk = trackseek(fdd, media, track); | |
| if (trk == NULL) { | |
| return(FDDSTAT_RECNFND); | |
| } | |
| sec = (D88SEC)trk->buf; | |
| sectors = LOADINTELWORD(sec->sectors); | |
| if (sectors == 0) { | |
| return(FDDSTAT_RECNFND); | |
| } | |
| secnum = 0; | |
| rem = trk->size; | |
| while(1) { | |
| size = LOADINTELWORD(sec->size); | |
| size += sizeof(_D88SEC); | |
| if (rem < size) { | |
| return(FDDSTAT_RECNFND); | |
| } | |
| if (num == secnum) { | |
| break; | |
| } | |
| secnum++; | |
| sectors = LOADINTELWORD(sec->sectors); | |
| if (secnum >= sectors) { | |
| return(FDDSTAT_RECNFND); | |
| } | |
| sec = (D88SEC)(((UINT8 *)sec) + size); | |
| } | |
| ptr[0] = sec->c; | |
| ptr[1] = sec->h; | |
| ptr[2] = sec->r; | |
| ptr[3] = sec->n; | |
| ptr[4] = 0; | |
| ptr[5] = 0; | |
| // fdc.s.rreg = sec->c; // メルヘンヴェール | |
| if (sec->stat) { | |
| return(FDDSTAT_CRCERR); | |
| } | |
| return(0x00); | |
| } | |
| // ---- | |
| BRESULT fddd88_set(FDDFILE fdd, const OEMCHAR *fname) { | |
| short attr; | |
| FILEH fh; | |
| BOOL r; | |
| UINT8 ptr[D88_TRACKMAX][4]; | |
| UINT i; | |
| attr = file_attr(fname); | |
| if (attr & 0x18) { | |
| goto fdst_err; | |
| } | |
| fh = file_open_rb(fname); | |
| if (fh == FILEH_INVALID) { | |
| goto fdst_err; | |
| } | |
| 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); | |
| if (r) { | |
| goto fdst_err; | |
| } | |
| 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; | |
| } | |
| fdd->type = DISKTYPE_D88; | |
| fdd->protect = (UINT8)(attr & 1); | |
| fdd->seek = fddd88_seek; | |
| fdd->read = fddd88_read; | |
| fdd->write = fddd88_write; | |
| fdd->crc = fddd88_crc; | |
| return(SUCCESS); | |
| fdst_err: | |
| return(FAILURE); | |
| } | |
| void fddd88_eject(FDDFILE fdd) { | |
| drvflush(fdd); | |
| } | |
| // --------------------------------------------------------------------------- | |
| #if 0 | |
| // ---- | |
| 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 19 static BYTE curwrite = 0; | Line 373 static BYTE curwrite = 0; |
| static BYTE curtrkerr = 0; | static BYTE curtrkerr = 0; |
| static BYTE hole = 0; | static BYTE hole = 0; |
| static BYTE *curdata; | static BYTE *curdata; |
| static UINT crcnum = 0; | // static UINT crcnum = 0; |
| static BYTE crcerror = FALSE; | // static BYTE crcerror = FALSE; |
| extern WORD readdiag; | extern WORD readdiag; |
| Line 69 static BYTE TAO_BUF[0x3000]; | Line 423 static BYTE TAO_BUF[0x3000]; |
| //---------------------------------------------------------------------- | //---------------------------------------------------------------------- |
| static UINT32 nexttrackptr(FDDFILE fdd, UINT32 fptr, UINT32 last) { | |
| UINT t; | static int curdataflush(void) { |
| UINT32 cur; | |
| for (t=0; t<164; t++) { | |
| cur = fdd->inf.d88.ptr[t]; | |
| if ((cur > fptr) && (cur < last)) { | |
| last = cur; | |
| } | |
| } | |
| return(last); | |
| } | |
| int curdataflush(void) { | |
| FDDFILE fdd; | FDDFILE fdd; |
| FILEH fh; | FILEH fh; |
| Line 113 int curdataflush(void) { | Line 453 int curdataflush(void) { |
| } | } |
| static DWORD read_d88track(REG8 drv, UINT track, BYTE type) { | static DWORD read_d88track(REG8 drv, UINT track, REG8 media) { |
| FDDFILE fdd; | FDDFILE fdd; |
| FILEH hdr; | FILEH hdr; |
| Line 121 static DWORD read_d88track(REG8 drv, UIN | Line 461 static DWORD read_d88track(REG8 drv, UIN |
| curdataflush(); | curdataflush(); |
| curdrv = drv; | curdrv = drv; |
| curtrk = track; | curtrk = track; |
| curtype = type; | curtype = media; |
| cursct = (UINT)-1; | cursct = (UINT)-1; |
| curwrite = 0; | curwrite = 0; |
| curtrkerr = 0; | curtrkerr = 0; |
| crcnum = 0; | // crcnum = 0; |
| crcerror = 0; | crcerror = 0; |
| fdd = fddfile + drv; | fdd = fddfile + drv; |
| if ((drv < 0) || (drv > 3) || (track > 163) || | if ((drv < 0) || (drv > 3) || (track > 163) || |
| ((type == 0) && (fdd->inf.d88.head.fd_type == 0x20)) || | (media != (fdd->inf.d88.head.fd_type >> 4)) || |
| ((type == 1) && (fdd->inf.d88.head.fd_type != 0x20)) || | |
| ((curfp = fdd->inf.d88.ptr[track]) == 0) || | ((curfp = fdd->inf.d88.ptr[track]) == 0) || |
| ((cursize = nexttrackptr(fdd, curfp, | ((cursize = nexttrackptr(fdd, curfp, |
| fdd->inf.d88.fd_size) - curfp) > 0x4000)) { | fdd->inf.d88.fd_size) - curfp) > 0x4000)) { |
| Line 173 const _D88SEC *p; | Line 512 const _D88SEC *p; |
| UINT sectors; | UINT sectors; |
| UINT secsize; | UINT secsize; |
| if ((curdrv != drv) || (curtrk != track) || (curtype != fdc.media)) { | if ((curdrv != drv) || (curtrk != track) || (curtype != fdc.s.media)) { |
| read_d88track(drv, track, fdc.media); | read_d88track(drv, track, fdc.s.media); |
| } | } |
| if (curtrkerr) { | if (curtrkerr) { |
| cursct = r; | cursct = r; |
| Line 211 seekerror:; | Line 550 seekerror:; |
| return(FALSE); | return(FALSE); |
| } | } |
| static void drvflush(REG8 drv) { | |
| if (curdrv == drv) { | // ---- |
| curdataflush(); | |
| curdrv = (REG8)-1; | |
| curtrk = (UINT)-1; | |
| cursct = (UINT)-1; | |
| } | |
| } | |
| //********************************************************************** | //********************************************************************** |
| short fdd_crc_d88(void) { | |
| UINT track; | |
| const _D88SEC *p; | |
| UINT sec; | |
| UINT sectors; | |
| UINT secsize; | |
| ZeroMemory(fdc.crc_dat, 6); | |
| track = (fdc.c << 1) + fdc.h; | |
| if (track >= 164) { | |
| goto crcerror_d88; | |
| } | |
| seeksector(fdc.drv, track, fdc.r); | |
| if (curtrkerr) { | |
| goto crcerror_d88; | |
| } | |
| p = (D88SEC)D88_BUF; | |
| for (sec=0; sec<crcnum;) { | |
| sectors = LOADINTELWORD(p->sectors); | |
| secsize = LOADINTELWORD(p->size); | |
| sec++; | |
| if (sec >= sectors) { | |
| goto crcerror_d88; | |
| } | |
| p = (D88SEC)(((UINT8 *)(p + 1)) + secsize); | |
| } | |
| fdc.rreg = p->c; // メルヘンヴェール | |
| fdc.crc_dat[0] = p->c; | |
| fdc.crc_dat[1] = p->h; | |
| fdc.crc_dat[2] = p->r; | |
| fdc.crc_dat[3] = p->n; | |
| crcnum++; | |
| if (p->stat) { | |
| crcerror = TRUE; | |
| } | |
| else { | |
| crcerror = FALSE; | |
| } | |
| return(0); | |
| crcerror_d88:; | |
| crcerror = TRUE; | |
| return(1); | |
| } | |
| BYTE fdd_stat_d88(void) { | BYTE fdd_stat_d88(void) { |
| Line 282 BYTE fdd_stat_d88(void) { | Line 569 BYTE fdd_stat_d88(void) { |
| BYTE ans = 0; | BYTE ans = 0; |
| int seekable; | int seekable; |
| fdd = fddfile + fdc.drv; | fdd = fddfile + fdc.s.drv; |
| if (fdd->type != DISKTYPE_D88) { | if (fdd->type != DISKTYPE_D88) { |
| return(0x80); // NOT READY | return(0x80); // NOT READY |
| } | } |
| type = fdc.type; | cmd = (REG8)(fdc.s.cmd >> 4); |
| cmd = (REG8)(fdc.cmd >> 4); | type = fdc.s.type; |
| trk = (fdc.c << 1) + fdc.h; | trk = (fdc.s.c << 1) + fdc.s.h; |
| seekable = seeksector(fdc.drv, trk, fdc.r); | seekable = seeksector(fdc.s.drv, trk, fdc.s.r); |
| if (!fdc.r) { | if (!fdc.s.r) { |
| seekable = TRUE; | seekable = TRUE; |
| } | } |
| Line 301 BYTE fdd_stat_d88(void) { | Line 588 BYTE fdd_stat_d88(void) { |
| } | } |
| } | } |
| if (type == 2 || cmd == 0x0f) { | if (type == 2 || cmd == 0x0f) { |
| if (fdc.r && cursec.del_flg) { | if (fdc.s.r && cursec.del_flg) { |
| ans |= 0x20; // RECODE TYPE / WRITE FAULT | ans |= 0x20; // RECODE TYPE / WRITE FAULT |
| } | } |
| } | } |
| Line 309 BYTE fdd_stat_d88(void) { | Line 596 BYTE fdd_stat_d88(void) { |
| if ((trk > 163) || (!seekable)) { | if ((trk > 163) || (!seekable)) { |
| ans |= 0x10; // SEEK ERROR / RECORD NOT FOUND | ans |= 0x10; // SEEK ERROR / RECORD NOT FOUND |
| } | } |
| if ((!(ans & 0xf0)) && fdc.r && (cursec.stat)) { | if ((!(ans & 0xf0)) && fdc.s.r && (cursec.stat)) { |
| ans |= 0x08; // CRC ERROR | ans |= 0x08; // CRC ERROR |
| } | } |
| } | } |
| Line 324 BYTE fdd_stat_d88(void) { | Line 611 BYTE fdd_stat_d88(void) { |
| if (type == 1 || type == 4) { | if (type == 1 || type == 4) { |
| if (type == 1) { // ver0.25 | if (type == 1) { // ver0.25 |
| ans |= 0x20; // HEAD ENGAGED (X1 デハ ツネニ 1) | ans |= 0x20; // HEAD ENGAGED (X1 デハ ツネニ 1) |
| if (!fdc.c) { // TRACK00 | if (!fdc.s.c) { // TRACK00 |
| ans |= 0x04; | ans |= 0x04; |
| } | } |
| } | } |
| Line 342 BYTE fdd_stat_d88(void) { | Line 629 BYTE fdd_stat_d88(void) { |
| ans |= 0x03; // DATA REQUEST / BUSY | ans |= 0x03; // DATA REQUEST / BUSY |
| } | } |
| } | } |
| else if ((cmd == 0x0e) && (readdiag < 0x1a00)) { | else if ((cmd == 0x0c) && (fdc.s.bufpos < 6)) { |
| ans |= 0x03; | ans |= 0x03; |
| } | } |
| else if ((cmd == 0x0c) && (fdc.crc_off < 6)) { // ver0.25 | else if ((cmd == 0x0e) && (readdiag < 0x1a00)) { |
| ans |= 0x03; | ans |= 0x03; |
| } | } |
| else if (cmd == 0x0f) { | else if (cmd == 0x0f) { |
| Line 366 BYTE fdd_stat_d88(void) { | Line 653 BYTE fdd_stat_d88(void) { |
| void fdd_read_d88(void) { | void fdd_read_d88(void) { |
| // POCO:読めなかったらレジスタを変更させない | // POCO:読めなかったらレジスタを変更させない |
| if ((fdd_stat_d88() & 0xf3) == 3) { | if ((fdd_stat_d88() & 0xf3) == 3) { |
| fdc.data = curdata[fdc.off]; | fdc.s.data = curdata[fdc.off]; |
| } | } |
| } | } |
| void fdd_write_d88(void) { | void fdd_write_d88(void) { |
| if ((fdd_stat_d88() & 0xf3) == 3) { | if ((fdd_stat_d88() & 0xf3) == 3) { |
| curdata[fdc.off] = fdc.data; | curdata[fdc.off] = fdc.s.data; |
| curwrite = 1; | curwrite = 1; |
| } | } |
| } | } |
| Line 384 BYTE fdd_incoff_d88(void) { | Line 671 BYTE fdd_incoff_d88(void) { |
| UINT trk; | UINT trk; |
| UINT secsize; | UINT secsize; |
| cmd = (REG8)(fdc.cmd >> 4); | cmd = (REG8)(fdc.s.cmd >> 4); |
| trk = (fdc.c << 1) + fdc.h; | trk = (fdc.s.c << 1) + fdc.s.h; |
| seeksector(fdc.drv, trk, fdc.r); | seeksector(fdc.s.drv, trk, fdc.s.r); |
| fdc.off++; | fdc.off++; |
| secsize = LOADINTELWORD(cursec.size); | secsize = LOADINTELWORD(cursec.size); |
| if ((UINT)fdc.off < secsize) { | if ((UINT)fdc.off < secsize) { |
| Line 394 BYTE fdd_incoff_d88(void) { | Line 681 BYTE fdd_incoff_d88(void) { |
| } | } |
| fdc.off = secsize; | fdc.off = secsize; |
| if ((cmd == 0x09) || (cmd == 0x0b)) { | if ((cmd == 0x09) || (cmd == 0x0b)) { |
| fdc.rreg = fdc.r + 1; // ver0.25 | fdc.s.rreg = fdc.s.r + 1; // ver0.25 |
| if (seeksector(fdc.drv, trk, fdc.rreg)) { | if (seeksector(fdc.s.drv, trk, fdc.s.rreg)) { |
| fdc.r++; | fdc.s.r++; |
| fdc.off = 0; | fdc.off = 0; |
| return(0); | return(0); |
| } | } |
| Line 411 void init_tao_d88(void) { | Line 698 void init_tao_d88(void) { |
| FDDFILE fdd; | FDDFILE fdd; |
| fdd = fddfile + fdc.drv; | fdd = fddfile + fdc.s.drv; |
| if ((fdc.media == 0) && (fdd->inf.d88.head.fd_type != 0x20)) { | if (fdc.s.media != (fdd->inf.d88.head.fd_type >> 4)) { |
| tao = WID_ERR; | |
| } | |
| if (fdc.s.media == DISKTYPE_2D) { | |
| tao = WID_2D; | tao = WID_2D; |
| } | } |
| else if ((fdc.media == 1) && (fdd->inf.d88.head.fd_type == 0x20)) { | else if (fdc.s.media == DISKTYPE_2HD) { |
| tao = WID_2HD; | tao = WID_2HD; |
| } | } |
| else { | else { |
| Line 459 static int fileappend(FILEH hdl, FDDFILE | Line 749 static int fileappend(FILEH hdl, FDDFILE |
| return(0); | return(0); |
| } | } |
| void endoftrack(void) { | static void endoftrack(void) { |
| FDDFILE fdd; | FDDFILE fdd; |
| FILEH hdr; | FILEH hdr; |
| Line 483 void endoftrack(void) { | Line 773 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 |
| fdd = fddfile + fdc.drv; | fdd = fddfile + fdc.s.drv; |
| trk = (fdc.c << 1) + fdc.h; | trk = (fdc.s.c << 1) + fdc.s.h; |
| p = (D88SEC)TAO_BUF; | p = (D88SEC)TAO_BUF; |
| for (i=0; i<(int)tao.sector; i++) { | for (i=0; i<(int)tao.sector; i++) { |
| Line 650 void fdd_wtao_d88(BYTE data) { | Line 940 void fdd_wtao_d88(BYTE data) { |
| break; | break; |
| } | } |
| } | } |
| #endif | |
| // ---- | |
| BRESULT fddd88_eject(FDDFILE fdd, REG8 drv) { | |
| drvflush(drv); | |
| ZeroMemory(&fdd->inf.d88, sizeof(fdd->inf.d88)); | |
| fdd->fname[0] = '\0'; | |
| fdd->type = DISKTYPE_NOTREADY; | |
| return(SUCCESS); | |
| } | |
| BRESULT fddd88_set(FDDFILE fdd, REG8 drv, const OEMCHAR *fname) { | |
| short attr; | |
| FILEH fh; | |
| BOOL r; | |
| UINT8 ptr[D88_TRACKMAX][4]; | |
| UINT i; | |
| attr = file_attr(fname); | |
| if (attr & 0x18) { | |
| goto fdst_err; | |
| } | |
| fh = file_open_rb(fname); | |
| if (fh == FILEH_INVALID) { | |
| goto fdst_err; | |
| } | |
| 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); | |
| if (r) { | |
| goto fdst_err; | |
| } | |
| 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; | |
| } | |
| fdd->type = DISKTYPE_D88; | |
| fdd->protect = (UINT8)(attr & 1); | |
| milstr_ncpy(fdd->fname, fname, NELEMENTS(fdd->fname)); | |
| return(SUCCESS); | |
| fdst_err: | |
| return(FAILURE); | |
| } | |