1 #ifndef __HARDDISK_H__
\r
2 #define __HARDDISK_H__
\r
6 /***************************************************************************
\r
8 MAME compressed hard disk header format. All numbers are stored in
\r
9 Motorola (big-endian) byte ordering. The header is 76 bytes long.
\r
11 [ 0] char tag[8]; // 'MComprHD'
\r
12 [ 8] UINT32 length; // length of header (including tag and length fields)
\r
13 [ 12] UINT32 version; // drive format version
\r
14 [ 16] UINT32 flags; // flags (see below)
\r
15 [ 20] UINT32 compression; // compression type
\r
16 [ 24] UINT32 blocksize; // sectors per block
\r
17 [ 28] UINT32 totalblocks; // total # of block represented
\r
18 [ 32] UINT32 cylinders; // number of cylinders on hard disk
\r
19 [ 36] UINT32 heads; // number of heads on hard disk
\r
20 [ 40] UINT32 sectors; // number of sectors on hard disk
\r
21 [ 44] UINT8 md5[16]; // MD5 checksum for this drive
\r
22 [ 60] UINT8 parentmd5[16]; // MD5 checksum for parent drive
\r
23 [ 76] (header length)
\r
26 0x00000001 - set if this drive has a parent
\r
27 0x00000002 - set if this drive allows writes
\r
29 ***************************************************************************/
\r
31 /*************************************
\r
35 *************************************/
\r
37 #define HARD_DISK_HEADER_SIZE 76
\r
38 #define HARD_DISK_HEADER_VERSION 1
\r
40 #define HARD_DISK_SECTOR_SIZE 512
\r
42 #define HDFLAGS_HAS_PARENT 0x00000001
\r
43 #define HDFLAGS_IS_WRITEABLE 0x00000002
\r
45 #define HDCOMPRESSION_NONE 0
\r
46 #define HDCOMPRESSION_ZLIB 1
\r
47 #define HDCOMPRESSION_MAX 2
\r
53 HDERR_OUT_OF_MEMORY,
\r
55 HDERR_INVALID_PARAMETER,
\r
57 HDERR_FILE_NOT_FOUND,
\r
58 HDERR_REQUIRES_PARENT,
\r
59 HDERR_FILE_NOT_WRITEABLE,
\r
63 HDERR_INVALID_PARENT,
\r
64 HDERR_SECTOR_OUT_OF_RANGE,
\r
65 HDERR_DECOMPRESSION_ERROR,
\r
66 HDERR_COMPRESSION_ERROR,
\r
67 HDERR_CANT_CREATE_FILE,
\r
73 /*************************************
\r
77 *************************************/
\r
79 struct hard_disk_header
\r
81 UINT32 length; /* length of header data */
\r
82 UINT32 version; /* drive format version */
\r
83 UINT32 flags; /* flags field */
\r
84 UINT32 compression; /* compression type */
\r
85 UINT32 blocksize; /* sectors per block */
\r
86 UINT32 totalblocks; /* total # of blocks represented */
\r
87 UINT32 cylinders; /* number of cylinders on hard disk */
\r
88 UINT32 heads; /* number of heads on hard disk */
\r
89 UINT32 sectors; /* number of sectors on hard disk */
\r
90 UINT8 md5[16]; /* MD5 checksum for this drive */
\r
91 UINT8 parentmd5[16]; /* MD5 checksum for parent drive */
\r
95 struct hard_disk_interface
\r
97 void *(*open)(const char *filename, const char *mode);
\r
98 void (*close)(void *file);
\r
99 uint32 (*read)(void *file, UINT64 offset, UINT32 count, void *buffer);
\r
100 uint32 (*write)(void *file, UINT64 offset, UINT32 count, const void *buffer);
\r
103 void hard_disk_set_interface(struct hard_disk_interface *intf);
\r
105 int hard_disk_create(const char *filename, const struct hard_disk_header *header);
\r
106 void *hard_disk_open(const char *filename, int writeable, void *parent);
\r
107 void hard_disk_close(void *disk);
\r
108 void hard_disk_close_all(void);
\r
110 UINT32 hard_disk_read(void *disk, UINT32 lbasector, UINT32 numsectors, void *buffer);
\r
111 UINT32 hard_disk_write(void *disk, UINT32 lbasector, UINT32 numsectors, const void *buffer);
\r
113 int hard_disk_get_last_error(void);
\r
114 const struct hard_disk_header *hard_disk_get_header(void *disk);
\r
115 int hard_disk_set_header(const char *filename, const struct hard_disk_header *header);
\r
117 int hard_disk_compress(const char *rawfile, UINT32 offset, const char *newfile, const struct hard_disk_header *header, const char *difffile, void (*progress)(const char *, ...));
\r
118 int hard_disk_verify(const char *hdfile, void (*progress)(const char *, ...), UINT8 headermd5[16], UINT8 actualmd5[16]);
\r