home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
listings
/
v_07_02
/
v7n2063a.txt
< prev
next >
Wrap
Text File
|
1988-09-15
|
4KB
|
100 lines
/* RQH.H ** Device Driver definitions and templates.
** The DOS device header and DOS Request Header is mapped.
-- R.D.Allen, 9/3/87
Copyright 1987, 1988 PARS Service Partnership
*/
/* Convenient method for mapping an INTEL far pointer in C */
union _farp {
struct {
unsigned int offset;
unsigned int segment;
} address;
char far *string;
};
/* A method to map the device header structure required by DOS
and declared in the startup file DVR_MAIN.ASM */
extern struct _header {
union _farp next_dev;
union _ioctl {
unsigned int word;
struct {
unsigned int stout : 1; /* Bit 0 ** Is stdout device */
unsigned int stin : 1; /* Bit 1 ** Is stdin device */
unsigned int nul : 1; /* Bit 2 ** Is the NULL device */
unsigned int clock : 1; /* Bit 3 ** Is the $CLOCK device */
unsigned int rsv4 : 1; /* Bit 4 ** reserved */
unsigned int raw : 1; /* Bit 5 ** Raw mode status */
unsigned int eof : 1; /* Bit 6 ** At end of file status */
unsigned int isdev : 1; /* Bit 7 ** Is a device */
unsigned int rsv810 : 3; /* Bits 8 - 10 ** reserved */
unsigned int ocr : 1; /* Bit 11 ** I forgot? */
unsigned int rsv12 : 1; /* Bit 12 ** reserved */
unsigned int obusy : 1; /* Bit 13 ** Output busy status */
unsigned int ioctl : 1; /* Bit 14 ** Supports IOCTL calls */
unsigned int cdev : 1; /* Bit 15 ** Character device */
} bits;
} io;
unsigned int strat; /* Address of STRATEGY Routine */
unsigned int intr; /* Address of INTERRUPT Routine */
char name[8]; /* DOS file name of device */
} header;
/* The tail of a Request Header is mapped differently for different
commands. These structures will define all necessary access methods. */
struct _init { /* Command tail used only during initialization */
char units; /* Number of Units as required for Block Device */
union _farp end; /* Ending address of driver reported to DOS */
union _farp args; /* CONFIG.SYS line after "DEVICE=" */
char devnum; /* Beginning Device Number, this Block Device */
};
struct _io { /* Command tail used for most other commands */
char media; /* Block Device media field */
union _farp data; /* Address for data Input/Output */
int count; /* Number of bytes to be transferred */
int sec_num; /* Block Device sector number */
union _farp volume; /* Block Device Volume label */
};
/* A union to hold all the different Request Header command tail formats. */
union _rq_tail {
struct _init init; /* Initialization command tail */
struct _io io; /* Most read, write routines */
char peek; /* Non-destructive read, no wait */
};
/* DOS Request Header format. This structure unites all the different
parts of a request header so they may be accessed in C. */
struct _rq_hdr {
char count; /* total bytes in header */
char unit_code; /* Block Device Garbage (not used) */
char command; /* Device driver command */
struct _st_bits { /* Bit fields to map Status word */
unsigned int err_type : 8; /** DOS error to report */
unsigned int done : 1; /** Done status (normally returned) */
unsigned int busy : 1; /** Busy status (normal not used) */
unsigned int reserved : 5;
unsigned int err_flag : 1; /** If set, ERR_TYPE should used */
} status; /* Status word returned to DOS */
struct _rq_hdr far *next_rq; /* RESERVED -- front pointer */
struct _rq_hdr far *pending; /* Chain pointer for queued req. */
union _rq_tail tail; /* Request Header Command Tail */
};
/* Request Header address storage as used by STRATEGY routine. */
union _ptr {
struct {
unsigned int offset;
unsigned int segment;
} address;
struct _rq_hdr far *rq; /* far pointer to access request header */
};