--- np2/fdd/sxsi.c 2005/03/05 06:02:29 1.16 +++ np2/fdd/sxsi.c 2005/04/05 09:12:24 1.20 @@ -4,6 +4,7 @@ #include "sysmng.h" #include "cpucore.h" #include "pccore.h" +#include "iocore.h" #include "sxsi.h" #if defined(SUPPORT_IDEIO) #include "ideio.h" @@ -14,6 +15,12 @@ // ---- +static BRESULT nc_reopen(SXSIDEV sxsi) { + + (void)sxsi; + return(FAILURE); +} + static REG8 nc_read(SXSIDEV sxsi, long pos, UINT8 *buf, UINT size) { (void)sxsi; @@ -39,23 +46,36 @@ static REG8 nc_format(SXSIDEV sxsi, long return(0x60); } -static void sxsi_disconnect(SXSIDEV sxsi) { +static void nc_close(SXSIDEV sxsi) { + + (void)sxsi; +} + +static void nc_destroy(SXSIDEV sxsi) { + + (void)sxsi; +} + - FILEH fh; +static void sxsi_disconnect(SXSIDEV sxsi) { if (sxsi) { #if defined(SUPPORT_IDEIO) ideio_notify(sxsi->drv, 0); #endif - fh = (FILEH)sxsi->fh; + if (sxsi->flag & SXSIFLAG_FILEOPENED) { + (*sxsi->close)(sxsi); + } + if (sxsi->flag & SXSIFLAG_READY) { + (*sxsi->destroy)(sxsi); + } sxsi->flag = 0; - sxsi->fh = (INTPTR)FILEH_INVALID; + sxsi->reopen = nc_reopen; sxsi->read = nc_read; sxsi->write = nc_write; sxsi->format = nc_format; - if (fh != FILEH_INVALID) { - file_close(fh); - } + sxsi->close = nc_close; + sxsi->destroy = nc_destroy; } } @@ -70,11 +90,12 @@ void sxsi_initialize(void) { for (i=0; ifh; - sxsi->fh = (INTPTR)FILEH_INVALID; - if (fh != FILEH_INVALID) { - file_close(fh); + if (sxsi->flag & SXSIFLAG_FILEOPENED) { + sxsi->flag &= ~SXSIFLAG_FILEOPENED; + (*sxsi->close)(sxsi); } sxsi++; } @@ -129,17 +148,14 @@ BOOL sxsi_isconnect(SXSIDEV sxsi) { BRESULT sxsi_prepare(SXSIDEV sxsi) { - FILEH fh; - if ((sxsi == NULL) || (!(sxsi->flag & SXSIFLAG_READY))) { return(FAILURE); } - fh = (FILEH)sxsi->fh; - if (fh == FILEH_INVALID) { - fh = file_open(sxsi->filename); - sxsi->fh = (INTPTR)fh; - if (fh == FILEH_INVALID) { - sxsi->flag = 0; + if (!(sxsi->flag & SXSIFLAG_FILEOPENED)) { + if ((*sxsi->reopen)(sxsi) == SUCCESS) { + sxsi->flag |= SXSIFLAG_FILEOPENED; + } + else { return(FAILURE); } } @@ -170,13 +186,13 @@ SXSIDEV sxsi_getptr(REG8 drv) { return(NULL); } -const OEMCHAR *sxsi_getfilename(REG8 drv) { +OEMCHAR *sxsi_getfilename(REG8 drv) { SXSIDEV sxsi; sxsi = sxsi_getptr(drv); if ((sxsi) && (sxsi->flag & SXSIFLAG_READY)) { - return(sxsi->filename); + return(sxsi->fname); } return(NULL); } @@ -198,12 +214,25 @@ BRESULT sxsi_setdevtype(REG8 drv, UINT8 } } -BRESULT sxsi_devopen(REG8 drv, const OEMCHAR *file) { +UINT8 sxsi_getdevtype(REG8 drv) { + + SXSIDEV sxsi; + + sxsi = sxsi_getptr(drv); + if (sxsi) { + return(sxsi->devtype); + } + else { + return(SXSIDEV_NC); + } +} + +BRESULT sxsi_devopen(REG8 drv, const OEMCHAR *fname) { SXSIDEV sxsi; BRESULT r; - if ((file == NULL) || (file[0] == '\0')) { + if ((fname == NULL) || (fname[0] == '\0')) { goto sxsiope_err; } sxsi = sxsi_getptr(drv); @@ -212,11 +241,11 @@ BRESULT sxsi_devopen(REG8 drv, const OEM } switch(sxsi->devtype) { case SXSIDEV_HDD: - r = sxsihdd_open(sxsi, file); + r = sxsihdd_open(sxsi, fname); break; case SXSIDEV_CDROM: - r = sxsicd_open(sxsi, file); + r = sxsicd_open(sxsi, fname); break; default: @@ -226,8 +255,8 @@ BRESULT sxsi_devopen(REG8 drv, const OEM if (r != SUCCESS) { goto sxsiope_err; } - file_cpyname(sxsi->filename, file, NELEMENTS(sxsi->filename)); - sxsi->flag = SXSIFLAG_READY; + file_cpyname(sxsi->fname, fname, NELEMENTS(sxsi->fname)); + sxsi->flag = SXSIFLAG_READY | SXSIFLAG_FILEOPENED; #if defined(SUPPORT_IDEIO) ideio_notify(sxsi->drv, 1); #endif @@ -255,7 +284,7 @@ BOOL sxsi_issasi(void) { for (drv=0x00; drv<0x04; drv++) { sxsi = sxsi_getptr(drv); if (sxsi) { - if (sxsi->devtype == SXSIDEV_HDD) { + if ((drv < 0x02) && (sxsi->devtype == SXSIDEV_HDD)) { if (sxsi->flag & SXSIFLAG_READY) { if (sxsi->mediatype & SXSIMEDIA_INVSASI) { return(FALSE);