12.6 SYS - Device drivers

  --------------------------

 

      The compiler makes it much easier to write drivers, because it creates

  the driver headers and the STRATEGY and INTERRUPT functions itself. You

  only need to write the command processing code.

 

      In order to compile a device driver file, add /sys on the command line.

  There are also new compiler directives which act only with this switch:

 

      ?sysattribute <value> - this directive passes the driver attribute to

  the compiler, the default value being 0x2000.

 

      ?sysname <text string> - this directive sends the compiler the name of

  the future driver, with the default being "NO_NAME". The name can be up to

  8 characters.

 

      ?syscommand <command_0>,<command_1>, ... <command_n>; - this directive

  is obligatory. It is used to send a list of names of functions for

  processing driver commands. The names are separated by commas. The list

  ends with a semicolon ';'. No more than 25 commands can be sent. If any

  command has no support code you must write the word NONE in the list.

 

      By default the compiler does not create any stack for the driver. The

  driver may use the system stack, but sometimes this is very small. If your

  functions make active use of the stack and you don't want to use the system

  stack, use the directive ?stack <size> to force the driver to use its own

  stack.

 

      The address of the header of the request will be passed to your

  functions for processing command when transferring control in registers

  ES:BX. Register DS is equal to CS. When control is returned, your functions

  must retain register DS. Register AX must contain the return code. The

  other registers may be used as you wish.

 

      The command initialization processing function should be last (so that

  the address space occupied by this function can be returned to the

  operating system). If dynamic functions are used in other command

  processing functions, this function must be preceeded by the directive

  ?setdinproc.  Global variables must be initialized.