[comp.sys.ibm.pc] Interrupt List 88.9, file INTERRUP.LST 04/07

ralf@b.gp.cs.cmu.edu (Ralf Brown) (12/18/88)

	whether or not DESQview was loaded
---------------------------------------------
INT 21 - DOS - GET CURRENT TIME
	AH = 2Ch
Return: CH = hours
	CL = minutes
	DH = seconds
	DL = hundredths of seconds
Note: time is updated approximately every 5/100 second
---------------------------------------------
INT 21 - DOS - SET CURRENT TIME
	AH = 2Dh
	CH = hours
	CL = minutes
	DH = seconds
	DL = hundredths of seconds
Return: AL = 00h if no error
	   = FFh if bad value sent to routine
Note: DOS 3.3 also sets CMOS clock
---------------------------------------------
INT 21 - DOS - SET VERIFY FLAG
	AH = 2Eh
	DL = 0
	AL = 1 VERIFY on
	     0 VERIFY off
---------------------------------------------
INT 21 - DOS 2+ - GET DISK TRANSFER AREA ADDRESS
	AH = 2Fh
Return: ES:BX = address of DTA
---------------------------------------------
INT 21 - DOS 2+ - GET DOS VERSION
	AH = 30h
Return: AL = Major Version number (0 for DOS 1.x)
	AH = Minor Version number
	BH = OEM number
	    00h IBM
	    16h DEC
	BL:CX = 24-bit user number
---------------------------------------------
INT 21 - DOS 2+ - TERMINATE BUT STAY RESIDENT
	AH = 31h
	AL = exit code
	DX = program size, in paragraphs
---------------------------------------------
INT 21 - DOS 2+ internal - GET DRIVE PARAMETER BLOCK
	AH = 32h
	DL = drive number
	    0 = default, 1 = A, etc.
Return: AL = 0FFh if invalid drive number, else
	DS:BX -> drive parameter block.

Structure of DOS Drive Parameter Block:
Offset	Size	Description
 00h	BYTE	drive number (0 = A, etc.)
 01h	BYTE	unit number within device driver
 02h	WORD	number of bytes per sector
 04h	BYTE	largest sector number in cluster (one less than sect/clust)
 05h	BYTE	log base two of the cluster size
 06h	WORD	number of reserved (boot) sectors
 08h	BYTE	number of copies of the FAT
 09h	WORD	number of root directory entries
 0Bh	WORD	first data sector on medium
 0Dh	WORD	largest possible cluster number (one more than # data clust)
 0Fh	BYTE	number of sectors in one FAT copy
 10h	WORD	first sector of root directory
 12h	DWORD	address of device driver for this drive
 16h	BYTE	media descriptor byte for medium
 17h	BYTE	FFh indicates block must be rebuilt
		(DOS 3.x) 00h indicates block accessed
 18h	DWORD	address of next device block, offset = FFFFh indicates last
---DOS 2.x only---
 1Ch	WORD	starting cluster of current directory (0 = root directory)
 1Eh 64 BYTEs	ASCIZ current directory path string
---DOS 3.x---
; this was always:
 1Ch	WORD = 0	probably unused, values left from before
 1Eh	WORD = 0FFFFh	block was built
---------------------------------------------
INT 21 - DOS 2+ - EXTENDED CONTROL-BREAK CHECKING
	AH = 33h
	AL = subfunction
	    00h get state
	    01h set state
	       DL = 0 for OFF or 1 for ON
	    02h internal, called by PRINT.COM (DOS 3.1)
	    05h internal, return boot drive in DL (1=A:) (not in DOS 3.1)
Return: DL = current BREAK setting if AL = 00h
	    0 BREAK=OFF
	    1 BREAK=ON
	AL = FFh if error
---------------------------------------------
INT 21 - DOS 2+ internal - RETURN CritSectFlag POINTER
	AH = 34h
Return: ES:BX -> 1-byte DOS "Critical Section Flag", also known as InDOS flag
Notes:	when the critical section flag is nonzero, code within DOS is being
	executed.  It is safe to enter DOS when both the critical section flag
	and the critical error flag are zero.

	The critical error flag is the byte after the critical section flag in
	DOS 2.x, and the byte BEFORE the critical section flag in DOS 3.x 
	(except COMPAQ DOS 3.0, where the critical error flag is located 1AAh
	bytes BEFORE the critical section flag)
---------------------------------------------
INT 21 - DOS 2+ - GET INTERRUPT VECTOR
	AH = 35h
	AL = interrupt number
Return: ES:BX = value of interrupt vector
---------------------------------------------
INT 21 - DOS 2+ - GET DISK SPACE
	AH = 36h
	DL = drive code (0 = default, 1 = A, 2 = B, etc.)
Return: AX = number of sectors per cluster
	     or 0FFFFh if invalid drive
	BX = number of available clusters
	CX = bytes per sector
	DX = total clusters
Note: multiply AX * CX * BX for free space on disk
      multiply AX * CX * DX for total disk space
---------------------------------------------
INT 21 - DOS 2+ internal - SWITCHAR/AVAILDEV
	AH = 37h
	AL = subfunction
	   0 Read switch character (returns current character in DL)
	   1 Set switch character (specify new character in DL)
	   2 (DOS 2.x only) Read device availability (as set by function AL=3)
	   3 (DOS 2.x only) Set device availability, where:
	     DL = 0 means \DEV\ must preceed device names
	     DL <> 0 means \DEV\ need not preceed device names
Return: AL = FFh means the value in AL was not in the range 0-3.
	DL = Switch character (if AL=0 or 1)
	     Device availability flag (if AL=2 or 3)
---------------------------------------------
INT 21 - DOS 2+ - GET COUNTRY-DEPENDENT INFORMATION
	AH = 38h
--DOS 2.x--
	AL = 0	get current-country info
	DS:DX = segment:offset of buffer for returned info
Return: BX = country code
	buffer at DS:DX filled as follows:
	   bytes 0-1 = date format   0 = USA	mm dd yy
				     1 = Europe dd mm yy
				     2 = Japan	yy mm dd
	   byte 2    = currency symbol
	   byte 3    = 00h
	   byte 4    = thousands separator char
	   byte 5    = 00h
	   byte 6    = decimal separator char
	   byte 7    = 00h
	   bytes 8-1Fh reserved

--DOS 3.x--
	AL = 0 for current country
	AL = 01h thru 0FEh for specific country with code <255
	AL = 0FFh for specific country with code >= 255
	   BX = 16-bit country code
	DS:DX = segment:offset of buffer for returned info
	DX = 0FFFFh if setting country code, rather than getting info
Return: (if DX <> 0FFFFh)
	CF set on error
	    AX = error code (02h)
	CF clear if successful
	    BX = country code
	    DS:DX filled in:
	        WORD  date format (see above)
	      5 BYTEs currency symbol string, ASCIZ
	        BYTE  thousands separator char
	        BYTE  00h
	        BYTE  decimal separator char
	        BYTE  00h
	        BYTE  date separator char
	        BYTE  00h
	        BYTE  time separator char
	        BYTE  00h
	        BYTE  currency format
			bit 2 = set if currency symbol replaces decimal pt
			bit 1 = number of spaces between value and curr sym
			bit 0 = 0 if currency symbol precedes value
				1 if currency symbol follows value
	        BYTE  number of digits after decimal in currency
	        BYTE  time format
			bit 0 = 0 if 12-hour clock
				1 if 24-hour clock
	        DWORD address of case map routine (FAR CALL, AL = char to map)
	        BYTE  data-list separator char
	        BYTE  00h
	     10 BYTEs reserved
---------------------------------------------
INT 21 - DOS 2+ - CREATE A SUBDIRECTORY (MKDIR)
	AH = 39h
	DS:DX = address of ASCIZ pathname
Return: CF set on error
	    AX = error code (03h,05h)
---------------------------------------------
INT 21 - DOS 2+ - REMOVE A DIRECTORY ENTRY (RMDIR)
	AH = 3Ah
	DS:DX = address of ASCIZ pathname
Return: CF set on error
	    AX = error code (03h,05h,06h,10h)
---------------------------------------------
INT 21 - DOS 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR)
	AH = 3Bh
	DS:DX = address of ASCIZ directory name
