bool ccvf_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) { const format &f = formats[0]; UINT64 size = io_generic_size(io); dynamic_buffer img(size); io_generic_read(io, &img[0], 0, size); std::string ccvf = std::string((const char *)&img[0], size); dynamic_buffer bytes(78720); int start = 0, end = 0; std::string line; UINT32 byteoffs = 0; char hex[3] = {0}; do { end = ccvf.find_first_of(10, start); line.assign(ccvf.substr(start, end)); if (line.find("Compucolor Virtual Floppy Disk Image") != std::string::npos && line.find("Label") != std::string::npos && line.find("Track") != std::string::npos) { for (int byte = 0; byte < 32; byte++) { if (byteoffs==78720) break; hex[0]=line[byte * 2]; hex[1]=line[(byte * 2) + 1]; bytes[byteoffs++] = strtol(hex, nullptr, 16); } } start = end + 1; } while (start > 0 && end != -1); UINT64 pos = 0; int total_size = 200000000/f.cell_size; for(int track=0; track < f.track_count; track++) { std::vector<UINT32> buffer; int offset = 0; for (int i=0; i<1920 && pos<size; i++, pos++) { for (int bit=0; bit<8; bit++) { bit_w(buffer, BIT(bytes[pos], bit), f.cell_size); } } if (offset < total_size) { // pad the remainder of the track with sync int count = total_size-buffer.size(); for (int i=0; i<count;i++) { bit_w(buffer, (track > 0) ? 1 : 0, f.cell_size); } } generate_track_from_levels(track, 0, buffer, 0, image); } image->set_variant(f.variant); return true; }
bool g64_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) { UINT64 size = io_generic_size(io); UINT8 *img = global_alloc_array(UINT8, size); io_generic_read(io, img, 0, size); int version = img[0x08]; if (version) throw emu_fatalerror("g64_format: Unsupported version %u", version); int track_count = img[0x09]; int pos = 0x0c; int track_offset[84*2]; for(int track = 0; track < track_count; track++) { track_offset[track] = pick_integer_le(img, pos, 4); pos += 4; } int speed_zone_offset[84*2]; for(int track = 0; track < track_count; track++) { speed_zone_offset[track] = pick_integer_le(img, pos, 4); pos += 4; } for(int track = 0; track < track_count; track++) { int track_size = 0; pos = track_offset[track]; if (pos > 0) { track_size = pick_integer_le(img, pos, 2); pos +=2; if (speed_zone_offset[track] > 3) throw emu_fatalerror("g64_format: Unsupported variable speed zones on track %d", track); UINT32 cell_size = c1541_cell_size[speed_zone_offset[track]]; int total_size = 200000000/cell_size; UINT32 *buffer = global_alloc_array_clear(UINT32, total_size); int offset = 0; for (int i=0; i<track_size; i++, pos++) { for (int bit=7; bit>=0; bit--) { bit_w(buffer, offset++, BIT(img[pos], bit), cell_size); if (offset == total_size) break; } } if (offset < total_size) { // pad the remainder of the track with sync int count = (total_size-offset); for (int i=0; i<count; i++) { bit_w(buffer, offset++, 1, cell_size); } } int physical_track = track >= 84 ? track - 84 : track; int head = track >= 84; generate_track_from_levels(physical_track, head, buffer, total_size, 0, image); global_free(buffer); } } image->set_variant(floppy_image::SSSD); return true; }