|
|
| version 1.2, 2004/08/02 11:48:13 | version 1.3, 2004/08/02 13:38:46 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "dosio.h" | #include "dosio.h" |
| #include "pccore.h" | #include "pccore.h" |
| #include "x1_io.h" | #include "iocore.h" |
| #include "x1_fdc.h" | |
| #include "fdd_mtr.h" | |
| #include "fdd_d88.h" | |
| #include "fddfile.h" | #include "fddfile.h" |
| #include "fdd_d88.h" | |
| #include "fdd_mtr.h" | |
| static D88_HEADER d88head[4]; | static D88_HEADER d88head[4]; |
| Line 23 static BYTE *curdata; | Line 22 static BYTE *curdata; |
| static WORD crcnum = 0; | static WORD crcnum = 0; |
| static BYTE crcerror = FALSE; | static BYTE crcerror = FALSE; |
| extern BYTE WRITEPT[]; | |
| extern BYTE DISKNUM[]; | |
| extern WORD readdiag; | extern WORD readdiag; |
| #define TAO_MODE_GAP 0x4e | #define TAO_MODE_GAP 0x4e |
| Line 270 crcerror_d88:; | Line 266 crcerror_d88:; |
| BYTE fdd_stat_d88(void) { | BYTE fdd_stat_d88(void) { |
| BYTE type, cmnd; | FDDFILE fdd; |
| BYTE type; | |
| REG8 cmd; | |
| BYTE ans = 0; | BYTE ans = 0; |
| int seekable; | int seekable; |
| WORD trk; | WORD trk; |
| if (DISKNUM[fdc.drv] == DRV_EMPTY) { | fdd = fddfile + fdc.drv; |
| if (fdd->type != DISKTYPE_D88) { | |
| return(0x80); // NOT READY | return(0x80); // NOT READY |
| } | } |
| type = fdc.type; | type = fdc.type; |
| cmnd = (BYTE)(fdc.cmnd >> 4); | cmd = (REG8)(fdc.cmd >> 4); |
| trk = (fdc.c << 1) + (WORD)fdc.h; | trk = (fdc.c << 1) + (WORD)fdc.h; |
| seekable = seeksector(fdc.drv, trk, fdc.r); | seekable = seeksector(fdc.drv, trk, fdc.r); |
| if (!fdc.r) { | if (!fdc.r) { |
| Line 287 BYTE fdd_stat_d88(void) { | Line 286 BYTE fdd_stat_d88(void) { |
| } | } |
| if (type == 0 || type == 1 || type == 4 || | if (type == 0 || type == 1 || type == 4 || |
| cmnd == 0x0a || cmnd == 0x0b || cmnd == 0x0f) { | cmd == 0x0a || cmd == 0x0b || cmd == 0x0f) { |
| if (d88head[fdc.drv].protect & 0x10) { // WRITE PROTECT | if (fdd->protect) { // WRITE PROTECT |
| ans |= 0x40; | ans |= 0x40; |
| } | } |
| } | } |
| if (type == 2 || cmnd == 0x0f) { | if (type == 2 || cmd == 0x0f) { |
| if (fdc.r && cursec.del_flg) { | if (fdc.r && cursec.del_flg) { |
| ans |= 0x20; // RECODE TYPE / WRITE FAULT | ans |= 0x20; // RECODE TYPE / WRITE FAULT |
| } | } |
| Line 305 BYTE fdd_stat_d88(void) { | Line 304 BYTE fdd_stat_d88(void) { |
| ans |= 0x08; // CRC ERROR | ans |= 0x08; // CRC ERROR |
| } | } |
| } | } |
| if (cmnd == 0x0c) { | if (cmd == 0x0c) { |
| if (curtrkerr) { | if (curtrkerr) { |
| ans |= 0x10; | ans |= 0x10; |
| } | } |
| Line 331 BYTE fdd_stat_d88(void) { | Line 330 BYTE fdd_stat_d88(void) { |
| if ((type == 2) && ((WORD)fdc.off < cursec.size)) { | if ((type == 2) && ((WORD)fdc.off < cursec.size)) { |
| ans |= 0x03; // DATA REQUEST / BUSY | ans |= 0x03; // DATA REQUEST / BUSY |
| } | } |
| else if ((cmnd == 0x0e) && (readdiag < 0x1a00)) { | else if ((cmd == 0x0e) && (readdiag < 0x1a00)) { |
| ans |= 0x03; | ans |= 0x03; |
| } | } |
| else if ((cmnd == 0x0c) && (fdc.crc_off < 6)) { // ver0.25 | else if ((cmd == 0x0c) && (fdc.crc_off < 6)) { // ver0.25 |
| ans |= 0x03; | ans |= 0x03; |
| } | } |
| else if (cmnd == 0x0f) { | else if (cmd == 0x0f) { |
| if (tao.flag == 3) { | if (tao.flag == 3) { |
| if (++tao.lostdatacnt > LOSTDATA_COUNT) { | if (++tao.lostdatacnt > LOSTDATA_COUNT) { |
| tao.flag = 4; | tao.flag = 4; |
| Line 372 void fdd_write_d88(void) { | Line 371 void fdd_write_d88(void) { |
| BYTE fdd_incoff_d88(void) { | BYTE fdd_incoff_d88(void) { |
| BYTE cmnd; | REG8 cmd; |
| WORD trk; | WORD trk; |
| cmnd = (BYTE)(fdc.cmnd >> 4); | cmd = (REG8)(fdc.cmd >> 4); |
| trk = (fdc.c << 1) + (WORD)fdc.h; | trk = (fdc.c << 1) + (WORD)fdc.h; |
| seeksector(fdc.drv, trk, fdc.r); | seeksector(fdc.drv, trk, fdc.r); |
| if ((WORD)(++fdc.off) < cursec.size) { | if ((WORD)(++fdc.off) < cursec.size) { |
| return(0); | return(0); |
| } | } |
| fdc.off = cursec.size; | fdc.off = cursec.size; |
| if (cmnd == 0x09 || cmnd == 0x0b) { | if ((cmd == 0x09) || (cmd == 0x0b)) { |
| fdc.rreg = fdc.r + 1; // ver0.25 | fdc.rreg = fdc.r + 1; // ver0.25 |
| if (seeksector(fdc.drv, trk, fdc.rreg)) { | if (seeksector(fdc.drv, trk, fdc.rreg)) { |
| fdc.r++; | fdc.r++; |
| Line 625 void fdd_wtao_d88(BYTE data) { | Line 624 void fdd_wtao_d88(BYTE data) { |
| // ---- | // ---- |
| BRESULT fddd88_eject(REG8 drv) { | BRESULT fddd88_eject(FDDFILE fdd, REG8 drv) { |
| FDDFILE fdd; | |
| drvflush(drv); | drvflush(drv); |
| fdd = fddfile + drv; | |
| ZeroMemory(&d88head[drv], sizeof(D88_HEADER)); | ZeroMemory(&d88head[drv], sizeof(D88_HEADER)); |
| fdd->fname[0] = '\0'; | fdd->fname[0] = '\0'; |
| DISKNUM[drv] = 0; | fdd->type = DISKTYPE_NOTREADY; |
| return(SUCCESS); | return(SUCCESS); |
| } | } |
| BRESULT fddd88_set(REG8 drv, const OEMCHAR *fname) { | BRESULT fddd88_set(FDDFILE fdd, REG8 drv, const OEMCHAR *fname) { |
| FDDFILE fdd; | |
| short attr; | short attr; |
| FILEH fh; | FILEH fh; |
| UINT rsize; | UINT rsize; |
| fdd = fddfile + drv; | |
| attr = file_attr(fname); | attr = file_attr(fname); |
| if (attr & 0x18) { | if (attr & 0x18) { |
| goto fdst_err; | goto fdst_err; |
| Line 658 BRESULT fddd88_set(REG8 drv, const OEMCH | Line 652 BRESULT fddd88_set(REG8 drv, const OEMCH |
| if (rsize != sizeof(D88_HEADER)) { | if (rsize != sizeof(D88_HEADER)) { |
| goto fdst_err; | goto fdst_err; |
| } | } |
| if (attr & 1) { | if (d88head[drv].protect & 0x10) { |
| d88head[drv].protect |= (WORD)0x10; | attr |= 1; |
| } | } |
| milstr_ncpy(fdd->fname, fname, NELEMENTS(fdd->fname)); | milstr_ncpy(fdd->fname, fname, NELEMENTS(fdd->fname)); |
| DISKNUM[drv] = 1; | fdd->type = DISKTYPE_D88; |
| fdd->protect = (UINT8)(attr & 1); | |
| return(SUCCESS); | return(SUCCESS); |
| fdst_err: | fdst_err: |