fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/drivers/block/block.h *
7 * Created: 2003-04-14 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 2003-2019 Hampa Hug <hampa@hampa.ch> *
9 *****************************************************************************/
10
11/*****************************************************************************
12 * This program is free software. You can redistribute it and / or modify it *
13 * under the terms of the GNU General Public License version 2 as published *
14 * by the Free Software Foundation. *
15 * *
16 * This program is distributed in the hope that it will be useful, but *
17 * WITHOUT ANY WARRANTY, without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
19 * Public License for more details. *
20 *****************************************************************************/
21
22
23#ifndef PCE_DEVICES_BLOCK_BLOCK_H
24#define PCE_DEVICES_BLOCK_BLOCK_H 1
25
26
27#include <config.h>
28
29#include <stdio.h>
30#include <stdint.h>
31
32#ifdef HAVE_UNISTD_H
33#include <unistd.h>
34#endif
35
36
37enum {
38 PCE_DISK_NONE,
39 PCE_DISK_RAW,
40 PCE_DISK_RAM,
41 PCE_DISK_PCE,
42 PCE_DISK_DOSEMU,
43 PCE_DISK_COW,
44 PCE_DISK_PSI,
45 PCE_DISK_QED,
46 PCE_DISK_PBI,
47 PCE_DISK_CHD,
48 PCE_DISK_PRI
49};
50
51
52struct disk_s;
53
54
55typedef int (*dsk_read_f) (struct disk_s *dsk, void *buf, uint32_t i, uint32_t n);
56
57typedef int (*dsk_write_f) (struct disk_s *dsk, const void *buf, uint32_t i, uint32_t n);
58
59typedef int (*dsk_get_msg_f) (struct disk_s *dsk, const char *msg, char *val, unsigned max);
60typedef int (*dsk_set_msg_f) (struct disk_s *dsk, const char *msg, const char *val);
61
62
63/*!***************************************************************************
64 * @short The disk structure
65 *****************************************************************************/
66typedef struct disk_s {
67 unsigned type;
68
69 void (*del) (struct disk_s *dsk);
70 dsk_read_f read;
71 dsk_write_f write;
72 dsk_get_msg_f get_msg;
73 dsk_set_msg_f set_msg;
74
75 unsigned drive;
76
77 uint32_t blocks;
78
79 uint32_t c;
80 uint32_t h;
81 uint32_t s;
82
83 uint32_t visible_c;
84 uint32_t visible_h;
85 uint32_t visible_s;
86
87 char readonly;
88
89 char *fname;
90
91 void *ext;
92} disk_t;
93
94
95/*!***************************************************************************
96 * @short The disk set structure
97 *****************************************************************************/
98typedef struct {
99 unsigned cnt;
100 disk_t **dsk;
101} disks_t;
102
103
104uint16_t dsk_get_uint16_be (const void *buf, unsigned i);
105uint32_t dsk_get_uint32_be (const void *buf, unsigned i);
106uint64_t dsk_get_uint64_be (const void *buf, unsigned i);
107
108void dsk_set_uint16_be (void *buf, unsigned i, uint16_t v);
109void dsk_set_uint32_be (void *buf, unsigned i, uint32_t v);
110void dsk_set_uint64_be (void *buf, unsigned i, uint64_t v);
111
112uint16_t dsk_get_uint16_le (const void *buf, unsigned i);
113uint32_t dsk_get_uint32_le (const void *buf, unsigned i);
114uint64_t dsk_get_uint64_le (const void *buf, unsigned i);
115
116void dsk_set_uint16_le (void *buf, unsigned i, uint16_t v);
117void dsk_set_uint32_le (void *buf, unsigned i, uint32_t v);
118void dsk_set_uint64_le (void *buf, unsigned i, uint64_t v);
119
120
121int dsk_set_pos (FILE *fp, uint64_t ofs);
122int dsk_read (FILE *fp, void *buf, uint64_t ofs, uint64_t cnt);
123int dsk_write (FILE *fp, const void *buf, uint64_t ofs, uint64_t cnt);
124int dsk_get_filesize (FILE *fp, uint64_t *cnt);
125int dsk_set_filesize (FILE *fp, uint64_t cnt);
126
127int dsk_adjust_chs (uint32_t *n, uint32_t *c, uint32_t *h, uint32_t *s);
128
129/*!***************************************************************************
130 * @short Initialize a disk structure
131 *****************************************************************************/
132void dsk_init (disk_t *dsk, void *ext, uint32_t n, uint32_t c, uint32_t h, uint32_t s);
133
134/*!***************************************************************************
135 * @short Delete a disk
136 *****************************************************************************/
137void dsk_del (disk_t *dsk);
138
139
140/*!***************************************************************************
141 * @short Set the drive number
142 *****************************************************************************/
143void dsk_set_drive (disk_t *dsk, unsigned d);
144
145/*!***************************************************************************
146 * @short Get the disk type
147 *****************************************************************************/
148unsigned dsk_get_type (const disk_t *dsk);
149
150/*!***************************************************************************
151 * @short Set the disk type
152 *****************************************************************************/
153void dsk_set_type (disk_t *dsk, unsigned type);
154
155/*!***************************************************************************
156 * @short Get the read-only flag
157 *****************************************************************************/
158int dsk_get_readonly (disk_t *dsk);
159
160/*!***************************************************************************
161 * @short Set the read-only flag
162 *****************************************************************************/
163void dsk_set_readonly (disk_t *dsk, int v);
164
165/*!***************************************************************************
166 * @short Set the disk file name
167 *****************************************************************************/
168void dsk_set_fname (disk_t *dsk, const char *fname);
169
170/*!***************************************************************************
171 * @short Get the disk file name
172 *****************************************************************************/
173const char *dsk_get_fname (const disk_t *dsk);
174
175/*!***************************************************************************
176 * @short Set the disk geometry
177 *****************************************************************************/
178int dsk_set_geometry (disk_t *dsk, uint32_t n, uint32_t c, uint32_t h, uint32_t s);
179
180/*!***************************************************************************
181 * @short Set the visible geometry
182 *****************************************************************************/
183void dsk_set_visible_chs (disk_t *dsk, uint32_t c, uint32_t h, uint32_t s);
184
185/*!***************************************************************************
186 * @short Get the drive number
187 *****************************************************************************/
188unsigned dsk_get_drive (const disk_t *dsk);
189
190/*!***************************************************************************
191 * @short Get the number of blocks in a disk
192 *****************************************************************************/
193uint32_t dsk_get_block_cnt (const disk_t *dsk);
194
195/*!***************************************************************************
196 * @short Guess and set the disk geometry
197 *****************************************************************************/
198int dsk_guess_geometry (disk_t *dsk);
199
200
201/*!***************************************************************************
202 * @short Open a disk image
203 * @param fname The disk image file name
204 * @param ofs For raw images, the image data start offset. Not used for
205 * other image formats.
206 * @param ro Open read-only if true
207 * @return A new disk image structure
208 *****************************************************************************/
209disk_t *dsk_auto_open (const char *fname, uint64_t ofs, int ro);
210
211
212/*!***************************************************************************
213 * @short Convert CHS to LBA
214 * @return Nonzero if the CHS address is illegal
215 *****************************************************************************/
216int dsk_get_lba (disk_t *dsk, uint32_t c, uint32_t h, uint32_t s, uint32_t *v);
217
218/*!***************************************************************************
219 * @short Read blocks using LBA addressing
220 * @return Zero if successful
221 *****************************************************************************/
222int dsk_read_lba (disk_t *dsk, void *buf, uint32_t i, uint32_t n);
223
224/*!***************************************************************************
225 * @short Read blocks using LBA addressing with zero fill
226 * @return Zero if successful
227 *
228 * This function can read beyond the end of the block device. Blocks past
229 * the end are zero filled.
230 *****************************************************************************/
231int dsk_read_lbaz (disk_t *dsk, void *buf, uint32_t i, uint32_t n);
232
233/*!***************************************************************************
234 * @short Read blocks using CHS addressing
235 * @return Zero if successful
236 *****************************************************************************/
237int dsk_read_chs (disk_t *dsk, void *buf,
238 uint32_t c, uint32_t h, uint32_t s, uint32_t blk_n
239);
240
241/*!***************************************************************************
242 * @short Write blocks using LBA addressing
243 * @return Zero if successful
244 *****************************************************************************/
245int dsk_write_lba (disk_t *dsk, const void *buf, uint32_t i, uint32_t n);
246
247/*!***************************************************************************
248 * @short Write blocks using LBA addressing
249 * @return Zero if successful
250 *****************************************************************************/
251int dsk_write_chs (disk_t *dsk, const void *buf,
252 uint32_t c, uint32_t h, uint32_t s, uint32_t n
253);
254
255int dsk_commit (disk_t *dsk);
256
257disk_t *dsk_create_cow (disk_t *dsk, const char *name, unsigned long minblk);
258disk_t *dsk_open_cow (disk_t *dsk, const char *name);
259
260/*!***************************************************************************
261 * @short Get a message from a disk
262 * @return Zero if successful
263 *****************************************************************************/
264int dsk_get_msg (disk_t *dsk, const char *msg, char *val, unsigned max);
265
266/*!***************************************************************************
267 * @short Send a message to a disk
268 * @return Zero if successful
269 *****************************************************************************/
270int dsk_set_msg (disk_t *dsk, const char *msg, const char *val);
271
272
273/*!***************************************************************************
274 * @short Create a new disk set
275 * @return The new disk set or NULL on error
276 *****************************************************************************/
277disks_t *dsks_new (void);
278
279/*!***************************************************************************
280 * @short Delete a disk set and all included disks
281 *****************************************************************************/
282void dsks_del (disks_t *dsks);
283
284/*!***************************************************************************
285 * @short Add a disk to a disk set
286 * @return Zero if successful
287 *****************************************************************************/
288int dsks_add_disk (disks_t *dsks, disk_t *dsk);
289
290/*!***************************************************************************
291 * @short Remove a disk from a disk set
292 * @return Zero if the disk was not in the set
293 *****************************************************************************/
294int dsks_rmv_disk (disks_t *dsks, disk_t *dsk);
295
296/*!***************************************************************************
297 * @short Get a disk from a disk set
298 * @param drive The drive number
299 * @return The disk or NULL on error
300 *****************************************************************************/
301disk_t *dsks_get_disk (disks_t *dsks, unsigned drive);
302
303/*!***************************************************************************
304 * @short Commit all disks in a disk set
305 * @return Zero if successful
306 *****************************************************************************/
307int dsks_commit (disks_t *dsks);
308
309/*!***************************************************************************
310 * @short Get a message from a disk
311 * @param drv The drive number
312 * @param msg The message
313 * @param val The return value
314 * @param max The size of val
315 * @return Zero if successful
316 *****************************************************************************/
317int dsks_get_msg (disks_t *dsks, unsigned drv, const char *msg, char *val, unsigned max);
318
319/*!***************************************************************************
320 * @short Send a message to a disk
321 * @param drv The drive number
322 * @param msg The message
323 * @param val The message parameters or NULL
324 * @return Zero if successful
325 *****************************************************************************/
326int dsks_set_msg (disks_t *dsks, unsigned drv, const char *msg, const char *val);
327
328
329#endif