                              Appendix E

                 MS-DOS INTERRUPTS AND FUNCTION CALLS

          INTERRUPTS

          MS-DOS Reserves interrupt types 20 to  3F  hex  for
          its  use.   This  means  absolute  locations  80 to
          FF hex are the transfer address  storage  locations
          reserved  by  the  DOS.  The defined interrupts are
          as follows with all values in hex:


          20   Program terminate.  This  is  the  normal  way
               to  exit  a  program.   This  vector transfers
               to the logic in the  DOS  for  restoration  of
               <CONTROL-C>   exit  addresses  to  the  values
               they had on entry to the  program.   All  file
               buffers  are  flushed to disk.  All files that
               have changed in length should have been closed
               (see  function  call  10 hex) prior to issuing
               this  interrupt.   If  the  changed  file  was
               not  closed  its  length  will not be recorded
               correctly in the directory.  When this  inter-
               rupt  is  executed,  CS MUST point to the 100H
               parameter area.

          21   Function request.   See  section  II  FUNCTION
               REQUESTS.

          22   Terminate  address.   The  address represented
               by this interrupt (88-8B hex) is  the  address
               to  which  control will transfer when the pro-
               gram  terminates.   This  address  is   copied
               into  low  memory  of  the segment the program
               is loaded into at the  time  this  segment  is
               created.   If  a  program  wishes  to  execute
               a second program it  must  set  the  terminate
               address  prior  to  creation  of  the  segment
               the program will be  loaded  into.   Otherwise

                                                            1


               once  the second program executes its termina-
               tion would cause transfer to its host's  term-
               ination address.

          23   <CONTROL-C>  exit  address.  If the user types
               <CONTROL-C> during  keyboard  input  or  video
               output,  "C"  will  be  printed on the console
               and an interrupt type 23 hex will  be  execut-
               ed.   If  the  <CONTROL-C>  routine  preserves
               all registers, it may end with a  return-from-
               interrupt   instruction   (IRET)  to  continue
               program  execution.   If  functions  9  or  10
               (buffered  output  and input), were being exe-
               cuted, then I/0 will continue from  the  start
               of  the  line.   When  the  interrupt  occurs,
               all registers are set to the  value  they  had
               when  the  original  call  to MS-DOS was made.
               There are no restrictions on  what  the  <CON-
               TROL-C>   handler  is allowed to do, including
               MS-DOS function calls, so long as  the  regis-
               ters are unchanged if IRET is used.

               If  the  program  creates a new segment, loads
               in  a  second  program  which  itself  changes
               the   <CONTROL-C>   address,  the  termination
               of the  second  program  and  return  to   the
               first   will  cause  the  <CONTROL-C>  address
               to be restored to  the  value  it  had  before
               execution of the second program.

          24   Fatal  error abort vector.  When a fatal error
               occurs within MS-DOS, control will  be  trans-
               ferred  with  an  INT  24H.   On  entry to the
               error handler, AH will have  its  bit  7=0  if
               the  error  was  a  hard  disk error (probably
               the most common occurrence), bit 7=1  if  not.
               If  it  is a hard disk error, bits 0-2 include
               the following:

                                                            2

                    bit  0         0 if read, 1 if write

                    bits 2    1    AFFECTED DISK AREA
                   ____ _    _    __________________
                         0    0    Reserved area
                         0    1    File allocation table
                         1    0    Directory
                         1    1    Data area

               AL, CX, DX, and DS:BX will be setup to perform
               a  retry  of  the transfer with INT 25H or INT
               26H (below).  DI  will  have  a  16-bit  error
               code returned by the hardware.
            
               The values returned are:

                         0    write protect
                         2    disk not ready
                         4    data error
                         6    Seek error
                         8    Sector not found
                         A    Write fault
                         C    General disk failure

               The  registers  will be set up for a BIOS disk
               call and the returned  code  will  be  in  the
               lower  half  of the DI register with the upper
               half undefined.   The  user  stack  will  look
               as follows from the top to bottom:

               IP        Registers   such  that  if  an  IRET
               CS        is executed  the  DOS  will  respond
               FLAGS     according to (AL) as follows:
                         (AL)=0    ignore the error
                             =1    retry the operation
                                   (IF   THIS   OPTION   USED
                                   STACK  DS,BX,CX   AND   DX
                                   MUST NOT BE MODIFIED!)
                              =2   abort the program

                                                            3



               AX  USER REGISTERS AT TIME OF REQUEST
               BX
               CX
               DX
               SI
               DI
               BP
               DS
               ES
               IP  The interrupt from the user to the DOS
               CS
               FLAGS

               Currently,  the  only  error  possible when AH
               bit 7=1 is a bad  memory  image  of  the  file
               allocation table.

          25   Absolute  disk  read.   This transfers control
               directly to the DOS BIOS.   Upon  return,  the
               original  flags  are  still  on the stack (put
               there by the INT instruction).  This is neces-
               sary  because  return  information  is  passed
               back in the flags.  Be sure to pop  the  stack
               to  prevent  uncontrolled  growth.   For  this
               entry point "records" and  "sectors"  are  the
               same size.  The request is as follows:

                    (AL)   DRIVE NUMBER (0=A, 1=B, etc.)
                    (CX)   Number of sectors to read
                    (DX)   Beginning logical record number
                    (DS:BX) Transfer address

               The  number of records specified are transfer-
               red between the given drive and  the  transfer
               address.   "Logical  record  numbers"  are ob-
               tained by numbering each  sector  sequentially
               starting   from  zero  and  continuing  across
               track boundaries.  For example logical  record
               number  0 is track 0 sector 1, whereas logical
               record number 12 hex is track 2 sector 3.

                                                            4


               All registers but the  segment  registers  are
               destroyed  by  this  call.   If  the  transfer
               was successful the carry  flag  (CF)  will  be
               zero.   If  the  transfer  was  not successful
               CF=1 and  (AL)  will  indicate  the  error  as
               follows:

                    Return    Description
                    0         Attempt to write 
                                   on write protected disk
                    2         Disk not ready
                    4         Data error
                    6         Seek error
                    8         Sector not found
                    C         General disk failure
                    A         Write fault

          26   Absolute  disk  write.   This  vector  is  the
               counterpart to  interrupt  25  above.   Except
               for the fact that this is a write the descrip-
               tion above applies.

          27   Terminate  but  stay  resident.   This  vector
               is  used by programs which are to remain resi-
               dent  when  COMMAND  regains  control.    Such
               a  program  is loaded as an executing COM file
               by COMMAND.  After it has initialized  itself,
               it  must  set  DX to its last address plus one
               in the segment it is executing in,  then  exe-
               cute  an  interrupt  27H.   COMMAND  will then
               treat the program as an extension  of  MS-DOS,
               and  the  program  will  not  be overlaid when
               other programs are executed.

                                                            5



          FUNCTION REQUESTS

          The user requests a function by placing a  function
          number  in  the  AH  register, supplying additional
          information in other  registers  as  necessary  for
          the  specific  function then executing an interrupt
          type 2l hex.  When MS-DOS takes control it switches
          to  an  internal  stack.   User registers except AX
          are preserved unless  information  is  passed  back
          to  the  requester  as  indicated  in  the specific
          requests.  The user stack needs  to  be  sufficient
          to  accommodate the interrupt system.  It is recom-
          mended that it be 80 hex in addition  to  the  user
          needs.   There  is an additional mechanism provided
          for programs that conform to CP/M  calling  conven-
          tions.   The  function  number  is placed in the CL
          register, other registers are set as normal accord-
          ing  to  the  function specification, and an intra-
          segment call is made to location 5 in  the  current
          code  segment.   This  method  is only available to
          functions which do  not  pass  a  parameter  in  AL
          and  whose  numbers  are  equal to or less than 36.
          Register AX is always destroyed if  this  mechanism
          is  used,  otherwise it is the same as normal func-
          tion requests.  The functions are as  follows  with
          all values in hex:


          0    Program  terminate.   The  terminate and <CON-
               TROL-C> exit addresses  are  restored  to  the
               values  they  had  on entry to the terminating
               program.  All file buffers  are  flushed,  but
               files  which  have  been changed in length but
               not  closed  will  not  be  recorded  properly
               in  the  disk  directory.   Control  transfers
               to the terminate address.

                                                            6



          1    Keyboard input.   Waits  for  a  character  to
               be  typed  at  the  keyboard,  then echoes the
               character to  the  video  device  and  returns
               it  in  AL.   The  character  is checked for a
               <CONTROL-C>.   If  this  key  is  detected  an
               interrupt 23 hex will be executed. 

          2    Video  output.   The character in DL is output
               to the video  device.   If  a  <CONTROL-C>  is
               detected  after  the  output  an  interrupt 23
               hex will be executed. 

          3    Auxiliary input.  Waits for a  character  from
               the   auxiliary  input  device,  then  returns
               that character in AL.

          4    Auxiliary output.   The  character  in  DL  is
               output to the auxiliary device. 

          5    Printer output.  The character in DL is output
               to the printer.  

          6    Direct console I/O.  If DL  is  FF  hex,  then
               AL   returns  with  keyboard  input  character
               if one is  ready,  otherwise  00.   If  DL  is
               not  FF  hex,  then  DL  is  assumed to have a
               valid character which is output to  the  video
               device.

          7    Direct  console  input.  Waits for a character
               to be typed  at  the  keyboard,  then  returns
               the  character  in  AL.   As  with function 6,
               no checks are made on the character. 

          8    Console input  without  echo.   This  function
               is  identical  to  function  1, except the key
               is not echoed. 

                                                            7


          9    Print string.   On  entry,  DS:DX  must  point
               to  a  character  string  in memory terminated
               by a "$" (24  hex).   Each  character  in  the
               string  will  be  output  to  the video device
               in the same form as function 2. 

          A    Buffered  keyboard  input.  On  entry,   DS:DX
               point  to  an  input  buffer.   The first byte
               must not be  zero  and  specifies  the  number
               of  characters  the  buffer can hold.  Charac-
               ters are read from  the  keyboard  and  placed
               in  the  buffer  beginning  at the third byte.
               Reading the keyboard and  filling  the  buffer
               continues  until  <RETURN>  is  typed.  If the
               buffer fills to one  less  than  the  maximum,
               then  additional  keyboard  input  is  ignored
               until a <RETURN> is typed.   The  second  byte
               of  the buffer is set to the number of charac-
               ters received excluding  the  carriage  return
               (0D  hex), which is always the last character.
               Editing of this buffer  is  described  in  the
               main  MS-DOS  document  under  "template edit-
               ing". 

          B    Check keyboard  status.   If  a  character  is
               available  from  the  keyboard,  AL will be FF
               hex.  Otherwise AL will be 00.

          C    Character  input  with  buffer  flush.   First
               the  keyboard  type-ahead  buffer  is emptied.
               Then if AL is 1, 6, 7, 8 or 0A hex,  the  cor-
               responding  MS-DOS  input  function is execut-
               ed.  If AL is not  one  of  these  values,  no
               further  operation  is  done  and  AL  returns
               00.

          D    Disk reset.  Flushes all  file  buffers.   Un-
               closed  files  that  have been changed in size
               will not be  properly  recorded  in  the  disk
               directory  until  they are closed.  This func-

                                                            8


               tion need not be called before a  disk  change
               if  all  files  which  have  been written have
               been closed.

          E    Select disk.  The drive specified in DL  (0=A,
               1=B,  etc.)  is  selected as the default disk.
               The number of drives is returned in AL. 

          F    Open file.  On entry, DS:DX point to an unopen-
               ed file control block (FCB).  The disk  direc-
               tory  is  searched  for  the named file and AL
               will return a 00 and  the  FCB  is  filled  as
               follows: 

               If  the  drive  code  was 0 (default disk), it
               is changed to  actual  disk  used  (A=1,  B=2,
               etc.).    This  allows  changing  the  default
               disk  without  interfacing   with   subsequent
               operations  on  this  file.   The high byte of
               the  current  block  field  is  set  to  zero.
               The  size  of  the  record  to  be worked with
               (FCB bytes E-F  hex)  is  set  to  the  system
               default  of  80  hex.   The  size of the file,
               and the time and  date  are  set  in  the  FCB
               from  information  obtained  from  the  direc-
               tory.

               It is the user's  responsibility  to  set  the
               record  size  (FCB  bytes  E-F) to the size he
               wished to think  of  the  file  in  terms  of,
               if  the  default  80  hex  is not appropriate.
               It is also the user's  responsibility  to  set
               the  random  record field and/or current block
               and record fields. 

          10   Close file.   This  function  must  be  called
               after  file  writes  to  insure  all directory
               information  is  updated.   On  entry,   DS:DX
               point  to  an  opened FCB.  The disk directory
               is searched and if  the  file  is  found,  its

                                                            9


 


 



               position  is compared  with that  kept in  the
               FCB.  If the file is not found in  the  direc-
               tory,  it is assumed the disk has been changed
               and AL returns FF hex.  Otherwise, the  direc-
               tory  is  updated  to  reflect  the  status in
               the FCB and AL returns 00.

          11   Search for the first entry.  On  entry,  DS:DX
               point  to an unopened FCB.  The disk directory
               is searched for the first matching name  (name
               could  have "?"'s indicating any letter match-
               ed) and if none are found AL returns  FF  hex.
               Otherwise,  locations  at  the  disk  transfer
               address are set as follows:

               l.   If the FCB  provided  for  searching  was
                    an  extended   FCB,  then  the first byte
                    is set to FF hex, then 5 bytes of  zeros,
                    then  the  attribute byte from the search
                    FCB, then the  drive  number  used  (A=1,
                    B=2,  etc.),  then  the  32  bytes of the
                    directory entry.  Thus the disk  transfer
                    address  contains  a  valid  unopened ex-
                    tended FCB with the  same  search  attri-
                    butes as the search FCB.

               2.   If  the  FCB  provided  for searching was
                    a normal FCB,  then  the  first  byte  is
                    set  to  the drive number used (A=1, B=2,
                    etc.)  and  the  next  32  bytes  contain
                    the   matching   directory  entry.   Thus
                    the  disk  transfer  address  contains  a
                    valid unopened normal FCB.

                                                           10



          Directory entries are formatted as follows:

          ----------------------------------------------
               Location Bytes Description 
          ==============================================
                    0    11   File name and extension
          ----------------------------------------------
                   11     1   Attributes.  Bits l or 2 
                                   make file hidden
          ----------------------------------------------
                   10    10   Zero field (for expansion)
          ----------------------------------------------
                   22     2   Time
                                   Bits 0-4   = secs*2
                                        5-10  = min 
                                        11-15 = hrs
          ----------------------------------------------
                   24     2   Date.
                                   Bits 0-4   = day
                                        5-8   = month
                                        9-15  = year
          ---------------------------------------------
                   26     2   First allocation unit
          ---------------------------------------------
                   28     4   File size, in bytes. 
                                (30 bits max.)
          ---------------------------------------------


          12   Search  for  the  next  entry.  After function
               11 has been called and found a match, function
               12  may  be  called  to find the next match to
               an ambiguous  request  ("?"'s  in  the  search
               filename).   Both  inputs  and outputs are the
               same as function 11.   The  reserved  area  of
               the  FCB  keeps information necessary for con-
               tinuing the search, so it must  not  be  modi-
               fied. 

                                                           11

          13   Delete  file.   On  entry,  DS:DX  point to an
               unopened FCB.  All matching directory  entries
               are  deleted.   If no directory entries match,
               AL returns FF, otherwise AL returns 00.

          14   Sequential read.  On  entry,  DS:DX  point  to
               an  opened  FCB.   The record addressed by the
               current block (FCB bytes C-D) and the  current
               record  (FCB  byte  1F)  is loaded at the disk
               transfer  address,  then  the  record  address
               is incremented.  If end-of-file is encountered
               AL returns either  01  or  03.   A  return  of
               01  indicates  no data in the record, 03 indi-
               cates a partial  record  is  read  and  filled
               out  with  zeros.   A return of 02 means there
               was not  enough  room  in  the  disk  transfer
               segment  to  read  one record, so the transfer
               was aborted. AL returns  00  if  the  transfer
               was completed successfully.   

          15   Sequential   write.   On  entry,  DS:DX  point
               to an opened FCB.   The  record  addressed  by
               the  current  block  and current record fields
               is written  from  the  disk  transfer  address
               (or in the case  of  records  less than sector
               sizes is buffered up  for  an  eventual  write
               when  a  sector's  worth of data is accumulat-
               ed).  The record address is then  incremented.
               If  the  disk  is  full, AL returns with a 0l.
               A return of 02  means  there  was  not  enough
               room  in  the  disk  transfer segment to write
               one  record,  so  the  transfer  was  aborted.
               AL  returns  00  if the transfer was completed
               successfully.  

                                                           12


          16   Create file.   On  entry  DS:DX  point  to  an
               unopened  FCB.  The disk directory is searched
               for an empty  entry,  and  AL  returns  FF  if
               none  is found.  Otherwise, the entry is init-
               ialized to a zero-length  file,  the  file  is
               opened (see function F), and AL returns 00.

          17   Rename  file.   On  entry,  DS:DX  point  to a
               modified FCB which has a drive code  and  file
               name  in  the  usual  position,  and  a second
               file name starting 6  bytes  after  the  first
               (DS:DX+11  hex) in what is normally a reserved
               area.  Every matching occurrence of the  first
               is changed to the second (with the restriction
               that two files  cannot  have  the  exact  same
               name  and  extension).   If  "?"'s  appear  in
               the second name, then the corresponding  posi-
               tions  in the original name will be unchanged.
               AL returns FF  hex  if  no  match  was  found,
               otherwise 00.

          19   Current  disk.   AL  returns  with the code of
               the current default drive (0=A, 1=B, etc.)

          1A   Set disk transfer address.  The disk  transfer
               address  is  set  to  DS:DX.   MS-DOS will not
               allow disk transfers  to  wrap  around  within
               the  segment,  nor  to  overflow into the next
               segment. 

          1B   Allocation table address.   On  return,  DS:BX
               point  to the allocation table for the current
               drive, DX has the number of allocation  units,
               and  AL  has the number of records per alloca-
               tion unit, and CX has  the size of the  physi-
               cal  sector.   At  DS:[BX-11], the byte before
               the allocation table, is the  dirty  byte  for
               the  table.   If set to 01, it means the table
               has been modified and  must  be  written  back
               to  disk.   If  00, the table is not modified.

                                                           13


               Any programs which get the address and direct-
               ly  modify  the table must be sure to set this
               byte to 01 for the  changes  to  be  recorded.
               This byte should NEVER be set to 00 - instead,
               a DISK RESET  function  (#0D  hex)  should  be
               performed  to  write  the  table and reset the
               bit.

          21   Random read.  On  entry,  DS:DX  point  to  an
               opened  FCB.   The  current  block and current
               record are set to agree with the random record
               field,  then  the  record  addresses  by these
               fields is loaded at the current disk  transfer
               address.    If   end-of-file  is  encountered,
               AL returns either 01 or 03.  If 01 is returned
               no more data is available.  If 03 is returned,
               a partial  record  is  available,  filled  out
               with  zeros.   A  return  of  02   means there
               was not  enough  room  in  the  disk  transfer
               segment  to  read  one  record,  so the trans-
               fer was aborted.  AL returns 00 if the  trans-
               fer was completed successfully.

          22   Random  write.   On  entry,  DS:DX point to an
               opened FCB.  The  current  block  and  current
               record are set to agree with the random record
               field, then  the  record  addressed  by  these
               fields  is  written (or in the case of records
               not the same as  sector  sizes-buffered)  from
               the  disk  transfer  address.   If the disk is
               full AL returns 01.   A  return  of  02  means
               there  was not  enough room in the disk trans-
               fer segment to write one record, so the trans-
               fer  was aborted.  AL returns 00 if the trans-
               fer was completed successfully.

                                                           14
          23   File size.  On entry, DS:DX point  to  an  un-
               opened  FCB.   The  disk directory is searched
               for the  first  matching  entry  and  if  none
               is found, AL returns FF.  Otherwise the random
               record field is  set  with  the  size  of  the
               file (in terms of the record size field round-
               ed up) and AL returns 00.

          24   Set random  record  field.   On  entry,  DS:DX
               point  to  an  opened FCB.  This function sets
               the random  record  field  to  the  same  file
               address   as  the  current  block  and  record
               fields.

          25   Set  vector.   The  interrupt  type  specified
               in AL is set to the 4-byte address DS:DX.

          26   Create  a  new  program  segment.   On  entry,
               DX has a segment number at  which  to  set  up
               a  new  program  segment.   The entire 100 hex
               area at location zero in the  current  program
               segment  is  copied  into location zero in the
               new program segment.  The memory size informa-
               tion  at location 6 is updated and the current
               termination  and  <CONTROL-C>   exit   address
               are  saved in the new program segment starting
               at 0A hex. 

          27   Random block  read.   On  entry,  DS:DX  point
               to  an  opened  FCB,  and CX contains a record
               count that must not be  zero.   The  specified
               number  of  records  (in  terms  of the record
               size field) are read from  the  file  address.
               If  end-of-file  is reached before all records
               have been read, AL returns either  01  or  03.
               A  return  of  01  indicates  end-of-file  and
               the last record is complete,  a  03  indicates
               the  last  record  is  a  partial  record.  If
               wrap-around above  address  FFFF  hex  in  the
               disk  transfer  segment  would  occur, as many

                                                           15


               records as possible are read  and  AL  returns
               02.   If  all  records  are read successfully,
               AL returns 00.  In any case  CX  returns  with
               the  actual  number  of records read,  and the
               random record field and  the  current  block/-
               record  fields  are  set  to  address the next
               record.

          28   Random  block  write.   Essentially  the  same
               as  function  27  above,  except  for  writing
               and  a  write-protect  indication.   If  there
               is  insufficient space on the disk, AL returns
               01 and no  records  are  written.   If  CX  is
               zero  upon  entry,  no  records  are  written,
               but the file is set to  the  length  specified
               by  the  Random  Record  field, whether longer
               or shorter than the current  file size  (allo-
               cation  units  are  released  or  allocated as
               appropriate). 

          29   Parse file name.  On  entry  DS:SI  points  to
               a  command  line  to  parse,  and ES:DI points
               to a portion of memory to be  filled  in  with
               an  unopened  FCB.   Leading  TABs  and spaces
               are ignored when scanning.  If  bit  0  of  AL
               is  equal  to  1  on  entry,  then at most one
               leading file name separator will  be  ignored,
               along  with  any  trailing  TABs  and  spaces.
               The four filename separators are:

                         ;  ,  =  +

               If bit 0 of AL is equal to l, then all parsing
               stops  if  a  separator  is  encountered.  The
               command line is parsed  for  a  file  name  of
               the  form  d:filename.ext,  and  if  found,  a
               corresponding  unopened  FCB  is  created   at
               ES:DI.   The  entry  value  of  AL  bits l, 2,
               and 3 determine  what  to  do  if  the  drive,
               filename,   or  extension,  respectively,  are

                                                           16


               missing.  In each care, if the bit is  a  zero
               and  the  field  is not present on the command
               line, then the FCB  is  filled  with  a  fixed
               value  (0,  meaning  the default drive for the
               drive field ;  all  blanks  for  the  filename
               and  extension  fields).   If  the bit is a 1,
               and the field is not  present on  the  command
               line,  then  that  field  in  the  destination
               FCB at ES:DI is left  unchanged.   If  an  as-
               terisk  "*"  appears in the filename or exten-
               sion, then all  remaining  characters  in  the
               name or extension are set to "?".

               The  following  characters  are illegal within
               MS-DOS file specifications: 

                    "  /  [  ]  +  =  ;  ,

               Control characters and  spaces  also  may  not
               be  given  as elements of file specifications.
               If any of  these  characters  are  encountered
               while  parsing,  or  the  period  (.) or colon
               (:) is found  in  an  invalid  position,  then
               parsing stops at that point.

               If  either  "?"  or  "*"  appears  in the file
               name or extension then AL returns  0l,  other-
               wise  00.   DS:SI  will return pointing to the
               first character after the file name.

          2A   Get date.  Returns  date  in  CX:DX.   CX  has
               the  year  DH has the day.  If the time-of-day
               clock rolls over to the  next  day,  the  date
               will  be  adjusted  accordingly,  taking  into
               account the  number  of  days  in  each  month
               and leap years. 

                                                           17

          2B   Set  date.   On  entry CX:DX must have a valid
               date in the same format as returned  by  func-
               tion  2A  above.   If the date is indeed valid
               and the set  operation   is  successful,  then
               AL  returns  00.   If  the  date is not valid,
               then AL returns FF. 

          2C   Get time.  Returns with time-of-day in  CX:DX.
               Time actually represented as four 8-bit binary
               quantities, as  follows:   CH  has  the  hours
               (0-23),  CL has minutes (0-59), DH has seconds
               (0-59), DL has  1/100  seconds  (0-99).   This
               format  is  easily  converted  to  a printable
               form yet can also be  calculated  upon  (e.g.,
               subtracting  two times).

          2D   Set  time.   On  entry,  CX:DX has time in the
               same format as returned by function 2C  above.
               If  any  component  of  the time is not valid,
               the set operation is aborted  and  AL  returns
               FF.  If the time is valid, AL returns 00.

          2E   Set/Reset  Verify  Flag.   On  entry,  DL must
               be 0 and AL has  the  verify  flag:   0  =  no
               verify,  1  =  verify  after  write. This flag
               is simply passed to the  I/O  system  on  each
               write,  so  its  exact  meaning is interpreted
               there. 
           
                                                           18
