void upd765_format::extract_sectors(floppy_image *image, const format &f, desc_s *sdesc, int track, int head) { UINT8 bitstream[500000/8]; UINT8 sectdata[50000]; desc_xs sectors[256]; int track_size; // Extract the sectors generate_bitstream_from_track(track, head, f.cell_size, bitstream, track_size, image); switch (f.encoding) { case floppy_image::FM: extract_sectors_from_bitstream_fm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); break; case floppy_image::MFM: extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); break; } for(int i=0; i<f.sector_count; i++) { desc_s &ds = sdesc[i]; desc_xs &xs = sectors[ds.sector_id]; if(!xs.data) memset((void *)ds.data, 0, ds.size); else if(xs.size < ds.size) { memcpy((void *)ds.data, xs.data, xs.size); memset((UINT8 *)ds.data + xs.size, 0, xs.size - ds.size); } else memcpy((void *)ds.data, xs.data, ds.size); } }
void upd765_format::check_compatibility(floppy_image *image, int *candidates, int &candidates_count) { UINT8 bitstream[500000/8]; UINT8 sectdata[50000]; desc_xs sectors[256]; int track_size; // Extract the sectors generate_bitstream_from_track(0, 0, formats[candidates[0]].cell_size, bitstream, track_size, image); switch (formats[candidates[0]].encoding) { case floppy_image::FM: extract_sectors_from_bitstream_fm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); break; case floppy_image::MFM: extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); break; } // Check compatibility with every candidate, copy in-place int *ok_cands = candidates; for(int i=0; i != candidates_count; i++) { const format &f = formats[candidates[i]]; int ns = 0; for(int j=0; j<256; j++) if(sectors[j].data) { int sid; if(f.sector_base_id == -1) { for(sid=0; sid < f.sector_count; sid++) if(f.per_sector_id[sid] == j) break; } else sid = j - f.sector_base_id; if(sid < 0 || sid > f.sector_count) goto fail; if(f.sector_base_size) { if(sectors[j].size != f.sector_base_size) goto fail; } else { if(sectors[j].size != f.per_sector_size[sid]) goto fail; } ns++; } if(ns == f.sector_count) *ok_cands++ = candidates[i]; fail: ; } candidates_count = ok_cands - candidates; }
bool vdk_format::save(io_generic *io, floppy_image *image) { uint8_t bitstream[500000/8]; uint8_t sector_data[50000]; desc_xs sectors[256]; uint64_t file_offset = 0; int track_count, head_count; image->get_actual_geometry(track_count, head_count); // write header uint8_t header[12]; header[0] = 'd'; header[1] = 'k'; header[2] = sizeof(header) % 0x100; header[3] = sizeof(header) / 0x100; header[4] = 0x10; header[5] = 0x10; header[6] = 'M'; header[7] = 0x01; header[8] = track_count; header[9] = head_count; header[10] = 0; header[11] = 0; io_generic_write(io, header, file_offset, sizeof(header)); file_offset += sizeof(header); // write disk data for (int track = 0; track < track_count; track++) { for (int head = 0; head < head_count; head++) { int track_size; generate_bitstream_from_track(track, head, 2000, bitstream, track_size, image); extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sector_data, sizeof(sector_data)); for (int i = 0; i < SECTOR_COUNT; i++) { io_generic_write(io, sectors[FIRST_SECTOR_ID + i].data, file_offset, SECTOR_SIZE); file_offset += SECTOR_SIZE; } } } return true; }
bool jvc_format::save(io_generic *io, floppy_image *image) { UINT8 bitstream[500000/8]; UINT8 sector_data[50000]; desc_xs sectors[256]; UINT64 file_offset = 0; int track_count, head_count; image->get_actual_geometry(track_count, head_count); // we'll write a header if the disk is two-sided if (head_count == 2) { UINT8 header[2]; header[0] = 18; header[1] = 2; io_generic_write(io, header, file_offset, sizeof(header)); file_offset += sizeof(header); } // write disk data for (int track = 0; track < track_count; track++) { for (int head = 0; head < head_count; head++) { int track_size; generate_bitstream_from_track(track, head, 2000, bitstream, track_size, image); extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sector_data, sizeof(sector_data)); for (int i = 0; i < 18; i++) { if (sectors[1 + i].size != 256) emu_fatalerror("jvc_format: invalid sector size: %d\n", sectors[1 + i].size); io_generic_write(io, sectors[1 + i].data, file_offset, sectors[1 + i].size); file_offset += sectors[1 + i].size; } } } return true; }