--- np2/fdd/sxsicd.c 2005/04/05 09:12:24 1.4 +++ np2/fdd/sxsicd.c 2005/04/05 20:37:07 1.6 @@ -11,15 +11,10 @@ static const UINT8 cd001[7] = {0x01,'C','D','0','0','1',0x01}; typedef struct { - UINT type; - UINT32 pos; -} CDTRK; - -typedef struct { FILEH fh; UINT type; - UINT32 lastpos; - CDTRK trk[99]; + UINT trks; + _CDTRK trk[100]; OEMCHAR path[MAX_PATH]; } _CDINFO, *CDINFO; @@ -193,12 +188,14 @@ static const OEMCHAR str_audio[] = OEMTE static BRESULT openimg(SXSIDEV sxsi, const OEMCHAR *path, - const CDTRK *trk, UINT trks) { + const _CDTRK *trk, UINT trks) { FILEH fh; UINT type; long totals; CDINFO cdinfo; + UINT mediatype; + UINT i; fh = file_open_rb(path); if (fh == FILEH_INVALID) { @@ -220,15 +217,29 @@ static BRESULT openimg(SXSIDEV sxsi, con ZeroMemory(cdinfo, sizeof(_CDINFO)); cdinfo->fh = fh; cdinfo->type = type; - cdinfo->lastpos = totals; if ((trk != NULL) && (trks != 0)) { - trks = min(trks, NELEMENTS(cdinfo->trk)); - CopyMemory(cdinfo->trk, trk, trks * sizeof(CDTRK)); + 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; itrk[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; @@ -247,7 +258,7 @@ static BRESULT openimg(SXSIDEV sxsi, con sxsi->sectors = 1; sxsi->surfaces = 1; sxsi->headersize = 0; - sxsi->mediatype = SXSIMEDIA_DATA; + sxsi->mediatype = mediatype; return(SUCCESS); sxsiope_err2: @@ -269,7 +280,7 @@ static BRESULT getint2(const OEMCHAR *st return(SUCCESS); } -static BRESULT getpos(const OEMCHAR *str, UINT32 *pos) { +static UINT32 getpos(const OEMCHAR *str) { UINT m; UINT s; @@ -278,28 +289,28 @@ static BRESULT getpos(const OEMCHAR *str if ((getint2(str + 0, &m) != SUCCESS) || (str[2] != ':') || (getint2(str + 3, &s) != SUCCESS) || (str[5] != ':') || (getint2(str + 6, &f) != SUCCESS)) { - return(FAILURE); - } - if (pos) { - *pos = (((m * 60) + s) * 75) + f; + return(0); } - return(SUCCESS); + return((((m * 60) + s) * 75) + f); } static BRESULT opencue(SXSIDEV sxsi, const OEMCHAR *fname) { - CDTRK trk[99]; + _CDTRK trk[99]; OEMCHAR path[MAX_PATH]; - UINT curtrk; + UINT index; + UINT8 curtrk; + UINT curtype; TEXTFILEH tfh; OEMCHAR buf[512]; OEMCHAR *argv[8]; int argc; - UINT type; ZeroMemory(trk, sizeof(trk)); path[0] = '\0'; - curtrk = -1; + index = 0; + curtrk = 1; + curtype = 0x14; tfh = textfile_open(fname, 0x800); if (tfh == NULL) { return(FAILURE); @@ -307,39 +318,30 @@ static BRESULT opencue(SXSIDEV sxsi, con while(textfile_read(tfh, buf, NELEMENTS(buf)) == SUCCESS) { argc = milstr_getarg(buf, argv, NELEMENTS(argv)); if ((argc >= 3) && (!milstr_cmp(argv[0], str_file))) { - file_cpyname(path, argv[1], NELEMENTS(path)); + file_cpyname(path, fname, NELEMENTS(path)); + file_cutname(path); + file_catname(path, argv[1], NELEMENTS(path)); } else if ((argc >= 3) && (!milstr_cmp(argv[0], str_track))) { - curtrk = milstr_solveINT(argv[1]) - 1; - type = 0; + curtrk = (UINT8)milstr_solveINT(argv[1]); if (!milstr_cmp(argv[2], str_mode1)) { - type = 0x14; + curtype = 0x14; } else if (!milstr_cmp(argv[2], str_audio)) { - type = 0x10; - } - if ((curtrk < NELEMENTS(trk)) && (type != 0)) { - trk[curtrk].type = type; + curtype = 0x10; } } else if ((argc >= 3) && (!milstr_cmp(argv[0], str_index))) { - if (curtrk < NELEMENTS(trk)) { - getpos(argv[2], &trk[curtrk].pos); + if (index < NELEMENTS(trk)) { + trk[index].type = curtype; + trk[index].track = curtrk; + trk[index].pos = getpos(argv[2]); + index++; } } } textfile_close(tfh); -#if 0 -{ - UINT i; - for (i=0; ihdl; + if (tracks) { + *tracks = cdinfo->trks; + } + return(cdinfo->trk); +} +