1 // license:BSD-3-Clause
2 // copyright-holders:Fabio Priuli
3 /*********************************************************************
4 
5     formats/dip_dsk.h
6 
7     PC98 DIP disk images
8 
9     0x100 header, followed by track data
10 
11     TODO:
12     - Investigate header structure
13     - can this format be used to support different disc types?
14 
15 *********************************************************************/
16 
17 #include <cassert>
18 
19 #include "dip_dsk.h"
20 
dip_format()21 dip_format::dip_format()
22 {
23 }
24 
name() const25 const char *dip_format::name() const
26 {
27 	return "dip";
28 }
29 
description() const30 const char *dip_format::description() const
31 {
32 	return "DIP disk image";
33 }
34 
extensions() const35 const char *dip_format::extensions() const
36 {
37 	return "dip";
38 }
39 
identify(io_generic * io,uint32_t form_factor)40 int dip_format::identify(io_generic *io, uint32_t form_factor)
41 {
42 	uint64_t size = io_generic_size(io);
43 
44 	if (size == 0x134000 + 0x100)
45 		return 100;
46 
47 	return 0;
48 }
49 
load(io_generic * io,uint32_t form_factor,floppy_image * image)50 bool dip_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
51 {
52 	int heads, tracks, spt, bps;
53 
54 	//For the moment we only support this disk structure...
55 	//2 sides, 77 tracks, 8 sectors/track, 1024 bytes/sector = 1261568 bytes (360rpm)
56 	heads = 2;
57 	tracks = 77;
58 	spt = 8;
59 	bps = 1024;
60 
61 	int cell_count = form_factor == floppy_image::FF_35 ? 200000 : 166666;
62 
63 	int ssize;
64 	for (ssize = 0; (128 << ssize) < bps; ssize++) {};
65 
66 	desc_pc_sector sects[256];
67 	uint8_t sect_data[65536];
68 
69 	for (int track = 0; track < tracks; track++)
70 		for (int head = 0; head < heads; head++)
71 		{
72 			io_generic_read(io, sect_data, 0x100 + bps * spt * (track * heads + head), bps * spt);
73 
74 			for (int i = 0; i < spt; i++)
75 			{
76 				sects[i].track       = track;
77 				sects[i].head        = head;
78 				sects[i].sector      = i + 1;
79 				sects[i].size        = ssize;
80 				sects[i].actual_size = bps;
81 				sects[i].deleted     = false;
82 				sects[i].bad_crc     = false;
83 				sects[i].data        = sect_data + i * bps;
84 			}
85 
86 			build_pc_track_mfm(track, head, image, cell_count, spt, sects, calc_default_pc_gap3_size(form_factor, bps));
87 		}
88 
89 	return true;
90 }
91 
supports_save() const92 bool dip_format::supports_save() const
93 {
94 	return false;
95 }
96 
97 const floppy_format_type FLOPPY_DIP_FORMAT = &floppy_image_format_creator<dip_format>;
98