bool g64_format::save(io_generic *io, floppy_image *image) { int tracks, heads; image->get_actual_geometry(tracks, heads); tracks = TRACK_COUNT * heads; // write header UINT8 header[] = { 'G', 'C', 'R', '-', '1', '5', '4', '1', 0x00, tracks, TRACK_LENGTH & 0xff, TRACK_LENGTH >> 8 }; io_generic_write(io, header, POS_SIGNATURE, sizeof(header)); // write tracks for (int head = 0; head < heads; head++) { int tracks_written = 0; dynamic_buffer trackbuf(TRACK_LENGTH-2); for (int track = 0; track < TRACK_COUNT; track++) { UINT32 tpos = POS_TRACK_OFFSET + (track * 4); UINT32 spos = tpos + (tracks * 4); UINT32 dpos = POS_TRACK_OFFSET + (tracks * 4 * 2) + (tracks_written * TRACK_LENGTH); io_generic_write_filler(io, 0x00, tpos, 4); io_generic_write_filler(io, 0x00, spos, 4); if (image->get_buffer(track, head).size() <= 1) continue; int track_size; int speed_zone; // figure out the cell size and speed zone from the track data if ((speed_zone = generate_bitstream(track, head, 3, &trackbuf[0], track_size, image)) == -1) if ((speed_zone = generate_bitstream(track, head, 2, &trackbuf[0], track_size, image)) == -1) if ((speed_zone = generate_bitstream(track, head, 1, &trackbuf[0], track_size, image)) == -1) if ((speed_zone = generate_bitstream(track, head, 0, &trackbuf[0], track_size, image)) == -1) throw emu_fatalerror("g64_format: Cannot determine speed zone for track %u", track); LOG_FORMATS("head %u track %u size %u cell %u\n", head, track, track_size, c1541_cell_size[speed_zone]); UINT8 track_offset[4]; UINT8 speed_offset[4]; UINT8 track_length[2]; place_integer_le(track_offset, 0, 4, dpos); place_integer_le(speed_offset, 0, 4, speed_zone); place_integer_le(track_length, 0, 2, track_size/8); io_generic_write(io, track_offset, tpos, 4); io_generic_write(io, speed_offset, spos, 4); io_generic_write_filler(io, 0xff, dpos, TRACK_LENGTH); io_generic_write(io, track_length, dpos, 2); io_generic_write(io, &trackbuf[0], dpos + 2, track_size); tracks_written++; } } return true; }
bool g64_format::save(io_generic *io, floppy_image *image) { UINT8 header[] = { 'G', 'C', 'R', '-', '1', '5', '4', '1', 0x00, 0x54, TRACK_LENGTH & 0xff, TRACK_LENGTH >> 8 }; io_generic_write(io, header, SIGNATURE, sizeof(header)); int head = 0; int tracks_written = 0; dynamic_buffer trackbuf(TRACK_LENGTH-2); for (int track = 0; track < 84; track++) { offs_t tpos = TRACK_OFFSET + track * 4; offs_t spos = SPEED_ZONE + track * 4; offs_t dpos = TRACK_DATA + tracks_written * TRACK_LENGTH; io_generic_write_filler(io, 0x00, tpos, 4); io_generic_write_filler(io, 0x00, spos, 4); if (image->get_track_size(track, head) <= 1) continue; int track_size; int speed_zone; // figure out the cell size and speed zone from the track data if ((speed_zone = generate_bitstream(track, head, 3, trackbuf, track_size, image)) == -1) if ((speed_zone = generate_bitstream(track, head, 2, trackbuf, track_size, image)) == -1) if ((speed_zone = generate_bitstream(track, head, 1, trackbuf, track_size, image)) == -1) if ((speed_zone = generate_bitstream(track, head, 0, trackbuf, track_size, image)) == -1) throw emu_fatalerror("g64_format: Cannot determine speed zone for track %u", track); LOG_FORMATS("track %u size %u cell %u\n", track, track_size, c1541_cell_size[speed_zone]); UINT8 track_offset[4]; UINT8 speed_offset[4]; UINT8 track_length[2]; place_integer_le(track_offset, 0, 4, dpos); place_integer_le(speed_offset, 0, 4, speed_zone); place_integer_le(track_length, 0, 2, track_size/8); io_generic_write(io, track_offset, tpos, 4); io_generic_write(io, speed_offset, spos, 4); io_generic_write_filler(io, 0xff, dpos, TRACK_LENGTH); io_generic_write(io, track_length, dpos, 2); io_generic_write(io, trackbuf, dpos + 2, track_size); tracks_written++; } return true; }