[comp.sys.ibm.pc] Interrupt list, part 2 of 8

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

Return: pops up "Programming error" window in DV 2.00
------------------------------------------------------
INT 15 - TopView - "LOCATE" - FIND WINDOW AT A GIVEN SCREEN LOCATION
	AX = 1018h
	BH = column
	BL = row
	ES = segment of object handle for ???
	     (0 = use default)
Return: ES = segment of object handle for window which is visible at the
	     indicated position
------------------------------------------------------
INT 15 - TopView - "SOUND" - MAKE TONE
	AX = 1019h
	BX = frequency in Hertz
	CX = duration in clock ticks (18.2 ticks/sec)
Return: immediately, tone continues to completion
Notes: if another tone is already playing, the new tone does not start until
       completion of the previous one.	In DV 2.00, it is possible to enqueue
       about 32 tones before the process is blocked until a note completes.
       in DV 2.00, the lowest tone allowed is 20 Hz
------------------------------------------------------
INT 15 - TopView - "OSTACK" - SWITCH TO TASK'S INTERNAL STACK
	AX = 101Ah
Return: stack switched
------------------------------------------------------
INT 15 - TopView - "BEGINC" - BEGIN CRITICAL REGION
	AX = 101Bh
Return: task-switching temporarily disabled
Note: will not task-switch until END CRITICAL REGION (AX = 101Ch) called
------------------------------------------------------
INT 15 - TopView - "ENDC" - END CRITICAL REGION
	AX = 101Ch
Return: task-switching enabled
------------------------------------------------------
INT 15 - TopView - "STOP" - STOP TASK
	AX = 101Dh
	ES = segment of object handle for task to be stopped
	     (== handle of main window for that task)
Return: indicated task will no longer get CPU time
Note: at least in DV 2.00, this function is ignored unless the indicated task
      is the current task.
------------------------------------------------------
INT 15 - TopView - "START" - START TASK
	AX = 101Eh
	ES = segment of object handle for task to be started
	     (== handle of main window for that task)
Return: indicated task is started up again
------------------------------------------------------
INT 15 - TopView - "DISPEROR" - POP-UP ERROR WINDOW
	AX = 101Fh
	BX = bit fields
	     bits 0-12: number of characters to display
	     bits 13,14: which mouse button may be pressed to remove window
			 00 = either
			 01 = left
			 10 = right
			 11 = either
	     bit 15: beep if 1
	DS:DI -> text of message
	CH = width of error window (0 = default)
	CL = height of error window (0 = default)
	DX = segment of object handle
Return: BX = status: 1 = left button, 2 = right, 27 = ESC pressed
Note: window remains on-screen until ESC or indicated mouse button is pressed
------------------------------------------------------
INT 15 - TopView - UNIMPLEMENTED IN DV 2.0x
	AX = 1020h
Return: pops up "Programming error" window in DV 2.0x
------------------------------------------------------
INT 15 - TopView - "PGMINT" - INTERRUPT ANOTHER TASK
	AX = 1021h
	BX = segment of object handle for task to interrupt
	DX:CX = address of FAR routine to jump to next time task is run
Return: nothing???
Note: the current ES, DS, SI, DI, and BP are passed to the FAR routine
------------------------------------------------------
INT 15 - TopView - "GETVER" - GET VERSION
	AX = 1022h
	BX = 0
Return: BX nonzero, TopView or compatible loaded
	(BL = major version, BH = minor version)
Notes: TaskView returns BX = 0001h, DESQview 2.0 returns BX = 0A01h
------------------------------------------------------
INT 15 - TopView - "POSWIN" - POSITION WINDOW
	AX = 1023h
	BX = segment of object handle for parent window within which to
	     position the window (0 = full screen)
	ES = segment of object handle for window to be positioned
	DL = bit flags
	     bits 0,1: horizontal position
		00 = current
		01 = center
		10 = left
		11 = right
	     bits 2,3: vertical position
		00 = current
		01 = center
		10 = top
		11 = bottom
	     bit 4: don't redraw screen if set
	     bits 5-7 not used
	CH = number of columns to offset from position specified by DL
	CL = number of rows to offset from position specified by DL
Return: nothing
------------------------------------------------------
INT 15 - TopView - "GETBUF" - GET VIRTUAL SCREEN INFO
	AX = 1024h
	BX = segment of object handle for window
	      (0 = use default)
Return: ES:DI = address of virtual screen
	CX = size of virtual screen in bytes
	DL = 0 ???
	     1 ???
------------------------------------------------------
INT 15 - TopView - "USTACK" - SWITCH BACK TO USER'S STACK
	AX = 1025h
Return: stack switched back
Note: call only after INT 15h/AX=101Ah
------------------------------------------------------
INT 15 - DESQview (TopView???) - UNIMPLEMENTED IN DV 2.0x
	AH = 10h
	AL = 26h thru 2Ah
Return: pops up "Programming error" window in DV 2.0x
------------------------------------------------------
INT 15 - DESQview 2.0 (TopView???) - "POSTTASK" - AWAKEN TASK
	AX = 102Bh
	BX = segment of object handle for task
Return: nothing
------------------------------------------------------
INT 15 - DESQview 2.0 (TopView???) - START NEW APPLICATION IN NEW PROCESS
	AX = 102Ch
	ES:DI -> contents of .PIF/.DVP file
	BX = size of .PIF/.DVP info
Return: BX = segment of object handle for new task
	     0 on error
------------------------------------------------------
INT 15 - DESQview 2.0 - KEYBOARD MOUSE CONTROL
	AX = 102Dh
	BL = subfunction
	     00h determine whether using keyboard mouse
	     01h turn keyboard mouse on
	     02h turn keyboard mouse off
Return: if BL was 00h,
	   BL = 0 using real mouse
		1 using keyboard mouse
------------------------------------------------------
INT 15 - TopView commands
	AH = 11h
	AL = various
Note: in DESQview 2.0x, these function calls are identical to AH=DEh, so
      see those below
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "HANDLE" - RETURN OBJECT HANDLE
	AH = 12h
	BH = 00h
	BL = which handle to return
	    00h handle in DWORD on top of stack
	    01h current task's window handle
	    02h given task's mailbox handle (task's handle on stack)
	    03h current task's mailbox handle
	    04h given task's keyboard handle (task's handle on stack)
	    05h current task's keyboard object handle
	    06h given task's OBJECTQ handle (task's handle on stack)
	    07h current task's OBJECTQ handle
	    08h   \
	      thru > return 0000:0000
	    10h   /
Return: DWORD on top of stack is object handle
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "NEW" - CREATE NEW OBJECT
	AH = 12h
	BH = 01h
	BL = object
	    00h handle is DWORD on top of stack
	    01h use task's window handle
	    02h given task's mailbox (task's handle on top of stack)
	    03h current task's mailbox
	    04h given task's keyboard (task's handle on top of stack)
	    05h current task's keyboard object
	    08h WINDOW class
	    09h MAILBOX class
	    0Ah KEYBOARD class
	    0Bh TIMER object (counts down 32-bit time in 10ms increments)
	    0Fh POINTER object
	    10h PANEL object
	STACK: (if window object or WINDOW class)
	       DWORD address to jump to (no new task if high word == 0)
	       DWORD ??? (doesn't seem to be used)
	       DWORD bytes for task's private stack (-1 == default of 0100h)
	       DWORD bytes system memory allocation (0 == none, -1 == default)
	       DWORD window size, columns
	       DWORD window size, rows
	       DWORD length of window title
	       DWORD address of window title
Return: DWORD on top of stack is new object handle
Note: if a new task is created, it is started with
      AX = BX = CX = SI = DI = BP = 0
      DX = segment of parent's object handle
      DS = ES = SS = segment of private stack (and new task's object handle)
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "FREE" - FREE AN OBJECT
	AH = 12h
	BH = 02h
	BL = object
	    00h handle in DWORD on top of stack
		window: close window and free
		timer: free timer
		panel: free panel object
		pointer: free pointer
	    01h task's window handle - kills task, never returns
	    02h given task's mailbox (task's handle on top of stack)
	    03h current task's mailbox
	    04h given task's keyboard (task's handle on top of stack)
	    05h current task's keyboard object
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "DIR" - GET PANEL FILE DIRECTORY
	AH = 12h
	BX = 0300h
	STACK: DWORD handle of panel object
