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