bool flex_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) { int spt = info.last_sec; int bps = 256; int cell_count = (form_factor == floppy_image::FF_525) ? 50000 : 100000; int offset = 0; int head_num = 1; int total_tracks = info.last_trk+1; bool double_sided = false; if(total_tracks == 40 && spt == 36) double_sided = true; if(total_tracks == 77 && spt == 30) double_sided = true; if(total_tracks == 80 && spt == 40) // 800kB double_sided = true; if(total_tracks == 80 && spt == 72) // 1.44MB double_sided = true; if(spt >= 20) double_sided = true; if(double_sided) { spt = spt / 2; head_num = 2; } for(int track=0; track < total_tracks; track++) for(int head=0;head < head_num;head++) { desc_pc_sector sects[80]; UINT8 sect_data[20000]; int sdatapos = 0; for(int i=0; i<spt; i++) { sects[i].track = track; sects[i].head = head; // no side select? if(head == 0) sects[i].sector = i+1; else sects[i].sector = i+1+spt; sects[i].actual_size = bps; sects[i].size = 1; sects[i].deleted = false; sects[i].bad_crc = false; sects[i].data = §_data[sdatapos]; io_generic_read(io, sects[i].data, offset, bps); offset += bps; sdatapos += bps; } // gap sizes unverified if(total_tracks == 35 && spt == 18 && (track >= 1 && track <= 2)) // handle Gimix Flex 3.6 disk image, which the boot sector loads tracks 1 and 2 as MFM build_wd_track_mfm(track, head, image, cell_count*2, spt, sects, 50, 32, 22); else build_wd_track_fm(track, head, image, cell_count, spt, sects, 24, 16, 11); } return true; }
bool jvc_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) { int header_size, track_count, head_count, sector_count, sector_size, sector_base_id; if (!parse_header(io, header_size, track_count, head_count, sector_count, sector_size, sector_base_id)) return false; // safety check if (sector_count * sector_size > 10000) emu_fatalerror("jvc_format: incorrect track layout\n"); int file_offset = header_size; for (int track = 0; track < track_count; track++) { for (int head = 0; head < head_count ; head++) { desc_pc_sector sectors[256]; UINT8 sector_data[10000]; int sector_offset = 0; for (int i = 0; i < sector_count; i++) { sectors[i].track = track; sectors[i].head = head; sectors[i].sector = sector_base_id + i; sectors[i].actual_size = sector_size; sectors[i].size = sector_size >> 8; sectors[i].deleted = false; sectors[i].bad_crc = false; sectors[i].data = §or_data[sector_offset]; io_generic_read(io, sectors[i].data, file_offset, sector_size); sector_offset += sector_size; file_offset += sector_size; } build_wd_track_mfm(track, head, image, 100000, sector_count, sectors, 22, 32, 24); } } return true; }
bool vdk_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) { uint8_t header[0x100]; io_generic_read(io, header, 0, 0x100); int header_size = header[3] * 0x100 + header[2]; int track_count = header[8]; int head_count = header[9]; int file_offset = header_size; for (int track = 0; track < track_count; track++) { for (int head = 0; head < head_count ; head++) { desc_pc_sector sectors[SECTOR_COUNT]; uint8_t sector_data[SECTOR_COUNT * SECTOR_SIZE]; int sector_offset = 0; for (int i = 0; i < SECTOR_COUNT; i++) { sectors[i].track = track; sectors[i].head = head; sectors[i].sector = FIRST_SECTOR_ID + i; sectors[i].actual_size = SECTOR_SIZE; sectors[i].size = SECTOR_SIZE >> 8; sectors[i].deleted = false; sectors[i].bad_crc = false; sectors[i].data = §or_data[sector_offset]; io_generic_read(io, sectors[i].data, file_offset, SECTOR_SIZE); sector_offset += SECTOR_SIZE; file_offset += SECTOR_SIZE; } build_wd_track_mfm(track, head, image, 100000, SECTOR_COUNT, sectors, 22, 32, 24); } } return true; }