--- xmil/fdd/fdd_2d.c 2004/08/01 05:31:30 1.1 +++ xmil/fdd/fdd_2d.c 2004/08/08 09:12:06 1.4 @@ -1,14 +1,12 @@ #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]; @@ -21,14 +19,14 @@ BYTE changesector2d(void) { FILEH fh; WORD sec; long seekp; - short drv = FDC.drv; + short drv = fdc.drv; - if (FDC.media) { + if (fdc.media) { return(1); } fdd = fddfile + drv; - sec = (WORD)(((FDC.c) << 5) + (FDC.h << 4) + FDC.r - 1); + sec = (WORD)(((fdc.c) << 5) + (fdc.h << 4) + fdc.r - 1); if (sec_now[drv] == sec) { return(0); } @@ -59,100 +57,55 @@ BYTE changesector2d(void) { return(0); } -BRESULT fdd_eject_2d(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; - } - seekp = (long)sec_now[drv] << 8; - fh = file_open(fdd->fname); - if (fh == FILEH_INVALID) { - ret = 1; - break; - } - if ((file_seek(fh, seekp, FSEEK_SET) != seekp) || - (file_write(fh, sec_data[drv], 256) != 256)) { - ret = 1; - } - if (file_close(fh)) { - ret = 1; - } - break; - } - fdd->fname[0] = '\0'; - DISKNUM[drv] = 0; - sec_now[drv] = -1; - sec_write[drv] = 0; - return(ret); -} -BRESULT fdd_set_2d(REG8 drv, const OEMCHAR *fname) { - - FDDFILE fdd; - WORD attr; - - fdd_eject_2d(drv); - fdd = fddfile + drv; - if ((drv < 0 || drv > 3) || - ((attr = file_attr(fname)) & 0x18)) { // エラー・ディレクトリ・ラベル - return(1); - } - DISKNUM[drv] = DRV_FMT2D; - file_cpyname(fdd->fname, fname, NELEMENTS(fdd->fname)); - WRITEPT[drv] = (BYTE)(attr & 1); - return(0); -} - //********************************************************************** short fdd_crc_2d(void) { - 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; // ??? メルヘンヴェール + 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); } 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); + type = fdc.type; + 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.media))) { ans |= 0x10; // SEEK ERROR / RECORD NOT FOUND } if (type == 1 || type == 4) { if (type == 1) { ans |= 0x20; // HEAD ENGAGED (X1 デハ ツネニ 1) - if (FDC.c == 0) { + if (fdc.c == 0) { ans |= 0x04; // TRACK00 } } @@ -164,10 +117,10 @@ BYTE fdd_stat_2d(void) { if (FDDMTR_BUSY) { ans |= 0x01; } - if ((type == 2) && (FDC.r) && (FDC.off < 256)) { + if ((type == 2) && (fdc.r) && (fdc.off < 256)) { ans |= 0x03; // DATA REQUEST / BUSY } - else if (cmnd == 0x0f) { + else if (cmd == 0x0f) { ans |= 0x04; // error! } } @@ -180,7 +133,7 @@ BYTE fdd_stat_2d(void) { void fdd_read_2d(void) { if (((fdd_stat_2d() & 0xf3) == 3) && (!changesector2d())) { - FDC.data = sec_data[FDC.drv][FDC.off]; + fdc.data = sec_data[fdc.drv][fdc.off]; } } @@ -188,30 +141,82 @@ void fdd_read_2d(void) { void fdd_write_2d(void) { if (((fdd_stat_2d() & 0xf3) == 3) && (!changesector2d())) { - sec_data[FDC.drv][FDC.off] = FDC.data; - sec_write[FDC.drv] = 1; + sec_data[fdc.drv][fdc.off] = fdc.data; + sec_write[fdc.drv] = 1; } } BYTE fdd_incoff_2d(void) { - BYTE cmnd; + REG8 cmd; - if (++FDC.off < 256) { + if (++fdc.off < 256) { return(0); } - cmnd = (BYTE)(FDC.cmnd >> 4); - if (cmnd == 0x09 || cmnd == 0x0b) { - if (FDC.r < 16) { - FDC.r++; - FDC.rreg++; - FDC.off = 0; + cmd = (REG8)(fdc.cmd >> 4); + if ((cmd == 0x09) || (cmd == 0x0b)) { + if (fdc.r < 16) { + fdc.r++; + fdc.rreg++; + fdc.off = 0; return(0); } - FDC.rreg = FDC.r + 1; + fdc.rreg = fdc.r + 1; } - FDC.off = 256; + fdc.off = 256; return(1); } + + +// ---- + +BRESULT fdd2d_set(FDDFILE fdd, REG8 drv, const OEMCHAR *fname) { + + short attr; + + attr = file_attr(fname); + if (attr & 0x18) { + return(FAILURE); + } + file_cpyname(fdd->fname, fname, NELEMENTS(fdd->fname)); + 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) { + + FILEH fh; + long seekp; + BRESULT ret = 0; + + while(1) { + if ((!sec_write[drv]) || (sec_now[drv] == -1)) { + break; + } + seekp = (long)sec_now[drv] << 8; + fh = file_open(fdd->fname); + if (fh == FILEH_INVALID) { + ret = 1; + break; + } + if ((file_seek(fh, seekp, FSEEK_SET) != seekp) || + (file_write(fh, sec_data[drv], 256) != 256)) { + ret = 1; + } + if (file_close(fh)) { + ret = 1; + } + break; + } + fdd->fname[0] = '\0'; + fdd->type = DISKTYPE_NOTREADY; + sec_now[drv] = -1; + sec_write[drv] = 0; + return(ret); +} +