Return: CF set on error
	    AX = error code (03h)
---------------------------------------------
INT 21 - DOS 2+ - CREATE A FILE WITH HANDLE (CREAT)
	AH = 3Ch
	CX = attributes for file
	    bit 0: read-only
		1: hidden
		2: system
		3: volume label
		4: reserved, must be zero (directory)
		5: archive bit
		7: if set, file is shareable under Novell NetWare
	DS:DX = address of ASCIZ filename
Return: CF set on error
	    AX = error code (03h,04h,05h)
	CF clear if successful
	    AX = file handle
---------------------------------------------
INT 21 - DOS 2+ - OPEN DISK FILE WITH HANDLE
	AH = 3Dh
	AL = access code
	    0 = Read Only
	    1 = Write Only
	    2 = Read/Write
	AL bits 7-3 = file-sharing modes (DOS 3.x)
	    bit 7    = inheritance flag, set for no inheritance
	    bits 4-6 = sharing mode
		      000 compatibility mode
		      001 exclusive (deny all)
		      010 write access denied (deny write)
		      011 read access denied (deny read)
		      100 full access permitted (deny none)
	    bit 3    = reserved, should be zero
	DS:DX = address of ASCIZ filename
Return: CF set on error
	    AX = error code (01h,02h,03h,04h,05h,0Ch)
	CF clear if successful
	    AX = file handle
---------------------------------------------
INT 21 - DOS 2+ - CLOSE A FILE WITH HANDLE
	AH = 3Eh
	BX = file handle
Return: CF set on error
	    AX = error code (06h)
---------------------------------------------
INT 21 - DOS 2+ - READ FROM FILE WITH HANDLE
	AH = 3Fh
	BX = file handle
	CX = number of bytes to read
	DS:DX = address of buffer
Return: CF set on error
	    AX = error code (05h,06h)
	CF clear if successful
	    AX = number of bytes read (0 if at EOF before call)
---------------------------------------------
INT 21 - DOS 2+ - WRITE TO FILE WITH HANDLE
	AH = 40h
	BX = file handle
	CX = number of bytes to write
	DS:DX -> buffer
Return: CF set on error
	    AX = error code (05h,06h)
	CF clear if successful
	    AX = number of bytes actually written
Note: if CX is zero, no data is written, and the file is truncated or extended
      to the current position
---------------------------------------------
INT 21 - DOS 2+ - DELETE A FILE (UNLINK)
	AH = 41h
	DS:DX -> ASCIZ name of file to delete
Return: CF set on error
	    AX = error code (02h,05h)
---------------------------------------------
INT 21 - DOS 2+ - MOVE FILE READ/WRITE POINTER (LSEEK)
	AH = 42h
	AL = method value
	    0 = offset from beginning of file
	    1 = offset from present location
	    2 = offset from end of file
	BX = file handle
	CX:DX = offset in bytes
Return: CF set on error
	    AX = error code (01h,06h)
	CF clear if successful
	    DX:AX = new offset
---------------------------------------------
INT 21 - DOS 2+ - GET/PUT FILE ATTRIBUTES (CHMOD)
	AH = 43h
	AL =
	    0 = get file attributes
	    1 = put file attributes
	       CX = file attribute bits
		   0 = read only
		   1 = hidden file
		   2 = system file
		   3 = volume label
		   4 = subdirectory
		   5 = written since backup
		   8 = shareable (Novell NetWare)
	DS:DX -> ASCIZ file name
Return: CF set on error
	    AX = error code (01h,02h,03h,05h)
	CX = file attributes on get
---------------------------------------------
INT 21 - DOS 2+ - IOCTL - GET DEVICE INFORMATION
	AX = 4400h
	BX = file or device handle
Return: CF set on error
	   AX = error code
	CF clear if successful
	   DX = device info
	   If bit 7 set: (character device)
	       bit 0: console input device
		   1: console output device
		   2: NUL device
		   3: CLOCK$ device
		   4: device is special
		   5: binary (raw) mode
		   6: Not EOF
		  12: network device (DOS 3.x)
		  14: can process IOCTL control strings (func 2-5)
	   If bit 7 clear: (file)
	       bits 0-5 are block device number
		   6: file has not been written
		  12: network device (DOS 3.x)
		  14: ??? (DOS 3.x)
		  15: file is remote (DOS 3.x)
---------------------------------------------
INT 21 - DOS 2+ - IOCTL - SET DEVICE INFORMATION
	AX = 4401h
	BX = device handle
	DH = 0
	DL = device information to set (bits 0-7 from function 0)
Return: CF set on error
	    AX = error code
