--- np2/fdd/fdd_xdf.c 2004/01/27 10:55:47 1.3 +++ np2/fdd/fdd_xdf.c 2005/03/22 04:03:15 1.11 @@ -13,6 +13,10 @@ static const _XDFINFO supportxdf[] = { // 512 {0, 154, 15, 2, DISKTYPE_2HD, 0}, #endif +#if 1 + // 512 + {0, 160, 15, 2, DISKTYPE_2HD, 0}, +#endif // 1024 {0, 154, 8, 3, DISKTYPE_2HD, 0}, // 1.44MB @@ -20,23 +24,23 @@ static const _XDFINFO supportxdf[] = { }; 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]; + UINT8 dummy[4]; + UINT8 fddtype[4]; + UINT8 headersize[4]; + UINT8 fddsize[4]; + UINT8 sectorsize[4]; + UINT8 sectors[4]; + UINT8 surfaces[4]; + UINT8 cylinders[4]; } FDIHDR; -BOOL fddxdf_set(FDDFILE fdd, const char *fname, int ro) { +BRESULT fddxdf_set(FDDFILE fdd, const OEMCHAR *fname, int ro) { const _XDFINFO *xdf; short attr; FILEH fh; - UINT fdsize; + UINT32 fdsize; UINT size; attr = file_attr(fname); @@ -47,16 +51,15 @@ 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; - while(xdf < (supportxdf + (sizeof(supportxdf)/sizeof(_XDFINFO)))) { + while(xdf < (supportxdf + NELEMENTS(supportxdf))) { size = xdf->tracks; size *= xdf->sectors; size <<= (7 + xdf->n); if (size == fdsize) { - file_cpyname(fdd->fname, fname, sizeof(fdd->fname)); fdd->type = DISKTYPE_BETA; fdd->protect = ((attr & 1) || (ro))?TRUE:FALSE; fdd->inf.xdf = *xdf; @@ -68,12 +71,13 @@ const _XDFINFO *xdf; } // こっそり対応したりして -BOOL fddxdf_setfdi(FDDFILE fdd, const char *fname, int ro) { +BRESULT fddxdf_setfdi(FDDFILE fdd, const OEMCHAR *fname, int ro) { short attr; FILEH fh; - FDIHDR fdi; + UINT32 fdsize; UINT r; + FDIHDR fdi; UINT32 fddtype; UINT32 headersize; UINT32 size; @@ -88,9 +92,11 @@ BOOL fddxdf_setfdi(FDDFILE fdd, const ch 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); } @@ -109,6 +115,9 @@ BOOL fddxdf_setfdi(FDDFILE fdd, const ch (cylinders == 0) || (cylinders >= 128)) { return(FAILURE); } + if (fdsize != (headersize + (size * sectors * surfaces * cylinders))) { + return(FAILURE); + } size >>= 8; n = 0; while(size) { @@ -140,7 +149,6 @@ BOOL fddxdf_setfdi(FDDFILE fdd, const ch 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; @@ -152,7 +160,7 @@ BOOL fddxdf_setfdi(FDDFILE fdd, const ch return(SUCCESS); } -BOOL fddxdf_eject(FDDFILE fdd) { +BRESULT fddxdf_eject(FDDFILE fdd) { fdd->fname[0] = '\0'; fdd->type = DISKTYPE_NOTREADY; @@ -160,32 +168,31 @@ BOOL fddxdf_eject(FDDFILE fdd) { } -BOOL fddxdf_diskaccess(FDDFILE fdd) { +BRESULT fddxdf_diskaccess(FDDFILE fdd) { if ((fdd->type != DISKTYPE_BETA) || (CTRL_FDMEDIA != fdd->inf.xdf.disktype)) { return(FAILURE); } - (void)fdd; return(SUCCESS); } -BOOL fddxdf_seek(FDDFILE fdd) { +BRESULT fddxdf_seek(FDDFILE fdd) { if ((fdd->type != DISKTYPE_BETA) || (CTRL_FDMEDIA != fdd->inf.xdf.disktype) || - (fdc.rpm != fdd->inf.xdf.rpm) || + (fdc.rpm[fdc.us] != fdd->inf.xdf.rpm) || (fdc.ncn >= (fdd->inf.xdf.tracks >> 1))) { return(FAILURE); } return(SUCCESS); } -BOOL fddxdf_seeksector(FDDFILE fdd) { +BRESULT fddxdf_seeksector(FDDFILE fdd) { if ((fdd->type != DISKTYPE_BETA) || (CTRL_FDMEDIA != fdd->inf.xdf.disktype) || - (fdc.rpm != fdd->inf.xdf.rpm) || + (fdc.rpm[fdc.us] != fdd->inf.xdf.rpm) || (fdc.treg[fdc.us] >= (fdd->inf.xdf.tracks >> 1))) { fddlasterror = 0xe0; return(FAILURE); @@ -201,18 +208,18 @@ BOOL fddxdf_seeksector(FDDFILE fdd) { return(SUCCESS); } -BOOL fddxdf_read(FDDFILE fdd) { +BRESULT fddxdf_read(FDDFILE fdd) { FILEH hdl; 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); } @@ -225,38 +232,38 @@ BOOL fddxdf_read(FDDFILE fdd) { 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); } -BOOL fddxdf_write(FDDFILE fdd) { +BRESULT fddxdf_write(FDDFILE fdd) { FILEH hdl; 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); } @@ -269,25 +276,26 @@ BOOL fddxdf_write(FDDFILE fdd) { 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) { +BRESULT 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);