mirror of
https://github.com/holub/mame
synced 2025-05-20 20:58:51 +03:00
Added CHD support in softlists [Miodrag Milanovic]
This commit is contained in:
parent
8332fea6d4
commit
73fd06883a
@ -456,7 +456,7 @@ static void audit_one_disk(core_options *options, const rom_entry *rom, const ga
|
|||||||
record->exphash = ROM_GETHASHDATA(rom);
|
record->exphash = ROM_GETHASHDATA(rom);
|
||||||
|
|
||||||
/* open the disk */
|
/* open the disk */
|
||||||
err = open_disk_image_options(options, gamedrv, rom, &source_file, &source);
|
err = open_disk_image_options(options, gamedrv, rom, &source_file, &source, NULL);
|
||||||
|
|
||||||
/* if we failed, report the error */
|
/* if we failed, report the error */
|
||||||
if (err != CHDERR_NONE)
|
if (err != CHDERR_NONE)
|
||||||
|
@ -79,10 +79,16 @@ static DEVICE_IMAGE_LOAD(cdrom)
|
|||||||
dev_cdrom_t *cdrom = get_safe_token(&image.device());
|
dev_cdrom_t *cdrom = get_safe_token(&image.device());
|
||||||
chd_error err = (chd_error)0;
|
chd_error err = (chd_error)0;
|
||||||
chd_file *chd = NULL;
|
chd_file *chd = NULL;
|
||||||
|
astring tempstring;
|
||||||
|
|
||||||
err = chd_open_file( image.image_core_file(), CHD_OPEN_READ, NULL, &chd ); /* CDs are never writeable */
|
if (image.software_entry() == NULL)
|
||||||
if ( err )
|
{
|
||||||
goto error;
|
err = chd_open_file( image.image_core_file(), CHD_OPEN_READ, NULL, &chd ); /* CDs are never writeable */
|
||||||
|
if ( err )
|
||||||
|
goto error;
|
||||||
|
} else {
|
||||||
|
chd = get_disk_handle(image.device().machine, image.device().subtag(tempstring,"cdrom"));
|
||||||
|
}
|
||||||
|
|
||||||
/* open the CHD file */
|
/* open the CHD file */
|
||||||
cdrom->cdrom_handle = cdrom_open( chd );
|
cdrom->cdrom_handle = cdrom_open( chd );
|
||||||
@ -141,7 +147,8 @@ static DEVICE_START(cdrom)
|
|||||||
-------------------------------------------------*/
|
-------------------------------------------------*/
|
||||||
static DEVICE_IMAGE_SOFTLIST_LOAD(cdrom)
|
static DEVICE_IMAGE_SOFTLIST_LOAD(cdrom)
|
||||||
{
|
{
|
||||||
return image.load_software(swlist, swname, start_entry);
|
load_software_part_region( &image.device(), swlist, swname, start_entry );
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------
|
/*-------------------------------------------------
|
||||||
|
@ -949,9 +949,9 @@ static void process_rom_entries(rom_load_data *romdata, const char *regiontag, c
|
|||||||
up the parent and loading by checksum
|
up the parent and loading by checksum
|
||||||
-------------------------------------------------*/
|
-------------------------------------------------*/
|
||||||
|
|
||||||
chd_error open_disk_image(const game_driver *gamedrv, const rom_entry *romp, mame_file **image_file, chd_file **image_chd)
|
chd_error open_disk_image(const game_driver *gamedrv, const rom_entry *romp, mame_file **image_file, chd_file **image_chd,const char *locationtag)
|
||||||
{
|
{
|
||||||
return open_disk_image_options(mame_options(), gamedrv, romp, image_file, image_chd);
|
return open_disk_image_options(mame_options(), gamedrv, romp, image_file, image_chd, locationtag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -961,7 +961,7 @@ chd_error open_disk_image(const game_driver *gamedrv, const rom_entry *romp, mam
|
|||||||
checksum
|
checksum
|
||||||
-------------------------------------------------*/
|
-------------------------------------------------*/
|
||||||
|
|
||||||
chd_error open_disk_image_options(core_options *options, const game_driver *gamedrv, const rom_entry *romp, mame_file **image_file, chd_file **image_chd)
|
chd_error open_disk_image_options(core_options *options, const game_driver *gamedrv, const rom_entry *romp, mame_file **image_file, chd_file **image_chd,const char *locationtag)
|
||||||
{
|
{
|
||||||
const game_driver *drv, *searchdrv;
|
const game_driver *drv, *searchdrv;
|
||||||
const rom_entry *region, *rom;
|
const rom_entry *region, *rom;
|
||||||
@ -986,6 +986,12 @@ chd_error open_disk_image_options(core_options *options, const game_driver *game
|
|||||||
filerr = mame_fopen_options(options, SEARCHPATH_IMAGE, fname, OPEN_FLAG_READ, image_file);
|
filerr = mame_fopen_options(options, SEARCHPATH_IMAGE, fname, OPEN_FLAG_READ, image_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (filerr != FILERR_NONE && locationtag!=NULL)
|
||||||
|
{
|
||||||
|
astring fname(locationtag, PATH_SEPARATOR, ROM_GETNAME(romp), ".chd");
|
||||||
|
filerr = mame_fopen_options(options, SEARCHPATH_IMAGE, fname, OPEN_FLAG_READ, image_file);
|
||||||
|
}
|
||||||
|
|
||||||
/* did the file open succeed? */
|
/* did the file open succeed? */
|
||||||
if (filerr == FILERR_NONE)
|
if (filerr == FILERR_NONE)
|
||||||
{
|
{
|
||||||
@ -1101,7 +1107,7 @@ done:
|
|||||||
for a region
|
for a region
|
||||||
-------------------------------------------------*/
|
-------------------------------------------------*/
|
||||||
|
|
||||||
static void process_disk_entries(rom_load_data *romdata, const char *regiontag, const rom_entry *romp)
|
static void process_disk_entries(rom_load_data *romdata, const char *regiontag, const rom_entry *romp, const char *locationtag)
|
||||||
{
|
{
|
||||||
/* loop until we hit the end of this region */
|
/* loop until we hit the end of this region */
|
||||||
for ( ; !ROMENTRY_ISREGIONEND(romp); romp++)
|
for ( ; !ROMENTRY_ISREGIONEND(romp); romp++)
|
||||||
@ -1122,7 +1128,7 @@ static void process_disk_entries(rom_load_data *romdata, const char *regiontag,
|
|||||||
|
|
||||||
/* first open the source drive */
|
/* first open the source drive */
|
||||||
LOG(("Opening disk image: %s\n", filename.cstr()));
|
LOG(("Opening disk image: %s\n", filename.cstr()));
|
||||||
err = open_disk_image(romdata->machine->gamedrv, romp, &chd.origfile, &chd.origchd);
|
err = open_disk_image(romdata->machine->gamedrv, romp, &chd.origfile, &chd.origchd, locationtag);
|
||||||
if (err != CHDERR_NONE)
|
if (err != CHDERR_NONE)
|
||||||
{
|
{
|
||||||
if (err == CHDERR_FILE_NOT_FOUND)
|
if (err == CHDERR_FILE_NOT_FOUND)
|
||||||
@ -1283,7 +1289,7 @@ void load_software_part_region(device_t *device, char *swlist, char *swname, rom
|
|||||||
if (ROMREGION_ISROMDATA(region))
|
if (ROMREGION_ISROMDATA(region))
|
||||||
process_rom_entries(romdata, locationtag, region + 1);
|
process_rom_entries(romdata, locationtag, region + 1);
|
||||||
else if (ROMREGION_ISDISKDATA(region))
|
else if (ROMREGION_ISDISKDATA(region))
|
||||||
process_disk_entries(romdata, locationtag, region + 1);
|
process_disk_entries(romdata, core_strdup(regiontag.cstr()), region + 1, locationtag);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now go back and post-process all the regions */
|
/* now go back and post-process all the regions */
|
||||||
@ -1346,7 +1352,7 @@ static void process_region_list(rom_load_data *romdata)
|
|||||||
process_rom_entries(romdata, ROMREGION_ISLOADBYNAME(region) ? ROMREGION_GETTAG(region) : NULL, region + 1);
|
process_rom_entries(romdata, ROMREGION_ISLOADBYNAME(region) ? ROMREGION_GETTAG(region) : NULL, region + 1);
|
||||||
}
|
}
|
||||||
else if (ROMREGION_ISDISKDATA(region))
|
else if (ROMREGION_ISDISKDATA(region))
|
||||||
process_disk_entries(romdata, ROMREGION_GETTAG(region), region + 1);
|
process_disk_entries(romdata, ROMREGION_GETTAG(region), region + 1, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now go back and post-process all the regions */
|
/* now go back and post-process all the regions */
|
||||||
|
@ -313,10 +313,10 @@ astring &rom_region_name(astring &result, const game_driver *drv, const rom_sour
|
|||||||
/* ----- disk handling ----- */
|
/* ----- disk handling ----- */
|
||||||
|
|
||||||
/* open a disk image, searching up the parent and loading by checksum */
|
/* open a disk image, searching up the parent and loading by checksum */
|
||||||
chd_error open_disk_image(const game_driver *gamedrv, const rom_entry *romp, mame_file **image_file, chd_file **image_chd);
|
chd_error open_disk_image(const game_driver *gamedrv, const rom_entry *romp, mame_file **image_file, chd_file **image_chd,const char *locationtag);
|
||||||
|
|
||||||
/* open a disk image, searching up the parent and loading by checksum */
|
/* open a disk image, searching up the parent and loading by checksum */
|
||||||
chd_error open_disk_image_options(core_options *options, const game_driver *gamedrv, const rom_entry *romp, mame_file **image_file, chd_file **image_chd);
|
chd_error open_disk_image_options(core_options *options, const game_driver *gamedrv, const rom_entry *romp, mame_file **image_file, chd_file **image_chd,const char *locationtag);
|
||||||
|
|
||||||
/* return a pointer to the CHD file associated with the given region */
|
/* return a pointer to the CHD file associated with the given region */
|
||||||
chd_file *get_disk_handle(running_machine *machine, const char *region);
|
chd_file *get_disk_handle(running_machine *machine, const char *region);
|
||||||
|
@ -530,6 +530,35 @@ static void start_handler(void *data, const char *tagname, const char **attribut
|
|||||||
/* Missing dataarea name or size */
|
/* Missing dataarea name or size */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (!strcmp(tagname, "diskarea"))
|
||||||
|
{
|
||||||
|
const char *str_name = NULL;
|
||||||
|
|
||||||
|
for ( ; attributes[0]; attributes += 2 )
|
||||||
|
{
|
||||||
|
if ( !strcmp( attributes[0], "name" ) )
|
||||||
|
str_name = attributes[1];
|
||||||
|
}
|
||||||
|
if ( str_name )
|
||||||
|
{
|
||||||
|
if ( swlist->softinfo )
|
||||||
|
{
|
||||||
|
char *s = (char *)pool_malloc_lib(swlist->pool, ( strlen( str_name ) + 1 ) * sizeof(char) );
|
||||||
|
|
||||||
|
if ( !s )
|
||||||
|
return;
|
||||||
|
|
||||||
|
strcpy( s, str_name );
|
||||||
|
|
||||||
|
/* ROM_REGION( length, "name", flags ) */
|
||||||
|
add_rom_entry( swlist, s, NULL, 0, 1, ROMENTRYTYPE_REGION | ROMREGION_DATATYPEDISK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Missing dataarea name or size */
|
||||||
|
}
|
||||||
|
}
|
||||||
else if ( !strcmp(tagname, "feature") )
|
else if ( !strcmp(tagname, "feature") )
|
||||||
{
|
{
|
||||||
const char *str_feature_name = NULL;
|
const char *str_feature_name = NULL;
|
||||||
@ -662,6 +691,41 @@ static void start_handler(void *data, const char *tagname, const char **attribut
|
|||||||
/* Missing name, size, crc, sha1, or offset */
|
/* Missing name, size, crc, sha1, or offset */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
if (!strcmp(tagname, "disk"))
|
||||||
|
{
|
||||||
|
const char *str_name = NULL;
|
||||||
|
const char *str_sha1 = NULL;
|
||||||
|
const char *str_status = NULL;
|
||||||
|
|
||||||
|
for ( ; attributes[0]; attributes += 2 )
|
||||||
|
{
|
||||||
|
if ( !strcmp( attributes[0], "name" ) )
|
||||||
|
str_name = attributes[1];
|
||||||
|
if ( !strcmp( attributes[0], "sha1" ) )
|
||||||
|
str_sha1 = attributes[1];
|
||||||
|
if ( !strcmp( attributes[0], "status" ) )
|
||||||
|
str_status = attributes[1];
|
||||||
|
}
|
||||||
|
if ( swlist->softinfo )
|
||||||
|
{
|
||||||
|
if ( str_name && str_sha1 )
|
||||||
|
{
|
||||||
|
char *s_name = (char *)pool_malloc_lib(swlist->pool, ( strlen( str_name ) + 1 ) * sizeof(char) );
|
||||||
|
char *hashdata = (char *)pool_malloc_lib( swlist->pool, sizeof(char) * ( strlen(str_sha1) + 7 + 4 ) );
|
||||||
|
int baddump = ( str_status && !strcmp(str_status, "baddump") ) ? 1 : 0;
|
||||||
|
int nodump = ( str_status && !strcmp(str_status, "nodump" ) ) ? 1 : 0;
|
||||||
|
|
||||||
|
if ( !s_name || !hashdata )
|
||||||
|
return;
|
||||||
|
|
||||||
|
strcpy( s_name, str_name );
|
||||||
|
sprintf( hashdata, "s:%s#%s", str_sha1, ( nodump ? NO_DUMP : ( baddump ? BAD_DUMP : "" ) ) );
|
||||||
|
|
||||||
|
add_rom_entry( swlist, s_name, hashdata, 0, 0, ROMENTRYTYPE_ROM | DISK_READONLY );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
unknown_tag(&swlist->state, tagname);
|
unknown_tag(&swlist->state, tagname);
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user