---------------------------------------------
INT 21 - DOS 2+ - IOCTL - READ CHARACTER DEVICE CONTROL STRING
	AX = 4402h
	BX = device handle
	CX = number of bytes to read
	DS:DX -> buffer
Return: CF set on error
	    AX = error code
	CF clear if successful
	    AX = number of bytes read
---------------------------------------------
INT 21 - DOS 2+ - IOCTL - WRITE CHARACTER DEVICE CONTROL STRING
	AX = 4403h
	BX = device handle
	CX = number of bytes to write
	DS:DX -> buffer
Return: CF set on error
	    AX = error code
	CF clear if successful
	    AX = number of bytes written
---------------------------------------------
INT 21 - DOS 2+ - IOCTL - READ BLOCK DEVICE CONTROL STRING
	AX = 4404h
	BL = drive number (0=default)
	CX = number of bytes to read
	DS:DX -> buffer
Return: CF set on error
	   AX = error code
	CF clear if successful
	   AX = number of bytes read
---------------------------------------------
INT 21 - DOS 2+ - IOCTL - WRITE BLOCK DEVICE CONTROL STRING
	AX = 4405h
	BL = drive number (0=default)
	CX = number of bytes to write
	DS:DX -> buffer
Return: CF set on error
	    AX = error code
	CF clear if successful
	    AX = number of bytes written
---------------------------------------------
INT 21 - DOS 2+ - IOCTL - GET INPUT STATUS
	AX = 4406h
	BX = file or device handle
Return: AL = FFh device ready
	     00h device not ready
---------------------------------------------
INT 21 - DOS 2+ - IOCTL - GET OUTPUT STATUS
	AX = 4407h
	BX = file or device handle
Return: AL = FFh device ready
	     00h device not ready
Note: for DOS 2.x, files are always ready for output
---------------------------------------------
INT 21 - DOS 3.x - IOCTL - BLOCK DEVICE CHANGEABLE
	AX = 4408h
	BL = drive number (0=default)
Return: AX = 00h removable
	     01h fixed
	     0Fh invalid drive
---------------------------------------------
INT 21 - DOS 3.x - IOCTL - BLOCK DEVICE LOCAL
	AX = 4409h
	BL = drive number (0=default)
Return: DX = attribute word, bit 12 set if device is remote
---------------------------------------------
INT 21 - DOS 3.x - IOCTL - HANDLE LOCAL
	AX = 440Ah
	BX = file handle
Return: DX = attribute word, bit 15 set if file is remote
Note:	if file is remote, Novell Advanced NetWare 2.0 returns the number of
	the file server on which the handle is located in CX
---------------------------------------------
INT 21 - DOS 3.x - IOCTL - SET SHARING RETRY COUNT
	AX = 440Bh
	CX = delay (default 1)
	DX = retry count (default 3)
Return: CF set on error
	    AX = error code
---------------------------------------------
INT 21 - DOS 3.2 - IOCTL - GENERIC
	AX = 440Ch
	BX = device handle
	CH = category code
	    00h unknown (DOS 3.3)
	    01h COMn: (DOS 3.3)
	    03h CON (DOS 3.3)
	    05h LPTn:
	CL = function
	    45h set iteration count
	    4Ah select code page
	    4Ch start code-page preparation
	    4Dh end code-page preparation
	    65h get iteration count
	    6Ah query selected code page
	    6Bh query prepare list
	DS:DX -> parameter block
	    for CL=45h		WORD  iteration count
	    for CL=4Ah,4Dh,6Ah	WORD  length of data
				WORD  code page ID
	    for CL=4Ch		WORD  flags
				WORD  length of remainder of parameter block
				WORD  number of code pages following
			      N WORDs code page 1,...,N
	    for CL=6Bh		WORD  length of following data
				WORD  number of hardware code pages
			      N WORDs hardware code pages 1,...,N
				WORD  number of prepared code pages
			      N WORDs prepared code pages 1,...,N
Return: CF set on error
	    AX = error code
---------------------------------------------
INT 21 - DOS 3.2 - IOCTL - BLOCK DEVICE REQUEST
	AX = 440Dh
	BL = drive number (0=default)
	CH = category code
	    08h disk drive
	CL = function
 	    40h set device parameters
	    41h write logical device track
	    42h format and verify logical device track
	    60h get device parameters
	    61h read logical device track
	    62h verify logical device track
	DS:DX -> parameter block
	for functions 40h, 60h
	    BYTE  special functions
		bit 0 set if function to use current BPB, clear if Device BIOS
			Parameter Block field contains new default BPB
		bit 1 set if function to use track layout fields only
			must be clear if CL=60h
		bit 2 set if all sectors in track same size (should be set)
		bits 3-7 reserved
	    BYTE  device type
		00h  320K/360K disk
		01h  1.2M disk
		02h  720K disk
		03h  single-density 8-inch disk
		04h  double-density 8-inch disk
		05h  fixed disk
		06h  tape drive
		07h  other type of block device
	    WORD  device attributes
		bit 0 set if nonremovable medium
		bit 1 set if door lock supported
		bits 2-15 reserved
	    WORD  number of cylinders
	    BYTE  media type
		00h 1.2M disk (default)
		01h 320K/360K disk
	 31 BYTEs device BPB (see function 53h)
	    WORD  number of sectors per track (start of track layout field)
	  N word pairs: number,size of each sector in track
	for functions 41h, 61h
	    BYTE  reserved, must be zero
	    WORD  number of disk head
	    WORD  number of disk cylinder
	    WORD  number of first sector to read/write
	    WORD  number of sectors
	    DWORD transfer address
	for functions 42h, 62h
	    BYTE  reserved, must be zero
	    WORD  number of disk head
	    WORD  number of disk cylinder
Return: CF set on error
	   AX = error code
---------------------------------------------
INT 21 - DOS 3.2 - IOCTL - GET LOGICAL DRIVE MAP
	AX = 440Eh
	BL = drive number (0=default)
Return: CF set on error
	    AX = error code
	CF clear if successful
	    AL = 0 block device has only one logical drive assigned
		 1..26 the last letter used to reference the drive (1=A:,etc)
---------------------------------------------
INT 21 - DOS 3.2 - IOCTL - SET LOGICAL DRIVE MAP
	AX = 440Fh
	BL = physical drive number (0=default)
Return: CF set on error
	    AX = error code
Note: maps logical drives to physical drives, similar to DOS's treatment of
	a single physical floppy drive as both A: and B:
