214 lines
7.2 KiB
C
214 lines
7.2 KiB
C
|
|
#ifndef BLKDEV_H
|
|
#define BLKDEV_H
|
|
|
|
#define DEVICE_SCSI_BUFSIZE (65536 - 1024)
|
|
|
|
#define SCSI_UNIT_DISABLED -1
|
|
#define SCSI_UNIT_DEFAULT 0
|
|
#define SCSI_UNIT_IMAGE 1
|
|
#define SCSI_UNIT_IOCTL 2
|
|
#define SCSI_UNIT_SPTI 3
|
|
|
|
//#define device_debug write_log
|
|
#define device_debug
|
|
|
|
#define INQ_DASD 0x00 /* Direct-access device (disk) */
|
|
#define INQ_SEQD 0x01 /* Sequential-access device (tape) */
|
|
#define INQ_PRTD 0x02 /* Printer device */
|
|
#define INQ_PROCD 0x03 /* Processor device */
|
|
#define INQ_OPTD 0x04 /* Write once device (optical disk) */
|
|
#define INQ_WORM 0x04 /* Write once device (optical disk) */
|
|
#define INQ_ROMD 0x05 /* CD-ROM device */
|
|
#define INQ_SCAN 0x06 /* Scanner device */
|
|
#define INQ_OMEM 0x07 /* Optical Memory device */
|
|
#define INQ_JUKE 0x08 /* Medium Changer device (jukebox) */
|
|
#define INQ_COMM 0x09 /* Communications device */
|
|
#define INQ_IT8_1 0x0A /* IT8 */
|
|
#define INQ_IT8_2 0x0B /* IT8 */
|
|
#define INQ_STARR 0x0C /* Storage array device */
|
|
#define INQ_ENCL 0x0D /* Enclosure services device */
|
|
#define INQ_NODEV 0x1F /* Unknown or no device */
|
|
#define INQ_NOTPR 0x1F /* Logical unit not present (SCSI-1) */
|
|
|
|
#define MAX_TOC_ENTRIES 103
|
|
struct cd_toc
|
|
{
|
|
uae_u8 adr, control;
|
|
uae_u8 tno;
|
|
uae_u8 point;
|
|
uae_u8 track;
|
|
int address; // LSN
|
|
int paddress; // LSN
|
|
uae_u8 zero;
|
|
uae_u8 crc[2];
|
|
};
|
|
struct cd_toc_head
|
|
{
|
|
int first_track, first_track_offset;
|
|
int last_track, last_track_offset;
|
|
int firstaddress; // LSN
|
|
int lastaddress; // LSN
|
|
int tracks;
|
|
int points;
|
|
struct cd_toc toc[MAX_TOC_ENTRIES];
|
|
};
|
|
|
|
#define SUB_ENTRY_SIZE 12
|
|
#define SUB_CHANNEL_SIZE 96
|
|
#define SUBQ_SIZE (4 + 12)
|
|
|
|
#define AUDIO_STATUS_NOT_SUPPORTED 0x00
|
|
#define AUDIO_STATUS_IN_PROGRESS 0x11
|
|
#define AUDIO_STATUS_PAUSED 0x12
|
|
#define AUDIO_STATUS_PLAY_COMPLETE 0x13
|
|
#define AUDIO_STATUS_PLAY_ERROR 0x14
|
|
#define AUDIO_STATUS_NO_STATUS 0x15
|
|
|
|
struct device_info {
|
|
bool open;
|
|
int type;
|
|
int media_inserted;
|
|
int removable;
|
|
int write_protected;
|
|
int cylinders;
|
|
int trackspercylinder;
|
|
int sectorspertrack;
|
|
int bytespersector;
|
|
int bus, target, lun;
|
|
int unitnum;
|
|
TCHAR label[MAX_DPATH];
|
|
TCHAR mediapath[MAX_DPATH];
|
|
TCHAR vendorid[10];
|
|
TCHAR productid[18];
|
|
TCHAR revision[6];
|
|
char const *backend;
|
|
struct cd_toc_head toc;
|
|
};
|
|
|
|
struct amigascsi
|
|
{
|
|
uae_u8 *data;
|
|
uae_s32 len;
|
|
uae_u8 cmd[16];
|
|
uae_s32 cmd_len;
|
|
uae_u8 flags;
|
|
uae_u8 sensedata[256];
|
|
uae_u16 sense_len;
|
|
uae_u16 cmdactual;
|
|
uae_u8 status;
|
|
uae_u16 actual;
|
|
uae_u16 sactual;
|
|
};
|
|
|
|
typedef int (*check_bus_func)(int flags);
|
|
typedef int (*open_bus_func)(int flags);
|
|
typedef void (*close_bus_func)(void);
|
|
typedef int (*open_device_func)(int, const TCHAR*, int);
|
|
typedef void (*close_device_func)(int);
|
|
typedef struct device_info* (*info_device_func)(int, struct device_info*, int, int);
|
|
typedef uae_u8* (*execscsicmd_out_func)(int, uae_u8*, int);
|
|
typedef uae_u8* (*execscsicmd_in_func)(int, uae_u8*, int, int*);
|
|
typedef int (*execscsicmd_direct_func)(int, struct amigascsi*);
|
|
|
|
typedef void (*play_subchannel_callback)(uae_u8*, int);
|
|
typedef int (*play_status_callback)(int);
|
|
|
|
typedef int (*pause_func)(int, int);
|
|
typedef int (*stop_func)(int);
|
|
typedef int (*play_func)(int, int, int, int, play_status_callback, play_subchannel_callback);
|
|
typedef uae_u32 (*volume_func)(int, uae_u16, uae_u16);
|
|
typedef int (*qcode_func)(int, uae_u8*, int);
|
|
typedef int (*toc_func)(int, struct cd_toc_head*);
|
|
typedef int (*read_func)(int, uae_u8*, int, int);
|
|
typedef int (*rawread_func)(int, uae_u8*, int, int, int, uae_u32);
|
|
typedef int (*write_func)(int, uae_u8*, int, int);
|
|
typedef int (*isatapi_func)(int);
|
|
typedef int (*ismedia_func)(int, int);
|
|
typedef int (*scsiemu_func)(int, uae_u8*);
|
|
|
|
struct device_functions {
|
|
const TCHAR *name;
|
|
open_bus_func openbus;
|
|
close_bus_func closebus;
|
|
open_device_func opendev;
|
|
close_device_func closedev;
|
|
info_device_func info;
|
|
execscsicmd_out_func exec_out;
|
|
execscsicmd_in_func exec_in;
|
|
execscsicmd_direct_func exec_direct;
|
|
|
|
pause_func pause;
|
|
stop_func stop;
|
|
play_func play;
|
|
volume_func volume;
|
|
qcode_func qcode;
|
|
toc_func toc;
|
|
read_func read;
|
|
rawread_func rawread;
|
|
write_func write;
|
|
|
|
isatapi_func isatapi;
|
|
ismedia_func ismedia;
|
|
|
|
scsiemu_func scsiemu;
|
|
|
|
};
|
|
|
|
extern int device_func_init(int flags);
|
|
extern void device_func_reset(void);
|
|
extern int sys_command_open (int unitnum);
|
|
extern void sys_command_close (int unitnum);
|
|
extern int sys_command_isopen (int unitnum);
|
|
extern struct device_info *sys_command_info (int unitnum, struct device_info *di, int);
|
|
extern int sys_command_cd_pause (int unitnum, int paused);
|
|
extern void sys_command_cd_stop (int unitnum);
|
|
extern int sys_command_cd_play (int unitnum, int startlsn, int endlsn, int);
|
|
extern int sys_command_cd_play (int unitnum, int startlsn, int endlsn, int scan, play_status_callback statusfunc, play_subchannel_callback subfunc);
|
|
extern uae_u32 sys_command_cd_volume (int unitnum, uae_u16 volume_left, uae_u16 volume_right);
|
|
extern int sys_command_cd_qcode (int unitnum, uae_u8*);
|
|
extern int sys_command_cd_toc (int unitnum, struct cd_toc_head*);
|
|
extern int sys_command_cd_read (int unitnum, uae_u8 *data, int block, int size);
|
|
extern int sys_command_cd_rawread (int unitnum, uae_u8 *data, int sector, int size, int sectorsize);
|
|
extern int sys_command_cd_rawread (int unitnum, uae_u8 *data, int sector, int size, int sectorsize, uae_u8 scsicmd9, uae_u8 subs);
|
|
extern int sys_command_read (int unitnum, uae_u8 *data, int block, int size);
|
|
extern int sys_command_write (int unitnum, uae_u8 *data, int block, int size);
|
|
extern int sys_command_scsi_direct_native (int unitnum, int type, struct amigascsi *as);
|
|
extern int sys_command_scsi_direct (int unitnum, int type, uaecptr request);
|
|
extern int sys_command_ismedia (int unitnum, int quick);
|
|
extern struct device_info *sys_command_info_session (int unitnum, struct device_info *di, int, int);
|
|
extern bool blkdev_get_info (struct uae_prefs *p, int unitnum, struct device_info *di);
|
|
|
|
extern void scsi_atapi_fixup_pre (uae_u8 *scsi_cmd, int *len, uae_u8 **data, int *datalen, int *parm);
|
|
extern void scsi_atapi_fixup_post (uae_u8 *scsi_cmd, int len, uae_u8 *olddata, uae_u8 *data, int *datalen, int parm);
|
|
|
|
extern void scsi_log_before (uae_u8 *cdb, int cdblen, uae_u8 *data, int datalen);
|
|
extern void scsi_log_after (uae_u8 *data, int datalen, uae_u8 *sense, int senselen);
|
|
|
|
extern int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len,
|
|
uae_u8 *scsi_data, int *data_len, uae_u8 *r, int *reply_len, uae_u8 *s, int *sense_len, bool atapi);
|
|
|
|
extern void blkdev_vsync (void);
|
|
|
|
extern int msf2lsn (int msf);
|
|
extern int lsn2msf (int lsn);
|
|
extern uae_u8 frombcd (uae_u8 v);
|
|
extern uae_u8 tobcd (uae_u8 v);
|
|
extern int fromlongbcd (uae_u8 *p);
|
|
extern void tolongbcd (uae_u8 *p, int v);
|
|
|
|
extern void blkdev_default_prefs (struct uae_prefs *p);
|
|
extern void blkdev_fix_prefs (struct uae_prefs *p);
|
|
extern int isaudiotrack (struct cd_toc_head*, int block);
|
|
extern int isdatatrack (struct cd_toc_head*, int block);
|
|
|
|
enum cd_standard_unit { CD_STANDARD_UNIT_DEFAULT, CD_STANDARD_UNIT_AUDIO, CD_STANDARD_UNIT_CDTV, CD_STANDARD_UNIT_CD32 };
|
|
|
|
extern int get_standard_cd_unit (enum cd_standard_unit csu);
|
|
extern void close_standard_cd_unit (int);
|
|
extern void blkdev_cd_change (int unitnum, const TCHAR *name);
|
|
|
|
extern void blkdev_entergui (void);
|
|
extern void blkdev_exitgui (void);
|
|
|
|
#endif /* BLKDEV_H */
|