--- np2/fdd/fdd_xdf.c 2003/10/16 17:58:28 1.1.1.1 +++ np2/fdd/fdd_xdf.c 2004/03/08 15:27:07 1.7 @@ -9,23 +9,38 @@ static const _XDFINFO supportxdf[] = { #if 0 // 256 - {154, 26, 1, DISKTYPE_2HD, 0}, + {0, 154, 26, 1, DISKTYPE_2HD, 0}, // 512 - {154, 15, 2, DISKTYPE_2HD, 0}, + {0, 154, 15, 2, DISKTYPE_2HD, 0}, +#endif +#if 1 + // 512 + {0, 160, 15, 2, DISKTYPE_2HD, 0}, #endif // 1024 - {154, 8, 3, DISKTYPE_2HD, 0}, + {0, 154, 8, 3, DISKTYPE_2HD, 0}, // 1.44MB - {160, 18, 2, DISKTYPE_2HD, 1}, + {0, 160, 18, 2, DISKTYPE_2HD, 1}, }; +typedef struct { + BYTE dummy[4]; + BYTE fddtype[4]; + BYTE headersize[4]; + BYTE fddsize[4]; + BYTE sectorsize[4]; + BYTE sectors[4]; + BYTE surfaces[4]; + BYTE cylinders[4]; +} FDIHDR; + BOOL fddxdf_set(FDDFILE fdd, const char *fname, int ro) { const _XDFINFO *xdf; short attr; FILEH fh; - UINT fdsize; + UINT32 fdsize; UINT size; attr = file_attr(fname); @@ -36,7 +51,7 @@ const _XDFINFO *xdf; if (fh == FILEH_INVALID) { return(FAILURE); } - fdsize = file_seek(fh, 0, FSEEK_END); + fdsize = file_getsize(fh); file_close(fh); xdf = supportxdf; @@ -45,7 +60,7 @@ const _XDFINFO *xdf; size *= xdf->sectors; size <<= (7 + xdf->n); if (size == fdsize) { - milstr_ncpy(fdd->fname, fname, sizeof(fdd->fname)); + file_cpyname(fdd->fname, fname, sizeof(fdd->fname)); fdd->type = DISKTYPE_BETA; fdd->protect = ((attr & 1) || (ro))?TRUE:FALSE; fdd->inf.xdf = *xdf; @@ -56,6 +71,97 @@ const _XDFINFO *xdf; return(FAILURE); } +// こっそり対応したりして +BOOL fddxdf_setfdi(FDDFILE fdd, const char *fname, int ro) { + + short attr; + FILEH fh; + UINT32 fdsize; + UINT r; + FDIHDR fdi; + UINT32 fddtype; + UINT32 headersize; + UINT32 size; + UINT32 sectors; + UINT32 surfaces; + UINT32 cylinders; + UINT8 n; + UINT8 disktype; + UINT8 rpm; + + attr = file_attr(fname); + if (attr & 0x18) { + return(FAILURE); + } + fdsize = 0; + r = 0; + fh = file_open_rb(fname); + if (fh != FILEH_INVALID) { + fdsize = file_getsize(fh); + r = file_read(fh, &fdi, sizeof(fdi)); + file_close(fh); + } + if (r != sizeof(fdi)) { + return(FAILURE); + } + fddtype = LOADINTELDWORD(fdi.fddtype); + headersize = LOADINTELDWORD(fdi.headersize); + size = LOADINTELDWORD(fdi.sectorsize); + sectors = LOADINTELDWORD(fdi.sectors); + surfaces = LOADINTELDWORD(fdi.surfaces); + cylinders = LOADINTELDWORD(fdi.cylinders); + if (((size & (size - 1)) != 0) || (!(size & 0x7f80)) || + (sectors == 0) || (sectors >= 256) || + (surfaces != 2) || + (cylinders == 0) || (cylinders >= 128)) { + return(FAILURE); + } + if (fdsize != (headersize + (size * sectors * surfaces * cylinders))) { + return(FAILURE); + } + size >>= 8; + n = 0; + while(size) { + size >>= 1; + n++; + } + disktype = DISKTYPE_2HD; + rpm = 0; + switch(fddtype & 0xf0) { + case 0x10: // 1MB/640KB - 2DD + case 0x70: // 640KB - 2DD + case 0xf0: + disktype = DISKTYPE_2DD; + break; + + case 0x30: // 1.44MB - 2HD + case 0xb0: + rpm = 1; + break; + + case 0x50: // 320KB - 2D + case 0xd0: // + disktype = DISKTYPE_2D; + break; + + case 0x90: // 2HD + break; + + default: + return(FAILURE); + } + file_cpyname(fdd->fname, fname, sizeof(fdd->fname)); + fdd->type = DISKTYPE_BETA; + fdd->protect = ((attr & 1) || (ro))?TRUE:FALSE; + fdd->inf.xdf.headersize = headersize; + fdd->inf.xdf.tracks = (UINT8)(cylinders * 2); + fdd->inf.xdf.sectors = (UINT8)sectors; + fdd->inf.xdf.n = n; + fdd->inf.xdf.disktype = disktype; + fdd->inf.xdf.rpm = rpm; + return(SUCCESS); +} + BOOL fddxdf_eject(FDDFILE fdd) { fdd->fname[0] = '\0'; @@ -66,19 +172,18 @@ BOOL fddxdf_eject(FDDFILE fdd) { BOOL fddxdf_diskaccess(FDDFILE fdd) { - if (CTRL_FDMEDIA != DISKTYPE_2HD) { + if ((fdd->type != DISKTYPE_BETA) || + (CTRL_FDMEDIA != fdd->inf.xdf.disktype)) { return(FAILURE); } - (void)fdd; return(SUCCESS); } BOOL fddxdf_seek(FDDFILE fdd) { - if ((!fdd->fname[0]) || - (fdd->type != DISKTYPE_BETA) || - (CTRL_FDMEDIA != DISKTYPE_2HD) || - (fdc.rpm != fdd->inf.xdf.rpm) || + if ((fdd->type != DISKTYPE_BETA) || + (CTRL_FDMEDIA != fdd->inf.xdf.disktype) || + (fdc.rpm[fdc.us] != fdd->inf.xdf.rpm) || (fdc.ncn >= (fdd->inf.xdf.tracks >> 1))) { return(FAILURE); } @@ -87,10 +192,9 @@ BOOL fddxdf_seek(FDDFILE fdd) { BOOL fddxdf_seeksector(FDDFILE fdd) { - if ((!fdd->fname[0]) || - (fdd->type != DISKTYPE_BETA) || - (CTRL_FDMEDIA != DISKTYPE_2HD) || - (fdc.rpm != fdd->inf.xdf.rpm) || + if ((fdd->type != DISKTYPE_BETA) || + (CTRL_FDMEDIA != fdd->inf.xdf.disktype) || + (fdc.rpm[fdc.us] != fdd->inf.xdf.rpm) || (fdc.treg[fdc.us] >= (fdd->inf.xdf.tracks >> 1))) { fddlasterror = 0xe0; return(FAILURE); @@ -99,7 +203,6 @@ BOOL fddxdf_seeksector(FDDFILE fdd) { fddlasterror = 0xc0; return(FAILURE); } - // ver0.29 if ((fdc.mf != 0xff) && (fdc.mf != 0x40)) { fddlasterror = 0xc0; return(FAILURE); @@ -113,12 +216,12 @@ BOOL fddxdf_read(FDDFILE fdd) { long seekp; UINT secsize; - fddlasterror = 0x00; // ver0.28 + fddlasterror = 0x00; if (fddxdf_seeksector(fdd)) { return(FAILURE); } if (fdc.N != fdd->inf.xdf.n) { - fddlasterror = 0xc0; // ver0.28 + fddlasterror = 0xc0; return(FAILURE); } @@ -126,22 +229,23 @@ BOOL fddxdf_read(FDDFILE fdd) { seekp *= fdd->inf.xdf.sectors; seekp += fdc.R - 1; seekp <<= (7 + fdd->inf.xdf.n); + seekp += fdd->inf.xdf.headersize; secsize = 128 << fdd->inf.xdf.n; hdl = file_open_rb(fdd->fname); if (hdl == FILEH_INVALID) { - fddlasterror = 0xe0; // ver0.28 + fddlasterror = 0xe0; return(FAILURE); } if ((file_seek(hdl, seekp, FSEEK_SET) != seekp) || (file_read(hdl, fdc.buf, secsize) != secsize)) { file_close(hdl); - fddlasterror = 0xe0; // ver0.28 + fddlasterror = 0xe0; return(FAILURE); } file_close(hdl); fdc.bufcnt = secsize; - fddlasterror = 0x00; // ver0.28 + fddlasterror = 0x00; return(SUCCESS); } @@ -151,17 +255,17 @@ BOOL fddxdf_write(FDDFILE fdd) { long seekp; UINT secsize; - fddlasterror = 0x00; // ver0.28 + fddlasterror = 0x00; if (fddxdf_seeksector(fdd)) { - fddlasterror = 0xe0; // ver0.28 + fddlasterror = 0xe0; return(FAILURE); } if (fdd->protect) { - fddlasterror = 0x70; // ver0.28 + fddlasterror = 0x70; return(FAILURE); } if (fdc.N != fdd->inf.xdf.n) { - fddlasterror = 0xc0; // ver0.28 + fddlasterror = 0xc0; return(FAILURE); } @@ -169,29 +273,31 @@ BOOL fddxdf_write(FDDFILE fdd) { seekp *= fdd->inf.xdf.sectors; seekp += fdc.R - 1; seekp <<= (7 + fdd->inf.xdf.n); + seekp += fdd->inf.xdf.headersize; secsize = 128 << fdd->inf.xdf.n; hdl = file_open(fdd->fname); if (hdl == FILEH_INVALID) { - fddlasterror = 0xc0; // ver0.28 + fddlasterror = 0xc0; return(FAILURE); } if ((file_seek(hdl, seekp, FSEEK_SET) != seekp) || (file_write(hdl, fdc.buf, secsize) != secsize)) { file_close(hdl); - fddlasterror = 0xc0; // ver0.28 + fddlasterror = 0xc0; return(FAILURE); } file_close(hdl); fdc.bufcnt = secsize; - fddlasterror = 0x00; // ver0.28 + fddlasterror = 0x00; return(SUCCESS); } BOOL fddxdf_readid(FDDFILE fdd) { fddlasterror = 0x00; - if ((fdc.rpm != fdd->inf.xdf.rpm) || + if ((!fdc.mf) || + (fdc.rpm[fdc.us] != fdd->inf.xdf.rpm) || (fdc.crcn >= fdd->inf.xdf.sectors)) { fddlasterror = 0xe0; return(FAILURE);