floperr_t basicdsk_construct(floppy_image *floppy, const struct basicdsk_geometry *geometry) { struct basicdsk_tag *tag; struct FloppyCallbacks *format; assert(geometry->heads); assert(geometry->tracks); assert(geometry->sectors); tag = (struct basicdsk_tag *) floppy_create_tag(floppy, BASICDSK_TAG, sizeof(struct basicdsk_tag)); if (!tag) return FLOPPY_ERROR_OUTOFMEMORY; tag->geometry = *geometry; /* set up format callbacks */ format = floppy_callbacks(floppy); format->read_sector = basicdsk_read_sector; format->write_sector = basicdsk_write_sector; format->read_indexed_sector = basicdsk_read_indexed_sector; format->write_indexed_sector = basicdsk_write_indexed_sector; format->get_sector_length = basicdsk_get_sector_length; format->get_heads_per_disk = basicdsk_get_heads_per_disk; format->get_tracks_per_disk = basicdsk_get_tracks_per_disk; format->get_indexed_sector_info = basicdsk_get_indexed_sector_info; format->format_track = basicdsk_format_track; return FLOPPY_ERROR_SUCCESS; }
static FLOPPY_CONSTRUCT(oric_dsk_construct) { struct FloppyCallbacks *callbacks; struct oricdsk_tag *tag; UINT8 header[mfm_disk_header_size]; floppy_image_read(floppy, header, 0, mfm_disk_header_size); tag = (struct oricdsk_tag *) floppy_create_tag(floppy, sizeof(struct oricdsk_tag)); if (!tag) return FLOPPY_ERROR_OUTOFMEMORY; tag->heads = pick_integer_le(header, 8, 4); tag->tracks = pick_integer_le(header, 12, 4); tag->geometry = pick_integer_le(header, 16, 4); tag->tracksize = TRACK_SIZE_MFM; memset(tag->sector_data,0,sizeof(tag->sector_data)); callbacks = floppy_callbacks(floppy); callbacks->read_sector = oric_read_sector; callbacks->write_sector = oric_write_sector; callbacks->read_indexed_sector = oric_read_indexed_sector; callbacks->write_indexed_sector = oric_write_indexed_sector; callbacks->get_sector_length = oric_get_sector_length; callbacks->get_heads_per_disk = oric_get_heads_per_disk; callbacks->get_tracks_per_disk = oric_get_tracks_per_disk; callbacks->get_indexed_sector_info = oric_get_indexed_sector_info; return FLOPPY_ERROR_SUCCESS; }