---------------------------------------------
INT 21 - DOS 2+ - CREATE DUPLICATE HANDLE (DUP)
	AH = 45h
	BX = file handle to duplicate
Return: CF set on error
	    AX = error code (04h,06h)
	CF clear if successful
	    AX = new file handle
---------------------------------------------
INT 21 - DOS 2+ - FORCE DUPLICATE HANDLE (FORCDUP,DUP2)
	AH = 46h
	BX = existing file handle
	CX = new file handle
Return: CF set on error
	    AX = error code (04h,06h)
Note: closes file with handle BX if it is still open
---------------------------------------------
INT 21 - DOS 2+ - GET CURRENT DIRECTORY
	AH = 47h
	DL = drive (0=default, 1=A, etc.)
	DS:SI points to 64-byte buffer area
Return: CF set on error
	    AX = error code (0Fh)
Note: the returned path does not include the initial backslash
---------------------------------------------
INT 21 - DOS 2+ - ALLOCATE MEMORY
	AH = 48h
	BX = number of 16-byte paragraphs desired
Return: CF set on error
	    AX = error code (07h,08h)
	    BX = maximum available
	CF clear if successful
	    AX = segment of allocated memory block
---------------------------------------------
INT 21 - DOS 2+ - FREE MEMORY
	AH = 49h
	ES = segment address of area to be freed
Return: CF set on error
	    AX = error code (07h,09h)
---------------------------------------------
INT 21 - DOS 2+ - ADJUST MEMORY BLOCK SIZE (SETBLOCK)
	AH = 4Ah
	ES = segment address of block to change
	BX = new size in paragraphs
Return: CF set on error
	    AX = error code (07h,08h,09h)
	    BX = maximum size possible for the block
---------------------------------------------
INT 21 - DOS 2+ - LOAD OR EXECUTE (EXEC)
	AH = 4Bh
	AL = subfunction
	    0 = load and execute program
	    1 = load but do not execute (internal)
	    3 = load overlay; do not create PSP
	DS:DX = filename
	ES:BX = parameter block
	       AL =
		  0: WORD segment of environment (0 = use current)
		     DWORD -> command line
		     DWORD -> FCB 1
		     DWORD -> FCB 2
		  1: WORD segment of environment (0 = use current)
		     DWORD -> command line
		     DWORD -> FCB 1
		     DWORD -> FCB 2
		     DWORD (DOS 3.x) will hold SS:SP on return
		     DWORD (DOS 3.x) will hold entry point (CS:IP) on return
		  3: WORD segment load address
		     WORD segment relocation factor
Return: CF set on error
	    AX = error code (01h,02h,05h,08h,0Ah,0Bh)
	CF clear if successful
	    if function 1 and DOS 3.x or DESQview, process ID set to new
		program's PSP; get with function 62h
	    if function 1 and DOS 2.x, new program's initial stack and 
		entry point returned in registers
Note: DOS 2.x destroys all registers, including SS:SP

Structure of .EXE file header:
 00h	WORD  4Dh, 5Ah signature (sometimes 5Ah, 4Dh)
 02h	WORD  image size remainder (program size mod 512)
 04h	WORD  file size in pages (program size div 512) 
 06h	WORD  number of relocation items
 08h	WORD  header size in paragraphs
 0Ah	WORD  minimum extra paragraphs needed
 0Ch	WORD  maximum extra paragraphs needed
 0Eh	WORD  stack segment
 10h	WORD  stack offset
 12h	WORD  word checksum of entire file
 14h	DWORD initial CS:IP
 18h	WORD  offset of relocation table 
 1Ah	WORD  overlay number
---------------------------------------------
INT 21 - DOS 2+ - QUIT WITH EXIT CODE (EXIT)
	AH = 4Ch
	AL = exit code
Return: never returns
---------------------------------------------
INT 21 - DOS 2+ - GET EXIT CODE OF SUBPROGRAM (WAIT)
	AH = 4Dh
Return: AL = exit code of subprogram (functions 31h or 4Ch)
	AH = circumstance which caused termination
	    0 = Terminate/abort
	    1 = Control-C
	    2 = Hard error
	    3 = Terminate and stay resident
---------------------------------------------
INT 21 - DOS 2+ - FIND FIRST ASCIZ (FIND FIRST)
	AH = 4Eh
	CX = search attributes
	DS:DX -> ASCIZ filename
Return: CF set on error
	    AX = error code (02h,12h)
	[DTA] = data block
	      undocumented fields, 21 bytes total
		 ---PCDOS 3.10---
		      BYTE  drive letter
		   11 BYTEs search template
		      BYTE  search attributes
		 ---DOS 2.x (and DOS 3.x except 3.1???)---
		      BYTE  search attributes
		      BYTE  drive letter
		   11 BYTEs search template
		 ---both 2.x and 3.x---
                      WORD  entry count within directory
		    4 BYTEs reserved
		      WORD  cluster number of parent directory
	      BYTE  attribute of file found
	      WORD  file time
	      WORD  file date
	      DWORD file size
	   13 BYTEs ASCIZ filename+extension
---------------------------------------------
INT 21 - DOS 2+ - FIND NEXT ASCIZ (FIND NEXT)
	AH = 4Fh
	[DTA] = data block from last AH = 4Eh/4Fh call
Return: CF set on error
	    AX = error code (12h)
	[DTA] = data block, see AH = 4Eh above
---------------------------------------------
INT 21 - DOS 2+ internal - SET PSP SEGMENT
	AH = 50h
	BX = segment address of new PSP
Note: under DOS 2.xx, this function cannot be invoked inside an INT 28h handler
      without setting the Critical Error flag
---------------------------------------------
INT 21 - DOS 2+ internal - GET PSP SEGMENT
	AH = 51h
Return: BX = current PSP segment
Note: under DOS 2.xx, this function cannot be invoked inside an INT 28h handler
      without setting the Critical Error flag

