int harddisk_image_device::internal_load_hd() { astring tempstring; chd_error err = CHDERR_NONE; m_chd = NULL; if (m_hard_disk_handle) hard_disk_close(m_hard_disk_handle); /* open the CHD file */ if (software_entry() != NULL) { m_chd = get_disk_handle(device().machine(), device().subtag(tempstring,"harddriv")); } else { err = m_origchd.open(*image_core_file(), true); if (err == CHDERR_NONE) { m_chd = &m_origchd; } else if (err == CHDERR_FILE_NOT_WRITEABLE) { err = m_origchd.open(*image_core_file(), false); if (err == CHDERR_NONE) { err = open_disk_diff(device().machine().options(), basename_noext(), m_origchd, m_diffchd); if (err == CHDERR_NONE) { m_chd = &m_diffchd; } } } } if (m_chd != NULL) { /* open the hard disk file */ m_hard_disk_handle = hard_disk_open(m_chd); if (m_hard_disk_handle != NULL) return IMAGE_INIT_PASS; } /* if we had an error, close out the CHD */ m_origchd.close(); m_diffchd.close(); m_chd = NULL; seterror(IMAGE_ERROR_UNSPECIFIED, chd_file::error_string(err)); return IMAGE_INIT_FAIL; }
image_init_result harddisk_image_device::internal_load_hd() { chd_error err = CHDERR_NONE; m_chd = nullptr; if (m_hard_disk_handle) hard_disk_close(m_hard_disk_handle); /* open the CHD file */ if (software_entry() != nullptr) { m_chd = machine().rom_load().get_disk_handle(device().subtag("harddriv").c_str()); } else { err = m_origchd.open(image_core_file(), true); if (err == CHDERR_NONE) { m_chd = &m_origchd; } else if (err == CHDERR_FILE_NOT_WRITEABLE) { err = m_origchd.open(image_core_file(), false); if (err == CHDERR_NONE) { err = open_disk_diff(device().machine().options(), basename_noext(), m_origchd, m_diffchd); if (err == CHDERR_NONE) { m_chd = &m_diffchd; } } } } if (m_chd != nullptr) { /* open the hard disk file */ m_hard_disk_handle = hard_disk_open(m_chd); if (m_hard_disk_handle != nullptr) return image_init_result::PASS; } /* if we had an error, close out the CHD */ m_origchd.close(); m_diffchd.close(); m_chd = nullptr; seterror(IMAGE_ERROR_UNSPECIFIED, chd_file::error_string(err)); return image_init_result::FAIL; }
image_init_result harddisk_image_device::call_create(int create_format, util::option_resolution *create_args) { int err; UINT32 sectorsize, hunksize; UINT32 cylinders, heads, sectors, totalsectors; assert_always(create_args != nullptr, "Expected create_args to not be nullptr"); cylinders = create_args->lookup_int('C'); heads = create_args->lookup_int('H'); sectors = create_args->lookup_int('S'); sectorsize = create_args->lookup_int('L'); hunksize = create_args->lookup_int('K'); totalsectors = cylinders * heads * sectors; /* create the CHD file */ chd_codec_type compression[4] = { CHD_CODEC_NONE }; err = m_origchd.create(image_core_file(), (UINT64)totalsectors * (UINT64)sectorsize, hunksize, sectorsize, compression); if (err != CHDERR_NONE) goto error; /* if we created the image and hence, have metadata to set, set the metadata */ err = m_origchd.write_metadata(HARD_DISK_METADATA_TAG, 0, string_format(HARD_DISK_METADATA_FORMAT, cylinders, heads, sectors, sectorsize)); m_origchd.close(); if (err != CHDERR_NONE) goto error; return internal_load_hd(); error: return image_init_result::FAIL; }
bool harddisk_image_device::call_create(int create_format, option_resolution *create_args) { int err; UINT32 sectorsize, hunksize; UINT32 cylinders, heads, sectors, totalsectors; astring metadata; cylinders = option_resolution_lookup_int(create_args, 'C'); heads = option_resolution_lookup_int(create_args, 'H'); sectors = option_resolution_lookup_int(create_args, 'S'); sectorsize = option_resolution_lookup_int(create_args, 'L'); hunksize = option_resolution_lookup_int(create_args, 'K'); totalsectors = cylinders * heads * sectors; /* create the CHD file */ chd_codec_type compression[4] = { CHD_CODEC_NONE }; err = m_origchd.create(*image_core_file(), (UINT64)totalsectors * (UINT64)sectorsize, hunksize, sectorsize, compression); if (err != CHDERR_NONE) goto error; /* if we created the image and hence, have metadata to set, set the metadata */ metadata.format(HARD_DISK_METADATA_FORMAT, cylinders, heads, sectors, sectorsize); err = m_origchd.write_metadata(HARD_DISK_METADATA_TAG, 0, metadata); m_origchd.close(); if (err != CHDERR_NONE) goto error; return internal_load_hd(); error: return IMAGE_INIT_FAIL; }
bool harddisk_image_device::call_create(int create_format, option_resolution *create_args) { int err; char metadata[256]; UINT32 sectorsize, hunksize; UINT32 cylinders, heads, sectors, totalsectors; cylinders = option_resolution_lookup_int(create_args, 'C'); heads = option_resolution_lookup_int(create_args, 'H'); sectors = option_resolution_lookup_int(create_args, 'S'); sectorsize = option_resolution_lookup_int(create_args, 'L'); hunksize = option_resolution_lookup_int(create_args, 'K'); totalsectors = cylinders * heads * sectors; /* create the CHD file */ err = chd_create_file(image_core_file(), (UINT64)totalsectors * (UINT64)sectorsize, hunksize, CHDCOMPRESSION_NONE, NULL); if (err != CHDERR_NONE) goto error; sprintf(metadata, HARD_DISK_METADATA_FORMAT, cylinders, heads, sectors, sectorsize); return internal_load_hd(metadata); error: return IMAGE_INIT_FAIL; }
int harddisk_image_device::internal_load_hd(const char *metadata) { chd_error err = (chd_error)0; int is_writeable; /* open the CHD file */ do { is_writeable = !is_readonly(); m_chd = NULL; err = chd_open_file(image_core_file(), is_writeable ? CHD_OPEN_READWRITE : CHD_OPEN_READ, NULL, &m_chd); /* special case; if we get CHDERR_FILE_NOT_WRITEABLE, make the * image read only and repeat */ if (err == CHDERR_FILE_NOT_WRITEABLE) make_readonly(); } while(!m_chd && is_writeable && (err == CHDERR_FILE_NOT_WRITEABLE)); if (!m_chd) goto done; /* if we created the image and hence, have metadata to set, set the metadata */ if (metadata) { err = chd_set_metadata(m_chd, HARD_DISK_METADATA_TAG, 0, metadata, strlen(metadata) + 1, 0); if (err != CHDERR_NONE) goto done; } /* open the hard disk file */ m_hard_disk_handle = hard_disk_open(m_chd); if (!m_hard_disk_handle) goto done; done: if (err) { /* if we had an error, close out the CHD */ if (m_chd != NULL) { chd_close(m_chd); m_chd = NULL; } seterror(IMAGE_ERROR_UNSPECIFIED, chd_get_error_string(err)); } return err ? IMAGE_INIT_FAIL : IMAGE_INIT_PASS; }
void floppy_image_device::commit_image() { image_dirty = false; if(!output_format || !output_format->supports_save()) return; io_generic io; // Do _not_ remove this cast otherwise the pointer will be incorrect when used by the ioprocs. io.file = (device_image_interface *)this; io.procs = &image_ioprocs; io.filler = 0xff; file_error err = core_truncate(image_core_file(), 0); if (err != 0) popmessage("Error, unable to truncate image: %d", err); output_format->save(&io, image); }
bool cdrom_image_device::call_load() { chd_error err = (chd_error)0; chd_file *chd = NULL; astring tempstring; if (m_cdrom_handle) cdrom_close(m_cdrom_handle); if (software_entry() == NULL) { if (strstr(m_image_name,".chd") && is_loaded()) { err = m_self_chd.open( *image_core_file() ); /* CDs are never writeable */ if ( err ) goto error; chd = &m_self_chd; } } else { chd = get_disk_handle(device().machine(), device().subtag(tempstring,"cdrom")); } /* open the CHD file */ if (chd) { m_cdrom_handle = cdrom_open( chd ); } else { m_cdrom_handle = cdrom_open( m_image_name ); } if ( ! m_cdrom_handle ) goto error; return IMAGE_INIT_PASS; error: if ( chd && chd == &m_self_chd ) m_self_chd.close( ); if ( err ) seterror( IMAGE_ERROR_UNSPECIFIED, chd_file::error_string( err ) ); return IMAGE_INIT_FAIL; }
image_init_result cdrom_image_device::call_load() { chd_error err = (chd_error)0; chd_file *chd = nullptr; if (m_cdrom_handle) cdrom_close(m_cdrom_handle); if (software_entry() == nullptr) { if (is_filetype("chd") && is_loaded()) { err = m_self_chd.open( image_core_file() ); /* CDs are never writeable */ if ( err ) goto error; chd = &m_self_chd; } } else { chd = device().machine().rom_load().get_disk_handle(device().subtag("cdrom").c_str()); } /* open the CHD file */ if (chd) { m_cdrom_handle = cdrom_open( chd ); } else { m_cdrom_handle = cdrom_open(m_image_name.c_str()); } if ( ! m_cdrom_handle ) goto error; return image_init_result::PASS; error: if ( chd && chd == &m_self_chd ) m_self_chd.close( ); if ( err ) seterror( IMAGE_ERROR_UNSPECIFIED, chd_file::error_string( err ) ); return image_init_result::FAIL; }