Return: STACK: DWORD length of directory
	       DWORD address of directory

Format of panel file:
	BYTE C0h C3h
	BYTE number of panels in file
	for each panel in file
	    8 BYTES blank-padded panel name
	    DWORD panel offset in file
	    WORD panel length
	data for panels (each panel consists of one or more
	    window/query/manager streams)
	    first byte of each panel must be 1Bh, fifth byte must be E5h
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "ADDR" - GET OBJECT HANDLE
	AH = 12h
	BH = 03h
	BL = object
	    00h handle in DWORD on top of stack
	    02h sender of last msg read from mailbox (task's handle on stack)
	    03h sender of last msg read from current task's mailbox
Return: DWORD on stack is handle
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "READ" - WAIT FOR TIMER TO EXPIRE
	AH = 12h
	BX = 0400h
	STACK: DWORD timer's handle
Return: STACK: DWORD time in 1/100 sec since midnight when timer expires
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "READ" - GET NEXT RECORD
	AH = 12h
	BH = 04h
	BL = object
	    00h handle is DWORD on top of stack
		window: read next logical line
		mailbox: wait for and get next message
		pointer: wait for and get next message
	    01h read the next logical line from task's default window
	    02h get next message from mailbox (task's handle on top of stack)
	    03h get next message from current task's mailbox
	    04h get the next input from keyboard (handle on top of stack)
	    05h get the next input from task's default keyboard
	    06h wait for input from any object in OBJECTQ (handle on stack)
	    07h wait for input from any object in task's default OBJECTQ
Return: STACK: (if objectq) DWORD handle of object with input
	       (otherwise)  DWORD number of bytes
			    DWORD address
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "APPLY" - WRITE PANEL TO WINDOW
	AH = 12h
	BX = 0400h
	STACK: DWORD handle of panel object
	       DWORD window's handle or 0
	       DWORD length of panel name
	       DWORD pointer to panel name
Return: STACK: DWORD handle of created keyboard or 0
	       DWORD handle of window which was used
Notes: status of APPLY may be checked with STATUS message
       panel MUST have the following format
	 first byte must be 1Bh (i.e. must start with a stream)
	 first opcode in stream must be E5h
	   single byte arg of opcode is interpreted thus:
	      bit 7  \	11 means new window created
	      bit 6  /	01 means existing window used
	      bit 5 if set, create a new keyboard and put in field mode
	      bit 4 if set and bit 5 set, make new keyboard active
-----------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "WRITE" - WRITE TO OBJECT
	AH = 12h
	BH = 05h
	BL = object
	    00h handle is DWORD on top of stack
		timer: start timer to end at a specified time
		pointer: move pointer icon to specified position
	    02h send message by value/status=0 to mbox (task's handle on stack)
	    03h send message by value/status=0 to current task's mailbox
	    04h add input buffer to KEYBOARD queue (handle on top of stack)
	    05h add input buffer to task's default KEYBOARD queue
	    06h add an object to OBJECTQ (handle on top of stack)
	    07h add an object to task's default OBJECTQ
	STACK: (if mailbox)  DWORD length
			     DWORD address
	       (if keyboard) DWORD status (such as scan code)
			     DWORD length
			     DWORD address
	       (if objectq)  DWORD handle of object to add
	       (if timer)    DWORD 1/100ths seconds since midnight (actually
				   only accurate to 1/18 sec)
	       (if pointer)  DWORD column relative to origin of window
			     DWORD row relative to origin of window
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "WRITE" - WRITE STRING TO WINDOW
	AH = 12h
	BH = 05h
	BL = object
	    00h DWORD on top of stack is window handle
	    01h write string to task's default window
	STACK: DWORD object handle if handle passed on stack
	       DWORD total length of string (high word == 0)
	       DWORD address of string to display
Note: service routine will pop stack
Return: indicated actions performed
	a. non-control characters are displayed
	b. CR/LF/BS/Tab cause the usual cursor movement
	c. ESC starts a data structure with additional commands

Data Structure:
	MAGIC  DB  1Bh
	MODE   DB  ?   ; 00h, 01h, 10h, 14h-1Fh legal
	LENGTH DW  ?   ; length of remainder in bytes
	var-length fields follow, each an OPCODE followed by
	     zero or more args

MODE 00h (set or display values) "WINDOW STREAM"
    Opcodes:args
	00h  display 20h blanks with the default attribute
	01h-1Fh display OPCODE blanks with the default attribute
	20h  display char with default attribute 20h times
	     BYTE char to repeat
	21h-3Fh display char with default attribute OPCODE-20h times
	     BYTE char to repeat
	40h  display 20h blanks with specified attribute
	     BYTE attribute of blanks
	41h-5Fh display OPCODE-40h blanks with specified attribute
	     BYTE attribute of blanks
	60h  display next 20h characters
	     20h BYTES characters to display
	61h-7Fh display next OPCODE-60h characters
	     N BYTES characters to display
	80h-87h  display N blanks with default attribute
	     BYTE low 8 bits of 11-bit count (high 3 in low 3 bits of OPCODE)
		      [000h means 800h]
	88h-8Fh display N copies of the character
	     BYTE low 8 bits of 11-bit count (high 3 in low 3 bits of OPCODE)
		      [000h means 800h]
	     BYTE character to repeat
	90h-97h  display N blanks with specified attribute
	     BYTE low 8 bits of 11-bit length (high 3 in low 3 bits of OPCODE)
		      [000h means 800h]
	     BYTE attribute
	98h-9FH  display string at logical cursor pos
	     BYTE low 8 bits of 11-bit length (high 3 in low 3 bits of OPCODE)
		      [000h means 800h]
	     N BYTES string to display
	A0h  set logical cursor row
	     BYTE row number (0 is top)
	A1h  set logical cursor column
	     BYTE column number (0 is leftmost)
	A2h  set top edge of scrolling region
	     BYTE row
	A3h  set left edge of scrolling region
	     BYTE column
	A4h  set row of physical window position
	     BYTE line
	A5h  set column of physical window position
	     BYTE column
	A6h  set height of physical window
	     BYTE #rows
	A7h  set width of physical window
	     BYTE #columns
	A8h  set viewport row
	     BYTE row
	A9h  set viewport column
	     BYTE column
	AAh  set virtual screen height
	     BYTE rows
	ABh  set virtual screen width
	     BYTE columns
	ACh-AEh  unused
	AFh  ???
	     BYTE ??? (ANDed with current value of something)
	B0h  move logical cursor down
	     BYTE #rows (signed, negative values move up)
	B1h  move logical cursor right
	     BYTE #cols (signed, negative values move left)
	B2h  shift top edge of scrolling region
	     BYTE #rows (signed)
	B3h  shift left edge of scrolling region
	     BYTE #cols (signed)
	B4h  shift window down
	     BYTE #lines (signed)
	B5h  shift window right
	     BYTE #columns (signed)
	B6h  expand physical window vertically
	     BYTE #lines (signed)
	B7h  expand physical window horizontally
	     BYTE #columns (signed)
	B8h  adjust viewport row
	     BYTE #rows (signed)
	B9h  adjust viewport column
	     BYTE #columns (signed)
	BAh  adjust virtual screen height
	     BYTE #rows to increase (signed)
	BBh  adjust virtual screen width
	     BYTE #cols to increase (signed)
	BCh-BFh  unused
	C0h  set logical cursor position
	     BYTE row number (0 is top border)
	     BYTE column number (0 is left border)
	C1h  set top left corner of scrolling region
	     BYTE row
	     BYTE column
	C2h  set window pos
	     BYTE upper left row (no top border if 0)
	     BYTE upper left column (no left border if 0)
	C3h  set current window size
	     BYTE #rows
	     BYTE #cols
	C4h  set upper left corner of viewport (portion of virtual screen
	     displayed in window)
	     BYTE row
	     BYTE column
	C5h  set size of virtual screen
	     BYTE #rows
	     BYTE #cols
	C6h  unused
	C7h  unused
	C8h  set logical cursor relative to current position
	     BYTE number of rows to move down (signed)
	     BYTE number of columns to move right (signed)
	C9h  shift top left corner of scrolling region
	     BYTE #rows (signed)
	     BYTE #cols (signed)
	CAh  set window pos relative to current position
	     BYTE number of rows to shift down (signed)
	     BYTE number of columns to shift right (signed)
	CBh  set window size relative to current size
	     BYTE number of rows to expand (signed)
	     BYTE number of cols to expand (signed)
	CCh  shift viewport relative to current position
	     BYTE rows to shift (signed)
	     BYTE cols to shift (signed)
	CDh  resize virtual screen
	     BYTE #rows to expand (signed)
	     BYTE #cols to expand (signed)
	CEh  clear ???
	CFh  set ???
	D0h  turn on ??? (default)
	D1h  turn off ???
	D2h  turn on ???
	D3h  turn off ??? (default)
	D4h  window is visible
	D5h  window is hidden
	D6h  window has frame
	D7h  window unframed
	D8h  read characters from window (default)
	D9h  read attributes from window
	DAh  use logical attributes, which may be remapped
		attributes
		   1 normal text
		   2 highlighted normal text
		   3 help text
		   4 highlighted help text
		   5 error message
		   6 highlighted error message
		   7 emphasized text
		   8 marked text
		   9-16 are reverse video versions of 1-8
	DBh  use physical attributes for characters
	DCh  enable special actions for control characters (default)
	DDh  disable special control char handling, all chars displayable by
	     BIOS TTY call
	DEh  write both character and attribute (default)
	DFh  write character only, leave attribute untouched
	E0h  repeat following commands
	     BYTE number of times
	E1h  end of commands to repeat, start repeating them
	E2h  set color
	     BYTE color
	E3h  clear virtual screen
	E4h  redraw window
	E5h  select menu style
	     BYTE style
		bits 5,4 = 01 use two-letter menu entries for remainder of
		  this stream
	E5h  (panel file only)
	     BYTE modifier
		bits 7,6 = 11 panel goes in new window
			 = 01 panel uses existing window
		bit 5 = 1 create new keyboard in field mode
		bit 4 = 1 make newly-created keyboard active
		bits 3-0 unused ???
	E6h  create new window and perform rest of manipulations in new window
	     BYTE number of rows
	     BYTE number of columns
	     Return: DWORD object handle returned on stack at end
	E7h  unused
	E8h  scroll area up (top left corner defined by opcode C1h)
	     BYTE height
	     BYTE width
	E9h  scroll area down (top left corner defined by opcode C1h)
	     BYTE height
	     BYTE width
	EAh  scroll area left (top left corner defined by opcode C1h)
	     BYTE height
	     BYTE width
	EBh  scroll area right (top left corner defined by opcode C1h)
	     BYTE height
	     BYTE width
	ECh  set logical attributes for window contents
	     BYTE bit flags???
	     BYTE which attributes to set
		bit 7  if set, copy single following byte to indicated attrs
		bits 4-6  # of first attribute to change - 1
		bits 0-3  # of consecutive attributes to change
	     N BYTES new attributes
	EDh  set logical attributes for window frame
	     BYTE bit flags???
	     BYTE which attributes to set
		bit 7  if set, copy single following byte to indicated attrs
		bits 4-6  # of first attribute to change - 1
		bits 0-3  # of consecutive attributes to change
	     N BYTES new attributes
		  attributes
		       1 = top left corner
		       2 = top right corner
		       3 = bottom left corner
		       4 = bottom right corner
		       5 = top edge
		       6 = bottom edge
		       7 = left edge
		       8 = right edge
	EEh  set characters for window frame
	     BYTE bit flags???
	     BYTE which characters to set
		bit 7  if set, copy single following byte to indicated chars
		bits 4-6  # of first char to change - 1
		bits 0-3  # of consecutive chars to change
	     N BYTES new chars (same relative position as attributes above)
	EFh  set window name
	     BYTE length of name
	     N BYTES name
	F0h  clear input field to blanks
	     BYTE field number
	F1h  fill input field with character
	     BYTE field number
	     BYTE char
	F2h  set color of input field
	     BYTE field number (1-N)
	     BYTE attribute
	F3h  set initial contents of input field
	     BYTE field number (1-N)
	     N BYTES enough chars to exactly fill field as defined by op FFh
	F4h  position cursor to specific input field
	     BYTE field number (1-N)
	F5h  change field table entry
	     BYTE field number
	     7-8 BYTEs field table entry (see FFh below)
	F6h  set field type
	     BYTE field number
	     BYTE type
	F7h  ???
	     N BYTES (one for each field???)
	F8h  scroll field up a line
	     BYTE field number
	F9h  scroll field down a line
	     BYTE field number
	FAh  scroll field left
	     BYTE field number
	FBh  scroll field right
	     BYTE field number
	FCh  set field table header
	     BYTE number of fields
	     BYTE screen behavior bits
		bit 7  ???
		bit 6  set if menu items may be selected via keyboard
		bit 5  set if left mouse button may terminate entry
		bit 4  set if right mouse button may terminate entry
		bit 3  if set, menu fields return ' ' rather than 'Y' or 'N'
		bit 2  ???
		bits 0,1 = 00 no data returned on read of keyboard
			   01 data returned as array of chars containing
			      all fields packed together, with menu fields
			      represented by the character 'Y' if selected
			      and 'N' if not selected
			   10 data returned as variable-length records for
			      all fields
			   11 data returned as variable-length records for
			      the fields which were modified
	     BYTE field in which cursor was when entry was terminated
		  (updated by DESQview)
	     BYTE field in which mouse was when entry was terminated
		  (updated by DESQview)
	     BYTE color of field currently pointed to during entry
	     BYTE color of input fields which have been selected
	FDh  reset modified bit for all fields
	FEh  reset selected and modified bits for all fields
	FFh  set up input fields
	     6 BYTES table header (see FCh above)
	     the field table entries, one for each field
		 BYTE start row    \
		 BYTE start column  \ if menu selection and start is to
		 BYTE end row	    / right or below end, select from kbd only
		 BYTE end column   /
		 BYTE field type
		    bits 7,6 = 00 non-entry field
			       01 echos keystrokes input to make menu selection
			       10 fill-in field
			       11 menu selection
		    bit 5  ???
		    bit 4  ???
		    bit 3  ???
		    bit 2  ???
		    bit 1  set if field selected
		    bit 0  set if field modified
		 BYTE modifier
		      if type is fill-in, then bit flags to determine behavior
			  bit 7  if set, beep when field is full
			  bit 6  move to next field when current field is full
			  bit 5  if set, enter text from right end (for numbers)
			  bit 4  if set, force input to uppercase
			  bit 3  if set, clear old contents on first keystroke
			  bit 2  ???
			  bit 1  ???
			  bit 0  ???
		      if type is menu selection, first key to press to activate
			  00h if have to point-&-click or is an extended-ASCII
			      keystroke (only if two-key menus enabled)
		 BYTE for menu item, color of field after cursor or mouse
		      passes through it
		 BYTE second key for activating menu selection if field type is
		      C0h (0 = only single key).  This byte is present iff
		      two-letter menu entries selected with opcode E5h, and
		      in that case is present regardless of field type
	     Note: DESQview uses and updates the actual copy of the information
	       which is contained in the stream.  Thus this info must remain
	       intact until after the data entry is complete.

MODE 01h "QUERY STREAM" (valid only for those opcodes listed here)
	A0h return logical cursor row in next byte
	A1h return logical cursor column in next byte
	A2h return top row of scrolling region in next byte
	A3h return left column of scrolling region in next byte
	A4h return row of physical window origin in next byte
	A5h return column of physical window origin in next byte
	A6h return height of physcial window in next byte
	A7h return width of physical window in next byte
	A8h return row of viewport origin in next byte
	A9h return column of viewport origin in next byte
	AAh return height of virtual screen in next byte
	ABh return width of virtual screen in next byte
	AFh return ??? in next byte
	C0h return current logical cursor position in next two bytes
	C1h return top left corner of scrolling region in next two bytes
	C2h return current window position in next two bytes
	C3h return current window size in next two bytes
	C4h return current viewport origin in next two bytes
	C5h return current virtual screen size in next two bytes
	D0h \ overwritten with D0h if ??? on
	D1h /		       D1h if ??? off
	D2h \ overwritten with D2h if ??? on
	D3h /		       D3h if ??? off
	D4h \ overwritten with D4h if window visible
	D5h /		       D5h if window hidden
	D6h \ overwritten with D6h if window has frame
	D7h /		       D7h if window unframed
	D8h \ overwritten with D8h if reading characters from window
	D9h /		       D9h if reading attributes from window
	DAh \ overwritten with DAh if using logical attributes
	DBh /		       DBh if using physical attributes
	DCh \ overwritten with DCh if TTY control char interpretation on
	DDh /		       DDh if TTY control char interpretation off
	DEh \ overwritten with DEh if writing both characters and attributes
	DFh /		       DFh if leaving attributes untouched
	E2h return current color in next byte
	ECh get logical attributes for window contents
	    BYTE ???
	    BYTE which attributes to get
		bit 7 ???
		bits 4-6 first attribute to get - 1
		bits 0-3 # consecutive attributes
	    N BYTES buffer to hold attributes
	EDh get logical attributes for window frame
	    BYTE ???
	    BYTE which attributes to get
		bit 7 ???
		bits 4-6 first attribute to get - 1
		bits 0-3 # consecutive attributes
	    N BYTES buffer to hold attributes
	EEh get characters for window frame
	    BYTE ???
	    BYTE which attributes to get
		bit 7 ???
		bits 4-6 first char to get - 1
		bits 0-3 # consecutive chars
	    N BYTES buffer to hold chars
	EFh return current window name
	    BYTE    max length of returned name
	    N BYTES buffer to hold window name
	F3h return contents of input field
	    BYTE field number
	    N BYTES buffer to hold field contents (size exactly equal to field
		    size)
	F5h get field table entry
	    BYTE field number
	    7-8 BYTES buffer to hold field table entry
	F6h get type of a field
	    BYTE field number
	    BYTE type
	FCh get field table header
	    6 BYTES buffer to store header

MODE 10h "MANAGER STREAM" (valid only for opcodes listed here)
	00h allow window to be moved horizontally
	01h allow window to be moved vertically
	02h allow window to change width
	03h allow window to change height
	04h allow window to be scrolled horizontally
	05h allow window to be scrolled vertically
	06h allow "Close Window" menu selection
	07h allow window to be hidden
	08h allow "Mark" menu
	0Eh allow "Scissors" menu
	10h allow DESQview main menu to be popped up
	11h allow "Switch Windows" menu
	12h allow "Open Window" menu
	13h allow "Quit" menu selection
	20h-33h opposite of 00h-13h, disallow specified action
	40h notify if horizontal position of window changes
	41h notify if vertical position of window changes
	42h notify if width of window changes
	43h notify if height of window changes
	44h notify if window scrolled horizontally
	45h notify if window scrolled vertically
	46h notify if window is closed--program has to clean up and exit itself
	47h notify if window is hidden
	48h notify if "?" on main menu selected
	49h notify if colors changed??? (guess)
	4Ah notify if window is made active
	4Bh notify if window is switched away from
	4Ch notify if video mode changes
	4Dh notify if "Scissors" menu "Cut" option selected
	4Eh notify if "Scissors" menu "Copy" option selected
	4Fh notify if "Scissors" menu "Paste" option selected
	50h notify if DESQview main menu popped up
	51h notify if DESQview main menu popped down
	60h-71h  opposite of 40h-51h: don't notify on specified event
	84h attach window to parent task's window (both move together)
	85h detach window from parent task's window (may move independently)
	86h disable background operation
	87h enable running in background
	88h set minimum size of physical window
	    BYTE rows
	    BYTE columns
	89h set maximum size of physical window
	    BYTE rows
	    BYTE cols
	8Ah set primary asynchronous notification routine
	    DWORD address of routine, 0000:0000 means none
		  on entry ES:DI = handle of window, DS:SI is secondary routine
			   mailbox contains message indicating event
			      Opcode
			       40h  horizontal movement
				   DWORD object handle of window
				   BYTE  new row
				   BYTE  new col
			       41h  vertical movement
				   DWORD object handle of window
				   BYTE  new row
				   BYTE  new col
			       42h  horizontal size change
				   DWORD object handle of window
				   BYTE  new rows
				   BYTE  new cols
			       43h  vertical size change
				   DWORD object handle of window
				   BYTE  new rows
				   BYTE  new cols
			       44h  scrolled horizontally
				   DWORD object handle of window
				   BYTE  upper left row visible
				   BYTE  upper left column visible
				   BYTE  ???
				   BYTE  amount moved: >0 right, <0 left, 0 done
			       45h  scrolled vertically
				   DWORD object hande of window
				   BYTE  upper left row visible
				   BYTE  upper left column visible
				   BYTE  ???
				   BYTE  amount moved: >0 down, <0 up, 0 done
			       46h  window closed
				   DWORD object handle of window
				   BYTE  mouse pointer row
				   BYTE  mouse pointer column
				   BYTE  ???
			       47h  window hidden
			       48h  Help for Program selected
				   DWORD object handle of window
				   BYTE mouse pointer row
				   BYTE mouse pointer column
				   BYTE ???
			       49h  colors changed??? (guess)
			       4Ah  switched to window from another ("raise")
			       4Bh  switched away from the window ("lower")
			       4Ch  video mode changed
				   BYTE new video mode
			       4Dh  Scissors/cUt selected
				   DWORD object handle of window
				   BYTE  row of upper left corner
				   BYTE  column of upper left corner
				   BYTE  ???
				   DWORD handle of mailbox to write???
				   BYTE  height of region
				   BYTE  width of region
			       4Eh  Scissors/Copy selected
				   DWORD object handle of window
				   BYTE  row of upper left corner
				   BYTE  column of upper left corner
				   BYTE  ???
				   DWORD handle of mailbox to write???
				   BYTE  height of region
				   BYTE  width of region
			       4Fh  Scissors/Paste selected
				   DWORD object handle of window
				   BYTE  row of upper left corner
				   BYTE  column of upper left corner
				   BYTE  ???
				   DWORD handle of mailbox to read
				   BYTE  height of region
				   BYTE  width of region
			       50h  main menu popped up
			       51h  main menu popped down
		  routine should restore all registers before returning
	8Bh set secondary async notification routine
	    DWORD address of routine, passed to primary routine in DS:SI,
		  rather than called directly
	AEh ???
	AFh set selected field marker character
	    BYTE character to display at left edge of selected fields
	BCh disable use of cursor pad for navigating menus, maybe other???
	BDh enable use of cursor pad for navigating menus, maybe other???
	BEh disable ???
	BFh enable ???
	C0h make current window topmost in system
	C1h force current process into foreground
	C2h make current window topmost in process
	C3h position mouse pointer relative to origin of current field
	    BYTE rows below upper left corner of field
	    BYTE columns to right of upper left corner of field
	C4h position mouse pointer relative to origin of given field
	    BYTE field number
	    BYTE rows below upper left corner of field
	    BYTE columns to right of upper left corner of field
	C5h hide current window
	C6h show windows for this process
	C7h hide all windows for this process
	C8h suspend process and hide all its windows
	C9h force current process into background
	CAh make current window bottom-most in process
	CBh ???
	CCh close window
	CEh reorder windows
	    DWORD pointer to null-terminated list of words
		  each word is segment of object handle for a window

MODES 14h to 1Fh "USER STREAMS"
	normally NOPs, but may be defined by SETESC message to invoke FAR
	routines, one for each mode number
	  on entry to handler,
		DS:SI = first byte of actual stream (not header)
		CX = #bytes in stream
		ES:DI = window's handle
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SIZEOF" - GET OBJECT SIZE
	AH = 12h
	BH = 08h
	BL = object
	    00h handle in DWORD on top of stack
		timer: elapsed time since timer started
		pointer: number of messages queued to pointer object
		panel: number of panels in panel file
	    01h total chars in current task's default window
	    02h number of messages in task's mailbox (task's handle on stack)
	    03h number of messages in current task's mailbox
	    04h number of input buffers queued in task's kbd (handle on stack)
	    05h number of input buffers queued for current task's default kbd
	    06h number of objects queued in OBJECTQ (task's handle on stack)
	    07h number of objects queued in current task's OBJECTQ
Return: DWORD on stack is result
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "LEN" - GET OBJECT LENGTH
	AH = 12h
	BH = 09h
	BL = object
	    00h handle in DWORD on top of stack
		window: chars/line
		timer: timer remaining before timer expires
	    01h number of chars/line in current task's default window
Return: DWORD on top of stack is length
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "ADDTO" - SET OBJECT BITS
	AH = 12h
	BH = 0Ah
	BL = object
	    00h handle is DWORD on top of stack
		window: write characters and attributes
		timer: start timer for specified interval
		pointer: set control flags
	    01h write characters and attributes to task's default window
	    02h send message/status by value to mailbox (task's handle on stack)
	    03h send message/status by value to current task's default mailbox
	    04h set control flags on KEYBOARD object (handle on top of stack)
	    05h set control flags on task's default KEYBOARD object
	STACK: (if mailbox) DWORD status
			    DWORD length of message
			    DWORD address
	       (if timer)   DWORD duration in 1/100 seconds
	       (if window)  DWORD count of characters
			    DWORD address of characters
			    DWORD count of attributes
			    DWORD address of attributes
	       (otherwise)  DWORD bits to set
For keyboard objects, the bits have the following significance:
	bit 15 reserved, can't be set
	bit 14 unused
	bit 13 reserved, can't be set
	bit 12-5 unused
	bit 4  filter all keys (used with handler established by SETESC)
	bit 3  program continues executing while input in progress
	bit 2  insert mode active
	bit 1  keyboard is active
	bit 0  keyboard is in field mode
For pointer objects, the bits have the following significance:
	bit 15 reserved, can't be set
	bit 14-8 unused
	bit 7  mouse pointer is hidden while in window
	bit 6  get messages even if window not topmost
	bit 5  get messages even if window not foreground
	bit 4  mouse button must be held 1/2 second before it "clicks"
	bit 3  pointer position is relative to screen origin, not window origin
	bit 2  send message on button release as well as button press
	bit 1  unused???
	bit 0  send message only on button activity, not movement
	       DV-specific, and INT 15h/AX=DE0Fh must have been called first
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SUBFROM" - RESET OBJECT BITS
	AH = 12h
	BH = 0Bh
	BL = object
	    00h handle is DWORD on top of stack
		window: write attributes only
		mailbox: send message by reference
		pointer: reset control flags
	    01h write attributes only to task's default window
	    02h send msg/status by reference to mailbox (task's handle on stack)
	    03h send msg/status by reference to current task's mailbox
	    04h clear control flags on KEYBOARD object (handle on top of stack)
	    05h clear control flags on task's default KEYBOARD object
	    06h remove specific object from OBJECTQ (task's handle on stack)
	    07h remove specific object from task's default OBJECTQ
	STACK: (if mailbox) DWORD status
			    DWORD length
			    DWORD address
	       (if window)  DWORD number of attributes to write
			    DWORD address of attributes
	       (if objectq) DWORD handle of object to remove
	       (otherwise)  DWORD indicates which bits to clear
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "OPEN" - OPEN OBJECT
	AH = 12h
	BH = 0Ch
	BL = object
	    00h handle is DWORD on top of stack
		window: fill with given character
		keyboard: attach to a window
		timer: open
		pointer: start taking input for window
		panel: associate with a panel file
	    01h fill task's default window with given character
	    02h open given task's mailbox for input (task's handle on stack)
	    03h open current task's mailbox
	    04h attach a KEYBOARD to a window (handle on top of stack)
	    05h attach task's default KEYBOARD to a window
	    06h open a task's OBJECTQ (task's handle on top of stack)
	    07h open current task's OBJECTQ
	 STACK: (if window)   DWORD character to fill with
		(if keyboard) DWORD handle of window to attach to
		(if pointer)  DWORD handle of window to attach to
		(if panel)    DWORD length of filename
			      DWORD address of filename
		(otherwise)   nothing
Notes: special action taken if first byte of panel file name is 1Bh
       if first two bytes of panel file "name" are C0hC3h, then the "name" IS
       the panel file
       result code of open may be retrieved with STATUS message
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "CLOSE" - CLOSE OBJECT
	AH = 12h
	BH = 0Dh
	BL = object
	    00h handle is DWORD on top of stack
		timer: close
		keyboard: detach from window
		pointer: stop taking input
		panel: close
	    02h close given task's mailbox (task's handle on top of stack)
	    03h close task's default mailbox
	    04h close KEYBOARD object (handle on top of stack)
	    05h close task's default KEYBOARD
	    06h close givent task's OBJECTQ (task's handle on top of stack)
	    07h close current task's OBJECTQ
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "ERASE" - ERASE OBJECT
	AH = 12h
	BH = 0Eh
	BL = object
	    00h handle is DWORD on top of stack
		window: clear
		keyboard: discard input
		timer: cancel current interval
		pointer: discard all pending messages
	    01h clear task's default window
	    02h discard all queued messages in mailbox (handle on top of stack)
	    03h discard all queued messages in current task's default mailbox
	    04h discard all input queued to KEYBOARD (handle on top of stack)
	    05h discard all input queued to task's default KEYBOARD
	    06h remove all objects from OBJECTQ (task's handle on top of stack)
	    07h remove all objects from current task's OBJECTQ
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "STATUS" - GET OBJECT STATUS
	AH = 12h
	BH = 0Fh
	BL = object
	    00h handle is DWORD on top of stack
		timer: is it running?
		pointer: return status of last message
		panel: verify success of last OPEN or APPLY
	    02h return status of last msg READ from mailbox (handle on stack)
	    03h return status of last msg READ from task's default mailbox
	    04h get status of last msg from task's KEYBOARD (task handle on stk)
	    05h get status of last msg from task's default KEYBOARD
	    06h return whether OBJECTQ is open or not (handle on top of stack)
	    07h return whether task's default OBJECTQ is open or not
Return: DWORD on top of stack is status
Note: if object is a panel object, the status indicates the error code:
	14h ???
	15h ???
	16h invalid panel format
	17h panel file already open
	95h ???
	98h null panel file name
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "EOF" - GET OBJECT EOF STATUS
	AH = 12h
	BH = 10h
	BL = object
	    00h handle is DWORD on top of stack
	    01h returns TRUE if logical cursor past end of task's def window
	    02h return ??? for task's mailbox (task's handle on top of stack)
	    03h return ??? for current task's mailbox
Return: DWORD on top of stack is status
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "AT" - POSITION OBJECT CURSOR
	AH = 12h
	BH = 11h
	BL = object
	    00h window's handle is DWORD on top of stack
	    01h position logical cursor on task's default window
	STACK: DWORD column
	       DWORD row
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SETNAME" - ASSIGN NAME TO MAILBOX
	AH = 12h
	BH = 11h
	BL = mailbox to name
	    00h DWORD on top of stack is mailbox handle
	    02h use given task's mailbox (task's handle on top of stack)
	    03h use current task's default mailbox
	STACK: DWORD length of name
	       DWORD address of name
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SETSCALE" - SET POINTER SCALE FACTOR
	AH = 12h
	BX = 1100h
	STACK: DWORD object handle for pointer object
	       DWORD number of colums to scale pointer position to
	       DWORD number of rows to scale pointer position to
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "READN" - GET NEXT N OBJECT BYTES
	AH = 12h
	BH = 12h
	BL = object
	    00h handle is DWORD on top of stack
	    01h read next N chars/attributes on task's default window
	STACK: DWORD count
Return: STACK: DWORD width of screen line
	       DWORD address
	       DWORD count actually read
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "GETSCALE" - GET POINTER SCALE FACTOR
	AH = 12h
	BX = 1200h
	STACK: DWORD object handle for pointer
Return: STACK: DWORD pointer pos scaled as if window were this many colums wide
	       DWORD pointer pos scaled as if window were this many rows high
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "REDRAW" - REDRAW WINDOW
	AH = 12h
	BH = 13h
	BL = window object
	    00h DWORD on top of stack is handle for window to redraw
	    01h redraw task's default window
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SETICON" - SPECIFY POINTER ICON
	AH = 12h
	BX = 1300h
	STACK: DWORD object handle for pointer
	       DWORD character to use for pointer
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SETESC" - SET ESCAPE ROUTINE ADDRESS
	AH = 12h
	BH = 14h
	BL = message modifier
	    00h handle is DWORD on top of stack
	    01h define user stream
	    04h intercept keystrokes from KEYBOARD to a window (handle on stack)
	    05h intercept keystrokes from task's default KEYBOARD to a window
	STACK: (if window)   DWORD user stream number (14h-1Fh)
			     DWORD address of FAR user stream handler
	       (if keyboard) DWORD address of FAR filter function

The keyboard filter function is called when the keyboard is in field mode.  On
entry,
	AL = character
	AH = 0 or extended ASCII code if AL = 0
	BX = field number
	CH = cursor column
	CL = cursor row
	DL = field type modifier (sixth item in field table entry)
	DH = ??? (seventh item in field table entry)
	ES:SI = window's handle
(also, in DV 2.00, DS:DI points to the field table entry.  This may change in
 other versions)
The filter function should return
	AH = 0 use keystroke
	     1 ignore keystroke
	     >1 beep and ignore keystroke
------------------------------------------------------
INT 15 - TopView - SEND MESSAGE - "LOCK" - REQUEST EXCLUSIVE ACCESS TO RESOURCE
	AH = 12h
	BH = 14h
	BL = object
	    00h mailbox handle is DWORD on top of stack
	    02h use given task's mailbox (task's handle on top of stack)
	    03h use current task's default mailbox
