1  /*
2   * UAE - The Un*x Amiga Emulator
3   *
4   * Unix file system handler for AmigaDOS
5   *
6   * Copyright 1997 Bernd Schmidt
7   */
8 
9 #ifndef UAE_FILESYS_H
10 #define UAE_FILESYS_H
11 
12 #include "uae/types.h"
13 #ifdef FSUAE
14 #include "options.h"
15 #include <time.h>
16 #endif
17 
18 struct hardfilehandle;
19 
20 #define MAX_HDF_CACHE_BLOCKS 128
21 #define MAX_SCSI_SENSE 36
22 struct hdf_cache
23 {
24 	bool valid;
25 	uae_u8 *data;
26 	uae_u64 block;
27 	bool dirty;
28 	int readcount;
29 	int writecount;
30 	time_t lastaccess;
31 };
32 
33 struct hardfiledata {
34     uae_u64 virtsize; // virtual size
35     uae_u64 physsize; // physical size (dynamic disk)
36     uae_u64 offset;
37 	struct uaedev_config_info ci;
38 	struct hardfilehandle *handle;
39     int handle_valid;
40     int dangerous;
41     int flags;
42     uae_u8 *cache;
43     int cache_valid;
44     uae_u64 cache_offset;
45     TCHAR vendor_id[8 + 1];
46     TCHAR product_id[16 + 1];
47     TCHAR product_rev[4 + 1];
48     /* geometry from possible RDSK block */
49     int rdbcylinders;
50     int rdbsectors;
51     int rdbheads;
52     uae_u8 *virtual_rdb;
53     uae_u64 virtual_size;
54     int unitnum;
55     int byteswap;
56     int adide;
57     int hfd_type;
58 
59     uae_u8 *vhd_header;
60     uae_u32 vhd_bamoffset;
61     uae_u32 vhd_bamsize;
62     uae_u32 vhd_blocksize;
63     uae_u8 *vhd_sectormap;
64     uae_u64 vhd_sectormapblock;
65     uae_u32 vhd_bitmapsize;
66     uae_u64 vhd_footerblock;
67 
68 	void *chd_handle;
69 
70     int drive_empty;
71     TCHAR *emptyname;
72 
73 	struct hdf_cache bcache[MAX_HDF_CACHE_BLOCKS];
74 	uae_u8 scsi_sense[MAX_SCSI_SENSE];
75 
76 	struct uaedev_config_info delayedci;
77 	int reinsertdelay;
78 	bool isreinsert;
79 	bool unit_stopped;
80 };
81 
82 #define HFD_FLAGS_REALDRIVE 1
83 #define HFD_FLAGS_REALDRIVEPARTITION 2
84 
85 struct hd_hardfiledata {
86     struct hardfiledata hfd;
87     uae_u64 size;
88     int cyls;
89     int heads;
90     int secspertrack;
91     int cyls_def;
92     int secspertrack_def;
93     int heads_def;
94     int ansi_version;
95 };
96 
97 #define HD_CONTROLLER_EXPANSION_MAX 50
98 #define HD_CONTROLLER_NEXT_UNIT 200
99 
100 #define HD_CONTROLLER_TYPE_UAE 0
101 #define HD_CONTROLLER_TYPE_IDE_AUTO (HD_CONTROLLER_TYPE_UAE + 1)
102 #define HD_CONTROLLER_TYPE_IDE_FIRST (HD_CONTROLLER_TYPE_IDE_AUTO)
103 #define HD_CONTROLLER_TYPE_IDE_MB (HD_CONTROLLER_TYPE_IDE_FIRST + 1)
104 #define HD_CONTROLLER_TYPE_IDE_EXPANSION_FIRST (HD_CONTROLLER_TYPE_IDE_MB + 1)
105 #define HD_CONTROLLER_TYPE_IDE_LAST (HD_CONTROLLER_TYPE_IDE_EXPANSION_FIRST + HD_CONTROLLER_EXPANSION_MAX - 1)
106 
107 #define HD_CONTROLLER_TYPE_SCSI_AUTO (HD_CONTROLLER_TYPE_IDE_LAST + 1)
108 #define HD_CONTROLLER_TYPE_SCSI_FIRST (HD_CONTROLLER_TYPE_SCSI_AUTO)
109 #define HD_CONTROLLER_TYPE_SCSI_A3000 (HD_CONTROLLER_TYPE_SCSI_FIRST + 1)
110 #define HD_CONTROLLER_TYPE_SCSI_A4000T (HD_CONTROLLER_TYPE_SCSI_A3000 + 1)
111 #define HD_CONTROLLER_TYPE_SCSI_CDTV (HD_CONTROLLER_TYPE_SCSI_A4000T + 1)
112 #define HD_CONTROLLER_TYPE_SCSI_EXPANSION_FIRST (HD_CONTROLLER_TYPE_SCSI_CDTV + 1)
113 #define HD_CONTROLLER_TYPE_SCSI_LAST (HD_CONTROLLER_TYPE_SCSI_EXPANSION_FIRST + HD_CONTROLLER_EXPANSION_MAX - 1)
114 
115 #define HD_CONTROLLER_TYPE_PCMCIA_SRAM (HD_CONTROLLER_TYPE_SCSI_LAST + 1)
116 #define HD_CONTROLLER_TYPE_PCMCIA_IDE (HD_CONTROLLER_TYPE_PCMCIA_SRAM + 1)
117 
118 #define FILESYS_VIRTUAL 0
119 #define FILESYS_HARDFILE 1
120 #define FILESYS_HARDFILE_RDB 2
121 #define FILESYS_HARDDRIVE 3
122 #define FILESYS_CD 4
123 #define FILESYS_TAPE 5
124 
125 #define MAX_FILESYSTEM_UNITS 30
126 
127 struct uaedev_mount_info;
128 extern struct uaedev_mount_info options_mountinfo;
129 
130 extern struct hardfiledata *get_hardfile_data (int nr);
131 #define FILESYS_MAX_BLOCKSIZE 2048
132 extern int hdf_open (struct hardfiledata *hfd);
133 extern int hdf_open (struct hardfiledata *hfd, const TCHAR *altname);
134 extern int hdf_dup (struct hardfiledata *dhfd, const struct hardfiledata *shfd);
135 extern void hdf_close (struct hardfiledata *hfd);
136 extern int hdf_read_rdb (struct hardfiledata *hfd, void *buffer, uae_u64 offset, int len);
137 extern int hdf_read (struct hardfiledata *hfd, void *buffer, uae_u64 offset, int len);
138 extern int hdf_write (struct hardfiledata *hfd, void *buffer, uae_u64 offset, int len);
139 extern int hdf_getnumharddrives (void);
140 extern TCHAR *hdf_getnameharddrive (int index, int flags, int *sectorsize, int *dangerousdrive);
141 extern int isspecialdrive(const TCHAR *name);
142 extern int get_native_path(uae_u32 lock, TCHAR *out);
143 extern void hardfile_do_disk_change (struct uaedev_config_data *uci, bool insert);
144 extern void hardfile_send_disk_change (struct hardfiledata *hfd, bool insert);
145 extern int hardfile_media_change (struct hardfiledata *hfd, struct uaedev_config_info *ci, bool inserted, bool timer);
146 extern int hardfile_added (struct uaedev_config_info *ci);
147 
148 void hdf_hd_close(struct hd_hardfiledata *hfd);
149 int hdf_hd_open(struct hd_hardfiledata *hfd);
150 
151 
152 extern int vhd_create (const TCHAR *name, uae_u64 size, uae_u32);
153 
154 extern int hdf_init_target (void);
155 extern int hdf_open_target (struct hardfiledata *hfd, const TCHAR *name);
156 extern int hdf_dup_target (struct hardfiledata *dhfd, const struct hardfiledata *shfd);
157 extern void hdf_close_target (struct hardfiledata *hfd);
158 extern int hdf_read_target (struct hardfiledata *hfd, void *buffer, uae_u64 offset, int len);
159 extern int hdf_write_target (struct hardfiledata *hfd, void *buffer, uae_u64 offset, int len);
160 extern int hdf_resize_target (struct hardfiledata *hfd, uae_u64 newsize);
161 extern void getchsgeometry (uae_u64 size, int *pcyl, int *phead, int *psectorspertrack);
162 extern void getchsgeometry_hdf (struct hardfiledata *hfd, uae_u64 size, int *pcyl, int *phead, int *psectorspertrack);
163 extern void getchspgeometry (uae_u64 total, int *pcyl, int *phead, int *psectorspertrack, bool idegeometry);
164 
165 void add_cpuboard_unit(int unit, struct uaedev_config_info *uci, struct romconfig *rc);
166 
167 #endif /* UAE_FILESYS_H */
168