summaryrefslogtreecommitdiffstatshomepage
path: root/src/tools
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2011-08-20 06:47:40 +0000
committer Miodrag Milanovic <mmicko@gmail.com>2011-08-20 06:47:40 +0000
commit36136e22936c95afdae79694e0eb7027039a9d0f (patch)
tree7617bff78cadf1e1601d04426d92861d23e82859 /src/tools
parent45359b609ba1a3c350a4fad729fe4f656421bf23 (diff)
Added support for loading other image types to cdrom device, with use of chdman part of code [Miodrag Milanovic]
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/chdcd.c1020
-rw-r--r--src/tools/chdcd.h30
-rw-r--r--src/tools/tools.mak1
3 files changed, 0 insertions, 1051 deletions
diff --git a/src/tools/chdcd.c b/src/tools/chdcd.c
deleted file mode 100644
index b5ce1de3a77..00000000000
--- a/src/tools/chdcd.c
+++ /dev/null
@@ -1,1020 +0,0 @@
-/***************************************************************************
-
- TOC parser for CHD compression frontend
- Handles CDRDAO .toc, CDRWIN .cue, and Sega GDROM .gdi
-
- Copyright Nicola Salmoria and the MAME Team.
- Visit http://mamedev.org for licensing and usage restrictions.
-
-***************************************************************************/
-
-#include <ctype.h>
-#include <stdlib.h>
-#include "osdcore.h"
-#include "chd.h"
-#include "chdcd.h"
-#include "corefile.h"
-
-
-
-/***************************************************************************
- CONSTANTS & DEFINES
-***************************************************************************/
-
-#define TOKENIZE i = tokenize( linebuffer, i, sizeof(linebuffer), token, sizeof(token) );
-
-
-
-/***************************************************************************
- GLOBAL VARIABLES
-***************************************************************************/
-
-static char linebuffer[512];
-
-
-
-/***************************************************************************
- IMPLEMENTATION
-***************************************************************************/
-
-static astring get_file_path(astring &path)
-{
- int pos = path.rchr( 0, '\\');
- if (pos!=-1) {
- path = path.substr(0,pos+1);
- } else {
- pos = path.rchr( 0, '/');
- path = path.substr(0,pos+1);
- }
- return path;
-}
-/*-------------------------------------------------
- get_file_size - get the size of a file
--------------------------------------------------*/
-
-static UINT64 get_file_size(const char *filename)
-{
- osd_file *file;
- UINT64 filesize = 0;
- file_error filerr;
-
- filerr = osd_open(filename, OPEN_FLAG_READ, &file, &filesize);
- if (filerr == FILERR_NONE)
- osd_close(file);
-
- return filesize;
-}
-
-
-/*-------------------------------------------------
- tokenize - get a token from the line buffer
--------------------------------------------------*/
-
-static int tokenize( const char *linebuffer, int i, int linebuffersize, char *token, int tokensize )
-{
- int j = 0;
- int singlequote = 0;
- int doublequote = 0;
-
- while ((i < linebuffersize) && isspace((UINT8)linebuffer[i]))
- {
- i++;
- }
-
- while ((i < linebuffersize) && (j < tokensize))
- {
- if (!singlequote && linebuffer[i] == '"' )
- {
- doublequote = !doublequote;
- }
- else if (!doublequote && linebuffer[i] == '\'')
- {
- singlequote = !singlequote;
- }
- else if (!singlequote && !doublequote && isspace((UINT8)linebuffer[i]))
- {
- break;
- }
- else
- {
- token[j] = linebuffer[i];
- j++;
- }
-
- i++;
- }
-
- token[j] = '\0';
-
- return i;
-}
-
-
-/*-------------------------------------------------
- msf_to_frames - convert m:s:f into a number of frames
--------------------------------------------------*/
-
-static int msf_to_frames( char *token )
-{
- int m = 0;
- int s = 0;
- int f = 0;
-
- if( sscanf( token, "%d:%d:%d", &m, &s, &f ) == 1 )
- {
- f = m;
- }
- else
- {
- /* convert to just frames */
- s += (m * 60);
- f += (s * 75);
- }
-
- return f;
-}
-
-/*-------------------------------------------------
- parse_wav_sample - takes a .WAV file, verifies
- that the file is 16 bits, and returns the
- length in bytes of the data and the offset in
- bytes to where the data starts in the file.
--------------------------------------------------*/
-static UINT32 parse_wav_sample(char *filename, UINT32 *dataoffs)
-{
- unsigned long offset = 0;
- UINT32 length, rate, filesize;
- UINT16 bits, temp16;
- char buf[32];
- osd_file *file;
- file_error filerr;
- UINT64 fsize = 0;
- UINT32 actual;
-
- filerr = osd_open(filename, OPEN_FLAG_READ, &file, &fsize);
- if (filerr != FILERR_NONE)
- {
- osd_close(file);
- return 0;
- }
-
- /* read the core header and make sure it's a WAVE file */
- osd_read(file, buf, 0, 4, &actual);
- offset += actual;
- if (offset < 4)
- return 0;
- if (memcmp(&buf[0], "RIFF", 4) != 0)
- return 0;
-
- /* get the total size */
- osd_read(file, &filesize, offset, 4, &actual);
- offset += actual;
- if (offset < 8)
- return 0;
- filesize = LITTLE_ENDIANIZE_INT32(filesize);
-
- /* read the RIFF file type and make sure it's a WAVE file */
- osd_read(file, buf, offset, 4, &actual);
- offset += actual;
- if (offset < 12)
- return 0;
- if (memcmp(&buf[0], "WAVE", 4) != 0)
- return 0;
-
- /* seek until we find a format tag */
- while (1)
- {
- osd_read(file, buf, offset, 4, &actual);
- offset += actual;
- osd_read(file, &length, offset, 4, &actual);
- offset += actual;
- length = LITTLE_ENDIANIZE_INT32(length);
- if (memcmp(&buf[0], "fmt ", 4) == 0)
- break;
-
- /* seek to the next block */
- offset += length;
- if (offset >= filesize)
- return 0;
- }
-
- /* read the format -- make sure it is PCM */
- osd_read(file, &temp16, offset, 2, &actual);
- offset += actual;
- temp16 = LITTLE_ENDIANIZE_INT16(temp16);
- if (temp16 != 1)
- return 0;
-
- /* number of channels -- only mono is supported */
- osd_read(file, &temp16, offset, 2, &actual);
- offset += actual;
- temp16 = LITTLE_ENDIANIZE_INT16(temp16);
- if (temp16 != 2)
- return 0;
-
- /* sample rate */
- osd_read(file, &rate, offset, 4, &actual);
- offset += actual;
- rate = LITTLE_ENDIANIZE_INT32(rate);
- if (rate != 44100)
- return 0;
-
- /* bytes/second and block alignment are ignored */
- osd_read(file, buf, offset, 6, &actual);
- offset += actual;
-
- /* bits/sample */
- osd_read(file, &bits, offset, 2, &actual);
- offset += actual;
- if (bits != 16)
- return 0;
-
- /* seek past any extra data */
- offset += length - 16;
-
- /* seek until we find a data tag */
- while (1)
- {
- osd_read(file, buf, offset, 4, &actual);
- offset += actual;
- osd_read(file, &length, offset, 4, &actual);
- offset += actual;
- length = LITTLE_ENDIANIZE_INT32(length);
- if (memcmp(&buf[0], "data", 4) == 0)
- break;
-
- /* seek to the next block */
- offset += length;
- if (offset >= filesize)
- return 0;
- }
-
- /* if there was a 0 length data block, we're done */
- if (length == 0)
- return 0;
-
- osd_close(file);
-
- *dataoffs = offset;
-
- return length;
-}
-
-UINT16 read_uint16(FILE *infile)
-{
- UINT16 res = 0;
- unsigned char buffer[2];
-
- fread(buffer, 2, 1, infile);
-
- res = buffer[1] | buffer[0]<<8;
-
- return res;
-}
-
-UINT32 read_uint32(FILE *infile)
-{
- UINT32 res = 0;
- unsigned char buffer[4];
-
- fread(buffer, 4, 1, infile);
-
- res = buffer[3] | buffer[2]<<8 | buffer[1]<<16 | buffer[0]<<24;
-
- return res;
-}
-
-UINT64 read_uint64(FILE *infile)
-{
- UINT64 res0 = U64(0), res1 = U64(0);
- UINT64 res;
- unsigned char buffer[8];
-
- fread(buffer, 8, 1, infile);
-
- res0 = buffer[3] | buffer[2]<<8 | buffer[1]<<16 | buffer[0]<<24;
- res1 = buffer[7] | buffer[6]<<8 | buffer[5]<<16 | buffer[4]<<24;
-
- res = res0<<32 | res1;
-
- return res;
-}
-
-/*-------------------------------------------------
- chdcd_parse_toc - parse a CDRWin format CUE file
--------------------------------------------------*/
-
-chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc *outtoc, chdcd_track_input_info *outinfo)
-{
- FILE *infile;
- unsigned char buffer[12];
- UINT32 chain_offs, chunk_size;
- int done = 0;
-
- astring path = astring(tocfname);
-
- infile = fopen(tocfname, "rt");
- path = get_file_path(path);
-
- if (infile == (FILE *)NULL)
- {
- return CHDERR_FILE_NOT_FOUND;
- }
-
- /* clear structures */
- memset(outtoc, 0, sizeof(cdrom_toc));
- memset(outinfo, 0, sizeof(chdcd_track_input_info));
-
- // seek to 12 bytes before the end
- fseek(infile, -12, SEEK_END);
- fread(buffer, 12, 1, infile);
-
- if (memcmp(buffer, "NER5", 4))
- {
- printf("ERROR: Not a Nero 5.5 or later image!\n");
- fclose(infile);
- return CHDERR_FILE_NOT_FOUND;
- }
-
- chain_offs = buffer[11] | (buffer[10]<<8) | (buffer[9]<<16) | (buffer[8]<<24);
-
- if ((buffer[7] != 0) || (buffer[6] != 0) || (buffer[5] != 0) || (buffer[4] != 0))
- {
- printf("ERROR: File size is > 4GB, this version of CHDMAN cannot handle it.");
- fclose(infile);
- return CHDERR_FILE_NOT_FOUND;
- }
-
-// printf("NER5 detected, chain offset: %x\n", chain_offs);
-
- while (!done)
- {
- UINT32 offset;
- UINT8 start, end;
- int track;
-
- fseek(infile, chain_offs, SEEK_SET);
- fread(buffer, 8, 1, infile);
-
- chunk_size = (buffer[7] | buffer[6]<<8 | buffer[5]<<16 | buffer[4]<<24);
-
-// printf("Chunk type: %c%c%c%c, size %x\n", buffer[0], buffer[1], buffer[2], buffer[3], chunk_size);
-
- // we want the DAOX chunk, which has the TOC information
- if (!memcmp(buffer, "DAOX", 4))
- {
- // skip second chunk size and UPC code
- fseek(infile, 16, SEEK_CUR);
-
- read_uint32(infile);
- fread(&start, 1, 1, infile);
- fread(&end, 1, 1, infile);
-
-// printf("TOC type: %08x. Start track %d End track: %d\n", toc_type, start, end);
-
- outtoc->numtrks = (end-start) + 1;
-
- offset = 0;
- for (track = start; track <= end; track++)
- {
- UINT32 size, mode;
- UINT64 index0, index1, index2;
-
- fseek(infile, 12, SEEK_CUR); // skip ISRC code
- size = read_uint16(infile);
- mode = read_uint32(infile);
- index0 = read_uint64(infile);
- index1 = read_uint64(infile);
- index2 = read_uint64(infile);
-
-// printf("Track %d: sector size %d mode %x index0 %llx index1 %llx index2 %llx (pregap %d sectors, length %d sectors)\n", track, size, mode, index0, index1, index2, (UINT32)(index1-index0)/size, (UINT32)(index2-index1)/size);
- strncpy(outinfo->fname[track-1], path.cstr(), 256);
- strncat(outinfo->fname[track-1], tocfname, 256);
- outinfo->offset[track-1] = offset + (UINT32)(index1-index0);
- outinfo->idx0offs[track-1] = 0;
- outinfo->idx1offs[track-1] = 0;
-
- switch (mode>>24)
- {
- case 0x00: // 2048 byte data
- outtoc->tracks[track-1].trktype = CD_TRACK_MODE1;
- outinfo->swap[track-1] = 0;
- break;
-
- case 0x06: // 2352 byte mode 2 raw
- outtoc->tracks[track-1].trktype = CD_TRACK_MODE2_RAW;
- outinfo->swap[track-1] = 0;
- break;
-
- case 0x07: // 2352 byte audio
- outtoc->tracks[track-1].trktype = CD_TRACK_AUDIO;
- outinfo->swap[track-1] = 1;
- break;
-
- default:
- printf("ERROR: Unknown track type %x, contact MAMEDEV!\n", mode>>24);
- break;
- }
-
- outtoc->tracks[track-1].datasize = size;
-
- outtoc->tracks[track-1].subtype = CD_SUB_NONE;
- outtoc->tracks[track-1].subsize = 0;
-
- outtoc->tracks[track-1].pregap = (UINT32)(index1-index0)/size;
- outtoc->tracks[track-1].frames = (UINT32)(index2-index1)/size;
- outtoc->tracks[track-1].postgap = 0;
- outtoc->tracks[track-1].pgtype = 0;
- outtoc->tracks[track-1].pgsub = CD_SUB_NONE;
- outtoc->tracks[track-1].pgdatasize = 0;
- outtoc->tracks[track-1].pgsubsize = 0;
-
- offset += (UINT32)index2-index1;
- }
- }
-
- if (!memcmp(buffer, "END!", 4))
- {
- done = 1;
- }
- else
- {
- chain_offs += chunk_size + 8;
- }
- }
-
- fclose(infile);
-
- return CHDERR_NONE;
-}
-
-/*-------------------------------------------------
- chdcd_parse_gdi - parse a Sega GD-ROM rip
--------------------------------------------------*/
-
-static chd_error chdcd_parse_gdi(const char *tocfname, cdrom_toc *outtoc, chdcd_track_input_info *outinfo)
-{
- FILE *infile;
- int i, numtracks;
- //int chdpos=0;
-
- astring path = astring(tocfname);
-
- infile = fopen(tocfname, "rt");
- path = get_file_path(path);
-
- if (infile == (FILE *)NULL)
- {
- return CHDERR_FILE_NOT_FOUND;
- }
-
- /* clear structures */
- memset(outtoc, 0, sizeof(cdrom_toc));
- memset(outinfo, 0, sizeof(chdcd_track_input_info));
-
-
- fgets(linebuffer,511,infile);
- numtracks=atoi(linebuffer);
-
- for(i=0;i<numtracks;++i)
- {
- char *tok;
- int trknum;
- int trksize,trktype;
- int sz;
- int hunks;
-
-
- fgets(linebuffer,511,infile);
-
- tok=strtok(linebuffer," ");
-
- trknum=atoi(tok)-1;
-
- outinfo->swap[trknum]=0;
- outinfo->offset[trknum]=0;
-
- //outtoc->tracks[trknum].trktype = CD_TRACK_MODE1;
- outtoc->tracks[trknum].datasize = 0;
- outtoc->tracks[trknum].subtype = CD_SUB_NONE;
- outtoc->tracks[trknum].subsize = 0;
-
- tok=strtok(NULL," ");
- outtoc->tracks[trknum].physframeofs=atoi(tok);
-
- tok=strtok(NULL," ");
- trktype=atoi(tok);
-
- tok=strtok(NULL," ");
- trksize=atoi(tok);
-
- if(trktype==4 && trksize==2352)
- {
- outtoc->tracks[trknum].trktype=CD_TRACK_MODE1_RAW;
- outtoc->tracks[trknum].datasize=2352;
- }
- if(trktype==4 && trksize==2048)
- {
- outtoc->tracks[trknum].trktype=CD_TRACK_MODE1;
- outtoc->tracks[trknum].datasize=2048;
- }
- if(trktype==0)
- {
- //assert(trksize==2352);
- outtoc->tracks[trknum].trktype=CD_TRACK_AUDIO;
- outtoc->tracks[trknum].datasize=2352;
- }
-
- astring name;
-
- tok=strtok(NULL," ");
- name = tok;
- if (tok[0]=='"') {
- do {
- tok=strtok(NULL," ");
- if (tok!=NULL) {
- name += " ";
- name += tok;
- }
- } while(tok!=NULL && (strrchr(tok,'"')-tok !=(strlen(tok)-1)));
- name = name.delchr('"');
- }
- strncpy(outinfo->fname[trknum], path.cstr(), 256);
- strncat(outinfo->fname[trknum], name, 256);
-
- sz=get_file_size(outinfo->fname[trknum]);
-
- outtoc->tracks[trknum].frames=sz/trksize;
- outtoc->tracks[trknum].extraframes=0;
-
- if(trknum!=0)
- {
- int dif=outtoc->tracks[trknum].physframeofs-(outtoc->tracks[trknum-1].frames+outtoc->tracks[trknum-1].physframeofs);
- outtoc->tracks[trknum-1].frames+=dif;
- }
-
-/*
- if(trknum!=0)
- {
- outtoc->tracks[trknum-1].extraframes=outtoc->tracks[trknum].physframeofs-(outtoc->tracks[trknum-1].frames+outtoc->tracks[trknum-1].physframeofs);
- }
-*/
- hunks = (outtoc->tracks[trknum].frames+CD_FRAMES_PER_HUNK - 1) / CD_FRAMES_PER_HUNK;
- outtoc->tracks[trknum].extraframes = hunks * CD_FRAMES_PER_HUNK - outtoc->tracks[trknum].frames;
-
- //chdpos+=outtoc->tracks[trknum].frames+outtoc->tracks[trknum].extraframes;
-
- }
- /*
- for(i=0;i<numtracks;++i)
- {
- printf("%s %d %d %d\n",outinfo->fname[i],outtoc->tracks[i].frames,outtoc->tracks[i].extraframes,outtoc->tracks[i].physframeofs);
- }
- */
- /* close the input TOC */
- fclose(infile);
-
- /* store the number of tracks found */
- outtoc->numtrks = numtracks;
-
- return CHDERR_NONE;
-}
-
-/*-------------------------------------------------
- chdcd_parse_toc - parse a CDRWin format CUE file
--------------------------------------------------*/
-
-chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc *outtoc, chdcd_track_input_info *outinfo)
-{
- FILE *infile;
- int i, trknum;
- static char token[128];
- static char lastfname[256];
- UINT32 wavlen, wavoffs;
- astring path = astring(tocfname);
-
- infile = fopen(tocfname, "rt");
- path = get_file_path(path);
- if (infile == (FILE *)NULL)
- {
- return CHDERR_FILE_NOT_FOUND;
- }
-
- /* clear structures */
- memset(outtoc, 0, sizeof(cdrom_toc));
- memset(outinfo, 0, sizeof(chdcd_track_input_info));
-
- trknum = -1;
- wavoffs = wavlen = 0;
-
- while (!feof(infile))
- {
- /* get the next line */
- fgets(linebuffer, 511, infile);
-
- /* if EOF didn't hit, keep going */
- if (!feof(infile))
- {
- i = 0;
-
- TOKENIZE
-
- if (!strcmp(token, "FILE"))
- {
- /* found the data file for a track */
- TOKENIZE
-
- /* keep the filename */
- strncpy(lastfname, path.cstr(), 256);
- strncat(lastfname, token, 256);
-
- /* get the file type */
- TOKENIZE
-
- if (!strcmp(token, "BINARY"))
- {
- outinfo->swap[trknum] = 0;
- }
- else if (!strcmp(token, "MOTOROLA"))
- {
- outinfo->swap[trknum] = 1;
- }
- else if (!strcmp(token, "WAVE"))
- {
- wavlen = parse_wav_sample(lastfname, &wavoffs);
- if (!wavlen)
- {
- file_error err;
- core_file *fhand;
-
- err = core_fopen(lastfname, OPEN_FLAG_READ, &fhand);
- if (err != FILERR_NONE) printf("holy moley!\n");
- else core_fclose(fhand);
-
- printf("ERROR: couldn't read [%s] or not a valid .WAV\n", lastfname);
- return CHDERR_FILE_NOT_FOUND;
- }
- }
- else
- {
- printf("ERROR: Unhandled track type %s\n", token);
- return CHDERR_FILE_NOT_FOUND;
- }
- }
- else if (!strcmp(token, "TRACK"))
- {
- /* get the track number */
- TOKENIZE
- trknum = strtoul(token, NULL, 10) - 1;
-
- /* next token on the line is the track type */
- TOKENIZE
-
- if (wavlen != 0)
- {
- outtoc->tracks[trknum].trktype = CD_TRACK_AUDIO;
- outtoc->tracks[trknum].frames = wavlen/2352;
- outinfo->offset[trknum] = wavoffs;
- wavoffs = wavlen = 0;
- }
- else
- {
- outtoc->tracks[trknum].trktype = CD_TRACK_MODE1;
- outtoc->tracks[trknum].datasize = 0;
- outinfo->offset[trknum] = 0;
- }
- outtoc->tracks[trknum].subtype = CD_SUB_NONE;
- outtoc->tracks[trknum].subsize = 0;
- outtoc->tracks[trknum].pregap = 0;
- outinfo->idx0offs[trknum] = -1;
- outinfo->idx1offs[trknum] = 0;
-
- strncpy(outinfo->fname[trknum], lastfname, 256); // default filename to the last one
-// printf("trk %d: fname %s offset %d\n", trknum, &outinfo->fname[trknum][0], outinfo->offset[trknum]);
-
- cdrom_convert_type_string_to_track_info(token, &outtoc->tracks[trknum]);
- if (outtoc->tracks[trknum].datasize == 0)
- {
- printf("ERROR: Unknown track type [%s]. Contact MAMEDEV.\n", token);
- return CHDERR_FILE_NOT_FOUND;
- }
-
- /* next (optional) token on the line is the subcode type */
- TOKENIZE
-
- cdrom_convert_subtype_string_to_track_info(token, &outtoc->tracks[trknum]);
- }
- else if (!strcmp(token, "INDEX")) /* only in bin/cue files */
- {
- int idx, frames;
-
- /* get index number */
- TOKENIZE
- idx = strtoul(token, NULL, 10);
-
- /* get index */
- TOKENIZE
- frames = msf_to_frames( token );
-
- if (idx == 0)
- {
- outinfo->idx0offs[trknum] = frames;
- }
- else if (idx == 1)
- {
- outinfo->idx1offs[trknum] = frames;
- if ((outtoc->tracks[trknum].pregap == 0) && (outinfo->idx0offs[trknum] != -1))
- {
- outtoc->tracks[trknum].pregap = frames - outinfo->idx0offs[trknum];
- }
- }
- }
- else if (!strcmp(token, "PREGAP"))
- {
- int frames;
-
- /* get index */
- TOKENIZE
- frames = msf_to_frames( token );
-
- outtoc->tracks[trknum].pregap = frames;
- }
- else if (!strcmp(token, "POSTGAP"))
- {
- int frames;
-
- /* get index */
- TOKENIZE
- frames = msf_to_frames( token );
-
- outtoc->tracks[trknum].postgap = frames;
- }
- }
- }
-
- /* close the input CUE */
- fclose(infile);
-
- /* store the number of tracks found */
- outtoc->numtrks = trknum + 1;
-
- /* now go over the files again and set the lengths */
- for (trknum = 0; trknum < outtoc->numtrks; trknum++)
- {
- UINT64 tlen = 0;
-
- // this is true for cue/bin and cue/iso, and we need it for cue/wav since .WAV is little-endian
- if (outtoc->tracks[trknum].trktype == CD_TRACK_AUDIO)
- {
- outinfo->swap[trknum] = 1;
- }
-
- // don't do this for .WAV tracks, we already have their length and offset filled out
- if (outinfo->offset[trknum] == 0)
- {
- // is this the last track?
- if (trknum == (outtoc->numtrks-1))
- {
- /* if we have the same filename as the last track, do it that way */
- if (!strcmp(&outinfo->fname[trknum][0], &outinfo->fname[trknum-1][0]))
- {
- tlen = get_file_size(outinfo->fname[trknum]);
- if (tlen == 0)
- {
- printf("ERROR: couldn't find bin file [%s]\n", outinfo->fname[trknum-1]);
- return CHDERR_FILE_NOT_FOUND;
- }
- outinfo->offset[trknum] = outinfo->offset[trknum-1] + outtoc->tracks[trknum-1].frames * (outtoc->tracks[trknum-1].datasize + outtoc->tracks[trknum-1].subsize);
- outtoc->tracks[trknum].frames = (tlen - outinfo->offset[trknum]) / (outtoc->tracks[trknum].datasize + outtoc->tracks[trknum].subsize);
- }
- else /* data files are different */
- {
- tlen = get_file_size(outinfo->fname[trknum]);
- if (tlen == 0)
- {
- printf("ERROR: couldn't find bin file [%s]\n", outinfo->fname[trknum-1]);
- return CHDERR_FILE_NOT_FOUND;
- }
- tlen /= (outtoc->tracks[trknum].datasize + outtoc->tracks[trknum].subsize);
- outtoc->tracks[trknum].frames = tlen;
- outinfo->offset[trknum] = 0;
- }
- }
- else
- {
- /* if we have the same filename as the next track, do it that way */
- if (!strcmp(&outinfo->fname[trknum][0], &outinfo->fname[trknum+1][0]))
- {
- outtoc->tracks[trknum].frames = outinfo->idx1offs[trknum+1] - outinfo->idx1offs[trknum];
-
- if (trknum == 0) // track 0 offset is 0
- {
- outinfo->offset[trknum] = 0;
- }
- else
- {
- outinfo->offset[trknum] = outinfo->offset[trknum-1] + outtoc->tracks[trknum-1].frames * (outtoc->tracks[trknum-1].datasize + outtoc->tracks[trknum-1].subsize);
- }
-
- if (!outtoc->tracks[trknum].frames)
- {
- printf("ERROR: unable to determine size of track %d, missing INDEX 01 markers?\n", trknum+1);
- return CHDERR_FILE_NOT_FOUND;
- }
- }
- else /* data files are different */
- {
- tlen = get_file_size(outinfo->fname[trknum]);
- if (tlen == 0)
- {
- printf("ERROR: couldn't find bin file [%s]\n", outinfo->fname[trknum]);
- return CHDERR_FILE_NOT_FOUND;
- }
- tlen /= (outtoc->tracks[trknum].datasize + outtoc->tracks[trknum].subsize);
- outtoc->tracks[trknum].frames = tlen;
- outinfo->offset[trknum] = 0;
- }
- }
- }
- printf("trk %d: %d frames @ offset %d\n", trknum+1, outtoc->tracks[trknum].frames, outinfo->offset[trknum]);
- }
-
- return CHDERR_NONE;
-}
-
-/*-------------------------------------------------
- chdcd_parse_toc - parse a CDRDAO format TOC file
--------------------------------------------------*/
-
-chd_error chdcd_parse_toc(const char *tocfname, cdrom_toc *outtoc, chdcd_track_input_info *outinfo)
-{
- FILE *infile;
- int i, trknum;
- static char token[128];
-
- if (strstr(tocfname,".gdi"))
- {
- return chdcd_parse_gdi(tocfname, outtoc, outinfo);
- }
-
- if (strstr(tocfname,".cue"))
- {
- return chdcd_parse_cue(tocfname, outtoc, outinfo);
- }
-
- if (strstr(tocfname,".nrg"))
- {
- return chdcd_parse_nero(tocfname, outtoc, outinfo);
- }
-
- astring path = astring(tocfname);
-
- infile = fopen(tocfname, "rt");
- path = get_file_path(path);
-
- if (infile == (FILE *)NULL)
- {
- return CHDERR_FILE_NOT_FOUND;
- }
-
- /* clear structures */
- memset(outtoc, 0, sizeof(cdrom_toc));
- memset(outinfo, 0, sizeof(chdcd_track_input_info));
-
- trknum = -1;
-
- while (!feof(infile))
- {
- /* get the next line */
- fgets(linebuffer, 511, infile);
-
- /* if EOF didn't hit, keep going */
- if (!feof(infile))
- {
- i = 0;
-
- TOKENIZE
-
- if ((!strcmp(token, "DATAFILE")) || (!strcmp(token, "AUDIOFILE")) || (!strcmp(token, "FILE")))
- {
- int f;
-
- /* found the data file for a track */
- TOKENIZE
-
- /* keep the filename */
- strncpy(outinfo->fname[trknum], path.cstr(), 256);
- strncat(outinfo->fname[trknum], token, 256);
-
- /* get either the offset or the length */
- TOKENIZE
-
- if (!strcmp(token, "SWAP"))
- {
- TOKENIZE
-
- outinfo->swap[trknum] = 1;
- }
- else
- {
- outinfo->swap[trknum] = 0;
- }
-
- if (token[0] == '#')
- {
- /* it's a decimal offset, use it */
- f = strtoul(&token[1], NULL, 10);
- }
- else if (isdigit((UINT8)token[0]))
- {
- /* convert the time to an offset */
- f = msf_to_frames( token );
-
- f *= (outtoc->tracks[trknum].datasize + outtoc->tracks[trknum].subsize);
- }
- else
- {
- f = 0;
- }
-
- outinfo->offset[trknum] = f;
-
- TOKENIZE
-
- if (isdigit((UINT8)token[0]))
- {
- // this could be the length or an offset from the previous field.
- f = msf_to_frames( token );
-
- TOKENIZE
-
- if (isdigit((UINT8)token[0]))
- {
- // it was an offset.
- f *= (outtoc->tracks[trknum].datasize + outtoc->tracks[trknum].subsize);
-
- outinfo->offset[trknum] += f;
-
- // this is the length.
- f = msf_to_frames( token );
- }
- }
- else if( trknum == 0 && outinfo->offset[trknum] != 0 )
- {
- /* the 1st track might have a length with no offset */
- f = outinfo->offset[trknum] / (outtoc->tracks[trknum].datasize + outtoc->tracks[trknum].subsize);
- outinfo->offset[trknum] = 0;
- }
- else
- {
- /* guesstimate the track length? */
- f = 0;
- }
-
- outtoc->tracks[trknum].frames = f;
- }
- else if (!strcmp(token, "TRACK"))
- {
- trknum++;
-
- /* next token on the line is the track type */
- TOKENIZE
-
- outtoc->tracks[trknum].trktype = CD_TRACK_MODE1;
- outtoc->tracks[trknum].datasize = 0;
- outtoc->tracks[trknum].subtype = CD_SUB_NONE;
- outtoc->tracks[trknum].subsize = 0;
-
- cdrom_convert_type_string_to_track_info(token, &outtoc->tracks[trknum]);
- if (outtoc->tracks[trknum].datasize == 0)
- {
- printf("ERROR: Unknown track type [%s]. Contact MAMEDEV.\n", token);
- return CHDERR_FILE_NOT_FOUND;
- }
-
- /* next (optional) token on the line is the subcode type */
- TOKENIZE
-
- cdrom_convert_subtype_string_to_track_info(token, &outtoc->tracks[trknum]);
- }
- else if (!strcmp(token, "START"))
- {
- int frames;
-
- /* get index */
- TOKENIZE
- frames = msf_to_frames( token );
-
- outtoc->tracks[trknum].pregap = frames;
- }
- }
- }
-
- /* close the input TOC */
- fclose(infile);
-
- /* store the number of tracks found */
- outtoc->numtrks = trknum + 1;
-
- return CHDERR_NONE;
-}
diff --git a/src/tools/chdcd.h b/src/tools/chdcd.h
deleted file mode 100644
index 3228828a160..00000000000
--- a/src/tools/chdcd.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/***************************************************************************
-
- CDRDAO TOC parser for CHD compression frontend
-
- Copyright Nicola Salmoria and the MAME Team.
- Visit http://mamedev.org for licensing and usage restrictions.
-
-***************************************************************************/
-
-#pragma once
-
-#ifndef __CHDCD_H__
-#define __CHDCD_H__
-
-#include "cdrom.h"
-
-typedef struct _chdcd_track_input_info chdcd_track_input_info;
-struct _chdcd_track_input_info /* used only at compression time */
-{
- char fname[CD_MAX_TRACKS][256]; /* filename for each track */
- UINT32 offset[CD_MAX_TRACKS]; /* offset in the data file for each track */
- int swap[CD_MAX_TRACKS]; /* data needs to be byte swapped */
- UINT32 idx0offs[CD_MAX_TRACKS];
- UINT32 idx1offs[CD_MAX_TRACKS];
-};
-
-
-chd_error chdcd_parse_toc(const char *tocfname, cdrom_toc *outtoc, chdcd_track_input_info *outinfo);
-
-#endif /* __CHDCD_H__ */
diff --git a/src/tools/tools.mak b/src/tools/tools.mak
index 8adb4c73165..d864774fa1e 100644
--- a/src/tools/tools.mak
+++ b/src/tools/tools.mak
@@ -83,7 +83,6 @@ romcmp$(EXE): $(ROMCMPOBJS) $(LIBUTIL) $(ZLIB) $(EXPAT) $(LIBOCORE)
CHDMANOBJS = \
$(TOOLSOBJ)/chdman.o \
- $(TOOLSOBJ)/chdcd.o \
chdman$(EXE): $(VERSIONOBJ) $(CHDMANOBJS) $(LIBUTIL) $(ZLIB) $(EXPAT) $(LIBOCORE)
@echo Linking $@...