--- xmil/fdd/fddfile.c 2004/08/09 04:47:53 1.4 +++ xmil/fdd/fddfile.c 2008/06/02 20:07:31 1.9 @@ -12,10 +12,83 @@ _FDDFILE fddfile[MAX_FDDFILE]; +static REG8 dummyseek(FDDFILE fdd, REG8 media, UINT track) { + + (void)fdd; + (void)media; + (void)track; + return(FDDSTAT_SEEKERR); +} + +static REG8 dummyread(FDDFILE fdd, REG8 media, UINT track, REG8 sc, + UINT8 *ptr, UINT *size) { + + (void)fdd; + (void)media; + (void)track; + (void)sc; + (void)ptr; + (void)size; + return(FDDSTAT_RECNFND); +} + +static REG8 dummywrite(FDDFILE fdd, REG8 media, UINT track, REG8 sc, + const UINT8 *ptr, UINT size) { + + (void)fdd; + (void)media; + (void)track; + (void)sc; + (void)ptr; + (void)size; + return(FDDSTAT_RECNFND | FDDSTAT_WRITEFAULT); +} + +static REG8 dummycrc(FDDFILE fdd, REG8 media, UINT track, UINT num, + UINT8 *ptr) { + + (void)fdd; + (void)media; + (void)track; + (void)num; + (void)ptr; + return(FDDSTAT_RECNFND); +} + +static UINT32 getfdtype(const OEMCHAR *fname) { + +const OEMCHAR *ext; + + ext = file_getext(fname); + if ((!milstr_cmp(ext, str_d88)) || (!milstr_cmp(ext, str_88d))) { + return(FTYPE_D88); + } + return(FTYPE_BETA); +} + +static void setempty(FDDFILE fdd) { + + ZeroMemory(fdd, sizeof(_FDDFILE)); + fdd->seek = dummyseek; + fdd->read = dummyread; + fdd->write = dummywrite; + fdd->wrtrk = dummywrite; + fdd->crc = dummycrc; +} + + +/* ---- */ + void fddfile_initialize(void) { + + UINT i; + + for (i=0; i= MAX_FDDFILE) { return(str_null); @@ -23,32 +96,23 @@ const OEMCHAR *fdd_diskname(REG8 drv) { return(fddfile[drv].fname); } -BRESULT fdd_diskready(REG8 drv) { +BRESULT fddfile_diskready(REG8 drv) { - if ((drv >= MAX_FDDFILE) || (fddfile[drv].fname[0] == '\0')) { + if ((drv >= MAX_FDDFILE) || (fddfile[drv].type == DISKTYPE_NOTREADY)) { return(FALSE); } return(TRUE); } +BRESULT fddfile_diskprotect(REG8 drv) { -// ---- - -static REG8 getfdtype(const OEMCHAR *fname) { - -const OEMCHAR *ext; - - ext = file_getext(fname); - if (!milstr_cmp(ext, str_e2d)) { - return(FTYPE_BETA); - } - if ((!milstr_cmp(ext, str_d88)) || (!milstr_cmp(ext, str_88d))) { - return(FTYPE_D88); + if ((drv >= MAX_FDDFILE) || (!fddfile[drv].protect)) { + return(FALSE); } - return(FTYPE_NONE); + return(TRUE); } -BRESULT fdd_set(REG8 drv, const OEMCHAR *fname, UINT ftype, int ro) { +BRESULT fddfile_set(REG8 drv, const OEMCHAR *fname, UINT32 ftype, int ro) { FDDFILE fdd; BRESULT r; @@ -56,18 +120,18 @@ BRESULT fdd_set(REG8 drv, const OEMCHAR if (drv >= MAX_FDDFILE) { return(FAILURE); } - fdd_eject(drv); + fddfile_eject(drv); fdd = fddfile + drv; if (ftype == FTYPE_NONE) { ftype = getfdtype(fname); } switch(ftype) { case FTYPE_BETA: - r = fdd2d_set(fdd, drv, fname); + r = fdd2d_set(fdd, fname); break; case FTYPE_D88: - r = fddd88_set(fdd, drv, fname); + r = fddd88_set(fdd, fname); break; default: @@ -75,6 +139,7 @@ BRESULT fdd_set(REG8 drv, const OEMCHAR break; } if (r == SUCCESS) { + fdd->ftype = ftype; milstr_ncpy(fdd->fname, fname, NELEMENTS(fdd->fname)); if (ro) { fdd->protect = TRUE; @@ -83,21 +148,21 @@ BRESULT fdd_set(REG8 drv, const OEMCHAR return(r); } -BRESULT fdd_eject(REG8 drv) { +void fddfile_eject(REG8 drv) { FDDFILE fdd; if (drv >= MAX_FDDFILE) { - return(FAILURE); + return; } fdd = fddfile + drv; switch(fdd->type) { case DISKTYPE_BETA: - return(fdd2d_eject(fdd, drv)); + fdd2d_eject(fdd); case DISKTYPE_D88: - return(fddd88_eject(fdd, drv)); + fddd88_eject(fdd); } - return(FAILURE); + setempty(fdd); }