예제 #1
0
파일: ccvf_dsk.cpp 프로젝트: Fulg/mame
bool ccvf_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
{
	const format &f = formats[0];

	UINT64 size = io_generic_size(io);
	dynamic_buffer img(size);
	io_generic_read(io, &img[0], 0, size);

	std::string ccvf = std::string((const char *)&img[0], size);
	dynamic_buffer bytes(78720);

	int start = 0, end = 0;
	std::string line;
	UINT32 byteoffs = 0;
	char hex[3] = {0};

	do {
		end = ccvf.find_first_of(10, start);
		line.assign(ccvf.substr(start, end));
		if (line.find("Compucolor Virtual Floppy Disk Image") != std::string::npos && line.find("Label") != std::string::npos && line.find("Track") != std::string::npos) {
			for (int byte = 0; byte < 32; byte++) {
				if (byteoffs==78720) break;
				hex[0]=line[byte * 2];
				hex[1]=line[(byte * 2) + 1];
				bytes[byteoffs++] = strtol(hex, nullptr, 16);
			}
		}
		start = end + 1;
	} while (start > 0 && end != -1);

	UINT64 pos = 0;
	int total_size = 200000000/f.cell_size;

	for(int track=0; track < f.track_count; track++) {
		std::vector<UINT32> buffer;
		int offset = 0;

		for (int i=0; i<1920 && pos<size; i++, pos++) {
			for (int bit=0; bit<8; bit++) {
				bit_w(buffer, BIT(bytes[pos], bit), f.cell_size);
			}
		}

		if (offset < total_size) {
			// pad the remainder of the track with sync
			int count = total_size-buffer.size();
			for (int i=0; i<count;i++) {
				bit_w(buffer, (track > 0) ? 1 : 0, f.cell_size);
			}
		}

		generate_track_from_levels(track, 0, buffer, 0, image);
	}

	image->set_variant(f.variant);

	return true;
}
예제 #2
0
bool g64_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
{
    UINT64 size = io_generic_size(io);
    UINT8 *img = global_alloc_array(UINT8, size);
    io_generic_read(io, img, 0, size);

    int version = img[0x08];
    if (version)
        throw emu_fatalerror("g64_format: Unsupported version %u", version);

    int track_count = img[0x09];

    int pos = 0x0c;
    int track_offset[84*2];
    for(int track = 0; track < track_count; track++) {
        track_offset[track] = pick_integer_le(img, pos, 4);
        pos += 4;
    }

    int speed_zone_offset[84*2];
    for(int track = 0; track < track_count; track++) {
        speed_zone_offset[track] = pick_integer_le(img, pos, 4);
        pos += 4;
    }

    for(int track = 0; track < track_count; track++) {
        int track_size = 0;
        pos = track_offset[track];
        if (pos > 0) {
            track_size = pick_integer_le(img, pos, 2);
            pos +=2;

            if (speed_zone_offset[track] > 3)
                throw emu_fatalerror("g64_format: Unsupported variable speed zones on track %d", track);

            UINT32 cell_size = c1541_cell_size[speed_zone_offset[track]];
            int total_size = 200000000/cell_size;
            UINT32 *buffer = global_alloc_array_clear(UINT32, total_size);
            int offset = 0;

            for (int i=0; i<track_size; i++, pos++) {
                for (int bit=7; bit>=0; bit--) {
                    bit_w(buffer, offset++, BIT(img[pos], bit), cell_size);
                    if (offset == total_size) break;
                }
            }

            if (offset < total_size) {
                // pad the remainder of the track with sync
                int count = (total_size-offset);
                for (int i=0; i<count; i++) {
                    bit_w(buffer, offset++, 1, cell_size);
                }
            }

            int physical_track = track >= 84 ? track - 84 : track;
            int head = track >= 84;

            generate_track_from_levels(physical_track, head, buffer, total_size, 0, image);
            global_free(buffer);
        }
    }

    image->set_variant(floppy_image::SSSD);

    return true;
}