| version 1.1, 2003/10/16 17:58:31 | version 1.9, 2004/01/27 03:24:19 | 
| Line 1 | Line 1 | 
 | #include        "compiler.h" | #include        "compiler.h" | 
 |  | #include        "strres.h" | 
 | #include        "dosio.h" | #include        "dosio.h" | 
 |  | #include        "sysmng.h" | 
 |  | #include        "cpucore.h" | 
 | #include        "pccore.h" | #include        "pccore.h" | 
 | #include        "sxsi.h" | #include        "sxsi.h" | 
 |  |  | 
 |  |  | 
| typedef struct { | const char sig_vhd[8] = "VHD1.00"; | 
| char    vhd[3]; | const char sig_nhd[15] = "T98HDDIMAGE.R0"; | 
| 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}}; |  | 
 |  |  | 
|  | const SASIHDD sasihdd[7] = { | 
| _SXSIHDD        sxsi_hd[4]; | {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 | 
|  |  | 
|  | #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]; | 
|  |  | 
|  |  | 
|  | // SASI規格HDDかチェック | 
|  | static void sasihddcheck(SXSIDEV sxsi) { | 
|  |  | 
|  | const SASIHDD   *sasi; | 
|  | UINT            i; | 
|  |  | 
|  | sasi = sasihdd; | 
|  | for (i=0; i<sizeof(sasihdd)/sizeof(SASIHDD); i++, sasi++) { | 
|  | if ((sxsi->size == 256) && | 
|  | (sxsi->sectors == sasi->sectors) && | 
|  | (sxsi->surfaces == sasi->surfaces) && | 
|  | (sxsi->cylinders == sasi->cylinders)) { | 
|  | sxsi->type = (UINT16)(SXSITYPE_SASI + (i << 8) + SXSITYPE_HDD); | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
 |  |  | 
 |  |  | 
 | // ---- | // ---- | 
| Line 47  void sxsi_initialize(void) { | Line 55  void sxsi_initialize(void) { | 
 |  |  | 
 | UINT    i; | UINT    i; | 
 |  |  | 
| ZeroMemory(sxsi_hd, sizeof(sxsi_hd)); | ZeroMemory(sxsi_dev, sizeof(sxsi_dev)); | 
| for (i=0; i<(sizeof(sxsi_hd)/sizeof(_SXSIHDD)); i++) { | for (i=0; i<(sizeof(sxsi_dev)/sizeof(_SXSIDEV)); i++) { | 
| sxsi_hd[i].fh = (void *)FILEH_INVALID; | sxsi_dev[i].fh = (long)FILEH_INVALID; | 
 | } | } | 
 | } | } | 
 |  |  | 
| SXSIHDD sxsi_getptr(BYTE drv) { | SXSIDEV sxsi_getptr(REG8 drv) { | 
 |  |  | 
 | UINT    num; | UINT    num; | 
 |  |  | 
 | num = drv & 0x0f; | num = drv & 0x0f; | 
| if (num >= 2) { | if (!(drv & 0x20)) {                    // SASI or IDE | 
| return(NULL); | if (num < 2) { | 
|  | return(sxsi_dev + num); | 
|  | } | 
 | } | } | 
| num += (drv & 0x20) >> 4; | else { | 
| return(sxsi_hd + num); | 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); | sxsi = sxsi_getptr(drv); | 
 | if (sxsi) { | if (sxsi) { | 
| Line 76  const char *sxsi_getname(BYTE drv) { | Line 90  const char *sxsi_getname(BYTE drv) { | 
 | return(NULL); | 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; | 
| FILEH           fh; | const char      *ext; | 
| THDHDR          thd; | UINT16  type; | 
| HDIHDR          hdi; | long    totals; | 
| V98SCSIHDR      v98; | UINT32  headersize; | 
|  | UINT32  surfaces; | 
|  | UINT32  cylinders; | 
|  | UINT32  sectors; | 
|  | UINT32  size; | 
 |  |  | 
 | if ((file == NULL) || (file[0] == '\0')) { | if ((file == NULL) || (file[0] == '\0')) { | 
| goto sxsiope_err; | goto sxsiope_err1; | 
 | } | } | 
 | sxsi = sxsi_getptr(drv); | sxsi = sxsi_getptr(drv); | 
 | if (sxsi == NULL) { | 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); | ext = file_getext((char *)file); | 
| if ((!file_cmpname(ext, "thd")) && (!(drv & 0x20))) { | type = SXSITYPE_HDD; | 
| fh = file_open(file);                                                           // T98 HDD (SASI) | if ((!file_cmpname(ext, str_thd)) && (!(drv & 0x20))) { | 
| if (fh == FILEH_INVALID) { | THDHDR thd;                                             // T98 HDD (IDE) | 
| goto sxsiope_err; | if (file_read(fh, &thd, sizeof(thd)) != sizeof(thd)) { | 
| } | goto sxsiope_err2; | 
| if (file_read(fh, &thd, sizeof(thd)) == sizeof(thd)) { | } | 
| *sxsi = defsasi; | headersize = 256; | 
| sxsi->tracks = LOADINTELWORD(thd.tracks); | surfaces = 8; | 
| sxsi->totals = sxsi->tracks * sxsi->sectors * sxsi->surfaces; | cylinders = LOADINTELWORD(thd.cylinders); | 
| file_cpyname(sxsi->fname, file, sizeof(sxsi->fname)); | sectors = 33; | 
| sxsi->fh = (void *)fh; | size = 256; | 
| return(SUCCESS); | totals = cylinders * sectors * surfaces; | 
| } | } | 
| file_close(fh); | else if ((!file_cmpname(ext, str_hdi)) && (!(drv & 0x20))) { | 
| } | HDIHDR hdi;                                             // ANEX86 HDD (SASI) thanx Mamiya | 
| else if ((!file_cmpname(ext, "hdi")) && (!(drv & 0x20))) { | if (file_read(fh, &hdi, sizeof(hdi)) != sizeof(hdi)) { | 
| fh = file_open(file);                           // ANEX86 HDD (SASI) thanx Mamiya | goto sxsiope_err2; | 
| if (fh == FILEH_INVALID) { | } | 
| goto sxsiope_err; | headersize = LOADINTELDWORD(hdi.headersize); | 
| } | surfaces = LOADINTELDWORD(hdi.surfaces); | 
| if (file_read(fh, &hdi, sizeof(hdi)) == sizeof(hdi)) { | cylinders = LOADINTELDWORD(hdi.cylinders); | 
| *sxsi = defsasi; | sectors = LOADINTELDWORD(hdi.sectors); | 
| sxsi->size = LOADINTELWORD(hdi.sectorsize); | size = LOADINTELDWORD(hdi.sectorsize); | 
| sxsi->headersize = LOADINTELDWORD(hdi.headersize); | totals = cylinders * sectors * surfaces; | 
| sxsi->tracks = LOADINTELWORD(hdi.tracks); | } | 
| sxsi->surfaces = hdi.surfaces[0]; | else if ((!file_cmpname(ext, str_nhd)) && (!(drv & 0x20))) { | 
| sxsi->sectors = hdi.sectors[0]; | NHDHDR nhd;                                             // T98Next HDD (IDE) | 
| sxsi->totals = sxsi->tracks * sxsi->sectors * sxsi->surfaces; | if ((file_read(fh, &nhd, sizeof(nhd)) != sizeof(nhd)) || | 
| file_cpyname(sxsi->fname, file, sizeof(sxsi->fname)); | (memcmp(nhd.sig, sig_nhd, 15))) { | 
| sxsi->fh = (void *)fh; | goto sxsiope_err2; | 
| return(SUCCESS); | } | 
| } | headersize = LOADINTELDWORD(nhd.headersize); | 
| file_close(fh); | surfaces = LOADINTELWORD(nhd.surfaces); | 
| } | cylinders = LOADINTELDWORD(nhd.cylinders); | 
| else if ((!file_cmpname(ext, "hdd")) && (drv & 0x20)) { | sectors = LOADINTELWORD(nhd.sectors); | 
| fh = file_open(file);                                           // Virtual98 HDD (SCSI) | size = LOADINTELWORD(nhd.sectorsize); | 
| if (fh == FILEH_INVALID) { | totals = cylinders * sectors * surfaces; | 
| goto sxsiope_err; | } | 
| } | else if ((!file_cmpname(ext, str_hdd)) && (drv & 0x20)) { | 
| if ((file_read(fh, &v98, sizeof(v98)) == sizeof(v98)) && | VHDHDR vhd;                                             // Virtual98 HDD (SCSI) | 
| (!memcmp(v98.vhd, "VHD", 3))) { | if ((file_read(fh, &vhd, sizeof(vhd)) != sizeof(vhd)) || | 
| sxsi = &sxsi_hd[drv+2]; | (memcmp(vhd.sig, sig_vhd, 5))) { | 
| *sxsi = defscsi; | goto sxsiope_err2; | 
| sxsi->totals = (SINT32)LOADINTELDWORD(v98.totals); | } | 
| sxsi->tracks = LOADINTELWORD(v98.tracks); | headersize = 220; | 
| sxsi->size = LOADINTELWORD(v98.sectorsize); | surfaces = vhd.surfaces; | 
| sxsi->sectors = v98.sectors; | cylinders = LOADINTELWORD(vhd.cylinders); | 
| sxsi->surfaces = v98.surfaces; | sectors = vhd.sectors; | 
| milstr_ncpy(sxsi->fname, file, sizeof(sxsi->fname)); | size = LOADINTELWORD(vhd.sectorsize); | 
| sxsi->fh = (void *)fh; | totals = (SINT32)LOADINTELDWORD(vhd.totals); | 
| return(SUCCESS); | } | 
| } | else { | 
| file_close(fh); | 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); | return(FAILURE); | 
 | } | } | 
 |  |  | 
 | void sxsi_open(void) { | void sxsi_open(void) { | 
 |  |  | 
 | int             i; | int             i; | 
| BYTE    sasi; | REG8    drv; | 
 |  |  | 
 | sxsi_trash(); | sxsi_trash(); | 
| sasi = 0; | drv = 0; | 
 | for (i=0; i<2; i++) { | for (i=0; i<2; i++) { | 
| if (sxsi_hddopen(sasi, np2cfg.hddfile[i]) == SUCCESS) { | if (sxsi_hddopen(drv, np2cfg.sasihdd[i]) == SUCCESS) { | 
| sasi++; | drv++; | 
|  | } | 
|  | } | 
|  | drv = 0x20; | 
|  | for (i=0; i<4; i++) { | 
|  | if (sxsi_hddopen(drv, np2cfg.scsihdd[i]) == SUCCESS) { | 
|  | drv++; | 
 | } | } | 
 | } | } | 
 | } | } | 
 |  |  | 
 | void sxsi_flash(void) { | void sxsi_flash(void) { | 
 |  |  | 
| SXSIHDD sxsi; | SXSIDEV sxsi; | 
| SXSIHDD sxsiterm; | SXSIDEV sxsiterm; | 
 |  |  | 
| sxsi = sxsi_hd; | sxsi = sxsi_dev; | 
| sxsiterm = sxsi + (sizeof(sxsi_hd)/sizeof(_SXSIHDD)); | sxsiterm = sxsi + (sizeof(sxsi_dev)/sizeof(_SXSIDEV)); | 
 | while(sxsi < sxsiterm) { | while(sxsi < sxsiterm) { | 
 | if ((FILEH)sxsi->fh != FILEH_INVALID) { | if ((FILEH)sxsi->fh != FILEH_INVALID) { | 
 | file_close((FILEH)sxsi->fh); | file_close((FILEH)sxsi->fh); | 
| sxsi->fh = (void *)FILEH_INVALID; | sxsi->fh = (long)FILEH_INVALID; | 
 | } | } | 
 | sxsi++; | sxsi++; | 
 | } | } | 
| Line 184  void sxsi_flash(void) { | Line 245  void sxsi_flash(void) { | 
 |  |  | 
 | void sxsi_trash(void) { | void sxsi_trash(void) { | 
 |  |  | 
| SXSIHDD sxsi; | SXSIDEV sxsi; | 
| SXSIHDD sxsiterm; | SXSIDEV sxsiterm; | 
 |  |  | 
| sxsi = sxsi_hd; | sxsi = sxsi_dev; | 
| sxsiterm = sxsi + (sizeof(sxsi_hd)/sizeof(_SXSIHDD)); | sxsiterm = sxsi + (sizeof(sxsi_dev)/sizeof(_SXSIDEV)); | 
 | while(sxsi < sxsiterm) { | while(sxsi < sxsiterm) { | 
 | if ((FILEH)sxsi->fh != FILEH_INVALID) { | if ((FILEH)sxsi->fh != FILEH_INVALID) { | 
 | file_close((FILEH)sxsi->fh); | file_close((FILEH)sxsi->fh); | 
 | sxsi->fh = (void *)FILEH_INVALID; |  | 
 | } | } | 
| sxsi->fname[0] = '\0'; | ZeroMemory(sxsi, sizeof(_SXSIDEV)); | 
|  | sxsi->fh = (long)FILEH_INVALID; | 
 | sxsi++; | sxsi++; | 
 | } | } | 
 | } | } | 
 |  |  | 
| static SXSIHDD getdrive(BYTE drv) { | static SXSIDEV getdrive(REG8 drv) { | 
 |  |  | 
 | UINT    num; | UINT    num; | 
| SXSIHDD ret; | SXSIDEV ret; | 
 |  |  | 
 | num = drv & 0x0f; | num = drv & 0x0f; | 
 | if (num >= 2) { | if (num >= 2) { | 
 | return(NULL); | return(NULL); | 
 | } | } | 
 | num += (drv & 0x20) >> 4; | num += (drv & 0x20) >> 4; | 
| ret = sxsi_hd + num; | ret = sxsi_dev + num; | 
 | if (ret->fname[0] == '\0') { | if (ret->fname[0] == '\0') { | 
 | return(NULL); | return(NULL); | 
 | } | } | 
 | if ((FILEH)ret->fh == FILEH_INVALID) { | 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) { | if ((FILEH)ret->fh == FILEH_INVALID) { | 
 | ret->fname[0] = '\0'; | ret->fname[0] = '\0'; | 
 | return(NULL); | return(NULL); | 
 | } | } | 
 | } | } | 
 |  | sysmng_hddaccess(drv); | 
 | return(ret); | return(ret); | 
 | } | } | 
 |  |  | 
| BYTE sxsi_read(BYTE drv, long pos, BYTE *buf, UINT16 size) { | BOOL sxsi_issasi(void) { | 
 |  |  | 
| const _SXSIHDD  *sxsi; | 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; | 
 | long            r; | long            r; | 
| UINT16          rsize; | UINT            rsize; | 
 |  |  | 
 | sxsi = getdrive(drv); | sxsi = getdrive(drv); | 
 | if (sxsi == NULL) { | if (sxsi == NULL) { | 
| Line 243  const _SXSIHDD *sxsi; | Line 357  const _SXSIHDD *sxsi; | 
 | } | } | 
 | while(size) { | while(size) { | 
 | rsize = min(size, sxsi->size); | rsize = min(size, sxsi->size); | 
| nevent.remainclock -= rsize; | CPU_REMCLOCK -= rsize; | 
 | if (file_read((FILEH)sxsi->fh, buf, rsize) != rsize) { | if (file_read((FILEH)sxsi->fh, buf, rsize) != rsize) { | 
 | return(0xd0); | return(0xd0); | 
 | } | } | 
| Line 253  const _SXSIHDD *sxsi; | Line 367  const _SXSIHDD *sxsi; | 
 | return(0x00); | 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; | long            r; | 
| UINT16          wsize; | UINT            wsize; | 
 |  |  | 
 | sxsi = getdrive(drv); | sxsi = getdrive(drv); | 
 | if (sxsi == NULL) { | if (sxsi == NULL) { | 
| Line 273  const _SXSIHDD *sxsi; | Line 387  const _SXSIHDD *sxsi; | 
 | } | } | 
 | while(size) { | while(size) { | 
 | wsize = min(size, sxsi->size); | wsize = min(size, sxsi->size); | 
| nevent.remainclock -= wsize; | CPU_REMCLOCK -= wsize; | 
 | if (file_write((FILEH)sxsi->fh, buf, wsize) != wsize) { | if (file_write((FILEH)sxsi->fh, buf, wsize) != wsize) { | 
 | return(0x70); | return(0x70); | 
 | } | } | 
| Line 283  const _SXSIHDD *sxsi; | Line 397  const _SXSIHDD *sxsi; | 
 | return(0x00); | return(0x00); | 
 | } | } | 
 |  |  | 
| BYTE sxsi_format(BYTE drv, long pos) { | REG8 sxsi_format(REG8 drv, long pos) { | 
 |  |  | 
| const _SXSIHDD  *sxsi; | const _SXSIDEV  *sxsi; | 
 | long            r; | long            r; | 
 | UINT16          i; | UINT16          i; | 
 | BYTE            work[256]; | BYTE            work[256]; | 
| Line 310  const _SXSIHDD *sxsi; | Line 424  const _SXSIHDD *sxsi; | 
 | while(size) { | while(size) { | 
 | wsize = min(size, sizeof(work)); | wsize = min(size, sizeof(work)); | 
 | size -= wsize; | size -= wsize; | 
| nevent.remainclock -= wsize; | CPU_REMCLOCK -= wsize; | 
 | if (file_write((FILEH)sxsi->fh, work, wsize) != wsize) { | if (file_write((FILEH)sxsi->fh, work, wsize) != wsize) { | 
 | return(0x70); | return(0x70); | 
 | } | } |