Note: release exclusive access by sending CLOSE message to mailbox
      access may be requested multiple times, and requires multiple CLOSEs
------------------------------------------------------
INT 15 - PRINT.COM - ??? (AT,XT286,PS50+)
	AH = 20h
	AL = subfunction
	    00h ???
	    01h ???
	    10h setup of SYSREQ routine (OS hook)
	    11h completion of SYSREQ function (OS hook)
Note: AL = 0,1 set or reset some flags which affect what PRINT does when it
      tries to access the disk
------------------------------------------------------
INT 15 - SYSTEM - POWER-ON SELF-TEST ERROR LOG (PS50+)
	AH = 21h
	AL = subfunction
	    00h read POST log
	    01h write POST log
		BH = device ID
		BL = error code
Return: CF set on error
	AH = status (00h OK, 01h list full, 80h invalid cmd, 86h unsupported)
	if function 00h:
	   BX = number of error codes stored
	   ES:DI -> error log
Note: the log is a series of words, the first byte of which identifies the
      error code and the second the device.
------------------------------------------------------
INT 15 - READ/MODIFY PROFILES (CONVERTIBLE)
	AH = 40h
	AL = subfunction
	    0: get system profile in CX and BX
	    1: set system profile from CX and BX
	    2: get internal modem profile in BX
	    3: set internal modem profile from BX
