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