Structure of PSP:
 00h  2 BYTEs program exit point
 02h  	WORD  memory size in paragraphs
 04h	BYTE  unused
 05h  5 BYTEs CP/M entry point
 0Ah	DWORD terminate address (old INT 22h)
 0Eh	DWORD break address (old INT 23h)
 12h	DWORD critical error handler (old INT 24h)
 16h	WORD  parent PSP segment
 18h 20 BYTEs DOS 2+ open file table, FFh = unused
 2Ch	WORD  DOS 2+ environment segment
 2Eh	DWORD DOS 2+ process's SS:SP on entry to last INT 21 call
 32h	WORD  DOS 3.x max open files
 36h	DWORD DOS 3.x open file table address
 38h 24 BYTEs unused by DOS versions <= 3.3
 50h  3 BYTEs DOS function dispatcher (FAR routine)
 53h  9 BYTEs unused
 5Ch 16 BYTEs FCB #1, filled in from first commandline argument
 6Ch 20 BYTEs FCB #2, filled in from second commandline argument
 80h 128 BYTEs command tail / default DTA buffer
---------------------------------------------
INT 21 - DOS 2+ internal - GET LIST OF LISTS
	AH = 52h
Return: ES:BX points to DOS list of lists

List of Lists:
Bytes	Value
-2&-1	segment of first memory control block
00h-03h pointer to first DOS Device Control Block (see function 32h)
04h-07h pointer to list of DOS file tables
	DWORD pointer to next file table
	WORD  number of files in this table
	35h bytes per file
	  00h-01h number of file handles referring to this file
	  02h	  access mode (see function 3Dh)
	  03h-04h ???
	  05h-06h device info word (see function 44h/AL=00h)
	  07h-0Ah pointer to device driver header if character device
		  pointer to DOS Device Control Block if block device (see
		  func 32h for format)
	  0Bh-0Ch starting cluster of file
	  0Dh-0Eh file time in packed format
	  0Fh-10h file date in packed format
	  11h-14h file size
	  15h-18h current offset in file
	  19h-1Ah ???
	  1Bh-1Ch last cluster read
	  1Dh-1Eh number of sector containing directory entry
	  1Fh	  offset of directory entry within sector (byte offset/32)
	  20h-2Ah filename in FCB format (no path, no period, blank-padded)
	  2Bh-30h unused??? I see 0 always
	  31h-32h PSP segment of file's owner
	  33h-34h unused??? I see 0 always
08h-0Bh pointer to CLOCK$ device driver, whether installable or resident
0Ch-0Fh pointer to actual CON: device driver, whether installable or resident
-----DOS 2.x
10h	number of logical drives in system
11h-12h maximum bytes/block of any block device
13h-16h pointer to first disk buffer
	10h bytes control info followed by the 512-byte buffer
	     DWORD pointer to next disk buffer, FFFFh if last
	   4 BYTEs ???
	     WORD  logical sector number
	   2 BYTEs ???
	     DWORD pointer to DOS Device Control Block (see function 32h)
17h	Beginning (not a pointer--the real beginning!) of NUL device driver.
	This is the first device on DOS's linked list of device drivers.
-----DOS 3.x
10h-11h maximum bytes/block of any block device
12h-15h pointer to first disk buffer
	10h bytes control info per disk buffer, followed by 512-byte buffer
	   DWORD pointer to next disk buffer, FFFFh if last
	   BYTE  drive (0=A:)
	   BYTE  flags
		bit 7: ???
		bit 6: ???
		bit 5: contents may be overwritten if set (buffer not dirty)
		bit 4: ???
		bit 3: sector in data area
		bit 2: sector in root directory
		bit 1: sector in FAT
		bit 0: ???
 	   WORD  logical sector number
	   BYTE  ???
	   BYTE  ???
	   DWORD pointer to DOS Device Control Block (see function 32h)
	   WORD  unused??? (almost always 0)
16h-19h pointer to array of drive info:
	51h bytes per drive, starting with A: ...
	  00h-42h current path as ASCIZ, starting with 'x:\'
	  43h     ??? I see zero always
	  44h	  ??? I see 40h always
	  45h-48h pointer to DOS Disk Block for this drive
	  49h-4Ah starting cluster of current dir, 0 = root, -1 never accessed
	  4Bh-4Ch ??? I see FFFFh always
	  4Dh-4Eh ??? I see FFFFh always
	  4Fh-50h ??? I see 2 always
1Ah-1Dh pointer to FCB table (if CONFIG.SYS contains FCBS=)
1Eh-1Fh size of FCB table
20h	number of block devices
21h	value of LASTDRIVE command in CONFIG.SYS (default 5)
22h	Beginning (not a pointer--the real beginning!) of NUL device driver.
	This is the first device on DOS's linked list of device drivers.
	device driver header format:
	  DWORD pointer to next driver or -1 if last driver
	  WORD	device attributes
		bit 15	character device if set, block if clear
		bit 14	IOCTL supported
		bit 13	output until busy (character device)
			non-IBM format (block devices)
		bit 12	reserved
		bit 11	OPEN/CLOSE/RM calls supported
		bit 10-5 reserved
		bit 4	device is special (uses INT 29 for fast console output)
		bit 3	device is CLOCK
		bit 2	device is NUL
		bit 1	device is standard output
		bit 0	device is standard input
	  WORD	device strategy entry point
	  WORD	device interrupt entry point
	8 BYTEs blank-padded character device name
	  WORD	(CD-ROM driver) 0
	  BYTE	(CD-ROM driver) drive letter
	  BYTE	(CD-ROM driver) number of units
---------------------------------------------
INT 21 - DOS 2+ internal - TRANSLATE BPB
	AH = 53h
	DS:SI -> BPB (Bios Parameter Block)
	ES:BP -> buffer for DOS Disk Block
Note:	Translates BPB (Bios Parameter Block, see below) into a DOS Disk Block
	(see function 32h).

BPB structure:
 00h	WORD  bytes/sector. Get from DDB bytes 2-3.
 02h	BYTE  sectors/cluster. Get from (DDB byte 4) + 1
 03h	WORD  reserved sectors. Get from DDB bytes 6-7
 05h	BYTE  number of FATs. Get from DDB byte 8
 06h	WORD  number of root dir entries. Get from DDB bytes 09h-0Ah
 08h	WORD  total number of sectors. Get from:
	((DDB bytes D-E) - 1) * (sectors per cluster (BPB byte 2))
	  + (DDB Bytes B-C)
 0Ah	BYTE  media descriptor byte. Get from DDB byte 16h
 0Bh	WORD  number of sectors/FAT. Get from DDB byte 0Fh
---DOS 3.x---
 0Dh	WORD  number of sectors per track
 0Fh	WORD  number of heads
 11h	DWORD number of hidden sectors
 15h 11 BYTEs reserved	
---------------------------------------------
INT 21 - DOS 2+ - GET VERIFY FLAG
	AH = 54h