------------------------------------------------------
INT 15 - SYSTEM - WAIT ON EXTERNAL EVENT (CONVERTIBLE)
	AH = 41h
	AL = condition type
	    bits 0-2: condition to wait for
		     0 any external event
		     1 compare and return if equal
		     2 compare and return if not equal
		     3 test and return if not zero
		     4 test and return if zero
	    bit 3:    reserved
	    bit 4:    1=port address, 0=user byte
	    bits 5-7: reserved
	BH = condition compare or mask value
	BL = timeout value times 55 milliseconds
	    0 means no timeout
	DX = I/O port address if AL bit 4 set
	ES:DI -> user byte if AL bit 4 clear
------------------------------------------------------
INT 15 - SYSTEM - REQUEST POWER OFF (CONVERTIBLE)
	AH = 42h
	AL = 0 to use system profile
	     1 to force suspend regardless of system profile
------------------------------------------------------
INT 15 - SYSTEM - READ SYSTEM STATUS (CONVERTIBLE)
	AH = 43h
Return: AL = status bits
	    bit 0: LCD detached
	    bit 1: reserved
	    bit 2: RS232/parallel adapter powered on
	    bit 3: internal modem powered on
	    bit 4: power activated by alarm
	    bit 5: standby power lost
	    bit 6: external power in use
	    bit 7: power low
