]> Shamusworld >> Repos - virtualjaguar/blob - src/include/harddisk.h
Adding 1.0.1/2 uncompressed tarballs to tags for historical purposes.
[virtualjaguar] / src / include / harddisk.h
1 #ifndef __HARDDISK_H__\r
2 #define __HARDDISK_H__\r
3 \r
4 #include "types.h"\r
5 \r
6 /***************************************************************************\r
7 \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
10 \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
24 \r
25         Flags:\r
26                 0x00000001 - set if this drive has a parent\r
27                 0x00000002 - set if this drive allows writes\r
28 \r
29 ***************************************************************************/\r
30 \r
31 /*************************************\r
32  *\r
33  *      Constants\r
34  *\r
35  *************************************/\r
36 \r
37 #define HARD_DISK_HEADER_SIZE           76\r
38 #define HARD_DISK_HEADER_VERSION        1\r
39 \r
40 #define HARD_DISK_SECTOR_SIZE           512\r
41 \r
42 #define HDFLAGS_HAS_PARENT                      0x00000001\r
43 #define HDFLAGS_IS_WRITEABLE            0x00000002\r
44 \r
45 #define HDCOMPRESSION_NONE                      0\r
46 #define HDCOMPRESSION_ZLIB                      1\r
47 #define HDCOMPRESSION_MAX                       2\r
48 \r
49 enum\r
50 {\r
51         HDERR_NONE,\r
52         HDERR_NO_INTERFACE,\r
53         HDERR_OUT_OF_MEMORY,\r
54         HDERR_INVALID_FILE,\r
55         HDERR_INVALID_PARAMETER,\r
56         HDERR_INVALID_DATA,\r
57         HDERR_FILE_NOT_FOUND,\r
58         HDERR_REQUIRES_PARENT,\r
59         HDERR_FILE_NOT_WRITEABLE,\r
60         HDERR_READ_ERROR,\r
61         HDERR_WRITE_ERROR,\r
62         HDERR_CODEC_ERROR,\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
68         HDERR_CANT_VERIFY\r
69 };\r
70 \r
71 \r
72 \r
73 /*************************************\r
74  *\r
75  *      Type definitions\r
76  *\r
77  *************************************/\r
78 \r
79 struct hard_disk_header\r
80 {\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
92 };\r
93 \r
94 \r
95 struct hard_disk_interface\r
96 {\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
101 };\r
102 \r
103 void hard_disk_set_interface(struct hard_disk_interface *intf);\r
104 \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
109 \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
112 \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
116 \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
119 \r
120 #endif\r