static int append_inlay_file( char *inlay_file, libspectrum_tape *tape ) { libspectrum_tape_block* block; char *description; libspectrum_byte* jpg_data; size_t jpg_length; libspectrum_byte* custom_block_data; size_t custom_block_length; block = libspectrum_tape_block_alloc( LIBSPECTRUM_TAPE_BLOCK_CUSTOM ); /* Get the description */ description = malloc( DESCRIPTION_BUFFER_LEN ); memcpy( description, "Picture ", DESCRIPTION_BUFFER_LEN ); libspectrum_tape_block_set_text( block, description ); /* Read in the data */ if( read_file( inlay_file, &jpg_data, &jpg_length ) ) { free( description ); free( block ); return 1; } custom_block_length = jpg_length + 2; custom_block_data = malloc( custom_block_length ); /* Picture format */ if( is_filetype( inlay_file, ".jpg" ) ) { custom_block_data[0] = 1; } else if( is_filetype( inlay_file, ".gif" ) ) { custom_block_data[0] = 0; } else { free( custom_block_data ); return 1; } /* Picture description length 0 == "Inlay Card" */ custom_block_data[1] = 0; /* and the JPG itself */ memcpy( custom_block_data + 2, jpg_data, jpg_length ); libspectrum_tape_block_set_data_length( block, custom_block_length ); libspectrum_tape_block_set_data( block, custom_block_data ); /* Finally, put the block into the block list */ libspectrum_tape_append_block( tape, block ); return 0; }
static bool dir_readfiles(struct hash* d, const char* path, filetype allowed_file_type, proc_path path_processor, int tmpfile_fd) { DIR *dp = opendir(path); if (!dp) return false; struct dirent *dirp; while ((dirp = readdir(dp)) != NULL) { if (str_begins(dirp->d_name, ".")) continue; char* fullpath = 0; if (asprintf(&fullpath, "%s%s", path, dirp->d_name) != -1) { if (is_filetype(fullpath, allowed_file_type)) path_processor(fullpath, d, tmpfile_fd); free(fullpath); } } return closedir(dp) == 0; }
std::string c64_expansion_slot_device::get_default_card_software() { if (open_image_file(mconfig().options())) { if (is_filetype("crt")) return cbm_crt_get_card(*m_file); clear(); } return software_get_default_slot("standard"); }
image_init_result cbm2_expansion_slot_device::call_load() { size_t size; if (m_card) { if (software_entry() == nullptr) { size = length(); if (is_filetype("20")) { m_card->m_bank1.allocate(size); fread(m_card->m_bank1, size); } else if (is_filetype("40")) { m_card->m_bank2.allocate(size); fread(m_card->m_bank2, size); } else if (is_filetype("60")) { m_card->m_bank3.allocate(size); fread(m_card->m_bank3, size); } } else { load_software_region("bank1", m_card->m_bank1); load_software_region("bank2", m_card->m_bank2); load_software_region("bank3", m_card->m_bank3); } } return image_init_result::PASS; }
image_init_result vic20_expansion_slot_device::call_load() { if (m_card) { if (software_entry() == nullptr) { if (is_filetype("20")) fread(m_card->m_blk1, 0x2000); else if (is_filetype("40")) fread(m_card->m_blk2, 0x2000); else if (is_filetype("60")) fread(m_card->m_blk3, 0x2000); else if (is_filetype("70")) fread(m_card->m_blk3, 0x2000, 0x1000); else if (is_filetype("a0")) fread(m_card->m_blk5, 0x2000); else if (is_filetype("b0")) fread(m_card->m_blk5, 0x2000, 0x1000); else if (is_filetype("crt")) { // read the header uint8_t header[2]; fread(&header, 2); uint16_t address = (header[1] << 8) | header[0]; switch (address) { case 0x2000: fread(m_card->m_blk1, 0x2000); break; case 0x4000: fread(m_card->m_blk2, 0x2000); break; case 0x6000: fread(m_card->m_blk3, 0x2000); break; case 0x7000: fread(m_card->m_blk3, 0x2000, 0x1000); break; case 0xa000: fread(m_card->m_blk5, 0x2000); break; case 0xb000: fread(m_card->m_blk5, 0x2000, 0x1000); break; default: return image_init_result::FAIL; } } } else { load_software_region("blk1", m_card->m_blk1); load_software_region("blk2", m_card->m_blk2); load_software_region("blk3", m_card->m_blk3); load_software_region("blk5", m_card->m_blk5); } } return image_init_result::PASS; }
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; }
image_init_result c64_expansion_slot_device::call_load() { if (m_card) { size_t size; if (software_entry() == nullptr) { size = length(); if (is_filetype("80")) { fread(m_card->m_roml, size); m_card->m_exrom = (0); if (size == 0x4000) { m_card->m_game = 0; } } else if (is_filetype("a0")) { fread(m_card->m_romh, 0x2000); m_card->m_exrom = 0; m_card->m_game = 0; } else if (is_filetype("e0")) { fread(m_card->m_romh, 0x2000); m_card->m_game = 0; } else if (is_filetype("crt")) { size_t roml_size = 0; size_t romh_size = 0; int exrom = 1; int game = 1; if (cbm_crt_read_header(*m_file, &roml_size, &romh_size, &exrom, &game)) { uint8_t *roml = nullptr; uint8_t *romh = nullptr; m_card->m_roml.allocate(roml_size); m_card->m_romh.allocate(romh_size); if (roml_size) roml = m_card->m_roml; if (romh_size) romh = m_card->m_roml; cbm_crt_read_data(*m_file, roml, romh); } m_card->m_exrom = exrom; m_card->m_game = game; } } else { size = get_software_region_length("uprom"); if (size) { // Ultimax (VIC-10) cartridge load_software_region("lorom", m_card->m_roml); load_software_region("uprom", m_card->m_romh); m_card->m_exrom = 1; m_card->m_game = 0; } else { // Commodore 64/128 cartridge load_software_region("roml", m_card->m_roml); load_software_region("romh", m_card->m_romh); load_software_region("nvram", m_card->m_nvram); if (get_feature("exrom") != nullptr) m_card->m_exrom = atol(get_feature("exrom")); if (get_feature("game") != nullptr) m_card->m_game = atol(get_feature("game")); } } } return image_init_result::PASS; }