------------------------------------------------------
INT 15 - SYSTEM - (DE)ACTIVATE INTERNAL MODEM POWER (CONVERTIBLE)
	AH = 44h
	AL = 0 to power off
	     1 to power on
------------------------------------------------------
INT 15 - OS HOOK - KEYBOARD INTERCEPT (AT model 3x9,XT2,XT286,CONV,PS)
	AH = 4Fh
	AL = scan code
	CF set
Return: CF set
	   AL = scan code
	CF clear
	   scan code should not be used
Note: Called by INT 9 handler to translate scan codes
------------------------------------------------------
INT 15 - OS HOOK - DEVICE OPEN (AT,XT2,XT286,PS)
	AH = 80h
	BX = device ID
	CX = process type
Return: CF set on error
	AH = status
------------------------------------------------------
INT 15 - OS HOOK - DEVICE CLOSE (AT,XT2,XT286,PS)
	AH = 81h
	BX = device ID
	CX = process type
Return: CF set on error
	AH = status
------------------------------------------------------
INT 15 - OS HOOK - DEVICE PROGRAM TERMINATE (AT,XT2,XT286,PS)
	AH = 82h
	BX = device ID
Return: CF set on error
	AH = status
Note: closes all devices opened with function 80h
------------------------------------------------------
INT 15 - SYSTEM - EVENT WAIT (AT,XT286,CONV,PS)
	AH = 83h
	AL = subservice
	    0 = set interval
	    1 = cancel
	ES:BX -> event flag (bit 7 set when interval expires)
	CX:DX = number of microseconds to wait (only accurate to 977 us)
