DEVICE.H
上传用户:dcs7469208
上传日期:2010-01-02
资源大小:443k
文件大小:15k
源码类别:

操作系统开发

开发平台:

DOS

  1. /****************************************************************/
  2. /*                                                              */
  3. /*                           device.h                           */
  4. /*                      Device Driver Header File               */
  5. /*                                                              */
  6. /*                       November 20, 1991                      */
  7. /*                                                              */
  8. /*                      Copyright (c) 1995                      */
  9. /*                      Pasquale J. Villani                     */
  10. /*                      All Rights Reserved                     */
  11. /*                                                              */
  12. /* This file is part of DOS-C.                                  */
  13. /*                                                              */
  14. /* DOS-C is free software; you can redistribute it and/or       */
  15. /* modify it under the terms of the GNU General Public License  */
  16. /* as published by the Free Software Foundation; either version */
  17. /* 2, or (at your option) any later version.                    */
  18. /*                                                              */
  19. /* DOS-C is distributed in the hope that it will be useful, but */
  20. /* WITHOUT ANY WARRANTY; without even the implied warranty of   */
  21. /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See    */
  22. /* the GNU General Public License for more details.             */
  23. /*                                                              */
  24. /* You should have received a copy of the GNU General Public    */
  25. /* License along with DOS-C; see the file COPYING.  If not,     */
  26. /* write to the Free Software Foundation, 675 Mass Ave,         */
  27. /* Cambridge, MA 02139, USA.                                    */
  28. /****************************************************************/
  29. /* $Logfile:   C:/dos-c/hdr/device.h_v  $ */
  30. #ifdef MAIN
  31. # ifdef VERSION_STRINGS
  32. static BYTE *device_hRcsId = "$Header:   C:/dos-c/hdr/device.h_v   1.7   11 Jan 1998  2:05:54   patv  $";
  33. # endif
  34. #endif
  35. /* $Log:   C:/dos-c/hdr/device.h_v  $
  36.  *
  37.  *    Rev 1.7   11 Jan 1998  2:05:54   patv
  38.  * Added functionality to ioctl.
  39.  *
  40.  *    Rev 1.6   04 Jan 1998 23:14:20   patv
  41.  * Changed Log for strip utility
  42.  *
  43.  *    Rev 1.5   16 Jan 1997 12:46:06   patv
  44.  * pre-Release 0.92 feature additions
  45.  *      
  46.  *         Rev 1.4   29 May 1996 21:25:12   patv
  47.  *      bug fixes for v0.91a
  48.  *      
  49.  *         Rev 1.3   19 Feb 1996  3:15:30   patv
  50.  *      Added NLS, int2f and config.sys processing
  51.  *      
  52.  *         Rev 1.2   01 Sep 1995 17:35:40   patv
  53.  *      First GPL release.
  54.  *      
  55.  *         Rev 1.1   30 Jul 1995 20:43:48   patv
  56.  *      Eliminated version strings in ipl
  57.  *      
  58.  *         Rev 1.0   02 Jul 1995 10:39:30   patv
  59.  *      Initial revision.
  60.  */
  61. /* $EndLog$ */
  62. /*
  63.  *      Status Word Bits
  64.  */
  65. #define S_ERROR         0x8000          /* Error bit                    */
  66. #define S_BUSY          0x0200          /* Device busy bit              */
  67. #define S_DONE          0x0100          /* Device operation completed   */
  68. #define S_MASK          0x00ff          /* Mask to extract error code   */
  69. /*
  70.  *      MEDIA Descriptor Byte Bits
  71.  */
  72. #define MD_2SIDE        1               /* MEDIA is two sided           */
  73. #define MD_8SECTOR      2               /* MEDIA is eight sectored      */
  74. #define MD_REMOVABLE    4               /* MEDIA is removable (floppy)  */
  75. /*
  76.  *      Media Return Codes
  77.  */
  78. #define M_CHANGED       -1              /* MEDIA was changed            */
  79. #define M_DONT_KNOW     0               /* MEDIA state unkown           */
  80. #define M_NOT_CHANGED   1               /* MEDIA was not changed        */
  81. /*
  82.  *      Error Return Codes
  83.  */
  84. #define E_WRPRT         0               /* Write Protect                */
  85. #define E_UNIT          1               /* Unknown Unit                 */
  86. #define E_NOTRDY        2               /* Device Not Ready             */
  87. #define E_CMD           3               /* Unknown Command              */
  88. #define E_CRC           4               /* Crc Error                    */
  89. #define E_LENGTH        5               /* Bad Length                   */
  90. #define E_SEEK          6               /* Seek Error                   */
  91. #define E_MEDIA         7               /* Unknown MEDIA                */
  92. #define E_NOTFND        8               /* Sector Not Found             */
  93. #define E_PAPER         9               /* No Paper                     */
  94. #define E_WRITE         10              /* Write Fault                  */
  95. #define E_READ          11              /* Read Fault                   */
  96. #define E_FAILURE       12              /* General Failure              */
  97. /*
  98.  *      Command codes
  99.  */
  100. #define C_INIT          0x00            /* Initialize                   */
  101. #define C_MEDIACHK      0x01            /* MEDIA Check                  */
  102. #define C_BLDBPB        0x02            /* Build BPB                    */
  103. #define C_IOCTLIN       0x03            /* Ioctl In                     */
  104. #define C_INPUT         0x04            /* Input (Read)                 */
  105. #define C_NDREAD        0x05            /* Non-destructive Read         */
  106. #define C_ISTAT         0x06            /* Input Status                 */
  107. #define C_IFLUSH        0x07            /* Input Flush                  */
  108. #define C_OUTPUT        0x08            /* Output (Write)               */
  109. #define C_OUTVFY        0x09            /* Output with verify           */
  110. #define C_OSTAT         0x0a            /* Output                       */
  111. #define C_OFLUSH        0x0b            /* Output Flush                 */
  112. #define C_IOCTLOUT      0x0c            /* Ioctl Out                    */
  113. #define C_OPEN          0x0d            /* Device Open                  */
  114. #define C_CLOSE         0x0e            /* Device Close                 */
  115. #define C_REMMEDIA      0x0f            /* Removable MEDIA              */
  116. #define C_OUB           0x10            /* Output till busy             */
  117. #define C_GENIOCTL      0x13            /* Generic Ioctl                */
  118. #define C_GETLDEV       0x17            /* Get Logical Device           */
  119. #define C_SETLDEV       0x18            /* Set Logical Device           */
  120. #define C_IOCTLQRY      0x19            /* Ioctl Query                  */
  121. /*
  122.  *      Convienence macros
  123.  */
  124. #define failure(x)      (S_ERROR+S_DONE+x)
  125. #ifndef TRUE
  126. #define TRUE            1
  127. #endif
  128. #ifndef FALSE
  129. #define FALSE           0
  130. #endif
  131. #define mk_offset(far_ptr)      ((UWORD)(far_ptr))
  132. #define mk_segment(far_ptr) ((UWORD)((ULONG)(far_ptr) >> 16))
  133. #define far_ptr(seg, off) ((VOID FAR *)(((ULONG)(off))+((ULONG)(seg) << 16)))
  134. /*
  135.  *      structures
  136.  */
  137. /* Device header */
  138. struct dhdr
  139. {
  140. struct dhdr
  141. FAR     *dh_next;
  142. UWORD           dh_attr;
  143. VOID            (*dh_strategy)();
  144. VOID            (*dh_interrupt)();
  145. BYTE            dh_name[8];
  146. };
  147. #define ATTR_CHAR       0x8000
  148. #define ATTR_IOCTL 0x4000
  149. #define ATTR_EXCALLS    0x0800
  150. #define ATTR_QRYIOCTL 0x0080
  151. #define ATTR_GENIOCTL 0x0040
  152. #define ATTR_RAW        0x0400
  153. #define ATTR_FASTCON    0x0010
  154. #define ATTR_CLOCK      0x0008
  155. #define ATTR_NULL       0x0004
  156. #define ATTR_STDOUT     0x0002
  157. #define ATTR_STDIN      0x0001
  158. /*                                                                      */
  159. /* Bios Parameter Block structure                                       */
  160. /*                                                                      */
  161. /* The following offsets are computed as byte offsets and are based on  */
  162. /* the struct below. The struct itself cannot be used because on some   */
  163. /* compilers, structure alignement may be forced, throwing following    */
  164. /* fields off (e.g. - BYTE, followed by a WORD may have a byte of fill  */
  165. /* inserted in between; the WORD would then be at offset 2, not 1).     */
  166. /*                                                                      */
  167. #define BPB_NBYTE       0
  168. #define BPB_NSECTOR     2
  169. #define BPB_NRESERVED   3
  170. #define BPB_NFAT        5
  171. #define BPB_NDIRENT     6
  172. #define BPB_NSIZE       8
  173. #define BPB_MDESC       10
  174. #define BPB_NFSECT      11
  175. #define BPB_NSECS       13
  176. #define BPB_NHEADS      15
  177. #define BPB_HIDDEN      17
  178. #define BPB_HUGE        21
  179. #define BPB_SIZEOF      25
  180. typedef struct
  181. {
  182. UWORD   bpb_nbyte;              /* Bytes per Sector             */
  183. UBYTE   bpb_nsector;            /* Sectors per Allocation Unit  */
  184. UWORD   bpb_nreserved;          /* # Reserved Sectors           */
  185. UBYTE   bpb_nfat;               /* # FAT's                      */
  186. UWORD   bpb_ndirent;            /* # Root Directory entries     */
  187. UWORD   bpb_nsize;              /* Size in sectors              */
  188. UBYTE   bpb_mdesc;              /* MEDIA Descriptor Byte        */
  189. UWORD   bpb_nfsect;             /* FAT size in sectors          */
  190. UWORD   bpb_nsecs;              /* Sectors per track            */
  191. UWORD   bpb_nheads;             /* Number of heads              */
  192. ULONG   bpb_hidden;             /* Hidden sectors               */
  193. ULONG   bpb_huge;               /* Size in sectors if           */
  194. /* bpb_nsize== 0                                */
  195. } bpb;
  196. /*                                                                      */
  197. /* Boot Block (Super Block)                                             */
  198. /*                                                                      */
  199. /* See BPB comments for the offsets below                               */
  200. /*                                                                      */
  201. #define BT_JUMP         0
  202. #define BT_OEM          3
  203. #define BT_BPB          11
  204. #define BT_SIZEOF       36
  205. typedef struct
  206. {
  207. BYTE    bt_jump[3];             /* Boot Jump opcodes            */
  208. BYTE    bt_oem[8];              /* OEM Name                     */
  209. bpb     bt_bpb;                 /* BPB for this media/device    */
  210. WORD    bt_nsecs;               /* # Sectors per Track          */
  211. WORD    bt_nheads;              /* # Heads                      */
  212. WORD    bt_hidden;              /* # Hidden sectors             */
  213. LONG    bt_huge;                /* use if nsecs == 0            */
  214. } boot;
  215. typedef boot    super;          /* Alias for boot structure             */
  216. typedef struct
  217. {
  218. BYTE    r_length;       /*  Request Header length               */
  219. BYTE    r_unit;         /*  Unit Code                           */
  220. BYTE    r_command;      /*  Command Code                        */
  221. WORD    r_status;       /*  Status                              */
  222. BYTE    r_reserved[8];  /*  DOS Reserved Area                   */
  223. union
  224. {
  225. struct
  226. {
  227. BYTE    _r_nunits;      /*  number of units     */
  228. BYTE FAR
  229. *_r_endaddr;    /*  Ending Address      */
  230. bpb                     /*  ptr to BPB array    */
  231. * FAR *_r_bpbptr;
  232. BYTE    _r_firstunit;
  233. } _r_init;
  234. struct
  235. {
  236. BYTE    _r_meddesc;     /*  MEDIA Descriptor    */
  237. BYTE    _r_retcode;     /*  Return Code         */
  238. BYTE FAR
  239. *_r_vid;        /* volume id */
  240. } _r_media;
  241. struct
  242. {
  243. BYTE    _r_meddesc;     /*  MEDIA Descriptor    */
  244. boot FAR
  245. *_r_fat;        /*  boot sector pointer */
  246. bpb FAR
  247. *_r_bpbpt;      /*  ptr to BPB table    */
  248. } _r_bpb;
  249. struct
  250. {
  251. BYTE    _r_meddesc;     /*  MEDIA Descriptor    */
  252. BYTE FAR
  253. *_r_trans;      /*  Transfer Address    */
  254. UWORD   _r_count;       /*  Byte/Sector Count   */
  255. UWORD   _r_start;       /*  Starting Sector No. */
  256. BYTE FAR
  257. *_r_vid;        /* Pointer to volume id */
  258. LONG    _r_huge;        /* for > 32Mb drives    */
  259. } _r_rw;
  260. struct
  261. {
  262. BYTE    _r_ndbyte;      /*  Byte Read From Device       */
  263. } _r_nd;
  264. } _r_x;
  265. } request;
  266. #define HUGECOUNT       0xffff
  267. #define MAXSHORT        0xffffl
  268. /*
  269.  * Macros to assist request structure legibility
  270.  */
  271. /* Init packet macros                                                   */
  272. #define r_nunits        _r_x._r_init._r_nunits
  273. #define r_endaddr       _r_x._r_init._r_endaddr
  274. #define r_bpbptr        _r_x._r_init._r_bpbptr
  275. #define r_firstunit     _r_x._r_init._r_firstunit
  276. /* MEDIA Check packet macros                                            */
  277. #define r_mcmdesc       _r_x._r_media._r_meddesc
  278. #define r_mcretcode     _r_x._r_media._r_retcode
  279. #define r_mcvid         _r_x._r_media._r_vid
  280. /* Build BPB packet macros                                              */
  281. #define r_bpmdesc       _r_x._r_bpb._r_meddesc
  282. #define r_bpfat         _r_x._r_bpb._r_fat
  283. #define r_bpptr         _r_x._r_bpb._r_bpbpt
  284. /* rw packet macros                                                     */
  285. #define r_meddesc       _r_x._r_rw._r_meddesc
  286. #define r_trans         _r_x._r_rw._r_trans
  287. #define r_count         _r_x._r_rw._r_count
  288. #define r_start         _r_x._r_rw._r_start
  289. #define r_rwvid         _r_x._r_rw._r_vid
  290. #define r_huge          _r_x._r_rw._r_huge
  291. /* ndread packet macros                                                 */
  292. #define r_ndbyte        _r_x._r_nd._r_ndbyte
  293. /* 
  294.  *interrupt support (spl & splx) support - IBM style
  295.  */
  296. #define I_NONE          0               /* Initial value                */
  297. /* predefined interrupt levels - 8259 support                           */
  298. #define IRQ0            0x01            /* Level 0 - highest            */
  299. #define IRQ1            0x02
  300. #define IRQ2            0x04
  301. #define IRQ3            0x08
  302. #define IRQ4            0x10
  303. #define IRQ5            0x20
  304. #define IRQ6            0x40
  305. #define IRQ7            0x80            /* Level 7 - lowest             */
  306. /* standard hardware configuration                                      */
  307. #define I_RTC           IRQ0            /* Timer                        */
  308. #define I_KBD           IRQ1            /* Keyboard                     */
  309. #define I_COM2          IRQ3            /* COM1:                        */
  310. #define I_COM1          IRQ4            /* COM2:                        */
  311. #define I_HDC           IRQ5            /* Fixed disk                   */
  312. #define I_FDC           IRQ6            /* Diskette                     */
  313. #define I_PRT           IRQ7            /* Printer                      */
  314. /* standard hardware vectors - 8259 defined                             */
  315. #define V_RTC           0x08            /* Timer                        */
  316. #define V_KBD           0x09            /* Keyboard                     */
  317. #define V_LEV2          0x0a            /* Level 2 - uncomitted         */
  318. #define V_COM2          0x0b            /* COM1:                        */
  319. #define V_COM1          0x0c            /* COM2:                        */
  320. #define V_HDC           0x0d            /* Fixed disk                   */
  321. #define V_FDC           0x0e            /* Diskette                     */
  322. #define V_PRT           0x0f            /* Printer                      */
  323. #define V_LEV0          0x08            /* Level 0 - highest            */
  324. #define V_LEV1          0x09
  325. #define V_LEV2          0x0a            /* Level 2 - uncomitted         */
  326. #define V_LEV3          0x0b
  327. #define V_LEV4          0x0c
  328. #define V_LEV5          0x0d
  329. #define V_LEV6          0x0e
  330. #define V_LEV7          0x0f            /* Level 7 - lowest             */
  331. /*
  332.  */
  333. typedef request FAR *rqptr;
  334. typedef bpb FAR *bpbptr;
  335. typedef BYTE FAR *byteptr;
  336. typedef struct dhdr FAR *dhdrptr;
  337. /*
  338.  *      externals
  339.  */
  340. extern BYTE FAR *device_end();
  341. /*
  342.  *      end of device.h
  343.  */