bool upd765_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) { int type = find_size(io, form_factor); if(type == -1) return false; // format shouldn't exceed image geometry const format &f = formats[type]; int img_tracks, img_heads; image->get_maximal_geometry(img_tracks, img_heads); if (f.track_count > img_tracks || f.head_count > img_heads) return false; floppy_image_format_t::desc_e *desc; int current_size; int end_gap_index; switch (f.encoding) { case floppy_image::FM: desc = get_desc_fm(f, current_size, end_gap_index); break; case floppy_image::MFM: default: desc = get_desc_mfm(f, current_size, end_gap_index); break; } int total_size = 200000000/f.cell_size; int remaining_size = total_size - current_size; if(remaining_size < 0) throw emu_fatalerror("upd765_format: Incorrect track layout, max_size=%d, current_size=%d", total_size, current_size); // Fixup the end gap desc[end_gap_index].p2 = remaining_size / 16; desc[end_gap_index + 1].p2 = remaining_size & 15; desc[end_gap_index + 1].p1 >>= 16-(remaining_size & 15); int track_size = compute_track_size(f); uint8_t sectdata[40*512]; desc_s sectors[40]; for(int track=0; track < f.track_count; track++) for(int head=0; head < f.head_count; head++) { build_sector_description(f, sectdata, sectors, track, head); io_generic_read(io, sectdata, (track*f.head_count + head)*track_size, track_size); generate_track(desc, track, head, sectors, f.sector_count, total_size, image); } image->set_variant(f.variant); return true; }
bool wd177x_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) { int type = find_size(io, form_factor); if(type == -1) return false; const format &f = formats[type]; floppy_image_format_t::desc_e *desc; int current_size; int end_gap_index; switch (f.encoding) { case floppy_image::FM: desc = get_desc_fm(f, current_size, end_gap_index); break; case floppy_image::MFM: default: desc = get_desc_mfm(f, current_size, end_gap_index); break; } int total_size = 200000000/f.cell_size; int remaining_size = total_size - current_size; if(remaining_size < 0) throw emu_fatalerror("wd177x_format: Incorrect track layout, max_size=%d, current_size=%d", total_size, current_size); // Fixup the end gap desc[end_gap_index].p2 = remaining_size / 16; desc[end_gap_index + 1].p2 = remaining_size & 15; desc[end_gap_index + 1].p1 >>= 16-(remaining_size & 15); int track_size = compute_track_size(f); UINT8 sectdata[40*512]; desc_s sectors[40]; build_sector_description(f, sectdata, sectors); for(int track=0; track < f.track_count; track++) for(int head=0; head < f.head_count; head++) { if (f.encoding == floppy_image::FM) desc[14].p1 = get_track_dam_fm(f, head, track); else desc[16].p1 = get_track_dam_mfm(f, head, track); io_generic_read(io, sectdata, get_image_offset(f, head, track), track_size); generate_track(desc, track, head, sectors, f.sector_count, total_size, image); } image->set_variant(f.variant); return true; }