Return: CF set if function already busy
------------------------------------------------------
INT 15 - SYSTEM - READ JOYSTICK (AT,XT2,XT286,PS)
	AH = 84h
	DX = subservice
	    0 get switch settings
	      Return: AL = switch settings (bits 7-4)
	    1 read joystick inputs
	      Return: AX = A(x) value
		      BX = A(y) value
		      CX = B(x) value
		      DX = B(y) value
------------------------------------------------------
INT 15 - OS HOOK - SYSTEM REQUEST KEY PRESSED (AT,XT2,XT286,CONV,PS)
	AH = 85h
	AL = 0 press
	   = 1 release
Return: CF set on error
	AH = status
Note: called by keyboard decode routine
------------------------------------------------------
INT 15 - SYSTEM - WAIT (AT,XT2,XT286,CONV,PS)
	AH = 86h
	CX,DX = number of microseconds to wait (only accurate to 977 us)
Return: CF clear: after wait elapses
	CF set: immediately due to error
------------------------------------------------------
INT 15 - EXTENDED MEMORY - BLOCK MOVE (AT,XT286,PS)
	AH = 87h
	CX = number of words to move
	ES:SI -> global descriptor table
	       offset 0h  null descriptor (need not be initialized)
		      8h  uninitialized, will be made into GDT descriptor
		     10h  descriptor for source of move
		     18h  descriptor for destination of move
		     20h  uninitialized, used by BIOS
		     28h  uninitialized, will be made into SS descriptor
