--- np2/fdd/sxsi.c 2003/10/16 17:58:31 1.1 +++ np2/fdd/sxsi.c 2005/03/05 06:02:29 1.16 @@ -1,44 +1,63 @@ #include "compiler.h" +#include "strres.h" #include "dosio.h" +#include "sysmng.h" +#include "cpucore.h" #include "pccore.h" #include "sxsi.h" +#if defined(SUPPORT_IDEIO) +#include "ideio.h" +#endif + _SXSIDEV sxsi_dev[SASIHDD_MAX + SCSIHDD_MAX]; -typedef struct { - char vhd[3]; - char ver[4]; - char delimita; - char comment[128]; - BYTE padding[4]; - BYTE mbsize[2]; - BYTE sectorsize[2]; - BYTE sectors; - BYTE surfaces; - BYTE tracks[2]; - BYTE totals[4]; -} V98SCSIHDR; - -typedef struct { - BYTE tracks[2]; -} THDHDR; - -typedef struct { - BYTE dummy[8]; - BYTE headersize[4]; - BYTE filesize[4]; - BYTE sectorsize[4]; - BYTE sectors[4]; - BYTE surfaces[4]; - BYTE tracks[4]; -} HDIHDR; - -static const _SXSIHDD defsasi = {615*33*8, 615, 256, 33, 8, - HDDTYPE_SASI, 256, {0x00}}; -static const _SXSIHDD defscsi = {40*16*32*8, 40*16, 256, 32, 8, - HDDTYPE_SCSI, 220, {0x00}}; +// ---- + +static REG8 nc_read(SXSIDEV sxsi, long pos, UINT8 *buf, UINT size) { + + (void)sxsi; + (void)pos; + (void)buf; + (void)size; + return(0x60); +} + +static REG8 nc_write(SXSIDEV sxsi, long pos, const UINT8 *buf, UINT size) { + + (void)sxsi; + (void)pos; + (void)buf; + (void)size; + return(0x60); +} - _SXSIHDD sxsi_hd[4]; +static REG8 nc_format(SXSIDEV sxsi, long pos) { + + (void)sxsi; + (void)pos; + return(0x60); +} + +static void sxsi_disconnect(SXSIDEV sxsi) { + + FILEH fh; + + if (sxsi) { +#if defined(SUPPORT_IDEIO) + ideio_notify(sxsi->drv, 0); +#endif + fh = (FILEH)sxsi->fh; + sxsi->flag = 0; + sxsi->fh = (INTPTR)FILEH_INVALID; + sxsi->read = nc_read; + sxsi->write = nc_write; + sxsi->format = nc_format; + if (fh != FILEH_INVALID) { + file_close(fh); + } + } +} // ---- @@ -47,43 +66,142 @@ void sxsi_initialize(void) { UINT i; - ZeroMemory(sxsi_hd, sizeof(sxsi_hd)); - for (i=0; i<(sizeof(sxsi_hd)/sizeof(_SXSIHDD)); i++) { - sxsi_hd[i].fh = (void *)FILEH_INVALID; + ZeroMemory(sxsi_dev, sizeof(sxsi_dev)); + for (i=0; ifh; + sxsi->fh = (INTPTR)FILEH_INVALID; + if (fh != FILEH_INVALID) { + file_close(fh); + } + sxsi++; } } -SXSIHDD sxsi_getptr(BYTE drv) { +void sxsi_alltrash(void) { + + SXSIDEV sxsi; + SXSIDEV sxsiterm; + + sxsi = sxsi_dev; + sxsiterm = sxsi + NELEMENTS(sxsi_dev); + while(sxsi < sxsiterm) { + sxsi_disconnect(sxsi); + sxsi++; + } +} + +BOOL sxsi_isconnect(SXSIDEV sxsi) { + + if (sxsi) { + switch(sxsi->devtype) { + case SXSIDEV_HDD: + if (sxsi->flag & SXSIFLAG_READY) { + return(TRUE); + } + break; + + case SXSIDEV_CDROM: + return(TRUE); + } + } + return(FALSE); +} + +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; + return(FAILURE); + } + } + sysmng_hddaccess(sxsi->drv); + return(SUCCESS); +} + + +// ---- + +SXSIDEV sxsi_getptr(REG8 drv) { UINT num; num = drv & 0x0f; - if (num >= 2) { - return(NULL); + if (!(drv & 0x20)) { // SASI or IDE + if (num < SASIHDD_MAX) { + return(sxsi_dev + num); + } } - num += (drv & 0x20) >> 4; - return(sxsi_hd + num); +#if defined(SUPPORT_SCSI) + else { + if (num < SCSIHDD_MAX) { // SCSI + return(sxsi_dev + SASIHDD_MAX + num); + } + } +#endif + return(NULL); } -const char *sxsi_getname(BYTE drv) { +const OEMCHAR *sxsi_getfilename(REG8 drv) { - SXSIHDD sxsi; + SXSIDEV sxsi; sxsi = sxsi_getptr(drv); - if (sxsi) { - return(sxsi->fname); + if ((sxsi) && (sxsi->flag & SXSIFLAG_READY)) { + return(sxsi->filename); } return(NULL); } -BOOL sxsi_hddopen(BYTE drv, const char *file) { +BRESULT sxsi_setdevtype(REG8 drv, UINT8 dev) { + + SXSIDEV sxsi; + + sxsi = sxsi_getptr(drv); + if (sxsi) { + if (sxsi->devtype != dev) { + sxsi_disconnect(sxsi); + sxsi->devtype = dev; + } + return(SUCCESS); + } + else { + return(FAILURE); + } +} + +BRESULT sxsi_devopen(REG8 drv, const OEMCHAR *file) { - SXSIHDD sxsi; -const char *ext; - FILEH fh; - THDHDR thd; - HDIHDR hdi; - V98SCSIHDR v98; + SXSIDEV sxsi; + BRESULT r; if ((file == NULL) || (file[0] == '\0')) { goto sxsiope_err; @@ -92,230 +210,133 @@ const char *ext; if (sxsi == NULL) { goto sxsiope_err; } - ext = file_getext((char *)file); - if ((!file_cmpname(ext, "thd")) && (!(drv & 0x20))) { - fh = file_open(file); // T98 HDD (SASI) - if (fh == FILEH_INVALID) { - goto sxsiope_err; - } - if (file_read(fh, &thd, sizeof(thd)) == sizeof(thd)) { - *sxsi = defsasi; - sxsi->tracks = LOADINTELWORD(thd.tracks); - sxsi->totals = sxsi->tracks * sxsi->sectors * sxsi->surfaces; - file_cpyname(sxsi->fname, file, sizeof(sxsi->fname)); - sxsi->fh = (void *)fh; - return(SUCCESS); - } - file_close(fh); + switch(sxsi->devtype) { + case SXSIDEV_HDD: + r = sxsihdd_open(sxsi, file); + break; + + case SXSIDEV_CDROM: + r = sxsicd_open(sxsi, file); + break; + + default: + r = FAILURE; + break; } - else if ((!file_cmpname(ext, "hdi")) && (!(drv & 0x20))) { - fh = file_open(file); // ANEX86 HDD (SASI) thanx Mamiya - if (fh == FILEH_INVALID) { - goto sxsiope_err; - } - if (file_read(fh, &hdi, sizeof(hdi)) == sizeof(hdi)) { - *sxsi = defsasi; - sxsi->size = LOADINTELWORD(hdi.sectorsize); - sxsi->headersize = LOADINTELDWORD(hdi.headersize); - sxsi->tracks = LOADINTELWORD(hdi.tracks); - sxsi->surfaces = hdi.surfaces[0]; - sxsi->sectors = hdi.sectors[0]; - sxsi->totals = sxsi->tracks * sxsi->sectors * sxsi->surfaces; - file_cpyname(sxsi->fname, file, sizeof(sxsi->fname)); - sxsi->fh = (void *)fh; - return(SUCCESS); - } - file_close(fh); - } - else if ((!file_cmpname(ext, "hdd")) && (drv & 0x20)) { - fh = file_open(file); // Virtual98 HDD (SCSI) - if (fh == FILEH_INVALID) { - goto sxsiope_err; - } - if ((file_read(fh, &v98, sizeof(v98)) == sizeof(v98)) && - (!memcmp(v98.vhd, "VHD", 3))) { - sxsi = &sxsi_hd[drv+2]; - *sxsi = defscsi; - sxsi->totals = (SINT32)LOADINTELDWORD(v98.totals); - sxsi->tracks = LOADINTELWORD(v98.tracks); - sxsi->size = LOADINTELWORD(v98.sectorsize); - sxsi->sectors = v98.sectors; - sxsi->surfaces = v98.surfaces; - milstr_ncpy(sxsi->fname, file, sizeof(sxsi->fname)); - sxsi->fh = (void *)fh; - return(SUCCESS); - } - file_close(fh); + if (r != SUCCESS) { + goto sxsiope_err; } + file_cpyname(sxsi->filename, file, NELEMENTS(sxsi->filename)); + sxsi->flag = SXSIFLAG_READY; +#if defined(SUPPORT_IDEIO) + ideio_notify(sxsi->drv, 1); +#endif + return(SUCCESS); sxsiope_err: return(FAILURE); } -void sxsi_open(void) { +void sxsi_devclose(REG8 drv) { - int i; - BYTE sasi; + SXSIDEV sxsi; - sxsi_trash(); - sasi = 0; - for (i=0; i<2; i++) { - if (sxsi_hddopen(sasi, np2cfg.hddfile[i]) == SUCCESS) { - sasi++; - } - } + sxsi = sxsi_getptr(drv); + sxsi_disconnect(sxsi); } -void sxsi_flash(void) { +BOOL sxsi_issasi(void) { - SXSIHDD sxsi; - SXSIHDD sxsiterm; - - sxsi = sxsi_hd; - sxsiterm = sxsi + (sizeof(sxsi_hd)/sizeof(_SXSIHDD)); - while(sxsi < sxsiterm) { - if ((FILEH)sxsi->fh != FILEH_INVALID) { - file_close((FILEH)sxsi->fh); - sxsi->fh = (void *)FILEH_INVALID; + REG8 drv; + SXSIDEV sxsi; + BOOL ret; + + ret = FALSE; + for (drv=0x00; drv<0x04; drv++) { + sxsi = sxsi_getptr(drv); + if (sxsi) { + if (sxsi->devtype == SXSIDEV_HDD) { + if (sxsi->flag & SXSIFLAG_READY) { + if (sxsi->mediatype & SXSIMEDIA_INVSASI) { + return(FALSE); + } + ret = TRUE; + } + } + else { + return(FALSE); + } } - sxsi++; } + return(ret); } -void sxsi_trash(void) { +BOOL sxsi_isscsi(void) { - SXSIHDD sxsi; - SXSIHDD sxsiterm; + REG8 drv; + SXSIDEV sxsi; - sxsi = sxsi_hd; - sxsiterm = sxsi + (sizeof(sxsi_hd)/sizeof(_SXSIHDD)); - while(sxsi < sxsiterm) { - if ((FILEH)sxsi->fh != FILEH_INVALID) { - file_close((FILEH)sxsi->fh); - sxsi->fh = (void *)FILEH_INVALID; + for (drv=0x20; drv<0x28; drv++) { + sxsi = sxsi_getptr(drv); + if (sxsi_isconnect(sxsi)) { + return(TRUE); } - sxsi->fname[0] = '\0'; - sxsi++; } + return(FALSE); } -static SXSIHDD getdrive(BYTE drv) { +BOOL sxsi_iside(void) { - UINT num; - SXSIHDD ret; + REG8 drv; + SXSIDEV sxsi; - num = drv & 0x0f; - if (num >= 2) { - return(NULL); - } - num += (drv & 0x20) >> 4; - ret = sxsi_hd + num; - if (ret->fname[0] == '\0') { - return(NULL); - } - if ((FILEH)ret->fh == FILEH_INVALID) { - ret->fh = (void *)file_open(ret->fname); - if ((FILEH)ret->fh == FILEH_INVALID) { - ret->fname[0] = '\0'; - return(NULL); + for (drv=0x00; drv<0x04; drv++) { + sxsi = sxsi_getptr(drv); + if (sxsi_isconnect(sxsi)) { + return(TRUE); } } - return(ret); + return(FALSE); } -BYTE sxsi_read(BYTE drv, long pos, BYTE *buf, UINT16 size) { -const _SXSIHDD *sxsi; - long r; - UINT16 rsize; - sxsi = getdrive(drv); - if (sxsi == NULL) { - return(0x60); +REG8 sxsi_read(REG8 drv, long pos, UINT8 *buf, UINT size) { + + SXSIDEV sxsi; + + sxsi = sxsi_getptr(drv); + if (sxsi != NULL) { + return(sxsi->read(sxsi, pos, buf, size)); } - pos = pos * sxsi->size + sxsi->headersize; - r = file_seek((FILEH)sxsi->fh, pos, FSEEK_SET); - if (r == -1) { - return(0x40); - } - if (pos != r) { - return(0xd0); - } - while(size) { - rsize = min(size, sxsi->size); - nevent.remainclock -= rsize; - if (file_read((FILEH)sxsi->fh, buf, rsize) != rsize) { - return(0xd0); - } - buf += rsize; - size -= rsize; + else { + return(0x60); } - return(0x00); } -BYTE sxsi_write(BYTE drv, long pos, const BYTE *buf, UINT16 size) { +REG8 sxsi_write(REG8 drv, long pos, const UINT8 *buf, UINT size) { -const _SXSIHDD *sxsi; - long r; - UINT16 wsize; + SXSIDEV sxsi; - sxsi = getdrive(drv); - if (sxsi == NULL) { - return(0x60); + sxsi = sxsi_getptr(drv); + if (sxsi != NULL) { + return(sxsi->write(sxsi, pos, buf, size)); } - pos = pos * sxsi->size + sxsi->headersize; - r = file_seek((FILEH)sxsi->fh, pos, FSEEK_SET); - if (r == -1) { - return(0x40); - } - if (pos != r) { - return(0xd0); - } - while(size) { - wsize = min(size, sxsi->size); - nevent.remainclock -= wsize; - if (file_write((FILEH)sxsi->fh, buf, wsize) != wsize) { - return(0x70); - } - buf += wsize; - size -= wsize; + else { + return(0x60); } - return(0x00); } -BYTE sxsi_format(BYTE drv, long pos) { +REG8 sxsi_format(REG8 drv, long pos) { -const _SXSIHDD *sxsi; - long r; - UINT16 i; - BYTE work[256]; - UINT size; - UINT wsize; + SXSIDEV sxsi; - sxsi = getdrive(drv); - if (sxsi == NULL) { - return(0x60); + sxsi = sxsi_getptr(drv); + if (sxsi != NULL) { + return(sxsi->format(sxsi, pos)); } - pos = pos * sxsi->size + sxsi->headersize; - r = file_seek((FILEH)sxsi->fh, pos, FSEEK_SET); - if (r == -1) { - return(0x40); - } - if (pos != r) { - return(0xd0); - } - FillMemory(work, sizeof(work), 0xe5); - for (i=0; isectors; i++) { - size = sxsi->size; - while(size) { - wsize = min(size, sizeof(work)); - size -= wsize; - nevent.remainclock -= wsize; - if (file_write((FILEH)sxsi->fh, work, wsize) != wsize) { - return(0x70); - } - } + else { + return(0x60); } - return(0x00); }