|
|
| version 1.2, 2004/08/02 11:48:13 | version 1.5, 2004/08/09 04:47:53 |
|---|---|
| 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 "fddfile.h" | #include "fddfile.h" |
| #include "fdd_2d.h" | |
| #include "fdd_mtr.h" | #include "fdd_mtr.h" |
| extern BYTE WRITEPT[]; | |
| extern BYTE DISKNUM[]; | |
| static WORD sec_now[4] = {0, 0, 0, 0}; | static WORD sec_now[4] = {0, 0, 0, 0}; |
| static BYTE sec_write[4] = {0, 0, 0, 0}; | static BYTE sec_write[4] = {0, 0, 0, 0}; |
| static BYTE sec_data[4][256]; | static BYTE sec_data[4][256]; |
| static BYTE hole = 0; | static BYTE hole = 0; |
| BYTE changesector2d(void) { | static BYTE changesector2d(void) { |
| FDDFILE fdd; | FDDFILE fdd; |
| FILEH fh; | FILEH fh; |
| Line 23 BYTE changesector2d(void) { | Line 21 BYTE changesector2d(void) { |
| long seekp; | long seekp; |
| short drv = fdc.drv; | short drv = fdc.drv; |
| if (fdc.media) { | if (fdc.s.media != DISKTYPE_2D) { |
| return(1); | return(1); |
| } | } |
| fdd = fddfile + drv; | fdd = fddfile + drv; |
| Line 64 BYTE changesector2d(void) { | Line 62 BYTE changesector2d(void) { |
| //********************************************************************** | //********************************************************************** |
| short fdd_crc_2d(void) { | BRESULT fdd2d_crc(FDDFILE fdd) { |
| fdc.crc_dat[0] = fdc.c; | fdc.s.buffer[0] = fdc.c; |
| fdc.crc_dat[1] = fdc.h; | fdc.s.buffer[1] = fdc.h; |
| fdc.crc_dat[2] = fdc.r; | fdc.s.buffer[2] = fdc.r; |
| fdc.crc_dat[3] = 1; | fdc.s.buffer[3] = 1; |
| fdc.crc_dat[4] = 0; // CRC(Lo) | fdc.s.buffer[4] = 0; // CRC(Lo) |
| fdc.crc_dat[5] = 0; // CRC(Hi) | fdc.s.buffer[5] = 0; // CRC(Hi) |
| fdc.rreg = fdc.c; // ??? メルヘンヴェール | fdc.s.bufsize = 6; |
| return(0); | fdc.rreg = fdc.c; // メルヘンヴェール |
| (void)fdd; | |
| return(SUCCESS); | |
| } | } |
| BYTE fdd_stat_2d(void) { | BYTE fdd_stat_2d(void) { |
| BYTE type, cmnd; | FDDFILE fdd; |
| REG8 cmd; | |
| BYTE type; | |
| BYTE ans = 0; | BYTE ans = 0; |
| fdd = fddfile + fdc.drv; | |
| // NOT READY | // NOT READY |
| if (DISKNUM[fdc.drv] != DRV_FMT2D) { | if (fdd->type != DISKTYPE_BETA) { |
| return(0x80); | return(0x80); |
| } | } |
| type = fdc.type; | type = fdc.type; |
| cmnd = (BYTE)(fdc.cmnd >> 4); | cmd = (REG8)(fdc.cmd >> 4); |
| 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 (WRITEPT[fdc.drv]) { // WRITE PROTECT | if (fdd->protect) { // WRITE PROTECT |
| ans |= 0x40; | ans |= 0x40; |
| } | } |
| } | } |
| if ((type == 1 || type == 2) && | if ((type == 1 || type == 2) && |
| ((fdc.c >= 40) || (fdc.h > 1) || (fdc.r > 16) || (fdc.media))) { | ((fdc.c >= 40) || (fdc.h > 1) || (fdc.r > 16) || |
| (fdc.s.media != DISKTYPE_2D))) { | |
| ans |= 0x10; // SEEK ERROR / RECORD NOT FOUND | ans |= 0x10; // SEEK ERROR / RECORD NOT FOUND |
| } | } |
| Line 118 BYTE fdd_stat_2d(void) { | Line 123 BYTE fdd_stat_2d(void) { |
| if ((type == 2) && (fdc.r) && (fdc.off < 256)) { | if ((type == 2) && (fdc.r) && (fdc.off < 256)) { |
| ans |= 0x03; // DATA REQUEST / BUSY | ans |= 0x03; // DATA REQUEST / BUSY |
| } | } |
| else if (cmnd == 0x0f) { | else if (cmd == 0x0f) { |
| ans |= 0x04; // error! | ans |= 0x04; // error! |
| } | } |
| } | } |
| Line 147 void fdd_write_2d(void) { | Line 152 void fdd_write_2d(void) { |
| BYTE fdd_incoff_2d(void) { | BYTE fdd_incoff_2d(void) { |
| BYTE cmnd; | REG8 cmd; |
| if (++fdc.off < 256) { | if (++fdc.off < 256) { |
| return(0); | return(0); |
| } | } |
| cmnd = (BYTE)(fdc.cmnd >> 4); | cmd = (REG8)(fdc.cmd >> 4); |
| if (cmnd == 0x09 || cmnd == 0x0b) { | if ((cmd == 0x09) || (cmd == 0x0b)) { |
| if (fdc.r < 16) { | if (fdc.r < 16) { |
| fdc.r++; | fdc.r++; |
| fdc.rreg++; | fdc.rreg++; |
| Line 170 BYTE fdd_incoff_2d(void) { | Line 175 BYTE fdd_incoff_2d(void) { |
| // ---- | // ---- |
| BRESULT fdd2d_eject(REG8 drv) { | BRESULT fdd2d_set(FDDFILE fdd, REG8 drv, const OEMCHAR *fname) { |
| short attr; | |
| attr = file_attr(fname); | |
| if (attr & 0x18) { | |
| return(FAILURE); | |
| } | |
| fdd->type = DISKTYPE_BETA; | |
| fdd->protect = (UINT8)(attr & 1); | |
| sec_now[drv] = -1; | |
| sec_write[drv] = 0; | |
| return(SUCCESS); | |
| } | |
| BRESULT fdd2d_eject(FDDFILE fdd, REG8 drv) { | |
| FDDFILE fdd; | |
| FILEH fh; | FILEH fh; |
| long seekp; | long seekp; |
| BRESULT ret = 0; | BRESULT ret = 0; |
| fdd = fddfile + drv; | |
| while(1) { | while(1) { |
| if ((!sec_write[drv]) || (sec_now[drv] == -1)) { | if ((!sec_write[drv]) || (sec_now[drv] == -1)) { |
| break; | break; |
| Line 198 BRESULT fdd2d_eject(REG8 drv) { | Line 216 BRESULT fdd2d_eject(REG8 drv) { |
| break; | break; |
| } | } |
| fdd->fname[0] = '\0'; | fdd->fname[0] = '\0'; |
| DISKNUM[drv] = 0; | fdd->type = DISKTYPE_NOTREADY; |
| sec_now[drv] = -1; | sec_now[drv] = -1; |
| sec_write[drv] = 0; | sec_write[drv] = 0; |
| return(ret); | return(ret); |
| } | } |
| BRESULT fdd2d_set(REG8 drv, const OEMCHAR *fname) { | |
| FDDFILE fdd; | |
| short attr; | |
| fdd = fddfile + drv; | |
| attr = file_attr(fname); | |
| if (attr & 0x18) { | |
| return(FAILURE); | |
| } | |
| DISKNUM[drv] = DRV_FMT2D; | |
| file_cpyname(fdd->fname, fname, NELEMENTS(fdd->fname)); | |
| WRITEPT[drv] = (BYTE)(attr & 1); | |
| sec_now[drv] = -1; | |
| sec_write[drv] = 0; | |
| return(SUCCESS); | |
| } | |