--- np2/fdd/sxsi.c 2003/10/16 17:58:31 1.1.1.1 +++ np2/fdd/sxsi.c 2004/01/22 01:10:04 1.7 @@ -1,45 +1,48 @@ #include "compiler.h" +#include "strres.h" #include "dosio.h" +#include "sysmng.h" +#include "cpucore.h" #include "pccore.h" #include "sxsi.h" -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}}; - - - _SXSIHDD sxsi_hd[4]; +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 SASIHDD sasihdd[7] = { + {33, 4, 153}, // 5MB + {33, 4, 310}, // 10MB + {33, 6, 310}, // 15MB + {33, 8, 310}, // 20MB + {33, 4, 615}, // 20MB (not used!) + {33, 6, 615}, // 30MB + {33, 8, 615}}; // 40MB + + _SXSIDEV sxsi_dev[SASIHDD_MAX + SCSIHDD_MAX]; + + +// SASI規格HDDかチェック +static void sasihddcheck(SXSIDEV sxsi) { + +const SASIHDD *sasi; + UINT i; + + sasi = sasihdd; + for (i=0; isize == 256) && + (sxsi->sectors == sasi->sectors) && + (sxsi->surfaces == sasi->surfaces) && + (sxsi->cylinders == sasi->cylinders)) { + sxsi->type = (UINT16)(SXSITYPE_SASI + (i << 8) + SXSITYPE_HDD); + break; + } + } +} // ---- @@ -47,27 +50,33 @@ 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; i<(sizeof(sxsi_dev)/sizeof(_SXSIDEV)); i++) { + sxsi_dev[i].fh = (long)FILEH_INVALID; } } -SXSIHDD sxsi_getptr(BYTE drv) { +SXSIDEV sxsi_getptr(REG8 drv) { UINT num; num = drv & 0x0f; - if (num >= 2) { - return(NULL); + if (!(drv & 0x20)) { // SASI or IDE + if (num < 2) { + return(sxsi_dev + num); + } } - num += (drv & 0x20) >> 4; - return(sxsi_hd + num); + else { + if (num < 4) { // SCSI + return(sxsi_dev + SASIHDD_MAX + num); + } + } + return(NULL); } -const char *sxsi_getname(BYTE drv) { +const char *sxsi_getname(REG8 drv) { - SXSIHDD sxsi; + SXSIDEV sxsi; sxsi = sxsi_getptr(drv); if (sxsi) { @@ -76,14 +85,14 @@ const char *sxsi_getname(BYTE drv) { return(NULL); } -BOOL sxsi_hddopen(BYTE drv, const char *file) { +BOOL sxsi_hddopen(REG8 drv, const char *file) { - SXSIHDD sxsi; + SXSIDEV sxsi; const char *ext; FILEH fh; THDHDR thd; HDIHDR hdi; - V98SCSIHDR v98; + VHDHDR vhd; if ((file == NULL) || (file[0] == '\0')) { goto sxsiope_err; @@ -93,56 +102,59 @@ const char *ext; goto sxsiope_err; } ext = file_getext((char *)file); - if ((!file_cmpname(ext, "thd")) && (!(drv & 0x20))) { - fh = file_open(file); // T98 HDD (SASI) + 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 = defsasi; - sxsi->tracks = LOADINTELWORD(thd.tracks); - sxsi->totals = sxsi->tracks * sxsi->sectors * sxsi->surfaces; + *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 = (void *)fh; + sxsi->fh = (long)fh; return(SUCCESS); } file_close(fh); } - else if ((!file_cmpname(ext, "hdi")) && (!(drv & 0x20))) { + 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 = defsasi; + *sxsi = defide; sxsi->size = LOADINTELWORD(hdi.sectorsize); sxsi->headersize = LOADINTELDWORD(hdi.headersize); - sxsi->tracks = LOADINTELWORD(hdi.tracks); + sxsi->cylinders = LOADINTELWORD(hdi.cylinders); sxsi->surfaces = hdi.surfaces[0]; sxsi->sectors = hdi.sectors[0]; - sxsi->totals = sxsi->tracks * sxsi->sectors * sxsi->surfaces; + sxsi->totals = sxsi->cylinders * sxsi->sectors * sxsi->surfaces; + sasihddcheck(sxsi); file_cpyname(sxsi->fname, file, sizeof(sxsi->fname)); - sxsi->fh = (void *)fh; + sxsi->fh = (long)fh; return(SUCCESS); } file_close(fh); } - else if ((!file_cmpname(ext, "hdd")) && (drv & 0x20)) { + 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, &v98, sizeof(v98)) == sizeof(v98)) && - (!memcmp(v98.vhd, "VHD", 3))) { - sxsi = &sxsi_hd[drv+2]; + if ((file_read(fh, &vhd, sizeof(vhd)) == sizeof(vhd)) && + (!memcmp(vhd.sig, sig_vhd, 3))) { *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; + 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); @@ -155,28 +167,34 @@ sxsiope_err: void sxsi_open(void) { int i; - BYTE sasi; + REG8 drv; sxsi_trash(); - sasi = 0; + drv = 0; for (i=0; i<2; i++) { - if (sxsi_hddopen(sasi, np2cfg.hddfile[i]) == SUCCESS) { - sasi++; + if (sxsi_hddopen(drv, np2cfg.sasihdd[i]) == SUCCESS) { + drv++; + } + } + drv = 0x20; + for (i=0; i<4; i++) { + if (sxsi_hddopen(drv, np2cfg.scsihdd[i]) == SUCCESS) { + drv++; } } } void sxsi_flash(void) { - SXSIHDD sxsi; - SXSIHDD sxsiterm; + SXSIDEV sxsi; + SXSIDEV sxsiterm; - sxsi = sxsi_hd; - sxsiterm = sxsi + (sizeof(sxsi_hd)/sizeof(_SXSIHDD)); + sxsi = sxsi_dev; + sxsiterm = sxsi + (sizeof(sxsi_dev)/sizeof(_SXSIDEV)); while(sxsi < sxsiterm) { if ((FILEH)sxsi->fh != FILEH_INVALID) { file_close((FILEH)sxsi->fh); - sxsi->fh = (void *)FILEH_INVALID; + sxsi->fh = (long)FILEH_INVALID; } sxsi++; } @@ -184,50 +202,51 @@ void sxsi_flash(void) { void sxsi_trash(void) { - SXSIHDD sxsi; - SXSIHDD sxsiterm; + SXSIDEV sxsi; + SXSIDEV sxsiterm; - sxsi = sxsi_hd; - sxsiterm = sxsi + (sizeof(sxsi_hd)/sizeof(_SXSIHDD)); + sxsi = sxsi_dev; + sxsiterm = sxsi + (sizeof(sxsi_dev)/sizeof(_SXSIDEV)); while(sxsi < sxsiterm) { if ((FILEH)sxsi->fh != FILEH_INVALID) { file_close((FILEH)sxsi->fh); - sxsi->fh = (void *)FILEH_INVALID; + sxsi->fh = (long)FILEH_INVALID; } sxsi->fname[0] = '\0'; sxsi++; } } -static SXSIHDD getdrive(BYTE drv) { +static SXSIDEV getdrive(REG8 drv) { UINT num; - SXSIHDD ret; + SXSIDEV ret; num = drv & 0x0f; if (num >= 2) { return(NULL); } num += (drv & 0x20) >> 4; - ret = sxsi_hd + num; + ret = sxsi_dev + num; if (ret->fname[0] == '\0') { return(NULL); } if ((FILEH)ret->fh == FILEH_INVALID) { - ret->fh = (void *)file_open(ret->fname); + ret->fh = (long)file_open(ret->fname); if ((FILEH)ret->fh == FILEH_INVALID) { ret->fname[0] = '\0'; return(NULL); } } + sysmng_hddaccess(drv); return(ret); } -BYTE sxsi_read(BYTE drv, long pos, BYTE *buf, UINT16 size) { +REG8 sxsi_read(REG8 drv, long pos, BYTE *buf, UINT size) { -const _SXSIHDD *sxsi; +const _SXSIDEV *sxsi; long r; - UINT16 rsize; + UINT rsize; sxsi = getdrive(drv); if (sxsi == NULL) { @@ -243,7 +262,7 @@ const _SXSIHDD *sxsi; } while(size) { rsize = min(size, sxsi->size); - nevent.remainclock -= rsize; + CPU_REMCLOCK -= rsize; if (file_read((FILEH)sxsi->fh, buf, rsize) != rsize) { return(0xd0); } @@ -253,11 +272,11 @@ const _SXSIHDD *sxsi; return(0x00); } -BYTE sxsi_write(BYTE drv, long pos, const BYTE *buf, UINT16 size) { +REG8 sxsi_write(REG8 drv, long pos, const BYTE *buf, UINT size) { -const _SXSIHDD *sxsi; +const _SXSIDEV *sxsi; long r; - UINT16 wsize; + UINT wsize; sxsi = getdrive(drv); if (sxsi == NULL) { @@ -273,7 +292,7 @@ const _SXSIHDD *sxsi; } while(size) { wsize = min(size, sxsi->size); - nevent.remainclock -= wsize; + CPU_REMCLOCK -= wsize; if (file_write((FILEH)sxsi->fh, buf, wsize) != wsize) { return(0x70); } @@ -283,9 +302,9 @@ const _SXSIHDD *sxsi; return(0x00); } -BYTE sxsi_format(BYTE drv, long pos) { +REG8 sxsi_format(REG8 drv, long pos) { -const _SXSIHDD *sxsi; +const _SXSIDEV *sxsi; long r; UINT16 i; BYTE work[256]; @@ -310,7 +329,7 @@ const _SXSIHDD *sxsi; while(size) { wsize = min(size, sizeof(work)); size -= wsize; - nevent.remainclock -= wsize; + CPU_REMCLOCK -= wsize; if (file_write((FILEH)sxsi->fh, work, wsize) != wsize) { return(0x70); }