Return: CF set on error
	AH = status
	    00h source copied into destination
	    01h parity error
	    02h interrupt error
	    03h address line 20 gating failed
------------------------------------------------------
INT 15 - EXTENDED MEMORY - GET MEMORY SIZE (AT,XT286,PS)
	AH = 88h
Return: AX = memory size
------------------------------------------------------
INT 15 - SYSTEM - SWITCH TO VIRTUAL MODE (AT,XT286,PS50+)
	AH = 89h
	BL = interrupt number of IRQ0 (IRQ1-7 use next 7 interrupts)
	BH = interrupt number of IRQ8 (IRQ9-F use next 7 interrupts)
	DS:SI -> GDT for protected mode
	       offset 0h  null descriptor
		      8h  GDT descriptor
		     10h  IDT descriptor
		     18h  DS
		     20h  ES
		     28h  SS
		     30h  CS
		     38h  uninitialized, used to build descriptor for BIOS CS
	CX = offset into protected-mode CS to jump to
Return: CF set on error
	   AH = 0FFh  error enabling address line 20
------------------------------------------------------
INT 15 - OS HOOK - DEVICE BUSY LOOP (AT,XT2,XT286,CONV,PS)
	AH = 90h
	AL = type code
	    00h: disk
	    01h: diskette
	    02h: keyboard
	    03h: PS/2 pointing device
	    80h: network
	    FCh: disk reset
	    FDh: diskette motor start
	    FEh: printer
	ES:BX -> request block for type codes 80h through BFh
Return: CF set if wait time satisfied
	CF clear if driver must perform wait
Note: type codes are allocated as follows:
	00-7F non-reentrant devices; OS must arbitrate access
	80-BF reentrant devices; ES:BX points to a unique control block
	C0-FF wait-only calls, no complementary INT 15/AH=91h call
------------------------------------------------------
INT 15 - OS HOOK - SET FLAG AND COMPLETE INTERRUPT (AT,XT2,XT286,CONV,PS)
	AH = 91h
	AL = type code, see AH=90h above
	ES:BX -> request block for type codes 80h through BFh
Return: AH = 0
------------------------------------------------------
INT 15 - SYSTEM - GET CONFIGURATION (XT after 1/10/86,AT mdl 3x9,CONV,XT286,PS)
	AH = C0h
Return: CF = 1 if BIOS doesn't support call
	ES:BX -> ROM table
	     byte_count  dw   ?   ; number of bytes following
	     model	 db   ?   ; PC=ff, XT=fe or fb, PCjr = fd, etc, etc
	     submodel	 db   ?   ; distingushes between AT and XT/286, etc.
	     BIOS_rev	 db   ?   ; 0 for first release, 1 for 2nd, etc.
	     featbyte	 db   ?   ; 80h = DMA channel 3 used by hd BIOS
				  ; 40h = 2nd 8259 installed
				  ; 20h = Real-Time Clock installed
				  ; 10h = INT 15h/AH=4Fh called upon INT 9h
				  ;  8h = wait for external event supported
				  ;  4h = extended BIOS area allocated at 640K
				  ;  2h = bus is Micro Channel instead of PC
				  ;  1h   reserved
	     res1	 dw   0
	     res2	 dw   0
Note: the 1/10/86 XT BIOS returns an incorrect value for featbyte.
------------------------------------------------------
INT 15 - SYSTEM - RETURN EXTENDED-BIOS DATA-AREA SEGMENT ADDRESS (PS)
	AH = C1h
Return: CF set on error
	ES = segment of data area
------------------------------------------------------
INT 15 - POINTING DEVICE BIOS INTERFACE (PS,DESQview 2.x)
	AH = C2h
	AL = subfunction
	    00h enable/disable
	       BH = 00h disable
		    01h enable
	    01h reset
	       Return: BH = device ID
	    02h set sampling rate
	       BH = 00h 10/second
		    01h 20/second
		    02h 40/second
		    03h 60/second
		    04h 80/second
		    05h 100/second
		    06h 200/second
	    03h set resolution
	       BH = 00h one count per mm
		    01h two counts per mm
		    02h four counts per mm
		    03h eight counts per mm
	    04h get type
	       Return: BH = device ID
	    05h initialize
	       BH = data package size (1 - 8 bytes)
	    06h get/set scaling factor
	       BH = 00h return device status
		       Return: BL = status
				   bit 0: right button pressed
				   bit 1: reserved
				   bit 2: left button pressed
				   bit 3: reserved
				   bit 4: 0 if 1:1 scaling, 1 if 2:1 scaling
				   bit 5: device enabled
				   bit 6: 0 if stream mode, 1 if remote mode
				   bit 7: reserved
			       CL = resolution (see function 03h)
			       DL = sample rate, reports per second
		    01h set scaling at 1:1
		    02h set scaling at 2:1
	    07h set device handler address
	       ES:BX = user device handler
