--- np2/fdd/sxsi.c 2004/01/22 01:10:04 1.7 +++ np2/fdd/sxsi.c 2004/02/13 20:31:55 1.11 @@ -7,12 +7,8 @@ #include "sxsi.h" -static const char sig_vhd[] = "VHD"; - -static const _SXSIDEV defide = {615*33*8, 615, 256, 33, 8, - SXSITYPE_IDE | SXSITYPE_HDD, 256, 0, {0x00}}; -static const _SXSIDEV defscsi = {40*16*32*8, 40*16, 256, 32, 8, - SXSITYPE_SCSI | SXSITYPE_HDD, 220, 0, {0x00}}; +const char sig_vhd[8] = "VHD1.00"; +const char sig_nhd[15] = "T98HDDIMAGE.R0"; const SASIHDD sasihdd[7] = { {33, 4, 153}, // 5MB @@ -23,6 +19,14 @@ const SASIHDD sasihdd[7] = { {33, 6, 615}, // 30MB {33, 8, 615}}; // 40MB +#if 0 +static const _SXSIDEV defide = {615*33*8, 615, 256, 33, 8, + SXSITYPE_IDE | SXSITYPE_HDD, 256, 0, {0x00}}; +static const _SXSIDEV defscsi = {40*16*32*8, 40*16, 256, 32, 8, + SXSITYPE_SCSI | SXSITYPE_HDD, 220, 0, {0x00}}; +#endif + + _SXSIDEV sxsi_dev[SASIHDD_MAX + SCSIHDD_MAX]; @@ -33,7 +37,7 @@ const SASIHDD *sasi; UINT i; sasi = sasihdd; - for (i=0; isize == 256) && (sxsi->sectors == sasi->sectors) && (sxsi->surfaces == sasi->surfaces) && @@ -44,6 +48,7 @@ const SASIHDD *sasi; } } + // ---- void sxsi_initialize(void) { @@ -61,16 +66,18 @@ SXSIDEV sxsi_getptr(REG8 drv) { UINT num; num = drv & 0x0f; - if (!(drv & 0x20)) { // SASI or IDE - if (num < 2) { + if (!(drv & 0x20)) { // SASI or IDE + if (num < SASIHDD_MAX) { return(sxsi_dev + num); } } +#if defined(SUPPORT_SCSI) else { - if (num < 4) { // SCSI + if (num < SCSIHDD_MAX) { // SCSI return(sxsi_dev + SASIHDD_MAX + num); } } +#endif return(NULL); } @@ -87,80 +94,118 @@ const char *sxsi_getname(REG8 drv) { BOOL sxsi_hddopen(REG8 drv, const char *file) { - SXSIDEV sxsi; -const char *ext; - FILEH fh; - THDHDR thd; - HDIHDR hdi; - VHDHDR vhd; + SXSIDEV sxsi; + FILEH fh; +const char *ext; + UINT16 type; + long totals; + UINT32 headersize; + UINT32 surfaces; + UINT32 cylinders; + UINT32 sectors; + UINT32 size; if ((file == NULL) || (file[0] == '\0')) { - goto sxsiope_err; + goto sxsiope_err1; } sxsi = sxsi_getptr(drv); if (sxsi == NULL) { - goto sxsiope_err; + goto sxsiope_err1; + } + fh = file_open(file); + if (fh == FILEH_INVALID) { + goto sxsiope_err1; } ext = file_getext((char *)file); + type = SXSITYPE_HDD; if ((!file_cmpname(ext, str_thd)) && (!(drv & 0x20))) { - fh = file_open(file); // T98 HDD (IDE) - if (fh == FILEH_INVALID) { - goto sxsiope_err; - } - if (file_read(fh, &thd, sizeof(thd)) == sizeof(thd)) { - *sxsi = defide; - sxsi->cylinders = LOADINTELWORD(thd.cylinders); - sxsi->totals = sxsi->cylinders * sxsi->sectors * sxsi->surfaces; - sasihddcheck(sxsi); - file_cpyname(sxsi->fname, file, sizeof(sxsi->fname)); - sxsi->fh = (long)fh; - return(SUCCESS); - } - file_close(fh); + THDHDR thd; // T98 HDD (IDE) + if (file_read(fh, &thd, sizeof(thd)) != sizeof(thd)) { + goto sxsiope_err2; + } + headersize = 256; + surfaces = 8; + cylinders = LOADINTELWORD(thd.cylinders); + sectors = 33; + size = 256; + totals = cylinders * sectors * surfaces; + } + else if ((!file_cmpname(ext, str_nhd)) && (!(drv & 0x20))) { + NHDHDR nhd; // T98Next HDD (IDE) + if ((file_read(fh, &nhd, sizeof(nhd)) != sizeof(nhd)) || + (memcmp(nhd.sig, sig_nhd, 15))) { + goto sxsiope_err2; + } + headersize = LOADINTELDWORD(nhd.headersize); + surfaces = LOADINTELWORD(nhd.surfaces); + cylinders = LOADINTELDWORD(nhd.cylinders); + sectors = LOADINTELWORD(nhd.sectors); + size = LOADINTELWORD(nhd.sectorsize); + totals = cylinders * sectors * surfaces; } else if ((!file_cmpname(ext, str_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 = defide; - sxsi->size = LOADINTELWORD(hdi.sectorsize); - sxsi->headersize = LOADINTELDWORD(hdi.headersize); - sxsi->cylinders = LOADINTELWORD(hdi.cylinders); - sxsi->surfaces = hdi.surfaces[0]; - sxsi->sectors = hdi.sectors[0]; - sxsi->totals = sxsi->cylinders * sxsi->sectors * sxsi->surfaces; - sasihddcheck(sxsi); - file_cpyname(sxsi->fname, file, sizeof(sxsi->fname)); - sxsi->fh = (long)fh; - return(SUCCESS); - } - file_close(fh); + HDIHDR hdi; // ANEX86 HDD (SASI) thanx Mamiya + if (file_read(fh, &hdi, sizeof(hdi)) != sizeof(hdi)) { + goto sxsiope_err2; + } + headersize = LOADINTELDWORD(hdi.headersize); + surfaces = LOADINTELDWORD(hdi.surfaces); + cylinders = LOADINTELDWORD(hdi.cylinders); + sectors = LOADINTELDWORD(hdi.sectors); + size = LOADINTELDWORD(hdi.sectorsize); + totals = cylinders * sectors * surfaces; } else if ((!file_cmpname(ext, str_hdd)) && (drv & 0x20)) { - TRACEOUT(("insert hdd - %.2x", drv)); - fh = file_open(file); // Virtual98 HDD (SCSI) - if (fh == FILEH_INVALID) { - goto sxsiope_err; - } - if ((file_read(fh, &vhd, sizeof(vhd)) == sizeof(vhd)) && - (!memcmp(vhd.sig, sig_vhd, 3))) { - *sxsi = defscsi; - sxsi->totals = (SINT32)LOADINTELDWORD(vhd.totals); - sxsi->cylinders = LOADINTELWORD(vhd.cylinders); - sxsi->size = LOADINTELWORD(vhd.sectorsize); - sxsi->sectors = vhd.sectors; - sxsi->surfaces = vhd.surfaces; - file_cpyname(sxsi->fname, file, sizeof(sxsi->fname)); - sxsi->fh = (long)fh; - TRACEOUT(("success")); - return(SUCCESS); - } - file_close(fh); + VHDHDR vhd; // Virtual98 HDD (SCSI) + if ((file_read(fh, &vhd, sizeof(vhd)) != sizeof(vhd)) || + (memcmp(vhd.sig, sig_vhd, 5))) { + goto sxsiope_err2; + } + headersize = sizeof(vhd); + surfaces = vhd.surfaces; + cylinders = LOADINTELWORD(vhd.cylinders); + sectors = vhd.sectors; + size = LOADINTELWORD(vhd.sectorsize); + totals = (SINT32)LOADINTELDWORD(vhd.totals); + } + else { + goto sxsiope_err2; + } + + // フォーマット確認〜 + if ((surfaces == 0) || (surfaces >= 256) || + (cylinders == 0) || (cylinders >= 65536) || + (sectors == 0) || (sectors >= 256) || + (size == 0) || ((size & (size - 1)) != 0)) { + goto sxsiope_err2; + } + if (!(drv & 0x20)) { + type |= SXSITYPE_IDE; } + else { + type |= SXSITYPE_SCSI; + if (!(size & 0x700)) { // not 256,512,1024 + goto sxsiope_err2; + } + } + sxsi->totals = totals; + sxsi->cylinders = (UINT16)cylinders; + sxsi->size = (UINT16)size; + sxsi->sectors = (UINT8)sectors; + sxsi->surfaces = (UINT8)surfaces; + sxsi->type = type; + sxsi->headersize = headersize; + sxsi->fh = (long)fh; + file_cpyname(sxsi->fname, file, sizeof(sxsi->fname)); + if (type == (SXSITYPE_IDE | SXSITYPE_HDD)) { + sasihddcheck(sxsi); + } + return(SUCCESS); -sxsiope_err: +sxsiope_err2: + file_close(fh); + +sxsiope_err1: return(FAILURE); } @@ -176,12 +221,14 @@ void sxsi_open(void) { drv++; } } +#if defined(SUPPORT_SCSI) drv = 0x20; for (i=0; i<4; i++) { if (sxsi_hddopen(drv, np2cfg.scsihdd[i]) == SUCCESS) { drv++; } } +#endif } void sxsi_flash(void) { @@ -210,25 +257,19 @@ void sxsi_trash(void) { while(sxsi < sxsiterm) { if ((FILEH)sxsi->fh != FILEH_INVALID) { file_close((FILEH)sxsi->fh); - sxsi->fh = (long)FILEH_INVALID; } - sxsi->fname[0] = '\0'; + ZeroMemory(sxsi, sizeof(_SXSIDEV)); + sxsi->fh = (long)FILEH_INVALID; sxsi++; } } static SXSIDEV getdrive(REG8 drv) { - UINT num; SXSIDEV ret; - num = drv & 0x0f; - if (num >= 2) { - return(NULL); - } - num += (drv & 0x20) >> 4; - ret = sxsi_dev + num; - if (ret->fname[0] == '\0') { + ret = sxsi_getptr(drv); + if ((ret == NULL) || (ret->fname[0] == '\0')) { return(NULL); } if ((FILEH)ret->fh == FILEH_INVALID) { @@ -242,6 +283,58 @@ static SXSIDEV getdrive(REG8 drv) { return(ret); } +BOOL sxsi_issasi(void) { + + REG8 drv; + SXSIDEV sxsi; + BOOL ret; + UINT sxsiif; + + ret = FALSE; + for (drv=0x00; drv<0x04; drv++) { + sxsi = sxsi_getptr(drv); + if (sxsi) { + sxsiif = sxsi->type & SXSITYPE_IFMASK; + if (sxsiif == SXSITYPE_SASI) { + ret = TRUE; + } + else if (sxsiif == SXSITYPE_IDE) { + ret = FALSE; + break; + } + } + } + return(ret); +} + +BOOL sxsi_isscsi(void) { + + REG8 drv; + SXSIDEV sxsi; + + for (drv=0x20; drv<0x28; drv++) { + sxsi = sxsi_getptr(drv); + if ((sxsi) && (sxsi->type)) { + return(TRUE); + } + } + return(FALSE); +} + +BOOL sxsi_iside(void) { + + REG8 drv; + SXSIDEV sxsi; + + for (drv=0x00; drv<0x04; drv++) { + sxsi = sxsi_getptr(drv); + if ((sxsi) && (sxsi->type)) { + return(TRUE); + } + } + return(FALSE); +} + REG8 sxsi_read(REG8 drv, long pos, BYTE *buf, UINT size) { const _SXSIDEV *sxsi;