1 // license:BSD-3-Clause
2 // copyright-holders:Olivier Galibert, R. Belmont
3 /*********************************************************************
4 
5     ap2_dsk.h
6 
7     Apple II disk images
8 
9 *********************************************************************/
10 #ifndef MAME_FORMATS_AP2_DSK_H
11 #define MAME_FORMATS_AP2_DSK_H
12 
13 #pragma once
14 
15 #include "flopimg.h"
16 
17 
18 /***************************************************************************
19 
20     Constants
21 
22 ***************************************************************************/
23 
24 #define APPLE2_NIBBLE_SIZE              416
25 #define APPLE2_SMALL_NIBBLE_SIZE        374
26 #define APPLE2_STD_TRACK_COUNT          35
27 #define APPLE2_TRACK_COUNT              40
28 #define APPLE2_SECTOR_COUNT             16
29 #define APPLE2_SECTOR_SIZE              256
30 
31 
32 
33 /**************************************************************************/
34 
35 LEGACY_FLOPPY_OPTIONS_EXTERN(apple2);
36 
37 // new style code
38 
39 class a2_16sect_format : public floppy_image_format_t
40 {
41 public:
42 	a2_16sect_format();
43 
44 	virtual int identify(io_generic *io, uint32_t form_factor) override;
45 	virtual bool load(io_generic *io, uint32_t form_factor, floppy_image *image) override;
46 	virtual bool save(io_generic *io, floppy_image *image) override;
47 
48 	virtual const char *name() const override;
49 	virtual const char *description() const override;
50 	virtual const char *extensions() const override;
51 	virtual bool supports_save() const override;
52 
53 private:
54 	static const desc_e mac_gcr[];
55 
56 	uint8_t gb(const uint8_t *buf, int ts, int &pos, int &wrap);
57 	void update_chk(const uint8_t *data, int size, uint32_t &chk);
58 
59 	bool m_prodos_order;
60 
61 	int m_tracks;
62 };
63 
64 extern const floppy_format_type FLOPPY_A216S_FORMAT;
65 
66 class a2_rwts18_format : public floppy_image_format_t
67 {
68 public:
69 	a2_rwts18_format();
70 
71 	virtual int identify(io_generic *io, uint32_t form_factor) override;
72 	virtual bool load(io_generic *io, uint32_t form_factor, floppy_image *image) override;
73 	virtual bool save(io_generic *io, floppy_image *image) override;
74 
75 	virtual const char *name() const override;
76 	virtual const char *description() const override;
77 	virtual const char *extensions() const override;
78 	virtual bool supports_save() const override;
79 
80 private:
81 	static const desc_e mac_gcr[];
82 
83 	uint8_t gb(const uint8_t *buf, int ts, int &pos, int &wrap);
84 	void update_chk(const uint8_t *data, int size, uint32_t &chk);
85 };
86 
87 extern const floppy_format_type FLOPPY_RWTS18_FORMAT;
88 
89 
90 class a2_edd_format : public floppy_image_format_t
91 {
92 public:
93 	a2_edd_format();
94 
95 	virtual int identify(io_generic *io, uint32_t form_factor) override;
96 	virtual bool load(io_generic *io, uint32_t form_factor, floppy_image *image) override;
97 	virtual bool supports_save() const override;
98 
99 	virtual const char *name() const override;
100 	virtual const char *description() const override;
101 	virtual const char *extensions() const override;
102 
103 private:
104 	static uint8_t pick(const uint8_t *data, int pos);
105 };
106 
107 extern const floppy_format_type FLOPPY_EDD_FORMAT;
108 
109 class a2_woz_format : public floppy_image_format_t
110 {
111 public:
112 	a2_woz_format();
113 
114 	virtual int identify(io_generic *io, uint32_t form_factor) override;
115 	virtual bool load(io_generic *io, uint32_t form_factor, floppy_image *image) override;
116 	virtual bool supports_save() const override;
117 
118 	virtual const char *name() const override;
119 	virtual const char *description() const override;
120 	virtual const char *extensions() const override;
121 
122 private:
123 	static const uint8_t signature[8];
124 	static const uint8_t signature2[8];
125 
126 	static uint32_t r32(const std::vector<uint8_t> &data, uint32_t offset);
127 	static uint16_t r16(const std::vector<uint8_t> &data, uint32_t offset);
128 	static uint8_t r8(const std::vector<uint8_t> &data, uint32_t offset);
129 	static uint32_t crc32r(const uint8_t *data, uint32_t size);
130 	static uint32_t find_tag(const std::vector<uint8_t> &data, uint32_t tag);
131 };
132 
133 extern const floppy_format_type FLOPPY_WOZ_FORMAT;
134 
135 #endif // MAME_FORMATS_AP2_DSK_H
136