fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 329 lines 13 kB view raw
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