|
|
| version 1.1.1.1, 2003/10/16 17:58:28 | version 1.6, 2004/02/19 03:04:01 |
|---|---|
| Line 9 | Line 9 |
| static const _XDFINFO supportxdf[] = { | static const _XDFINFO supportxdf[] = { |
| #if 0 | #if 0 |
| // 256 | // 256 |
| {154, 26, 1, DISKTYPE_2HD, 0}, | {0, 154, 26, 1, DISKTYPE_2HD, 0}, |
| // 512 | // 512 |
| {154, 15, 2, DISKTYPE_2HD, 0}, | {0, 154, 15, 2, DISKTYPE_2HD, 0}, |
| #endif | #endif |
| // 1024 | // 1024 |
| {154, 8, 3, DISKTYPE_2HD, 0}, | {0, 154, 8, 3, DISKTYPE_2HD, 0}, |
| // 1.44MB | // 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) { | BOOL fddxdf_set(FDDFILE fdd, const char *fname, int ro) { |
| const _XDFINFO *xdf; | const _XDFINFO *xdf; |
| short attr; | short attr; |
| FILEH fh; | FILEH fh; |
| UINT fdsize; | UINT32 fdsize; |
| UINT size; | UINT size; |
| attr = file_attr(fname); | attr = file_attr(fname); |
| Line 36 const _XDFINFO *xdf; | Line 47 const _XDFINFO *xdf; |
| if (fh == FILEH_INVALID) { | if (fh == FILEH_INVALID) { |
| return(FAILURE); | return(FAILURE); |
| } | } |
| fdsize = file_seek(fh, 0, FSEEK_END); | fdsize = file_getsize(fh); |
| file_close(fh); | file_close(fh); |
| xdf = supportxdf; | xdf = supportxdf; |
| Line 45 const _XDFINFO *xdf; | Line 56 const _XDFINFO *xdf; |
| size *= xdf->sectors; | size *= xdf->sectors; |
| size <<= (7 + xdf->n); | size <<= (7 + xdf->n); |
| if (size == fdsize) { | if (size == fdsize) { |
| milstr_ncpy(fdd->fname, fname, sizeof(fdd->fname)); | file_cpyname(fdd->fname, fname, sizeof(fdd->fname)); |
| fdd->type = DISKTYPE_BETA; | fdd->type = DISKTYPE_BETA; |
| fdd->protect = ((attr & 1) || (ro))?TRUE:FALSE; | fdd->protect = ((attr & 1) || (ro))?TRUE:FALSE; |
| fdd->inf.xdf = *xdf; | fdd->inf.xdf = *xdf; |
| Line 56 const _XDFINFO *xdf; | Line 67 const _XDFINFO *xdf; |
| return(FAILURE); | 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) { | BOOL fddxdf_eject(FDDFILE fdd) { |
| fdd->fname[0] = '\0'; | fdd->fname[0] = '\0'; |
| Line 66 BOOL fddxdf_eject(FDDFILE fdd) { | Line 168 BOOL fddxdf_eject(FDDFILE fdd) { |
| BOOL fddxdf_diskaccess(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); | return(FAILURE); |
| } | } |
| (void)fdd; | |
| return(SUCCESS); | return(SUCCESS); |
| } | } |
| BOOL fddxdf_seek(FDDFILE fdd) { | BOOL fddxdf_seek(FDDFILE fdd) { |
| if ((!fdd->fname[0]) || | if ((fdd->type != DISKTYPE_BETA) || |
| (fdd->type != DISKTYPE_BETA) || | (CTRL_FDMEDIA != fdd->inf.xdf.disktype) || |
| (CTRL_FDMEDIA != DISKTYPE_2HD) || | (fdc.rpm[fdc.us] != fdd->inf.xdf.rpm) || |
| (fdc.rpm != fdd->inf.xdf.rpm) || | |
| (fdc.ncn >= (fdd->inf.xdf.tracks >> 1))) { | (fdc.ncn >= (fdd->inf.xdf.tracks >> 1))) { |
| return(FAILURE); | return(FAILURE); |
| } | } |
| Line 87 BOOL fddxdf_seek(FDDFILE fdd) { | Line 188 BOOL fddxdf_seek(FDDFILE fdd) { |
| BOOL fddxdf_seeksector(FDDFILE fdd) { | BOOL fddxdf_seeksector(FDDFILE fdd) { |
| if ((!fdd->fname[0]) || | if ((fdd->type != DISKTYPE_BETA) || |
| (fdd->type != DISKTYPE_BETA) || | (CTRL_FDMEDIA != fdd->inf.xdf.disktype) || |
| (CTRL_FDMEDIA != DISKTYPE_2HD) || | (fdc.rpm[fdc.us] != fdd->inf.xdf.rpm) || |
| (fdc.rpm != fdd->inf.xdf.rpm) || | |
| (fdc.treg[fdc.us] >= (fdd->inf.xdf.tracks >> 1))) { | (fdc.treg[fdc.us] >= (fdd->inf.xdf.tracks >> 1))) { |
| fddlasterror = 0xe0; | fddlasterror = 0xe0; |
| return(FAILURE); | return(FAILURE); |
| Line 99 BOOL fddxdf_seeksector(FDDFILE fdd) { | Line 199 BOOL fddxdf_seeksector(FDDFILE fdd) { |
| fddlasterror = 0xc0; | fddlasterror = 0xc0; |
| return(FAILURE); | return(FAILURE); |
| } | } |
| // ver0.29 | |
| if ((fdc.mf != 0xff) && (fdc.mf != 0x40)) { | if ((fdc.mf != 0xff) && (fdc.mf != 0x40)) { |
| fddlasterror = 0xc0; | fddlasterror = 0xc0; |
| return(FAILURE); | return(FAILURE); |
| Line 113 BOOL fddxdf_read(FDDFILE fdd) { | Line 212 BOOL fddxdf_read(FDDFILE fdd) { |
| long seekp; | long seekp; |
| UINT secsize; | UINT secsize; |
| fddlasterror = 0x00; // ver0.28 | fddlasterror = 0x00; |
| if (fddxdf_seeksector(fdd)) { | if (fddxdf_seeksector(fdd)) { |
| return(FAILURE); | return(FAILURE); |
| } | } |
| if (fdc.N != fdd->inf.xdf.n) { | if (fdc.N != fdd->inf.xdf.n) { |
| fddlasterror = 0xc0; // ver0.28 | fddlasterror = 0xc0; |
| return(FAILURE); | return(FAILURE); |
| } | } |
| Line 126 BOOL fddxdf_read(FDDFILE fdd) { | Line 225 BOOL fddxdf_read(FDDFILE fdd) { |
| seekp *= fdd->inf.xdf.sectors; | seekp *= fdd->inf.xdf.sectors; |
| seekp += fdc.R - 1; | seekp += fdc.R - 1; |
| seekp <<= (7 + fdd->inf.xdf.n); | seekp <<= (7 + fdd->inf.xdf.n); |
| seekp += fdd->inf.xdf.headersize; | |
| secsize = 128 << fdd->inf.xdf.n; | secsize = 128 << fdd->inf.xdf.n; |
| hdl = file_open_rb(fdd->fname); | hdl = file_open_rb(fdd->fname); |
| if (hdl == FILEH_INVALID) { | if (hdl == FILEH_INVALID) { |
| fddlasterror = 0xe0; // ver0.28 | fddlasterror = 0xe0; |
| return(FAILURE); | return(FAILURE); |
| } | } |
| if ((file_seek(hdl, seekp, FSEEK_SET) != seekp) || | if ((file_seek(hdl, seekp, FSEEK_SET) != seekp) || |
| (file_read(hdl, fdc.buf, secsize) != secsize)) { | (file_read(hdl, fdc.buf, secsize) != secsize)) { |
| file_close(hdl); | file_close(hdl); |
| fddlasterror = 0xe0; // ver0.28 | fddlasterror = 0xe0; |
| return(FAILURE); | return(FAILURE); |
| } | } |
| file_close(hdl); | file_close(hdl); |
| fdc.bufcnt = secsize; | fdc.bufcnt = secsize; |
| fddlasterror = 0x00; // ver0.28 | fddlasterror = 0x00; |
| return(SUCCESS); | return(SUCCESS); |
| } | } |
| Line 151 BOOL fddxdf_write(FDDFILE fdd) { | Line 251 BOOL fddxdf_write(FDDFILE fdd) { |
| long seekp; | long seekp; |
| UINT secsize; | UINT secsize; |
| fddlasterror = 0x00; // ver0.28 | fddlasterror = 0x00; |
| if (fddxdf_seeksector(fdd)) { | if (fddxdf_seeksector(fdd)) { |
| fddlasterror = 0xe0; // ver0.28 | fddlasterror = 0xe0; |
| return(FAILURE); | return(FAILURE); |
| } | } |
| if (fdd->protect) { | if (fdd->protect) { |
| fddlasterror = 0x70; // ver0.28 | fddlasterror = 0x70; |
| return(FAILURE); | return(FAILURE); |
| } | } |
| if (fdc.N != fdd->inf.xdf.n) { | if (fdc.N != fdd->inf.xdf.n) { |
| fddlasterror = 0xc0; // ver0.28 | fddlasterror = 0xc0; |
| return(FAILURE); | return(FAILURE); |
| } | } |
| Line 169 BOOL fddxdf_write(FDDFILE fdd) { | Line 269 BOOL fddxdf_write(FDDFILE fdd) { |
| seekp *= fdd->inf.xdf.sectors; | seekp *= fdd->inf.xdf.sectors; |
| seekp += fdc.R - 1; | seekp += fdc.R - 1; |
| seekp <<= (7 + fdd->inf.xdf.n); | seekp <<= (7 + fdd->inf.xdf.n); |
| seekp += fdd->inf.xdf.headersize; | |
| secsize = 128 << fdd->inf.xdf.n; | secsize = 128 << fdd->inf.xdf.n; |
| hdl = file_open(fdd->fname); | hdl = file_open(fdd->fname); |
| if (hdl == FILEH_INVALID) { | if (hdl == FILEH_INVALID) { |
| fddlasterror = 0xc0; // ver0.28 | fddlasterror = 0xc0; |
| return(FAILURE); | return(FAILURE); |
| } | } |
| if ((file_seek(hdl, seekp, FSEEK_SET) != seekp) || | if ((file_seek(hdl, seekp, FSEEK_SET) != seekp) || |
| (file_write(hdl, fdc.buf, secsize) != secsize)) { | (file_write(hdl, fdc.buf, secsize) != secsize)) { |
| file_close(hdl); | file_close(hdl); |
| fddlasterror = 0xc0; // ver0.28 | fddlasterror = 0xc0; |
| return(FAILURE); | return(FAILURE); |
| } | } |
| file_close(hdl); | file_close(hdl); |
| fdc.bufcnt = secsize; | fdc.bufcnt = secsize; |
| fddlasterror = 0x00; // ver0.28 | fddlasterror = 0x00; |
| return(SUCCESS); | return(SUCCESS); |
| } | } |
| BOOL fddxdf_readid(FDDFILE fdd) { | BOOL fddxdf_readid(FDDFILE fdd) { |
| fddlasterror = 0x00; | 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)) { | (fdc.crcn >= fdd->inf.xdf.sectors)) { |
| fddlasterror = 0xe0; | fddlasterror = 0xe0; |
| return(FAILURE); | return(FAILURE); |