1 #ifndef UAE_BLKDEV_H
2 #define UAE_BLKDEV_H
3 
4 #include "uae/types.h"
5 #ifdef FSUAE // NL
6 #include "uae/limits.h"
7 #endif
8 
9 #define DEVICE_SCSI_BUFSIZE (65536 - 1024)
10 
11 #define SCSI_UNIT_DISABLED -1
12 #define SCSI_UNIT_DEFAULT 0
13 #define SCSI_UNIT_IMAGE 1
14 #define SCSI_UNIT_IOCTL 2
15 #define SCSI_UNIT_SPTI 3
16 
17 //#define device_debug write_log
18 #define device_debug
19 
20 #define	INQ_DASD	0x00		/* Direct-access device (disk) */
21 #define	INQ_SEQD	0x01		/* Sequential-access device (tape) */
22 #define	INQ_PRTD	0x02 		/* Printer device */
23 #define	INQ_PROCD	0x03 		/* Processor device */
24 #define	INQ_OPTD	0x04		/* Write once device (optical disk) */
25 #define	INQ_WORM	0x04		/* Write once device (optical disk) */
26 #define	INQ_ROMD	0x05		/* CD-ROM device */
27 #define	INQ_SCAN	0x06		/* Scanner device */
28 #define	INQ_OMEM	0x07		/* Optical Memory device */
29 #define	INQ_JUKE	0x08		/* Medium Changer device (jukebox) */
30 #define	INQ_COMM	0x09		/* Communications device */
31 #define	INQ_IT8_1	0x0A		/* IT8 */
32 #define	INQ_IT8_2	0x0B		/* IT8 */
33 #define	INQ_STARR	0x0C		/* Storage array device */
34 #define	INQ_ENCL	0x0D		/* Enclosure services device */
35 #define	INQ_NODEV	0x1F		/* Unknown or no device */
36 #define	INQ_NOTPR	0x1F		/* Logical unit not present (SCSI-1) */
37 
38 #define MAX_TOC_ENTRIES 103
39 struct cd_toc
40 {
41 	uae_u8 adr, control;
42 	uae_u8 tno;
43 	uae_u8 point;
44 	uae_u8 track;
45 	int address; // LSN
46 	int paddress; // LSN
47 	uae_u8 zero;
48 	uae_u8 crc[2];
49 };
50 struct cd_toc_head
51 {
52 	int first_track, first_track_offset;
53 	int last_track, last_track_offset;
54 	int firstaddress; // LSN
55 	int lastaddress; // LSN
56 	int tracks;
57 	int points;
58 	struct cd_toc toc[MAX_TOC_ENTRIES];
59 };
60 
61 #define SUB_ENTRY_SIZE 12
62 #define SUB_CHANNEL_SIZE 96
63 #define SUBQ_SIZE (4 + 12)
64 
65 #define AUDIO_STATUS_NOT_SUPPORTED  0x00
66 #define AUDIO_STATUS_IN_PROGRESS    0x11
67 #define AUDIO_STATUS_PAUSED         0x12
68 #define AUDIO_STATUS_PLAY_COMPLETE  0x13
69 #define AUDIO_STATUS_PLAY_ERROR     0x14
70 #define AUDIO_STATUS_NO_STATUS      0x15
71 
72 struct device_info {
73 	bool open;
74     int type;
75     int media_inserted;
76     int removable;
77     int write_protected;
78     int cylinders;
79     int trackspercylinder;
80     int sectorspertrack;
81     int bytespersector;
82     int bus, target, lun;
83     int unitnum;
84     TCHAR label[MAX_DPATH];
85 	TCHAR mediapath[MAX_DPATH];
86 	TCHAR vendorid[10];
87 	TCHAR productid[18];
88 	TCHAR revision[6];
89 	const TCHAR *backend;
90 	struct cd_toc_head toc;
91 	TCHAR system_id[33];
92 	TCHAR volume_id[33];
93 };
94 
95 struct amigascsi
96 {
97     uae_u8 *data;
98     uae_s32 len;
99     uae_u8 cmd[16];
100     uae_s32 cmd_len;
101     uae_u8 flags;
102     uae_u8 sensedata[256];
103     uae_u16 sense_len;
104     uae_u16 cmdactual;
105     uae_u8 status;
106     uae_u16 actual;
107     uae_u16 sactual;
108 };
109 
110 typedef int (*check_bus_func)(int flags);
111 typedef int (*open_bus_func)(int flags);
112 typedef void (*close_bus_func)(void);
113 typedef int (*open_device_func)(int, const TCHAR*, int);
114 typedef void (*close_device_func)(int);
115 typedef struct device_info* (*info_device_func)(int, struct device_info*, int, int);
116 typedef uae_u8* (*execscsicmd_out_func)(int, uae_u8*, int);
117 typedef uae_u8* (*execscsicmd_in_func)(int, uae_u8*, int, int*);
118 typedef int (*execscsicmd_direct_func)(int, struct amigascsi*);
119 
120 typedef void (*play_subchannel_callback)(uae_u8*, int);
121 typedef int (*play_status_callback)(int);
122 
123 typedef int (*pause_func)(int, int);
124 typedef int (*stop_func)(int);
125 typedef int (*play_func)(int, int, int, int, play_status_callback, play_subchannel_callback);
126 typedef uae_u32 (*volume_func)(int, uae_u16, uae_u16);
127 typedef int (*qcode_func)(int, uae_u8*, int);
128 typedef int (*toc_func)(int, struct cd_toc_head*);
129 typedef int (*read_func)(int, uae_u8*, int, int);
130 typedef int (*rawread_func)(int, uae_u8*, int, int, int, uae_u32);
131 typedef int (*write_func)(int, uae_u8*, int, int);
132 typedef int (*isatapi_func)(int);
133 typedef int (*ismedia_func)(int, int);
134 typedef int (*scsiemu_func)(int, uae_u8*);
135 
136 struct device_functions {
137 	const TCHAR *name;
138 	open_bus_func openbus;
139 	close_bus_func closebus;
140 	open_device_func opendev;
141 	close_device_func closedev;
142 	info_device_func info;
143 	execscsicmd_out_func exec_out;
144 	execscsicmd_in_func exec_in;
145 	execscsicmd_direct_func exec_direct;
146 
147 	pause_func pause;
148 	stop_func stop;
149 	play_func play;
150 	volume_func volume;
151 	qcode_func qcode;
152 	toc_func toc;
153 	read_func read;
154 	rawread_func rawread;
155 	write_func write;
156 
157 	isatapi_func isatapi;
158 	ismedia_func ismedia;
159 
160 	scsiemu_func scsiemu;
161 
162 };
163 
164 extern int device_func_init(int flags);
165 extern void device_func_reset(void);
166 extern int sys_command_open (int unitnum);
167 extern int sys_command_open_tape (int unitnum, const TCHAR *tape_directory, bool readonly);
168 extern void sys_command_close (int unitnum);
169 extern int sys_command_isopen (int unitnum);
170 extern struct device_info *sys_command_info (int unitnum, struct device_info *di, int);
171 extern int sys_command_cd_pause (int unitnum, int paused);
172 extern void sys_command_cd_stop (int unitnum);
173 extern int sys_command_cd_play (int unitnum, int startlsn, int endlsn, int);
174 extern int sys_command_cd_play (int unitnum, int startlsn, int endlsn, int scan, play_status_callback statusfunc, play_subchannel_callback subfunc);
175 extern uae_u32 sys_command_cd_volume (int unitnum, uae_u16 volume_left, uae_u16 volume_right);
176 extern int sys_command_cd_qcode (int unitnum, uae_u8*);
177 extern int sys_command_cd_toc (int unitnum, struct cd_toc_head*);
178 extern int sys_command_cd_read (int unitnum, uae_u8 *data, int block, int size);
179 extern int sys_command_cd_rawread (int unitnum, uae_u8 *data, int sector, int size, int sectorsize);
180 int sys_command_cd_rawread (int unitnum, uae_u8 *data, int sector, int size, int sectorsize, uae_u8 sectortype, uae_u8 scsicmd9, uae_u8 subs);
181 extern int sys_command_read (int unitnum, uae_u8 *data, int block, int size);
182 extern int sys_command_write (int unitnum, uae_u8 *data, int block, int size);
183 extern int sys_command_scsi_direct_native (int unitnum, int type, struct amigascsi *as);
184 extern int sys_command_scsi_direct (int unitnum, int type, uaecptr request);
185 extern int sys_command_ismedia (int unitnum, int quick);
186 extern struct device_info *sys_command_info_session (int unitnum, struct device_info *di, int, int);
187 extern bool blkdev_get_info (struct uae_prefs *p, int unitnum, struct device_info *di);
188 
189 extern void scsi_atapi_fixup_pre (uae_u8 *scsi_cmd, int *len, uae_u8 **data, int *datalen, int *parm);
190 extern void scsi_atapi_fixup_post (uae_u8 *scsi_cmd, int len, uae_u8 *olddata, uae_u8 *data, int *datalen, int parm);
191 
192 extern void scsi_log_before (uae_u8 *cdb, int cdblen, uae_u8 *data, int datalen);
193 extern void scsi_log_after (uae_u8 *data, int datalen, uae_u8 *sense, int senselen);
194 
195 extern int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len,
196 	uae_u8 *scsi_data, int *data_len, uae_u8 *r, int *reply_len, uae_u8 *s, int *sense_len, bool atapi);
197 
198 extern void blkdev_vsync (void);
199 extern void restore_blkdev_start(void);
200 
201 extern int msf2lsn (int msf);
202 extern int lsn2msf (int lsn);
203 extern uae_u8 frombcd (uae_u8 v);
204 extern uae_u8 tobcd (uae_u8 v);
205 extern int fromlongbcd (uae_u8 *p);
206 extern void tolongbcd (uae_u8 *p, int v);
207 
208 extern void blkdev_default_prefs (struct uae_prefs *p);
209 extern void blkdev_fix_prefs (struct uae_prefs *p);
210 extern int isaudiotrack (struct cd_toc_head*, int block);
211 extern int isdatatrack (struct cd_toc_head*, int block);
212 void sub_to_interleaved (const uae_u8 *s, uae_u8 *d);
213 void sub_to_deinterleaved (const uae_u8 *s, uae_u8 *d);
214 
215 enum cd_standard_unit { CD_STANDARD_UNIT_DEFAULT, CD_STANDARD_UNIT_AUDIO, CD_STANDARD_UNIT_CDTV, CD_STANDARD_UNIT_CD32 };
216 
217 extern int get_standard_cd_unit (enum cd_standard_unit csu);
218 extern void close_standard_cd_unit (int);
219 extern void blkdev_cd_change (int unitnum, const TCHAR *name);
220 
221 extern void blkdev_entergui (void);
222 extern void blkdev_exitgui (void);
223 
224 bool filesys_do_disk_change (int, bool);
225 
226 extern struct device_functions devicefunc_scsi_ioctl;
227 extern struct device_functions devicefunc_scsi_spti;
228 extern struct device_functions devicefunc_cdimage;
229 
230 #endif /* UAE_BLKDEV_H */
231