Return: AL = 0 if flag OFF
	AL = 1 if flag ON
---------------------------------------------
INT 21 - DOS 2+ internal - CREATE PSP
	AH = 55h
	DX = segment number at which to set up PSP
Note: Like func 26h but creates "child" PSP rather than copying existing one.
---------------------------------------------
INT 21 - DOS 2+ - RENAME A FILE
	AH = 56h
	DS:DX -> ASCIZ old name
	ES:DI -> ASCIZ new name
Return: CF set on error
	    AX = error code (02h,03h,05h,11h
Note: allows move between directories on same logical volume
      (DOS 3.x) allows renaming of directories
---------------------------------------------
INT 21 - DOS 2+ - GET FILE'S DATE/TIME
	AX = 5700h
	BX = file handle
Return: CF set on error
	    AX = error code (01h,06h)
	CF clear if successful
	    CX = time of last write
	    DX = date of last write
---------------------------------------------
INT 21 - DOS 2+ - SET FILE'S DATE/TIME
	AX = 5701h
	BX = file handle
	CX = time to be set
	DX = date to be set
Return: CF set on error
	    AX = error code (01h,06h)
---------------------------------------------
INT 21 - DOS 3.x - GET/SET MEMORY ALLOCATION STRATEGY
	AH = 58h
	AL = function code
	    0 = get allocation strategy
	    1 = set allocation strategy
	       BL = strategy code
		   0 first fit (use first memory block large enough)
		   1 best fit (use smallest memory block large enough)
		   2 last fit (use high part of last usable memory block)
Return: CF set on error
	    AX = error code (01h)
	CF clear if successful
	    AX = strategy code
Note: the Set subfunction accepts any value in BL; 2 or greater means last fit.
      the Get subfunction returns the last value set, so programs should check
      whether the value is >= 2, not just equal to 2.
---------------------------------------------
INT 21 - DOS 3.x - GET EXTENDED ERROR CODE
	AH = 59h
	BX = version code (0000 for DOS 3.x)
Return: AX = extended error code
	BH = class of error
	BL = suggested action code
	CH = locus (where error occurred)
	CL, DX, SI, DI, BP, DS, and ES destroyed

Error codes:
	01h function number invalid
	02h file not found
	03h path not found
	04h too many open files (no handles available)
	05h access denied
	06h invalid handle
	07h memory control block destroyed
	08h insufficient memory
	09h memory block address invalid
	0Ah environment invalid
	0Bh format invalid
	0Ch access code invalid
	0Dh data invalid
	0Fh invalid drive
	10h attempted to remove current directory
	11h not same device
	12h no more files
	13h disk write-protected
	14h unknown unit
	15h drive not ready
	16h unknown command
	17h data error (CRC)
	18h bad request structure length
	19h seek error
	1Ah unknwon media type (non-DOS disk)
	1Bh sector not found
	1Ch printer out of paper
	1Dh write fault
	1Eh read fault
	1Fh general failure
	20h sharing violation
	21h lock violation
	22h disk change invalid
	    ES:DI -> ASCIZ volume label of required disk
	23h FCB unavailable
	24h sharing buffer overflow
	25h-31h reserved
	32h Network request not supported (DOS 3.1 + MS Networks)
	33h Remote computer not listening
	34h Duplicate name on network
	35h Network name not found
	36h Network busy
	37h Network device no longer exists
	38h Network BIOS command limit exceeded
	39h Network adapter hardware error
	3Ah Incorrect response from network
	3Bh Unexpected network error
	3Ch Incompatible remote adapter
	3Dh Print queue full
	3Eh Queue not full
	3Fh Not enough space to print file
	40h Network name was deleted
	41h Network: Access denied
	42h Network device type incorrect
	43h Network name not found
	44h Network name limit exceeded
	45h Network BIOS session limit exceeded
	46h Temporarily paused
	47h Network request not accepted
	48h Print/disk redirection paused (DOS 3.1 + MS Networks)
	49h-4Fh reserved
	50h file exists
	51h reserved
	52h cannot make directory
	53h fail on INT 24h
	54h (DOS 3.3) too many redirections
	55h (DOS 3.3) duplicate redirection
	56h (DOS 3.3) invalid password
	57h (DOS 3.3) invalid parameter
	58h (DOS 3.3) network write fault
Error Classes:
	01h out of resource (storage space or I/O channels)
	02h temporary situation (file or record lock)
	03h authorization (denied access)
	04h internal (system software bug)
	05h hardware failure
	06h system failure (configuration file missing or incorrect)
	07h application program error
	08h not found
	09h bad format
	0Ah locked
	0Bh media error
	0Ch already exists
	0Dh unknown
Suggested Action:
	01h retry
	02h delayed retry
	03h prompt user to reenter input
	04h abort after cleanup
	05h immediate abort
	06h ignore
	07h retry after user intervention
Error Locus:
	01h unknown or not appropriate
	02h block device (disk error)
	03h network related
	04h serial device (timeout)
	05h memory related
---------------------------------------------
INT 21 - DOS 3.x - CREATE UNIQUE FILE
	AH = 5Ah
	DS:DX -> ASCIZ directory path name ending with a '\' + 13 bytes to
		 receive generated filename
	CX = file attribute
Return: CF set on error
	    AX = error code (03h,05h)
	CF clear if successful
	    AX = file handle
	DS:DX -> path name
Note: The file created is not truly "temporary".  It MUST be removed by the
      user.
---------------------------------------------
INT 21 - DOS 3.x - CREATE NEW FILE
	AH = 5Bh
	DS:DX -> ASCIZ directory path name
	CX = file attribute
Return: CF set on error
	    AX = error code (03h,04h,05h,50h)
	CF clear if successful
	DS:DX -> path name
Note: Unlike function 3Ch, function 5Bh will fail if the file already exists.
---------------------------------------------
INT 21 - DOS 3.x - LOCK/UNLOCK FILE ACCESS
	AH = 5Ch
	AL = 00h lock
	     01h unlock
	BX = file handle
	CX:DX = starting offset of region to lock
	SI:DI = size of region to lock
Return: CF set on error
	    AX = error code (01h,06h,21h)
---------------------------------------------
INT 21 - DOS 3.1 internal - INDIRECT FUNCTION CALL
	AX = 5D00h
	DS:DX -> buffer containing register values
	             AX, BX, CX, DX, SI, DI, DS, ES 
		 for a call to INT 21h
Return: as appropriate for function being called
Notes:  does not check AH.  Out of range values will crash the system
---------------------------------------------
INT 21 - DOS 3.1 internal - SYNC???
	AX = 5D01h
	???
Return: ???
Note: does something to each disk file in the System File Table which has been
	written to; if remote file, calls INT 2F/AX=1107h
      seems to update the time stamp of all open files which have been written
---------------------------------------------
INT 21 - DOS 3.1 internal - network - ???
	AX = 5D02h
	???
Return: ???
Note: error unless network is loaded
---------------------------------------------
INT 21 - DOS 3.1 internal - network - ???
	AX = 5D03h
	???
Return: ???
Note: error unless network is loaded
---------------------------------------------
INT 21 - DOS 3.1 internal - network - ???
	AX = 5D04h
	???
Return: ???
Note: error unless network is loaded
---------------------------------------------
INT 21 - DOS 3.1 internal - network - ???
	AX = 5D05h
	???
Return: ES:DI = ???
	BX = ???
	CX = ???
Note: error unless network is loaded
---------------------------------------------
INT 21 - DOS 3.x internal - GET ADDRESS OF CRITICAL ERROR FLAG
	AX = 5D06h
Return: DS:SI -> critical error flag
	BX = ???
	CX = ???
Notes:	this call does a lot of other work in addition to returning the	pointer
	setting CritErr flag allows use of functions 50h/51h from INT 28h under
	DOS 2.x by forcing use of correct stack
---------------------------------------------
INT 21 - DOS 3.x internal - ???
	AH = 5Dh
	AL = subfunction
	     07h: ???
	     08h: ??? (used by COMMAND.COM)
	     09h: ??? (used by COMMAND.COM)
Return: ???
Note: in DOS 3.10, these are identical, and call INT 2F/AX=1125h
---------------------------------------------
INT 21 - DOS 3.1+ internal - SET EXTENDED ERROR INFORMATION
	AX = 5D0Ah
	DS:DX = address of 11-word error information
	       words 0 to 7: values of AX,BX,CX,DX,SI,DI,DS,ES that func 59h
			     will return
	       words 8 to 10: zero (reserved)
---------------------------------------------
INT 21 - DOS 3.1 + Microsoft Networks - GET MACHINE NAME
	AX = 5E00h
	DS:DX -> buffer for ASCIZ name (16 bytes)
Return: CF set on error
	    AX = error code (01h)
	CH = 0 if name not defined
          <> 0 defined
		CL = NETBIOS name number
		DS:DX -> ASCIZ machine name
---------------------------------------------
INT 21 - DOS 3.1 + Microsoft Networks - SET MACHINE NAME
	AX = 5E01h
	DS:DX -> ASCIZ name
	CL = name number
	CH = ???
---------------------------------------------
INT 21 - DOS 3.1 + Microsoft Networks - SET PRINTER SETUP
	AX = 5E02h
	BX = Redirection list index
	CX = length of setup string (<= 64)
	DS:SI -> string buffer
Return: CF set on error
	    AX = error code (01h)
---------------------------------------------
INT 21 - DOS 3.1 + Microsoft Networks - GET PRINTER SETUP
	AX = 5E03h
	BX = Redirection list index
	ES:DI -> string buffer
Return: CF set on error
	    AX = error code (01h)
	CX = length of setup string (<= 64)
---------------------------------------------
INT 21 - DOS 3.1 + Microsoft Networks - GET REDIRECTION LIST ENTRY
	AX = 5F02h
	BX = Redirection list index
	DS:SI -> 16 char local device name buffer
	ES:DI -> 128 char network name buffer
Return: CF set on error
	    AX = error code (01h,12h)
	BH = Device status flag (BIT 0 = 0 if valid)
	BL = device type (03 if printer, 04 if drive)
	CX = stored parameter value (user data)
Note: DX and BP are destroyed by this call!
---------------------------------------------
INT 21 - DOS 3.1 + Microsoft Networks - REDIRECT DEVICE
	AX = 5F03h
	BL = device type
		03 = printer device
		04 = file device
	CX = stored parameter value
	DS:SI -> ASCIZ source device name
	ES:DI -> destination ASCIZ network path + ASCIZ password
Return: CF set on error
	    AX = error code (01h,03h,05h,08h)
---------------------------------------------
INT 21 - DOS 3.1 + Microsoft Networks - CANCEL REDIRECTION
	AX = 5F04h
	DS:SI -> ASCIZ device name or network path
Return: CF set on error
	    AX = error code (01h,0Fh)
---------------------------------------------
INT 21 - DOS 3.x internal - RESOLVE PATH STRING TO FULLY QUALIFIED PATH STRING
	AH = 60h
	DS:SI = relative path string
	ES:DI = buffer for fully qualified name
Return: buffer filled with qualified name; may return error code, unknown.
---------------------------------------------
INT 21 - DOS 3.x internal - UNUSED
	AH = 61h
Return: AL = 0
---------------------------------------------
INT 21 - DOS 3.x - GET PSP ADDRESS
	AH = 62h
Return: BX = segment address of PSP
---------------------------------------------
INT 21 - DOS 2.25 only - GET LEAD BYTE TABLE
	AH = 63h
	AL = subfunction
	     0 = get system lead byte table
	     1 = set/clear interim console flag
		DL = 1/0 to set/clear interim console flag
	     2 = get interim console flag
Return: CF set on error
	    AX = error code
	DS:SI -> lead byte table (AL = 0)
	DL = interim console flag (AL = 2)
Note: does not preserve any registers other than SS:SP
---------------------------------------------
INT 21 - DOS 3.2 internal - ???
	AH = 64h
	AL = subfunction
	    00h get ???
		Return: DL = ???
	    01h set ???
		DL = ???
	    02h get and set ???
		DL = new ???
		Return: DL = old ???
---------------------------------------------
INT 21 - DOS 3.3 internal - ???
	AH = 64h
	AL = flag
		0  ??? 
	    non-0  ??? 
Return: nothing
Note: seems to have something to do with the network
---------------------------------------------
INT 21 - DOS 3.3 - GET EXTENDED COUNTRY INFORMATION
	AH = 65h
	AL = info ID
	    01h get general internationalization info
	    02h get pointer to uppercase table
	    04h get pointer to filename uppercase table
	    06h get pointer to collating sequence table
	BX = code page (-1=global code page)
	DX = country ID (-1=current country)
	ES:DI -> country information buffer
	CX = size of buffer (>= 5)
Return: CF set on error
	    AX = error code
	CF clear if succesful
	    CX = size of country information returned
	    ES:DI -> country information:
		BYTE  info ID
		if info ID == 1
		    WORD  size
		    WORD  country ID
		    WORD  code page
		 34 BYTEs see function 38h
		if info ID == 2
		    DWORD pointer to uppercase table
			  WORD	table size
		      128 BYTEs uppercase equivalents (if any) of chars 80h-FFh
		if info ID == 4
		    DWORD pointer to collating table
		  	  WORD	table size
		      256 BYTEs values used to sort characters 00h-FFh
		if info ID == 6
		    DWORD pointer to filename uppercase table
			  WORD	table size
		      128 BYTEs uppercase equivalents (if any) of chars 80h-FFh
---------------------------------------------
INT 21 - DOS 3.3 - GET GLOBAL CODE PAGE TABLE
	AH = 6601h
Return: CF set on error
	    AX = error code
	CF clear if successful
	    BX = active code page
	    DX = system code page
---------------------------------------------
INT 21 - DOS 3.3 - SET GLOBAL CODE PAGE TABLE
	AX = 6602h
	BX = active code page
	    437  US
	    850  Multilingual
	    860  Portugal
	    863  Canada (French)
	    865  Norway/Denmark
	DX = system code page (active page at boot time)
Return: CF set on error
	    AX = error code
---------------------------------------------
INT 21 - DOS 3.3 - SET HANDLE COUNT
	AH = 67h
	BX = desired number of handles (max 255)
Return: CF set if error (and error code in AX)
---------------------------------------------
INT 21 - DOS 3.3 - COMMIT FILE, WRITE ALL BUFFERED DATA TO DISK
	AH = 68h
	BX = file handle
Return: CF set on error (and error code in AX)
Note: if BX <= 20, no action is taken
---------------------------------------------
INT 21 - DOS 4.0 internal - GET DISK SERIAL NUMBER
	AH = 69h
	AL = subfunction???
	    0
	DS:DX -> buffer
		WORD  ??? (zero)
		DWORD  disk serial number (binary)
	     11 BYTEs volume label or "NO NAME	  " if none present
	      8 BYTEs FAT type--string "FAT12	" or "FAT16  "
Return: buffer filled with appropriate values
---------------------------------------------
INT 21 - DOS 4.0 internal - ???
	AH = 6Ah
	???
Return: ???
---------------------------------------------
INT 21 - DOS 4.0 internal - ???
	AH = 6Bh
	???
Return: ???
---------------------------------------------
INT 21 - DOS 4.0 - EXTENDED OPEN/CREATE
	AX = 6C00h
	BL = open mode as in AL for normal open
	BH = 0WF00000
	    W = auto commit on write
	    F = return error rather than doing INT 24h
	CX = create attribute
	DL = action if file exists/does not exists
	    bits 7-4 action if file does not exist
		    0000 fail
		    0001 create
	    bits 3-0 action if file exists
		    0000 fail
		    0001 open
		    0010 replace/open
	DH = 0
	DS:SI -> ASCIZ file name
Return: CF set on error
	   AX = error code
	CF clear if successful
	   AX = file handle
	   CX = 1 file opened
		2 file created
		3 file replaced
---------------------------------------------
INT 21 - ???
	AH = 89h
	???
Note: called by Microsoft C 4.0 startup code
---------------------------------------------
INT 21 - Novell NetWare SFT Level II - EXTENDED FILE ATTRIBUTES
	AH = B6h
	AL = subfunction
	    00h get extended file attributes
	    01h set extended file attributes
	CL = attributes
	    bit 4: transaction tracking file
		5: indexing file (to be implemented)
		6: read audit (to be implemented)
		7: write audit (to be implemented)
	DS:DX -> ASCIZ pathname
Return: CF set on error
	    AL = error code
		FFh file not found
		8Ch caller lacks privileges
	CL = current extended file attributes
---------------------------------------------
INT 21 - Novell Advanced NetWare 2.0+ - PRINT JOBS
	AH = B8h
	AL = subfunction
	    00h get default print job flags
	    01h set default capture flags
	    02h get specific capture flags
	    03h set specific print job flags
	    04h get default local printer
	    05h set default local printer
	    06h set capture print queue
	    07h set capture print job
	    08h get banner user name
	    09h set banner user name
	CX = buffer size
	ES:BX -> buffer
Return: none
---------------------------------------------
INT 21 - Novell NetWare 4.0 - SET END OF JOB STATUS
	AH = BBh
	AL = new EOJ flag
	    00h disable EOJs
	    otherwise enable EOJs
Return: AL = old EOJ flag
---------------------------------------------
INT 21 - Novell NetWare 4.6 - LOG PHYSICAL RECORD
	AH = BCh
	AL = flags
	    bit 0: lock as well as log record
		1: non-exclusive lock
	BX = file handle
	CX:DX = offset
	BP = timeout in timer ticks (1/18 sec)
	SI:DI = length
Return: AL = error code
---------------------------------------------
INT 21 - Novell NetWare 4.6 - RELEASE PHYSICAL RECORD
	AH = BDh
	BX = file handle
	CX:DX = offset
Return: AL = error code
---------------------------------------------
INT 21 - Novell NetWare 4.6 - CLEAR PHYSICAL RECORD
	AH = BEh
	BX = file handle
	CX:DX = offset
Return: AL = error code
---------------------------------------------
INT 21 - Novell NetWare 4.6 - LOG RECORD (FCB)
	AH = BFh
	AL = flags
	    bit 0: lock as well as log record
		1: non-exclusive lock
	DS:DX -> FCB
	BX:CX = offset
	BP = timeout in timer ticks (1/18 sec)
	SI:DI = length
Return: AL = error code
---------------------------------------------
INT 21 - Novell NetWare 4.6 - RELEASE RECORD (FCB)
	AH = C0h
	DS:DX -> FCB
	BX:CX = offset
Return: AL = error code
---------------------------------------------
INT 21 - Novell NetWare 4.6 - CLEAR RECORD (FCB)
	AH = C1h
	DS:DX -> FCB
	BX:CX = offset
Return: AL = error code
---------------------------------------------
INT 21 - Novell NetWare 4.6 - LOCK PHYSICAL RECORD SET
	AH = C2h
	AL = flags
	    bit 1: non-exclusive lock
	BP = timeout in timer ticks (1/18 sec)
--