summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/ap2_dsk.h
blob: 3dcf423ee833b30083ccc7b6e2cb1af229d1bfd8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert, R. Belmont
/*********************************************************************

    ap2_dsk.h

    Apple II disk images

*********************************************************************/

#ifndef AP2_DISK_H
#define AP2_DISK_H

#include "flopimg.h"


/***************************************************************************

    Constants

***************************************************************************/

#define APPLE2_NIBBLE_SIZE                      416
#define APPLE2_SMALL_NIBBLE_SIZE        374
#define APPLE2_TRACK_COUNT                      35
#define APPLE2_SECTOR_COUNT                     16
#define APPLE2_SECTOR_SIZE                      256



/**************************************************************************/

LEGACY_FLOPPY_OPTIONS_EXTERN(apple2);

// new style code

class a2_16sect_format : public floppy_image_format_t
{
public:
		a2_16sect_format();

		virtual int identify(io_generic *io, uint32_t form_factor) override;
		virtual bool load(io_generic *io, uint32_t form_factor, floppy_image *image) override;
		virtual bool save(io_generic *io, floppy_image *image) override;

		virtual const char *name() const override;
		virtual const char *description() const override;
		virtual const char *extensions() const override;
		virtual bool supports_save() const override;

private:
		static const desc_e mac_gcr[];

		uint8_t gb(const uint8_t *buf, int ts, int &pos, int &wrap);
		void update_chk(const uint8_t *data, int size, uint32_t &chk);

		bool m_prodos_order;
};

extern const floppy_format_type FLOPPY_A216S_FORMAT;

class a2_rwts18_format : public floppy_image_format_t
{
public:
		a2_rwts18_format();

		virtual int identify(io_generic *io, uint32_t form_factor) override;
		virtual bool load(io_generic *io, uint32_t form_factor, floppy_image *image) override;
		virtual bool save(io_generic *io, floppy_image *image) override;

		virtual const char *name() const override;
		virtual const char *description() const override;
		virtual const char *extensions() const override;
		virtual bool supports_save() const override;

private:
		static const desc_e mac_gcr[];

		uint8_t gb(const uint8_t *buf, int ts, int &pos, int &wrap);
		void update_chk(const uint8_t *data, int size, uint32_t &chk);
};

extern const floppy_format_type FLOPPY_RWTS18_FORMAT;


class a2_edd_format : public floppy_image_format_t
{
public:
		a2_edd_format();

		virtual int identify(io_generic *io, uint32_t form_factor) override;
		virtual bool load(io_generic *io, uint32_t form_factor, floppy_image *image) override;
		virtual bool supports_save() const override;

		virtual const char *name() const override;
		virtual const char *description() const override;
		virtual const char *extensions() const override;

private:
		static uint8_t pick(const uint8_t *data, int pos);
};

extern const floppy_format_type FLOPPY_EDD_FORMAT;

class a2_woz_format : public floppy_image_format_t
{
public:
		a2_woz_format();

		virtual int identify(io_generic *io, uint32_t form_factor) override;
		virtual bool load(io_generic *io, uint32_t form_factor, floppy_image *image) override;
		virtual bool supports_save() const override;

		virtual const char *name() const override;
		virtual const char *description() const override;
		virtual const char *extensions() const override;

private:
		static const uint8_t signature[8];

		static uint32_t r32(const std::vector<uint8_t> &data, uint32_t offset);
		static uint16_t r16(const std::vector<uint8_t> &data, uint32_t offset);
		static uint8_t r8(const std::vector<uint8_t> &data, uint32_t offset);
		static uint32_t crc32r(const uint8_t *data, uint32_t size);
		static uint32_t find_tag(const std::vector<uint8_t> &data, uint32_t tag);
};

extern const floppy_format_type FLOPPY_WOZ_FORMAT;

#endif /* AP2_DISK_H */