--- xmil/fdd/fddfile.c 2004/08/02 11:48:13 1.2 +++ xmil/fdd/fddfile.c 2004/08/15 12:32:11 1.6 @@ -5,91 +5,166 @@ #include "pccore.h" #include "iocore.h" #include "fddfile.h" -#include "x1_io.h" -#include "x1_fdc.h" #include "fdd_2d.h" #include "fdd_d88.h" _FDDFILE fddfile[MAX_FDDFILE]; -extern BYTE WRITEPT[]; -extern BYTE DISKNUM[]; +static REG8 dummyseek(FDDFILE fdd, REG8 media, UINT track) { -void fddfile_initialize(void) { + (void)fdd; + (void)media; + (void)track; + return(FDDSTAT_SEEKERR); } -const OEMCHAR *fdd_diskname(REG8 drv) { +static REG8 dummyread(FDDFILE fdd, REG8 media, UINT track, REG8 sc, + UINT8 *ptr, UINT *size) { - if (drv >= MAX_FDDFILE) { - return(str_null); - } - return(fddfile[drv].fname); + (void)fdd; + (void)media; + (void)track; + (void)sc; + (void)ptr; + (void)size; + return(FDDSTAT_RECNFND); } -BRESULT fdd_diskready(REG8 drv) { +static REG8 dummywrite(FDDFILE fdd, REG8 media, UINT track, REG8 sc, + const UINT8 *ptr, UINT size) { - if ((drv >= MAX_FDDFILE) || (fddfile[drv].fname[0] == '\0')) { - return(FALSE); - } - return(TRUE); + (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 REG8 getfdtype(const OEMCHAR *fname) { +static UINT32 getfdtype(const OEMCHAR *fname) { const OEMCHAR *ext; ext = file_getext(fname); if (!milstr_cmp(ext, str_e2d)) { - return(DRV_FMT2D); + return(FTYPE_BETA); } if ((!milstr_cmp(ext, str_d88)) || (!milstr_cmp(ext, str_88d))) { - return(DRV_FMT88); + return(FTYPE_D88); + } + return(FTYPE_NONE); +} + +static void setempty(FDDFILE fdd) { + + ZeroMemory(fdd, sizeof(_FDDFILE)); + fdd->seek = dummyseek; + fdd->read = dummyread; + fdd->write = dummywrite; + fdd->crc = dummycrc; +} + + +// ---- + +void fddfile_initialize(void) { + + UINT i; + + for (i=0; i= MAX_FDDFILE) { - return(FAILURE); + return(str_null); } - switch(getfdtype(fname)) { - case DRV_EMPTY: - return(FAILURE); + return(fddfile[drv].fname); +} - case DRV_FMT2D: - return(fdd2d_set(drv, fname)); +BRESULT fddfile_diskready(REG8 drv) { - default: - return(fddd88_set(drv, fname)); + if ((drv >= MAX_FDDFILE) || (fddfile[drv].type == DISKTYPE_NOTREADY)) { + return(FALSE); + } + return(TRUE); +} + +BRESULT fddfile_diskprotect(REG8 drv) { + + if ((drv >= MAX_FDDFILE) || (!fddfile[drv].protect)) { + return(FALSE); } - return(FAILURE); + return(TRUE); } -BRESULT fdd_eject(REG8 drv) { +BRESULT fddfile_set(REG8 drv, const OEMCHAR *fname, UINT32 ftype, int ro) { - FDDFILE fdd; + FDDFILE fdd; + BRESULT r; if (drv >= MAX_FDDFILE) { return(FAILURE); } + fddfile_eject(drv); fdd = fddfile + drv; - switch(DISKNUM[drv]) { - case DRV_EMPTY: - return(FAILURE); - - case DRV_FMT2D: - return(fdd2d_eject(drv)); + if (ftype == FTYPE_NONE) { + ftype = getfdtype(fname); + } + switch(ftype) { + case FTYPE_BETA: + r = fdd2d_set(fdd, fname); + break; + + case FTYPE_D88: + r = fddd88_set(fdd, fname); + break; default: - return(fddd88_eject(drv)); + r = FAILURE; + break; + } + if (r == SUCCESS) { + fdd->ftype = ftype; + milstr_ncpy(fdd->fname, fname, NELEMENTS(fdd->fname)); + if (ro) { + fdd->protect = TRUE; + } + } + return(r); +} + +void fddfile_eject(REG8 drv) { + + FDDFILE fdd; + + if (drv >= MAX_FDDFILE) { + return; + } + fdd = fddfile + drv; + switch(fdd->type) { + case DISKTYPE_BETA: + fdd2d_eject(fdd); + + case DISKTYPE_D88: + fddd88_eject(fdd); } - return(FAILURE); + setempty(fdd); }