// イメージファイルの実体を開き、各種情報構築 BRESULT setsxsidev(SXSIDEV sxsi, const OEMCHAR *path, const _CDTRK *trk, UINT trks) { FILEH fh; long totals; CDINFO cdinfo; UINT mediatype; UINT i; #ifdef TOCLOGOUT OEMCHAR logpath[MAX_PATH]; OEMCHAR logbuf[2048]; TEXTFILEH tfh; #endif // trk、trksは有効な値が設定済みなのが前提 if ((trk == NULL) || (trks == 0)) { goto sxsiope_err1; } fh = file_open_rb(path); if (fh == FILEH_INVALID) { goto sxsiope_err1; } cdinfo = (CDINFO)_MALLOC(sizeof(_CDINFO), path); if (cdinfo == NULL) { goto sxsiope_err2; } ZeroMemory(cdinfo, sizeof(_CDINFO)); cdinfo->fh = fh; trks = min(trks, NELEMENTS(cdinfo->trk) - 1); CopyMemory(cdinfo->trk, trk, trks * sizeof(_CDTRK)); #ifdef TOCLOGOUT file_cpyname(logpath, path, NELEMENTS(logpath)); file_cutext(logpath); file_catname(logpath, str_logB, NELEMENTS(logpath)); tfh = textfile_create(logpath, 0x800); if (tfh == NULL) { return(FAILURE); } TOCLOG(OEMTEXT("STR _CDTRK LOG\r\n"), 0); for (i = 0; i < trks; i++) { TOCLOG(OEMTEXT("trk[%02d]\r\n"), i); TOCLOG(OEMTEXT(" adr_ctl = 0x%02X\r\n"), cdinfo->trk[i].adr_ctl); TOCLOG(OEMTEXT(" point = %02d\r\n"), cdinfo->trk[i].point); TOCLOG(OEMTEXT(" [pos0][pos][ ] = [%18I32d]"), cdinfo->trk[i].pos0); TOCLOG(OEMTEXT("[%18I32d][ ]\r\n"), cdinfo->trk[i].pos); TOCLOG(OEMTEXT(" sec[ ][str][end] = [ ][%18I32d]"), cdinfo->trk[i].str_sec); TOCLOG(OEMTEXT("[%18I32d]\r\n"), cdinfo->trk[i].end_sec); TOCLOG(OEMTEXT(" sectors = %I32d\r\n"), cdinfo->trk[i].sectors); TOCLOG(OEMTEXT(" sector_size = %d\r\n"), cdinfo->trk[i].sector_size); TOCLOG(OEMTEXT(" sector [pregap][start][end] = [%18I32d]"), cdinfo->trk[i].pregap_sector); TOCLOG(OEMTEXT("[%18I32d]"), cdinfo->trk[i].start_sector); TOCLOG(OEMTEXT("[%18I32d]\r\n"), cdinfo->trk[i].end_sector); TOCLOG(OEMTEXT(" img_sec[pregap][start][end] = [%18I32d]"), cdinfo->trk[i].img_pregap_sec); TOCLOG(OEMTEXT("[%18I32d]"), cdinfo->trk[i].img_start_sec); TOCLOG(OEMTEXT("[%18I32d]\r\n"), cdinfo->trk[i].img_end_sec); TOCLOG(OEMTEXT(" offset [pregap][start][end] = [0x%016I64X]"), cdinfo->trk[i].pregap_offset); TOCLOG(OEMTEXT("[0x%016I64X]"), cdinfo->trk[i].start_offset); TOCLOG(OEMTEXT("[0x%016I64X]\r\n"), cdinfo->trk[i].end_offset); TOCLOG(OEMTEXT(" pregap_sectors = %I32d\r\n"), cdinfo->trk[i].pregap_sectors); TOCLOG(OEMTEXT(" track_sectors = %I32d\r\n"), cdinfo->trk[i].track_sectors); } TOCLOG(OEMTEXT("END _CDTRK LOG\r\n"), 0); textfile_close(tfh); #endif #if 1 if (sxsi->totals == -1) { totals = set_trkinfo(fh, cdinfo->trk, trks, 0); if (totals < 0) { goto sxsiope_err3; } sxsi->totals = totals; } #else totals = issec(fh, cdinfo->trk, trks); // とりあえず sxsi->read = sec2048_read; totals = issec2048(cdinfo->fh); if (totals < 0) { sxsi->read = sec2352_read; totals = issec2352(cdinfo->fh); } if (totals < 0) { sxsi->read = sec2448_read; totals = issec2448(cdinfo->fh); } if (totals < 0) { sxsi->read = sec_read; totals = issec(cdinfo->fh, cdinfo->trk, trks); } if (totals < 0) { goto sxsiope_err3; } #endif mediatype = 0; for (i = 0; i < trks; i++) { if (cdinfo->trk[i].adr_ctl == TRACK_DATA) { mediatype |= SXSIMEDIA_DATA; } else if (cdinfo->trk[i].adr_ctl == TRACK_AUDIO) { mediatype |= SXSIMEDIA_AUDIO; } } // リードアウトトラックを生成 cdinfo->trk[trks].adr_ctl = 0x10; cdinfo->trk[trks].point = 0xaa; // cdinfo->trk[trks].pos = totals; cdinfo->trk[trks].pos = sxsi->totals; cdinfo->trks = trks; file_cpyname(cdinfo->path, path, NELEMENTS(cdinfo->path)); sxsi->reopen = cd_reopen; sxsi->close = cd_close; sxsi->destroy = cd_destroy; sxsi->hdl = (INTPTR)cdinfo; // sxsi->totals = totals; sxsi->cylinders = 0; sxsi->size = 2048; sxsi->sectors = 1; sxsi->surfaces = 1; sxsi->headersize = 0; sxsi->mediatype = mediatype; #ifdef TOCLOGOUT file_cpyname(logpath, path, NELEMENTS(logpath)); file_cutext(logpath); file_catname(logpath, str_logA, NELEMENTS(logpath)); tfh = textfile_create(logpath, 0x800); if (tfh == NULL) { return(FAILURE); } TOCLOG(OEMTEXT("STR _CDTRK LOG\r\n"), 0); for (i = 0; i < trks; i++) { TOCLOG(OEMTEXT("trk[%02d]\r\n"), i); TOCLOG(OEMTEXT(" adr_ctl = 0x%02X\r\n"), cdinfo->trk[i].adr_ctl); TOCLOG(OEMTEXT(" point = %02d\r\n"), cdinfo->trk[i].point); TOCLOG(OEMTEXT(" [pos0][pos][ ] = [%18I32d]"), cdinfo->trk[i].pos0); TOCLOG(OEMTEXT("[%18I32d][ ]\r\n"), cdinfo->trk[i].pos); TOCLOG(OEMTEXT(" sec[ ][str][end] = [ ][%18I32d]"), cdinfo->trk[i].str_sec); TOCLOG(OEMTEXT("[%18I32d]\r\n"), cdinfo->trk[i].end_sec); TOCLOG(OEMTEXT(" sectors = %I32d\r\n"), cdinfo->trk[i].sectors); TOCLOG(OEMTEXT(" sector_size = %d\r\n"), cdinfo->trk[i].sector_size); TOCLOG(OEMTEXT(" sector [pregap][start][end] = [%18I32d]"), cdinfo->trk[i].pregap_sector); TOCLOG(OEMTEXT("[%18I32d]"), cdinfo->trk[i].start_sector); TOCLOG(OEMTEXT("[%18I32d]\r\n"), cdinfo->trk[i].end_sector); TOCLOG(OEMTEXT(" img_sec[pregap][start][end] = [%18I32d]"), cdinfo->trk[i].img_pregap_sec); TOCLOG(OEMTEXT("[%18I32d]"), cdinfo->trk[i].img_start_sec); TOCLOG(OEMTEXT("[%18I32d]\r\n"), cdinfo->trk[i].img_end_sec); TOCLOG(OEMTEXT(" offset [pregap][start][end] = [0x%016I64X]"), cdinfo->trk[i].pregap_offset); TOCLOG(OEMTEXT("[0x%016I64X]"), cdinfo->trk[i].start_offset); TOCLOG(OEMTEXT("[0x%016I64X]\r\n"), cdinfo->trk[i].end_offset); TOCLOG(OEMTEXT(" pregap_sectors = %I32d\r\n"), cdinfo->trk[i].pregap_sectors); TOCLOG(OEMTEXT(" track_sectors = %I32d\r\n"), cdinfo->trk[i].track_sectors); } TOCLOG(OEMTEXT("END _CDTRK LOG\r\n"), 0); textfile_close(tfh); #endif return(SUCCESS); sxsiope_err3: _MFREE(cdinfo); sxsiope_err2: file_close(fh); sxsiope_err1: return(FAILURE); }
long issec(FILEH fh, _CDTRK *trk, UINT trks) { #ifdef CHECK_ISO9660 long fpos; UINT8 buf[2048]; UINT secsize; #endif UINT i; // UINT fsize; INT64 fsize; long total; total = 0; #ifdef CHECK_ISO9660 fpos = 16 * trk[0].sector_size; if (trk[0].sector_size != 2048) { fpos += 16; } if (file_seek(fh, fpos, FSEEK_SET) != fpos) { goto sec_err; } if (file_read(fh, buf, sizeof(buf)) != sizeof(buf)) { goto sec_err; } if (memcmp(buf, cd001, 7) != 0) { goto sec_err; } secsize = LOADINTELWORD(buf + 128); if (secsize != 2048) { goto sec_err; } #endif if (trks == 1) { trk[0].sector_size = 2048; trk[0].str_sec = 0; total = issec2048(fh); if (total < 0) { trk[0].sector_size = 2352; total = issec2352(fh); } if (total < 0) { trk[0].sector_size = 2448; total = issec2448(fh); } if (total < 0) { return(-1); } else { trk[0].end_sec = total - 1; trk[0].sectors = total; return(total); } } // fsize = file_getsize(fh); fsize = file_getsizei64(fh); if (trk[0].pos0 == 0) { trk[0].str_sec = trk[0].pos; } else { trk[0].str_sec = trk[0].pos0; } for (i = 1; i < trks; i++) { if (trk[i].pos0 == 0) { trk[i].str_sec = trk[i].pos; } else { trk[i].str_sec = trk[i].pos0; } trk[i-1].end_sec = trk[i].str_sec - 1; trk[i-1].sectors = trk[i-1].end_sec - trk[i-1].str_sec + 1; total += trk[i-1].sectors; fsize -= trk[i-1].sectors * trk[i-1].sector_size; } if (fsize % trk[trks-1].sector_size != 0) { return(-1); } if (trk[trks-1].pos0 == 0) { trk[trks-1].str_sec = trk[trks-1].pos; } else { trk[trks-1].str_sec = trk[trks-1].pos0; } trk[trks-1].end_sec = trk[trks-1].str_sec + (fsize / trk[trks-1].sector_size); trk[trks-1].sectors = trk[trks-1].end_sec - trk[trks-1].str_sec + 1; total += trk[trks-1].sectors; return(total); #ifdef CHECK_ISO9660 sec_err: return(-1); #endif }
// ※CDTRK構造体内の // UINT32 str_sec; // UINT32 end_sec; // UINT32 sectors; // 等のメンバの設定 long set_trkinfo(FILEH fh, _CDTRK *trk, UINT trks, UINT64 imagesize) { UINT i; INT64 fsize; long total; total = 0; if (trks == 1) { trk[0].sector_size = 2048; trk[0].str_sec = 0; total = issec2048(fh); if (total < 0) { trk[0].sector_size = 2352; total = issec2352(fh); } if (total < 0) { trk[0].sector_size = 2448; total = issec2448(fh); } if (total < 0) { return(-1); } else { trk[0].end_sec = total - 1; trk[0].sectors = total; return(total); } } if (imagesize == 0) { fsize = file_getsizei64(fh); } else { fsize = imagesize; } if (trk[0].pos0 == 0) { trk[0].str_sec = trk[0].pos; } else { trk[0].str_sec = trk[0].pos0; } for (i = 1; i < trks; i++) { if (trk[i].pos0 == 0) { trk[i].str_sec = trk[i].pos; } else { trk[i].str_sec = trk[i].pos0; } trk[i-1].end_sec = trk[i].str_sec - 1; trk[i-1].sectors = trk[i-1].end_sec - trk[i-1].str_sec + 1; total += trk[i-1].sectors; fsize -= trk[i-1].sectors * trk[i-1].sector_size; } if (fsize % trk[trks-1].sector_size != 0) { return(-1); } if (trk[trks-1].pos0 == 0) { trk[trks-1].str_sec = trk[trks-1].pos; } else { trk[trks-1].str_sec = trk[trks-1].pos0; } trk[trks-1].end_sec = trk[trks-1].str_sec + (fsize / trk[trks-1].sector_size); trk[trks-1].sectors = trk[trks-1].end_sec - trk[trks-1].str_sec + 1; total += trk[trks-1].sectors; return(total); }
static BRESULT openimg(SXSIDEV sxsi, const OEMCHAR *path, const _CDTRK *trk, UINT trks) { FILEH fh; UINT type; int totals; CDINFO cdinfo; UINT mediatype; UINT i; fh = file_open_rb(path); if (fh == FILEH_INVALID) { goto sxsiope_err1; } type = 2048; totals = issec2048(fh); if (totals < 0) { type = 2352; totals = issec2352(fh); } if (totals < 0) { goto sxsiope_err2; } cdinfo = (CDINFO)_MALLOC(sizeof(_CDINFO), path); if (cdinfo == NULL) { goto sxsiope_err2; } ZeroMemory(cdinfo, sizeof(_CDINFO)); cdinfo->fh = fh; cdinfo->type = type; if ((trk != NULL) && (trks != 0)) { trks = min(trks, NELEMENTS(cdinfo->trk) - 1); CopyMemory(cdinfo->trk, trk, trks * sizeof(_CDTRK)); } else { cdinfo->trk[0].type = 0x14; cdinfo->trk[0].track = 1; // cdinfo->trk[0].pos = 0; trks = 1; } mediatype = 0; for (i=0; i<trks; i++) { if (cdinfo->trk[i].type == 0x14) { mediatype |= SXSIMEDIA_DATA; } else if (cdinfo->trk[i].type == 0x10) { mediatype |= SXSIMEDIA_AUDIO; } } cdinfo->trk[trks].type = 0x10; cdinfo->trk[trks].track = 0xaa; cdinfo->trk[trks].pos = totals; cdinfo->trks = trks; file_cpyname(cdinfo->path, path, NELEMENTS(cdinfo->path)); sxsi->reopen = cd_reopen; if (type == 2048) { sxsi->read = sec2048_read; } else { sxsi->read = sec2352_read; } sxsi->close = cd_close; sxsi->destroy = cd_destroy; sxsi->hdl = (INTPTR)cdinfo; sxsi->totals = totals; sxsi->cylinders = 0; sxsi->size = 2048; sxsi->sectors = 1; sxsi->surfaces = 1; sxsi->headersize = 0; sxsi->mediatype = mediatype; return(SUCCESS); sxsiope_err2: file_close(fh); sxsiope_err1: return(FAILURE); }