1 // license:BSD-3-Clause
2 // copyright-holders:Olivier Galibert
3 /*********************************************************************
4 
5     formats/upd765_dsk.h
6 
7     helper for simple upd765-formatted disk images
8 
9 *********************************************************************/
10 #ifndef MAME_FORMATS_UPD765_DSK_H
11 #define MAME_FORMATS_UPD765_DSK_H
12 
13 #pragma once
14 
15 #include "flopimg.h"
16 
17 class upd765_format : public floppy_image_format_t
18 {
19 public:
20 	struct format {
21 		uint32_t form_factor = 0U; // See floppy_image for possible values
22 		uint32_t variant = 0U;   // See floppy_image for possible values
23 		uint32_t encoding = 0U;  // See floppy_image for possible values
24 
25 		int cell_size;           // See floppy_image_format_t for details
26 		int sector_count;
27 		int track_count;
28 		int head_count;
29 		int sector_base_size;
30 		int per_sector_size[40]; // if sector_base_size is 0
31 		int sector_base_id;      // 0 or 1 usually, -1 if there's interleave
32 		int per_sector_id[40];   // if sector_base_id is -1.  If both per are used, then sector per_sector_id[i] has size per_sector_size[i]
33 		int gap_4a;              // Usually 80 - number of 4e between index and IAM sync
34 		int gap_1;               // Usually 50 - number of 4e between IAM and first IDAM sync
35 		int gap_2;               // 22 for <=1.44Mb, 41 for 2.88Mb - number of 4e between sector header and data sync
36 		int gap_3;               // Usually 84 - number of 4e between sector crc and next IDAM
37 	};
38 
39 	// End the array with {}
40 	upd765_format(const format *formats);
41 
42 	virtual int identify(io_generic *io, uint32_t form_factor) override;
43 	virtual bool load(io_generic *io, uint32_t form_factor, floppy_image *image) override;
44 	virtual bool save(io_generic *io, floppy_image *image) override;
45 	virtual bool supports_save() const override;
46 
47 protected:
48 	uint64_t file_header_skip_bytes;
49 	uint64_t file_footer_skip_bytes;
50 
51 	floppy_image_format_t::desc_e* get_desc_fm(const format &f, int &current_size, int &end_gap_index);
52 	floppy_image_format_t::desc_e* get_desc_mfm(const format &f, int &current_size, int &end_gap_index);
53 	int find_size(io_generic *io, uint32_t form_factor) const;
54 	int compute_track_size(const format &f) const;
55 	virtual void build_sector_description(const format &d, uint8_t *sectdata, desc_s *sectors, int track, int head) const;
56 	void check_compatibility(floppy_image *image, std::vector<int> &candidates);
57 	void extract_sectors(floppy_image *image, const format &f, desc_s *sdesc, int track, int head);
58 
59 private:
60 	format const *const formats;
61 };
62 
63 #endif // MAME_FORMATS_UPD765_DSK_H
64