Return: CF set on error
	AH = status
	    00h successful
	    01h invalid function
	    02h invalid input
	    03h interface error
	    04h need to resend
	    05h no device handler installed
-----------------------------------------------------
INT 15 - ENABLE/DISABLE WATCHDOG TIMEOUT (PS50+)
	AH = C3h
	AL = 00h disable
	     01h enable
		BX = timer counter
Return: CF set on error
Note: the watchdog timer generates an NMI
------------------------------------------------------
INT 15 - PROGRAMMABLE OPTION SELECT (PS50+)
	AH = C4h
	AL = 00h return base POS register address
	     01h enable slot
		 BL = slot number
	     02h enable adapter
Return: CF set on error
	DX = base POS register address (if function 00h)
------------------------------------------------------
INT 15 - DESQview - GET PROGRAM NAME
	AX = DE00h
Return: AX = offset into DESQVIEW.DVO of current program's record:
	       BYTE  length of name
	     N BYTES name
	     2 BYTES keys to invoke program (second = 00h if only one key used)
	       WORD  ??? (I see 0 always)
	       BYTE  end flag: 00h for all but last entry, which is FFh
------------------------------------------------------
INT 15 - DESQview - UPDATE "OPEN WINDOW" MENU
	AX = DE01h
Return: nothing
Note: reads DESQVIEW.DVO, disables Open menu if file not in current directory
------------------------------------------------------
INT 15 - DESQview - UNIMPLEMENTED IN DV 2.0x
	AX = DE02h
Return: nothing (NOP in DV 2.0x)
------------------------------------------------------
INT 15 - DESQview - UNIMPLEMENTED IN DV 2.0x
	AX = DE03h
Return: nothing (NOP in DV 2.0x)
------------------------------------------------------
INT 15 - DESQview - GET AVAILABLE COMMON MEMORY
	AX = DE04h
Return: BX = bytes of common memory available
	CX = largest block available
	DX = total common memory in bytes
------------------------------------------------------
INT 15 - DESQview - GET AVAILABLE CONVENTIONAL MEMORY
	AX = DE05h
Return: BX = K of memory available
	CX = largest block available
	DX = total conventional memory in K
------------------------------------------------------
INT 15 - DESQview - GET AVAILABLE EXPANDED MEMORY
	AX = DE06h
Return: BX = K of expanded memory available
	CX = largest block available
	DX = total expanded memory in K
------------------------------------------------------
INT 15 - DESQview - "APPNUM" - GET CURRENT PROGRAM'S NUMBER
	AX = DE07h
Return: AX = number of program as it appears on the "Switch Windows" menu
------------------------------------------------------
INT 15 - DESQview - GET ???
	AX = DE08h
Return: AX = 0	???
	     1	???
------------------------------------------------------
INT 15 - DESQview - UNIMPLEMENTED IN DV 2.00
	AX = DE09h
Return: nothing (NOP in DV 2.00)
------------------------------------------------------
INT 15 - DESQview 2.0 - "DBGPOKE" - DISPLAY CHARACTER ON STATUS LINE
	AX = DE0Ah
	BL = character
Return: character displayed, next call will display in next position (which
	wraps back to the start of the line if off the right edge of screen)
Notes:	displays character on bottom line of *physical* screen, regardless
	of current size of window (even entirely hidden)
	does not know about graphics display modes, just pokes the characters
	into display memory
------------------------------------------------------
INT 15 - DESQview 2.0 - "APILEVEL" - DEFINE MINIMUM API LEVEL REQUIRED
	AX = DE0Bh
	BL = API level
	     >2 pops up "You need a newer version" error window in DV 2.00
	BH = ???
Return: AX = maximum API level???
------------------------------------------------------
INT 15 - DESQview 2.0 - "GETMEM" - ALLOCATE "SYSTEM" MEMORY
	AX = DE0Ch
	BX = number of bytes
Return: ES:DI -> allocated block
------------------------------------------------------
INT 15 - DESQview 2.0 - "PUTMEM" - DEALLOCATE "SYSTEM" MEMORY
	AX = DE0Dh
	ES:DI -> previously allocated block
Return: nothing
------------------------------------------------------
INT 15 - DESQview 2.0 - FIND MAILBOX BY NAME
	AX = DE0Eh
	ES:DI -> name to find
	CX = length of name
Return: BX = 0 not found
	     1 found
		DS:SI = object handle
------------------------------------------------------
INT 15 - DESQview 2.0 - ENABLE DESQview EXTENSIONS
	AX = DE0Fh
Return: AX and BX destroyed (seems to be bug, weren't saved&restored)
Notes: sends a manager stream with opcodes AEh, BDh, and BFh to task's window
      enables an additional mouse mode
------------------------------------------------------
INT 15 - DESQview 2.0 - "PUSHKEY" - PUT KEY INTO KEYBOARD INPUT STREAM
	AX = DE10h
	BH = scan code
	BL = character
Return: BX = ??? (sometimes, but not always, same as BX passed in)
Note: a later read will get the keystroke as if it had been typed by the user
------------------------------------------------------
INT 15 - DESQview 2.0 - ENABLE/DISABLE AUTOMATIC JUSTIFICATION OF WINDOW
	AX = DE11h
	BL = 0	      viewport will not move automatically
	     nonzero  viewport will move to keep cursor visible
Return: nothing
------------------------------------------------------
INT 15 - DESQview 2.01 - ???
	AX = DE12h
	BX = 0	      clear ???
	     nonzero  set ???
Return: nothing
------------------------------------------------------
INT 16 - KEYBOARD - READ CHAR FROM BUFFER, WAIT IF EMPTY
	AH = 00h
Return: AH = scan code
	AL = character
------------------------------------------------------
INT 16 - KEYBOARD - CHECK BUFFER, DO NOT CLEAR
	AH = 01h
Return: ZF = 0 character in buffer
	    AH = scan code
	    AL = character
	ZF = 1 no character in buffer
------------------------------------------------------
INT 16 - KEYBOARD - GET SHIFT STATUS
	AH = 02h
	AL = shift status bits
	    0 = right shift key depressed
	    1 = left shift key depressed
	    2 = CTRL depressed
	    3 = ALT depressed
	    4 = SCROLL LOCK active
	    5 = NUM LOCK active
	    6 = CAPS LOCK active
	    7 = INSERT state active
------------------------------------------------------
INT 16 - KEYBOARD - SET DELAYS (Jr,AT model 339,XT286,PS)
	AH = 03h
-- 
{harvard,uunet,ucbvax}!b.gp.cs.cmu.edu!ralf -=-=- AT&T: (412)268-3053 (school) 
ARPA: RALF@B.GP.CS.CMU.EDU |"Tolerance means excusing the mistakes others make.
FIDO: Ralf Brown at 129/31 | Tact means not noticing them." --Arthur Schnitzler
BITnet: RALF%B.GP.CS.CMU.EDU@CMUCCVMA -=-=- DISCLAIMER? I claimed something?