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