home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / d / dvint33.zip / DVINT.LST next >
File List  |  1993-01-03  |  200KB  |  5,012 lines

  1. DESQview/QEMM Interrupt List    Release 33        Last change 1/3/93
  2. This compilation is Copyright (c) 1989,1990,1991,1992,1993 Ralf Brown
  3. ---------------------------------------------
  4. This is an excerpt of the full interrupt list, available as INTER33?.*.
  5. ---------------------------------------------
  6. If you notice any mistakes or omissions, please let me know!  It is only with
  7. YOUR help that the list can continue to grow at the current rate.  Please send
  8. all changes to me rather than distributing a modified version of the list.
  9.  
  10. Please read the file INTERRUP.1ST before asking me any questions.  You may find
  11. that they have already been addressed.
  12.  
  13.      Ralf Brown
  14.  
  15. ARPA: ralf@cs.cmu.edu
  16. UUCP: {ucbvax,harvard}!cs.cmu.edu!ralf
  17. BIT:  ralf%cs.cmu.edu@carnegie
  18. FIDO: Ralf Brown 1:129/26.1
  19.     or post a message to me in the DR_DEBUG echo (I probably won't see it
  20.     unless you address it to me)
  21. CIS:  >INTERNET:ralf@cs.cmu.edu 
  22.  
  23. I reply to all e-mail submissions and inquiries, but some of my replies bounce
  24. because of bad return paths.  If you don't get a response from me within a
  25. reasonable period of time, send it again with a better return path (starting at
  26. harvard or ucbvax for UUCP, from the ARPA Internet for others).
  27. ---------------------------------------------
  28. See INTERRUP.1ST for the key to system abbreviations and a list of the
  29. trademarks mentioned here.
  30. ---------------------------------------------
  31. DISCLAIMER:  THIS MATERIAL IS PROVIDED "AS IS".     I verify the information
  32. contained in this list to the best of my ability, but I cannot be held
  33. responsible for any problems caused by use or misuse of the information,
  34. especially for those functions not officially  documented.  If it is marked
  35. "internal" or undocumented, you should check it carefully to make sure it
  36. works the same way in your version of the software (and please let me know
  37. whether or not it works the same way).    Information marked with "???" is
  38. known to be incomplete or guesswork.
  39. ---------------------------------------------
  40. The use of -> instead of = signifies that the indicated register or register
  41. pair contains a pointer to the specified item, rather than the item itself.
  42. One or more letters may follow the interrupt number; they have the following
  43. meanings:  U - undocumented function, u - partially documented function,
  44. P - available only in protected mode, R - available only in real or V86 mode
  45. ----------0A---------------------------------
  46. INT 0A - IRQ2 - LPT2 (PC), VERTICAL RETRACE INTERRUPT (EGA,VGA)
  47. Notes:    the TOPS and PCnet adapters use this interrupt request line by default
  48.     DOS 3.2 revectors IRQ2 to a stack-switching routine
  49.     on ATs and above, the physical data line for IRQ2 is labeled IRQ9 and
  50.       connects to the slave 8259.  The BIOS redirects the interrupt for
  51.       IRQ9 back here.
  52.     under DESQview, only the INT 15h vector and BASIC segment address (the
  53.       word at 0000h:0510h) may be assumed to be valid for the handler's
  54.       process
  55.     many VGA boards do not implement the vertical retrace interrupt,
  56.       including the IBM VGA Adapter where the traces are either cut or
  57.       removed
  58. SeeAlso: INT 52"DESQview",INT 5A"DoubleDOS",INT 71,INT 7A"GO32"
  59. ----------0D---------------------------------
  60. INT 0D - IRQ5 - FIXED DISK (PC,XT), LPT2 (AT), reserved (PS/2)
  61. Notes:    under DESQview, only the INT 15h vector and BASIC segment address (the
  62.       word at 0000h:0510h) may be assumed to be valid for the handler's
  63.       process
  64.     may be masked by setting bit 5 on I/O port 21h
  65. SeeAlso: INT 0E"IRQ6",INT 0F"IRQ7",INT 55"DESQview",INT 5D"DoubleDOS"
  66. SeeAlso: INT 7D"GO32"
  67. ----------1000-------------------------------
  68. INT 10 - VIDEO - SET VIDEO MODE
  69.     AH = 00h
  70.     AL = mode (see below)
  71. Return: AL = video mode flag (Phoenix BIOS)
  72.         20h mode > 7
  73.         30h modes 0-5 and 7
  74.         3Fh mode 6
  75.     AL = CRT controller mode byte (Phoenix 386 BIOS v1.10)
  76. Note:    IBM standard modes do not clear the screen if the high bit of AL is set
  77.       (EGA or higher only)
  78. SeeAlso: AX=0070h,AX=007Eh,AX=10E0h,AX=10F0h,AH=40h,AX=6F05h,AH=FFh"GO32"
  79. SeeAlso: INT 33/AX=0028h,INT 5F/AH=00h,INT 62/AX=0001h
  80.  
  81. Values for video mode:
  82.       text/ text pixel     pixel    colors    disply    scrn  system
  83.       grph resol  box    resoltn        pages    addr
  84.  21h = T  132x60          16       2    B800 Tseng ET4000 chipset
  85.      = G   80x43  8x8    720x348     mono        B000 DESQview 2.x+Hercules [3]
  86.  22h = T  132x44  8x8                     Tseng Labs EVA
  87.      = G   80x43  8x8    720x348     mono        B800 DESQview 2.x+Hercules [3]
  88. Notes:
  89. [3] DESQview intercepts calls to change into these two modes (21h is page 0,
  90.       22h is page 1) even if there is no Hercules graphics board installed
  91. ----------1080--DX4456-----------------------
  92. INT 10 U - VIDEO - DESQview 2.0x only - internal - SET ??? HANDLER
  93.     AH = 80h
  94.     DX = 4456h ('DV')
  95.     ES:DI -> FAR subroutine to be called on ???
  96. Return: DS = segment of DESQview data structure for video buffer
  97. Note:    this function is probably meant for internal use only, due to the magic
  98.       value required in DX
  99.     the subroutine seems to be called when the DESQview menu is accessed;
  100.       on entry, AL = 03h or 04h
  101. ----------1081--DX4456-----------------------
  102. INT 10 U - VIDEO - DESQview 2.0x only - internal - GET ???
  103.     AH = 81h
  104.     DX = 4456h ('DV')
  105. Return: ES = segment of DESQview data structure for video buffer
  106.         BYTE ES:[0] = current window number in DV 2.0x
  107. Note:    this function is probably meant for internal use only, due to the magic
  108.       value required in DX
  109. SeeAlso: AH=82h
  110. ----------1082--DX4456-----------------------
  111. INT 10 U - VIDEO - DESQview 2.0x only - internal - GET CURRENT WINDOW INFO
  112.     AH = 82h
  113.     DX = 4456h ('DV')
  114. Return: DS = segment in DESQview for data structure
  115.          in DV 2.00,
  116.           BYTE DS:[0] = window number
  117.           WORD DS:[1] = segment of other data structure
  118.           WORD DS:[3] = segment of window's object handle
  119.     ES = segment of DESQview data structure for video buffer
  120.     AL = current window number
  121.     AH = ???
  122.     BL = direct screen writes
  123.         00h program does not do direct writes
  124.         01h program does direct writes, so shadow buffer not usable
  125.     BH = ???
  126.     CL = current video mode
  127.     CH = ???
  128. Note:    this function is probably meant for internal use only, due to the magic
  129.       value required in DX
  130. SeeAlso: AH=81h
  131. ----------10FE------------------------------
  132. INT 10 - TopView - GET SHADOW BUFFER
  133.     AH = FEh
  134.     ES:DI -> assumed video buffer
  135.         B800h:0000h color text/CGA graphics, B000h:0000h mono text,
  136.           or A000h:0000h EGA/VGA graphics (RSIS environments only)
  137. Return: ES:DI -> actual video buffer for calling process
  138. Notes:    if no multitasker or RSIS-compliant environment is installed, ES:DI is
  139.       returned unchanged; RSIS is the Relocated Screen Interface
  140.       Specification
  141.     for display pages other than 0, use AH=05h and AH=0Fh to determine
  142.       whether a particular page exists
  143.     TopView requires a call to AH=FFh to notify it that the screen has
  144.       changed; DESQview will check for changes itself until the first call
  145.       to AH=FFh
  146. SeeAlso: AH=05h,AX=5201h,AH=FFh,INT 15/AX=1024h,INT 21/AH=2Bh"DESQview"
  147. SeeAlso: INT 21/AH=ECh"DoubleDOS"
  148. ----------10FF-------------------------------
  149. INT 10 - TopView - UPDATE SCREEN FROM SHADOW BUFFER
  150.     AH = FFh
  151.     CX = number of consecutive changed characters
  152.     ES:DI -> first changed character in shadow buffer
  153. Notes:    avoid CX=0000h
  154.     DESQview will discontinue the automatic screen updating initiated by
  155.       AH=FEh after this call
  156.     not supported (ignored) by DESQview/X 1.0x
  157. SeeAlso: AH=FEh
  158. ----------151000-----------------------------
  159. INT 15 - TopView - "PAUSE" - GIVE UP CPU TIME
  160.     AX = 1000h
  161. Return: after other processes run
  162. Note:    under DESQview, if the process issuing this call has hooked INT 08h,
  163.       the current time-slice is set to expire at the next clock tick rather
  164.       than immediately
  165. SeeAlso: AH=00h"MultiDOS",AX=5305h,INT 21/AH=89h,INT 21/AH=EEh"DoubleDOS"
  166. SeeAlso: INT 2F/AX=1680h,INT 60/DI=0106h,INT 62/AH=01h,INT 7A/BX=000Ah
  167. SeeAlso: INT 7F/AH=E8h
  168. ----------151001-----------------------------
  169. INT 15 - TopView - "GETMEM" - ALLOCATE "SYSTEM" MEMORY
  170.     AX = 1001h
  171.     BX = number of bytes to allocate
  172. Return: ES:DI -> block of memory or 0000h:0000h (DV v2.26+)
  173.     AX = status (DV v2.42)
  174.         0000h successful
  175.         0001h failed
  176. Note:    use SETERROR (AX=DE15h) to avoid a user prompt if there is insufficient
  177.       common memory.  Under DV v2.42, this call never generates a user
  178.       prompt regardless of the SETERROR value; instead, it always returns
  179.       AX=0001h and ES:DI=0000h:0000h if out of memory
  180. SeeAlso: AX=1002h,AX=102Eh,AX=DE0Ch,AX=DE15h
  181. ----------151002-----------------------------
  182. INT 15 - TopView - "PUTMEM" - DEALLOCATE "SYSTEM" MEMORY
  183.     AX = 1002h
  184.     ES:DI -> previously allocated block
  185. Return: block freed
  186. SeeAlso: AX=1001h,AX=DE0Dh
  187. ----------151003-----------------------------
  188. INT 15 - TopView - "PRINTC" - DISPLAY CHARACTER/ATTRIBUTE ON SCREEN
  189.     AX = 1003h
  190.     BH = attribute
  191.     BL = character
  192.     DX = segment of object handle for window
  193. Note:    BX=0 does not display anything, it only positions the hardware cursor
  194. ----------1510-------------------------------
  195. INT 15 - TopView - UNIMPLEMENTED IN DV 2.x
  196.     AH = 10h
  197.     AL = 04h thru 12h
  198. Return: pops up "Programming error" window in DV 2.x
  199. ----------151013-----------------------------
  200. INT 15 - TopView - "GETBIT" - DEFINE A 2ND-LEVEL INTERRUPT HANDLER
  201.     AX = 1013h
  202.     ES:DI -> FAR service routine
  203. Return: BX = bit mask indicating which bit was allocated
  204.          0000h if no more bits available
  205. SeeAlso: AX=1014h,AX=1015h
  206. Note:    only a few TopView/DESQview API calls are allowed during a hardware
  207.       interrupt; if other calls need to be made, the interrupt handler
  208.       must schedule a 2nd-level interrupt with "SETBIT" (AX=1015h)
  209. ----------151014-----------------------------
  210. INT 15 - TopView - "FREEBIT" - UNDEFINE A 2ND-LEVEL INTERRUPT HANDLER
  211.     AX = 1014h
  212.     BX = bit mask from INT 15/AX=1013h
  213. SeeAlso: AX=1013h,AX=1015h
  214. ----------151015-----------------------------
  215. INT 15 - TopView - "SETBIT" - SCHEDULE ONE OR MORE 2ND-LEVEL INTERRUPTS
  216.     AX = 1015h
  217.     BX = bit mask for interrupts to post
  218. Return: indicated routines will be called: (DV 2.0x) at next task switch
  219.                        (DV 2.2x) immediately on return from
  220.                              hardware interrupt
  221. SeeAlso: AX=1013h,AX=1014h
  222. Notes:    this is one of the few TopView calls which are allowed from a hardware
  223.       interrupt handler
  224.     the handler will be called with ES containing the segment of the handle
  225.       of the next task to be executed; on return, ES must be the segment of
  226.       a task handle
  227. ----------151016-----------------------------
  228. INT 15 - TopView - "ISOBJ" - VERIFY OBJECT HANDLE
  229.     AX = 1016h
  230.     ES:DI = possible object handle
  231. Return: BX = FFFFh if ES:DI is a valid object handle
  232.          0000h if ES:DI is not
  233. Note:    under DESQview versions prior to 2.50, an object handle is always a
  234.       pointer to the object; for versions 2.50 and up, only task handles
  235.       are always pointers (other handles may consist of a unique object
  236.       number and offset into DESQview's common memory)
  237. SeeAlso: AX=DE14h,AX=DE2Bh,AX=DE2Ch
  238.  
  239. Format of object:
  240. Offset    Size    Description
  241.  00h    WORD    offset in common memory of previous object of same type
  242.  02h    WORD    offset in common memory of next object of same type
  243.  04h    WORD    signature FEDCh (DV 2.42-)
  244.         signature FEDCh or object number (DV 2.50+)
  245.  06h    WORD    object type
  246.         00h window/task
  247.         01h mailbox
  248.         02h keyboard
  249.         03h timer
  250.         04h pointer
  251.         05h panel
  252.         06h objectq
  253.  08h    DWORD    object handle to return to caller
  254.  0Ch    DWORD    canonicalized object address (segment = common memory)
  255.  10h    WORD    offset in common memory of owning task
  256.  12h    WORD    mapping context
  257.     remainder varies by object type and DESQview version
  258. ---v2.42 keyboard object---
  259.  14h    WORD    flag bits (see also AH=12h/BH=0Ah"OBJECT")
  260.         bit 15: keyboard opened
  261.  16h  4 BYTEs    ???
  262.  1Ah    WORD    priority in OBJECTQ???
  263.  1Ch    ...
  264.  25h    WORD    offset in common memory of ??? task
  265.  27h  4 BYTEs    ???
  266. ---v2.42 objectq object---
  267.  14h    WORD    flag bits (see also AH=12h/BH=0Ah"OBJECT")
  268.         bit 15: OBJECTQ opened
  269.  16h  2 BYTEs    ???
  270.  18h    WORD    offset in common memory of ??? task
  271.  1Ah  6 BYTEs    ???
  272. ---v2.42 mailbox object---
  273.  14h    WORD    flag bits (see also AH=12h/BH=0Ah"OBJECT")
  274.         bit 15: mailbox opened
  275.  1Ah    WORD    priority in OBJECTQ???
  276.  1Ch  6 BYTEs    ???
  277.  22h    WORD    offset in common memory of mailbox name (counted string)
  278.         0000h if no name
  279.      <= 5 BYTEs    ???
  280. ---v2.22-2.42 window/task object---
  281.  14h    BYTE    00h window, 01h task
  282.  15h    BYTE    internal (not Switch menu) window number???
  283.  16h    BYTE    internal (not Switch menu) window number???
  284.  17h    WORD    segment of internal window record
  285.  19h  2 BYTEs    ???
  286.  1Bh    BYTE    cursor row
  287.  1Ch    BYTE    cursor column
  288.  1Dh  2 BYTEs    ???
  289.  1Fh    BYTE    window height (logical)
  290.  20h    BYTE    window width (logical)
  291.  21h    BYTE    window position, row
  292.  22h    BYTE    window position, column
  293.  23h    BYTE    window height (visible)
  294.  24h    BYTE    window width (visible)
  295.  25h    BYTE    row of top of frame (or window if unframed)
  296.  26h    BYTE    column of left of frame (or window if unframed)
  297.  27h    BYTE    window height (physical, including frame)
  298.  28h    BYTE    window width (physical, including frame)
  299.  29h 10 BYTEs    ???
  300.  33h    BYTE    minimum height of window
  301.  34h    BYTE    minimum width of window
  302.  35h    BYTE    maximum height of window
  303.  36h    BYTE    maximum width of window
  304.  37h  3 BYTEs    ???
  305.  3Ah  8 BYTEs    window frame characters: ul,ur,ll,lr,t,b,l,r
  306.  42h 24 BYTEs    attributes???
  307.  5Ah  8 BYTEs    window frame characters: ul,ur,ll,lr,t,b,l,r
  308.  62h  6 BYTEs    ???
  309.  68h    WORD    offset in common memory of window name or 0000h if untitled
  310.  6Ah    WORD    length of window name
  311.  6Ch  2 BYTEs    ???
  312.  6Eh    WORD    offset of logical cursor in window (in character cells)
  313.  70h    DWORD    pointer to field table for window
  314.  74h  3 BYTEs    ???
  315.  77h    BYTE    number of last-visited field
  316.  78h    DWORD    pointer to field table entry for last-visited field
  317.  7Ch  3 BYTEs    ???
  318.  7Fh    BYTE    select field marker character
  319.  80h    BYTE    ??? bit flags
  320.         bit 0: allow ECh window stream opcode to change reverse logattr
  321.         bit 1: alternate field processing mode selected
  322.  81h    BYTE    ???
  323.  82h    DWORD    notification function (manager stream opcode 8Ah)
  324.         no notification if segment = 0000h
  325.  86h    DWORD    notification argument (manager stream opcode 8Bh)
  326.  8Ah    WORD    offset in common memory of ??? window object or 0000h
  327.  8Ch    WORD    offset in common memory of ??? window object or 0000h
  328.  8Eh    WORD    offset in common memory of ??? window object or 0000h
  329.  8Ch  6 BYTEs    ???
  330.  ---task object only
  331.  92h 11 BYTEs    ???
  332.  9Bh    BYTE    ??? bit flags
  333.         bit 3: ???
  334.         bit 6: perform protected-attribute processing on select fields
  335.  9Ch    BYTE    ???
  336.  9Dh    WORD    offset in common memory of current register save record
  337.         (see below).  No register save record in use if < 01C0h
  338.  9Fh    WORD    offset in common memory of task's keyboard object
  339.  A1h    WORD    offset in common memory of task's OBJECTQ object
  340.  A3h    WORD    offset in common memory of task's mailbox object
  341.  A5h    WORD    semaphore: FFFFh if on user stack, else on task's private stack
  342.  A7h    DWORD    user's SS:SP
  343.  ABh    WORD    task's private SP (SS read from offset 0Ah)
  344.  ADh  6 BYTEs    ???
  345.  B3h    BYTE    ??? bit flags
  346.         bit 0: run in foreground only
  347.  B4h  2 BYTEs    ???
  348.  B6h    BYTE    task status (see AX=DE2Ch)
  349.  B7h  9 BYTEs    ???
  350.  C0h    WORD    head pointer for keyboard buffer (wraps back to 00h after 80h)
  351.  C2h    WORD    tail pointer for keyboard buffer (wraps back to 00h after 80h)
  352.  C4h  2 BYTEs    ??? (0000h)
  353.  C6h    WORD    segment of keyboard buffer for task
  354.  C8h    WORD    offset in common memory of ??? keyboard object
  355.  CAh    BYTE    ???
  356.  CBh    WORD    offset in common memory of ??? object
  357.  CEh    BYTE    ??? flag
  358.  CFh    WORD    offset in common memory of default notify window for task
  359.         or 0000h if none
  360.  D1h  4 BYTEs    ???
  361.  D5h    BYTE    window number on Switch Window menu
  362.  D6h  5 BYTEs    ???
  363.  DBh    WORD    offset in common memory of ??? object
  364.  DDh  2 BYTEs    ???
  365.  DFh    WORD    API level for task
  366.  E1h    WORD    offset in common memory of ??? keyboard object
  367.  E7h    WORD    segment of ???
  368.  FDh    BYTE    ???
  369. 119h    DWORD    SS:SP for ???
  370. 11Dh  4 BYTEs    ???
  371. 121h    DWORD    pointer to ???
  372. 125h 35 BYTEs    ???
  373. ---v2.22
  374. 145h        task's default keyboard object
  375. ---v2.42
  376. 148h    WORD    ???
  377. 14Ah    BYTE    ???
  378. 14Dh 42 BYTEs    task's default keyboard object
  379. 177h 32 BYTEs    task's ObjectQ object
  380. 197h 41 BYTEs    task's default mailbox object
  381. 1C0h 24 BYTEs    first register save record
  382. 450h    --    default top of private stack
  383.  
  384. Format of Register Save Record:
  385. Offset    Size    Description
  386.  00h    WORD    AX
  387.  02h    WORD    BX
  388.  04h    WORD    CX
  389.  06h    WORD    DX
  390.  08h    WORD    DI
  391.  0Ah    WORD    SI
  392.  0Eh    WORD    DS
  393.  10h    WORD    ES
  394.  12h    DWORD    return address
  395.  16h    WORD    original flags
  396. ----------151017-----------------------------
  397. INT 15 - TopView - UNIMPLEMENTED IN DV 2.x
  398.     AX = 1017h
  399. Return: pops up "Programming error" window in DV 2.x
  400. ----------151018-----------------------------
  401. INT 15 - TopView - "LOCATE" - FIND WINDOW AT A GIVEN SCREEN LOCATION
  402.     AX = 1018h
  403.     BH = column
  404.     BL = row
  405.     ES = segment of object handle for window below which to search
  406.          0000h = start search with topmost window
  407. Return: ES = segment of object handle for window which is visible at the
  408.            indicated position, or covered by indicated window
  409.        = 0000h no window
  410. SeeAlso: AX=1023h,AX=1024h
  411. ----------151019-----------------------------
  412. INT 15 - TopView - "SOUND" - MAKE TONE
  413.     AX = 1019h
  414.     BX = frequency in Hertz (0000h = silence)
  415.     CX = duration in clock ticks (18.2 ticks/sec)
  416. Return: immediately, tone continues to completion
  417. Notes:    if another tone is already playing, the new tone does not start until
  418.       completion of the previous one.  Up to 32 tones may be queued before
  419.       the process is blocked until a note completes.
  420.     in DV 2.00, the lowest tone allowed is 20 Hz
  421.     if CX = 0, the current note is cancelled; if BX = 0 as well, all queued
  422.       notes are also cancelled
  423. SeeAlso: INT 16/AH=73h
  424. ----------15101A-----------------------------
  425. INT 15 - TopView - "OSTACK" - SWITCH TO TASK'S INTERNAL STACK
  426.     AX = 101Ah
  427. Return: stack switched
  428. Notes:    this call may not be nested; a second call must be preceded by a call
  429.       to "USTACK" (AX=1025h)
  430.     while TopView requires many API calls to be executed while on the
  431.       task's internal stack, DESQview allows those calls to be executed
  432.       regardless of the current stack
  433. SeeAlso: AX=1025h
  434. ----------15101B-----------------------------
  435. INT 15 - TopView - "BEGINC" - BEGIN CRITICAL REGION
  436.     AX = 101Bh
  437. Return: task-switching temporarily disabled
  438. Notes:    will not task-switch until "ENDC" (AX = 101Ch) called unless task
  439.       voluntarily releases the CPU (upon regaining the CPU, task-switching
  440.       will again be disabled)
  441.     suspends the caller until DOS is free
  442. SeeAlso: AH=0Dh"MultiDOS",AX=101Ch,AX=DE13h,AX=DE1Ch,INT 2F/AX=1681h
  443. SeeAlso: INT 60/DI=0602h
  444. ----------15101C-----------------------------
  445. INT 15 - TopView - "ENDC" - END CRITICAL REGION
  446.     AX = 101Ch
  447. Return: task-switching enabled
  448. Note:    this API call may be made from within a hardware interrupt handler
  449. SeeAlso: AX=101Bh,AX=DE13h,AX=DE1Bh,INT 2F/AX=1682h,INT 60/DI=0603h
  450. ----------15101D-----------------------------
  451. INT 15 - TopView - "STOP" - STOP TASK
  452.     AX = 101Dh
  453.     ES = segment of object handle for task to be stopped
  454.          (== handle of main window for that task)
  455. Return: indicated task will not get any CPU time until restarted with AX=101Eh
  456. Note:    once a task has been stopped, additional "STOP"s are ignored
  457. BUG:    in DV 2.00, this function is ignored unless the indicated task is the
  458.       current task
  459. SeeAlso: AX=101Eh,AX=102Bh,AH=12h"VMiX",INT 21/AH=81h
  460. ----------15101E-----------------------------
  461. INT 15 - TopView - "START" - START TASK
  462.     AX = 101Eh
  463.     ES = segment of object handle for task to be started
  464.          (== handle of main window for that task)
  465. Return: indicated task is started up again
  466. Note:    once a task has been started, additional "START"s are ignored
  467. SeeAlso: AX=101Dh,AX=102Bh,INT 21/AH=82h
  468. ----------15101F-----------------------------
  469. INT 15 - TopView - "DISPEROR" - POP-UP ERROR WINDOW
  470.     AX = 101Fh
  471.     BX = bit fields
  472.          bits 0-12: number of characters to display
  473.          bits 13,14: which mouse button may be pressed to remove window
  474.              00 = either
  475.              01 = left
  476.              10 = right
  477.              11 = either
  478.          bit 15: beep if 1
  479.     ES:DI -> text of message
  480.     CH = width of error window (0 = default)
  481.     CL = height of error window (0 = default)
  482.     DX = segment of object handle
  483. Return: BX = status: 1 = left button, 2 = right, 27 = ESC pressed
  484. Note:    window remains on-screen until ESC or indicated mouse button is pressed
  485. ----------151020-----------------------------
  486. INT 15 - TopView - UNIMPLEMENTED IN DV v2.00+
  487.     AX = 1020h
  488. Return: pops up "Programming error" window in DV v2.00+
  489. ----------151021-----------------------------
  490. INT 15 - TopView - "PGMINT" - INTERRUPT ANOTHER TASK
  491.     AX = 1021h
  492.     BX = segment of object handle for task to interrupt (not self)
  493.     DX:CX -> FAR routine to jump to next time task is run
  494. Return: nothing
  495. Notes:    the FAR routine is entered with the current ES, DS, SI, DI, and BP
  496.       values, using the task's internal stack (see AX=101Ah); only SS:SP
  497.       needs to be preserved
  498.     multiple PGMINTs to a single task are processed last-in first-out
  499.     if the other task is in a DOS or DV API call, the interruption will
  500.       occur on return from that call
  501. ----------151022BX0000-----------------------
  502. INT 15 - TopView - "GETVER" - GET VERSION
  503.     AX = 1022h
  504.     BX = 0000h
  505. Return: BX nonzero, TopView or compatible loaded
  506.     (BL = major version, BH = minor version)
  507. Notes:    TaskView returns BX = 0001h, DESQview v2.00+ returns BX = 0A01h
  508. ----------151023-----------------------------
  509. INT 15 - TopView - "POSWIN" - POSITION WINDOW
  510.     AX = 1023h
  511.     BX = segment of object handle for parent window within which to
  512.          position the window (0 = full screen)
  513.     ES = segment of object handle for window to be positioned
  514.     DL = bit flags
  515.          bits 0,1: horizontal position
  516.         00 = current
  517.         01 = center
  518.         10 = left
  519.         11 = right
  520.          bits 2,3: vertical position
  521.         00 = current
  522.         01 = center
  523.         10 = top
  524.         11 = bottom
  525.          bit 4: don't redraw screen if set
  526.          bits 5-7 not used
  527.     CH = number of columns to offset from position specified by DL
  528.     CL = number of rows to offset from position specified by DL
  529. Return: nothing
  530. ----------151024-----------------------------
  531. INT 15 - TopView - "GETBUF" - GET VIRTUAL SCREEN INFO
  532.     AX = 1024h
  533.     BX = segment of object handle for window
  534.           (0 = use default)
  535. Return: ES:DI -> virtual screen
  536.     CX = size of virtual screen in bytes
  537.     DL = 00h text screen
  538.          01h graphics screen
  539. SeeAlso: INT 10/AH=FEh,INT 21/AH=2Bh/CX=4445h
  540. ----------151025-----------------------------
  541. INT 15 - TopView - "USTACK" - SWITCH BACK TO USER'S STACK
  542.     AX = 1025h
  543. Return: stack switched back
  544. Notes:    call only after having switched to internal stack with AX=101Ah
  545.     while TopView requires many API calls to be executed while on the
  546.       task's private stack, DESQview allows those calls to be executed
  547.       regardless of the current stack
  548. SeeAlso: AX=101Ah
  549. ----------1510-------------------------------
  550. INT 15 - DESQview (TopView???) - UNIMPLEMENTED IN DV 2.x
  551.     AH = 10h
  552.     AL = 26h thru 2Ah
  553. Return: pops up "Programming error" window in DV 2.x
  554. ----------15102B-----------------------------
  555. INT 15 - DESQview v2.00+ (TopView???) - "POSTTASK" - AWAKEN TASK
  556.     AX = 102Bh
  557.     BX = segment of object handle for task
  558. Return: nothing
  559. Note:    forces a task which is waiting on its objectq to continue by placing
  560.       the handle for the task on the objectq
  561. SeeAlso: AX=101Dh,AX=101Eh,INT 21/AH=82h
  562. ----------15102C-----------------------------
  563. INT 15 - DESQview v2.00+ - "NEWPROC" - START NEW APPLICATION IN NEW PROCESS
  564.     AX = 102Ch
  565.     ES:DI -> contents of .PIF/.DVP file (see below)
  566.     BX = size of .PIF/.DVP info
  567. Return: BX = segment of object handle for new task
  568.          0000h on error
  569. SeeAlso: AX=DE24h,INT 21/AH=4Bh
  570.  
  571. Format of .PIF/.DVP file:
  572. Offset    Size    Description
  573.  00h    BYTE    reserved (0)
  574.  01h    BYTE    checksum of bytes 02h through 170h
  575.  02h 30 BYTEs    blank-padded program title
  576.  20h    WORD    maximum memory to allocate to partition in K
  577.  22h    WORD    minimum memory required in K
  578.  24h 64 BYTEs    ASCIZ program pathname
  579.  64h    BYTE    default drive letter ('A',...)
  580.  65h 64 BYTEs    ASCIZ default directory name
  581.  A5h 64 BYTEs    ASCIZ program parameters
  582.  E5h    BYTE    initial screen mode (0-7) (see also offset 189h)
  583.  E6h    BYTE    number of text pages used
  584.  E7h    BYTE    number of first interrupt to save
  585.  E8h    BYTE    number of last interrupt to save
  586.  E9h    BYTE    rows in virtual screen buffer
  587.  EAh    BYTE    columns in virtual screen buffer
  588.  EBh    BYTE    initial window position, row
  589.  ECh    BYTE    initial window position, column
  590.  EDh    WORD    system memory in K
  591.  EFh 64 BYTEs    ASCIZ shared program name
  592. 12Fh 64 BYTEs    ASCIZ shared program data file
  593. 16Fh    BYTE    flags1
  594.         bit 7: writes text directly to screen
  595.         bit 6: runs in foreground only
  596.         bit 5: uses math coprocessor
  597.         bit 4: accesses system keyboard buffer directly
  598.         bits 3-1: reserved (0)
  599.         bit 0: swappable
  600. 170h    BYTE    flags2
  601.         bit 6: uses command-line parameters in field at A5h
  602.         bit 5: swaps interrupt vectors
  603. ---information unique to .DVP files---
  604. 171h  2 BYTEs    keys to use on open menu
  605. 173h    WORD    size of script buffer in bytes
  606. 175h    WORD    automatically give up CPU after this many tests for keyboard
  607.         input in one clock tick (default 0 = never)
  608. 177h    BYTE    nonzero = "uses own colors"
  609. 178h    BYTE    nonzero if application swappable
  610. 179h  3 BYTEs    reserved (0) according to Quarterdeck documentation
  611.         in actual .DVP files, frequently 01h
  612. 17Ch    BYTE    nonzero to automatically close on exit (see also offset 18Bh)
  613. 17Dh    BYTE    nonzero if copy-protect floppy is required
  614. ---information unique to DESQview 2.0+---
  615. 17Eh    BYTE    .DVP version number
  616.         00h DESQview v1.2+
  617.         01h DESQview v2.0+
  618.         02h DESQview v2.2+
  619. 17Fh    BYTE    reserved (0)
  620. 180h    BYTE    initial number of rows in physical window
  621. 181h    BYTE    initial number of columns in physical window
  622. 182h    WORD    maximum expanded memory to allow, in K
  623. 184h    BYTE    flags3
  624.         bit 7: automatically assign window position
  625.         bit 5: maximum memory value has been specified
  626.         bit 4: disallow "Close" command
  627.         bit 3: foreground-only when doing graphics
  628.         bit 2: don't virtualize
  629.         bit 1: ??? set by DV 2.31 when "Runs in Background" = "D"
  630. 185h    BYTE    keyboard conflict level (0-4 for DV<2.26, 00h-0Fh for DV2.26+)
  631. 186h    BYTE    number of graphics pages used
  632. 187h    WORD    extra system memory size
  633. 189h    BYTE    initial screen mode (FFh = default) (overrides offset E5h)
  634. ---information unique to DESQview 2.2+---
  635. 18Ah    BYTE    serial port usage
  636.         FFh uses all serial ports
  637.         00h no serial ports
  638.         01h only COM1
  639.         02h only COM2
  640. 18Bh    BYTE    flags4
  641.         bit 7: automatically close application on exit if .COM or .EXE
  642.             specified (see also offset 17Ch)
  643.         bit 6: swappable if not using serial ports
  644.         bit 5: start program with window hidden (v2.26+)
  645.         bit 4: start program in background (v2.26+)
  646.         bit 3: virtualize text
  647.         bit 2: virtualize graphics
  648.         bit 1: share CPU when foreground
  649.         bit 0: share EGA when foreground and zoomed
  650. 18Ch    BYTE    protection level for 386 machines
  651. 18Dh 19 BYTEs    reserved (0) for regular DESQview
  652. ---information unique to DESQview/X 1.0---
  653. 18Dh    BYTE    X flags
  654.         bit 0: (XNEWPROC) use DOS client layer (DOS-to-X)
  655.                (NEWPROC) inherit DOS client layer usage
  656.         bit 1: don't display DOS window
  657.         bit 2: don't display wait message when opening window
  658.         bits 3-7: unused (0)
  659. 18Eh    BYTE    X keyboard behavior (0-3)
  660. 18Fh    BYTE    font scaling
  661.         00h fixed fonts
  662.         01h scalable fonts
  663. 190h 10 BYTEs    reserved (0)
  664. 19Ah    WORD    length of data follownig XDVP signature
  665. 19Ch  4 BYTEs    signature "XDVP"
  666. 1A0h  N BYTEs    list of variable length records (see below)
  667.  
  668. Format of variable length record:
  669. Offset    Size    Description
  670.  00h    WORD    length of following record, 0000h if end of record list
  671.  02h    BYTE    record type
  672.         01h script filename, up to 64 characters
  673.         02h command-line parameters (allows >64 characters on cmdline)
  674.         03h environment inheritance
  675.         04h environment string
  676.         05h starting window position
  677. ---types 01h,02h,04h---
  678.  03h  N BYTEs    ASCII data
  679. ---type 03h---
  680.  03h    BYTE    inheritance
  681.         00h do not inherit
  682.         01h inherit environment
  683. ---type 05h---
  684.  03h  N BYTEs    ASCII copy of fields as typed into DVPMAN, separated by commas:
  685.         starting row, starting column, starting height, starting width
  686. Note:    if there are multiple occurrences of record types 01h, 02h, or 03h,
  687.       only the last instance of each type is used; multiple occurrences of
  688.       type 04h are concatenated
  689. ----------15102D-----------------------------
  690. INT 15 - DESQview v2.00+ - "KMOUSE" - KEYBOARD MOUSE CONTROL
  691.     AX = 102Dh
  692.     BL = subfunction
  693.          00h determine whether using keyboard mouse
  694.         Return: BL = 00h using real mouse
  695.                  01h using keyboard mouse
  696.          01h turn keyboard mouse on
  697.          02h turn keyboard mouse off
  698. ----------15102E-----------------------------
  699. INT 15 - DESQview v2.40+ - ALLOCATE SYSTEM MEMORY
  700.     AX = 102Eh
  701.     BX = number of bytes
  702. Return: AX = status
  703.         0000h successful
  704.         ES:DI -> allocated system memory
  705.         0001h failed
  706.         ES:DI = 0000h:0000h
  707. Note:    under DV 2.42, this call is identical to AX=1001h
  708. SeeAlso: AX=1001h,AX=1002h,AX=DE0Ch
  709.  
  710. Format of system memory block header (one paragraph before memory block):
  711. Offset    Size    Description
  712.  00h    WORD    segment of next header or 0000h
  713.  02h    WORD    segment of previous header or 0000h
  714.  04h    WORD    size of block in paragraphs, including header
  715.  06h    BYTE    availability flag (00h in use, 01h free)
  716. ----------1511-------------------------------
  717. INT 15 - TopView commands
  718.     AH = 11h
  719.     AL = various (except 17h)
  720. Note:    in DESQview 2.x, these function calls are identical to AH=DEh, so
  721.       see those below
  722. SeeAlso: AH=DEh
  723. ----------151117BX0000-----------------------
  724. INT 15 - DESQview v2.20+ - "ASSERTMAP" - GET/SET MAPPING CONTEXT
  725.     AX = 1117h
  726.     BX = 0000h    get current mapping context without setting
  727.          nonzero    set new mapping context
  728. Return: BX = mapping context in effect before call
  729.     interrupts enabled
  730. Notes:    this function differs from AX = DE17h for DESQview v2.20 through 2.25
  731.     mapping contexts determine conventional-memory addressability; setting
  732.       a mapping context ensures that the associated program and data areas
  733.       are in memory for access.  Usable by drivers, TSRs and shared
  734.       programs.
  735.     caller need not be running under DESQview, but must ensure that the
  736.       stack in use will not be mapped out by the call
  737. SeeAlso: AX=DE17h,INT 2F/AX=1685h
  738. ----------1511DE-----------------------------
  739. INT 15 - DESQview - QEXT.SYS - INSTALLATION CHECK
  740.     AX = 11DEh
  741. Return: CF clear if installed
  742.         AX = segment at which QEXT.SYS is located
  743. Note:    a private entry point may be found by searching the beginning of the
  744.       returned segment for the signature string
  745.       "QUARTERDECK EXTENDED MEMORY MANAGER 286"; the word immediately
  746.       prior to the signature contains the QEXT version number in BCD,
  747.       and the word prior to that contains the offset within the QEXT
  748.       code segment of the private entry point
  749. SeeAlso: INT 67/AH=3Fh
  750.  
  751. Call private entry point with:
  752.     AH = 00h ???
  753.     AH = nonzero ???
  754. ----------1512--BH00-------------------------
  755. INT 15 - TopView - SEND MESSAGE - "HANDLE" - RETURN OBJECT HANDLE
  756.     AH = 12h
  757.     BH = 00h
  758.     BL = which handle to return
  759.         00h handle in DWORD on top of stack
  760.         01h current task's window handle
  761.         02h given task's mailbox handle (task's handle on stack)
  762.         03h current task's mailbox handle
  763.         04h given task's keyboard handle (task's handle on stack)
  764.         05h current task's keyboard object handle
  765.         06h given task's OBJECTQ handle (task's handle on stack)
  766.         07h current task's OBJECTQ handle
  767.         08h      \
  768.           thru > return 0000:0000 under DV < 2.26
  769.         10h      /
  770.         0Ch (2.26+) task owning object with handle in DWORD on top of stack
  771.         0Dh (2.26+) task handle of owner (parent) of current task
  772. Return: DWORD on top of stack is object handle
  773. Note:    BL=0Ch,0Dh returns 00000000h if the object is not open (keyboard,
  774.       mailbox, panel, pointer, and timer objects) or is an orphan (task,
  775.       window)
  776. SeeAlso: AH=12h/BH=02h,AH=12h/BH=80h
  777. ----------1512--BH01-------------------------
  778. INT 15 - TopView - SEND MESSAGE - "NEW" - CREATE NEW OBJECT
  779.     AH = 12h
  780.     BH = 01h
  781.     BL = object type to create
  782.         00h (DV 2.0x only) handle is DWORD on top of stack
  783.         01h (DV 2.0x only) use task's window handle
  784.         02h (DV 2.0x only) given task's mailbox (task's handle on stack)
  785.         03h (DV 2.0x only) current task's mailbox
  786.         04h (DV 2.0x only) given task's keyboard (task's handle on stack)
  787.         05h (DV 2.0x only) current task's keyboard object
  788.         08h WINDOW class
  789.         09h MAILBOX class
  790.         0Ah KEYBOARD class
  791.         0Bh TIMER object (counts down 32-bit time in 10ms increments)
  792.         0Fh POINTER object
  793.         10h PANEL object
  794.     STACK: (if window object or WINDOW class)
  795.            DWORD address to jump to (no new task if high word == 0)
  796.            DWORD (reserved) 0 = non-task window, FFFFh = task window
  797.            DWORD bytes for task's private stack (FFFFh == default of 0100h)
  798.            DWORD bytes system memory for input buffer for READ/READN
  799.             (0 == none, -1 == default--same as logical window size)
  800.            DWORD window size, columns
  801.            DWORD window size, rows
  802.            DWORD length of window title
  803.            DWORD address of window title
  804. Return: DWORD on top of stack is new object handle
  805. Notes:    if a new task is created, it is started with
  806.       AX = BX = SI = DI = BP = 0
  807.       DX:CX = handle of parent task
  808.       DS = ES = SS = segment of private stack (and new task's handle)
  809.     new windows are orphans, inherit the colors/hidden status of the
  810.       creating task's window, and are placed in the upper left hand corner
  811.       of the screen but not automatically redrawn
  812.     new keyboards are closed, and have all object bits cleared except for
  813.       the hardware cursor bit
  814. SeeAlso: AH=12h/BH=02h,AH=12h/BH=81h
  815. ----------1512--BH02-------------------------
  816. INT 15 - TopView - SEND MESSAGE - "FREE" - FREE AN OBJECT
  817.     AH = 12h
  818.     BH = 02h
  819.     BL = object
  820.         00h handle in DWORD on top of stack
  821.         window: close window and free
  822.         timer: free timer
  823.         panel: free panel object
  824.         pointer: free pointer
  825.         01h task's window handle - kills task, never returns
  826.         02h given task's mailbox (task's handle on top of stack)
  827.         03h current task's mailbox
  828.         04h given task's keyboard (task's handle on top of stack)
  829.         05h current task's keyboard object
  830. Notes:    when a window is freed, its keyboard and pointer objects are freed;
  831.       task windows also free any mailbox, objectq, and panel objects held
  832.       by the task and any child tasks
  833.     if the keyboard being freed is the default keyboard for a task, this
  834.       call is equivalent to CLOSE
  835.     panel and pointer objects are automatically closed if open
  836. SeeAlso: AH=12h/BH=01h,AH=12h/BH=0Dh,AH=12h/BH=82h
  837. ----------1512--BH03-------------------------
  838. INT 15 - TopView - SEND MESSAGE - "ADDR" - GET HANDLE OF MESSAGE SENDER
  839.     AH = 12h
  840.     BH = 03h
  841.     BL = object
  842.         00h mailbox handle in DWORD on top of stack
  843.         02h sender of last msg read from mailbox (task's handle on stack)
  844.         03h sender of last msg read from current task's mailbox
  845. Return: DWORD on stack is task handle of message sender
  846. SeeAlso: AH=12h/BH=00h,AH=12h/BH=83h
  847. ----------1512--BH03-------------------------
  848. INT 15 - DESQview v2.26+ - "CONNECT" - CONNECT TWO WINDOWS
  849.     AH = 12h
  850.     BH = 03h
  851.     BL = window to be connected
  852.         00h handle of window to be attached in DWORD on top of stack
  853.         01h attach current task's main window
  854.     STACK: DWORD handle of window to attach to or 00000000h to detach
  855. Return: STACK popped
  856. Notes:    when two windows are connected, both will move if the user moves either
  857.     multiple windows may be attached to a single window, but each window
  858.       may only be attached to one window at a time
  859. SeeAlso: AH=12h/BH=83h
  860. ----------1512--BX0300-----------------------
  861. INT 15 - TopView - SEND MESSAGE - "DIR" - GET PANEL FILE DIRECTORY
  862.     AH = 12h
  863.     BX = 0300h
  864.     STACK: DWORD handle of panel object
  865. Return: STACK: DWORD length of directory (always multiple of 14 bytes)
  866.            DWORD address of directory
  867. Note:    a null string is returned if the object is not open
  868. SeeAlso: AH=12h/BX=0400h"APPLY",AH=12h/BH=83h
  869.  
  870. Format of panel file:
  871. Offset    Size    Description
  872.  00h  2 BYTEs    C0h C3h
  873.  02h    BYTE    number of panels in file
  874.  03h    for each panel in file:
  875.         8 BYTEs  blank-padded panel name
  876.           DWORD  panel offset in file
  877.           WORD   panel length
  878.     data for panels (each consists of one or more window/query/manager
  879.     streams)
  880.         first byte of each panel must be 1Bh, fifth byte must be E5h
  881. ----------1512--BH04-------------------------
  882. INT 15 - TopView - SEND MESSAGE - "READ" - READ NEXT LOGICAL LINE OF WINDOW
  883.     AH = 12h
  884.     BH = 04h
  885.     BL = window to read from
  886.         00h handle is DWORD on top of stack
  887.         01h use calling task's default window
  888.         0Ch (DV 2.26+) default window of task owning handle on top of stack
  889.         0Dh (DV 2.26+) default window of parent task of current task
  890. Return: STACK:    DWORD number of bytes read
  891.         DWORD address of buffer
  892. Notes:    reading starts at the current logical cursor position; the cursor is
  893.       updated to point at the character following the last one read
  894.     any translucent blanks (FFh) which are visible on screen are changed
  895.       to the character which is seen through them
  896.     the string produced by the read is placed in an input buffer which may
  897.       be reused by the next READ or READN of a window
  898.     window stream opcodes D8h and D9h determine whether the read returns
  899.       characters or attributes
  900. SeeAlso: AH=12h/BH=05h"WINDOW",AH=12h/BH=12h,AH=12h/BH=84h
  901. ----------1512--BH04-------------------------
  902. INT 15 - TopView - SEND MESSAGE - "READ" - GET NEXT RECORD FROM OBJECT
  903.     AH = 12h
  904.     BH = 04h
  905.     BL = object
  906.         00h handle is DWORD on top of stack
  907.         mailbox: wait for and get next message
  908.         keyboard: wait for and get pointer to next input buffer
  909.         pointer: wait for and get next message
  910.         02h get next message from mailbox (task's handle on top of stack)
  911.         03h get next message from current task's mailbox
  912.         04h get the next input from keyboard (handle on top of stack)
  913.         05h get the next input from task's default keyboard
  914.         06h wait for input from any object in OBJECTQ (handle on stack)
  915.         07h wait for input from any object in task's default OBJECTQ
  916. Return: STACK: (if objectq) DWORD handle of object with input
  917.            (otherwise)  DWORD number of bytes
  918.                 DWORD address
  919. Notes:    for a keyboard in keystroke mode, the input buffer is a single byte
  920.       containing the character code as returned by the BIOS; the BIOS scan
  921.       code is available via the STATUS call if the character is zero
  922.     for a keyboard in field mode, the input buffer format is determined
  923.       by the field table header for the window the keyboard is attached to
  924.     keyboard input buffers and mailbox message buffers may be invalidated
  925.       by the next READ, ERASE, CLOSE, or FREE message to the same object
  926. SeeAlso: AH=12h/BH=05h"OBJECT",AH=12h/BH=84h
  927.  
  928. Format of pointer message:
  929. Offset    Size    Description
  930.  00h    WORD    row
  931.  02h    WORD    column
  932.  04h    BYTE    status
  933.         bit 7: set when press/release mode active and button pressed
  934.         bit 6: set when press/release mode active and button released
  935.         bits 7-2: number of clicks-1 if multiple-click mode active
  936.         bits 1,0: button pressed (00=none,01=button1,10=button2)
  937.  05h    BYTE    field number or zero (APILEVEL >= 2.00 only)
  938. ----------1512--BX0400-----------------------
  939. INT 15 - TopView - SEND MESSAGE - "READ" - WAIT FOR TIMER TO EXPIRE
  940.     AH = 12h
  941.     BX = 0400h
  942.     STACK: DWORD timer's handle
  943. Return: after timer expires
  944.     STACK: DWORD time in 1/100 sec after midnight when timer expired
  945. SeeAlso: AH=12h/BH=0Ah,AH=12h/BH=84h
  946. ----------1512--BX0400-----------------------
  947. INT 15 - TopView - SEND MESSAGE - "APPLY" - WRITE PANEL TO WINDOW
  948.     AH = 12h
  949.     BX = 0400h
  950.     STACK: DWORD handle of panel object
  951.            DWORD window's handle (or 0 for current task's window)
  952.            DWORD length of panel name
  953.            DWORD pointer to panel name
  954. Return: STACK: DWORD handle of window which was used
  955.            DWORD handle of keyboard or 0
  956. Notes:    status of APPLY may be checked with STATUS message
  957.     panel MUST have the following format
  958.       first byte must be 1Bh (i.e. must start with a stream)
  959.       first opcode in stream must be E5h
  960.         single byte arg of opcode is interpreted thus:
  961.           bits 7,6    11 means create new window
  962.             10 means create new field table for existing window
  963.             01 means use existing window and field table
  964.           bit 5 if set, panel contains a field table 
  965.             (creates a new keyboard and puts it in field mode)
  966.           bit 4 if set, panel contains input fields
  967.           bit 3 if set, panel contains select fields but no input fields
  968.     if the panel contains input or select fields, a keyboard handle is
  969.       returned; either the window's current open keyboard or a
  970.       newly-created keyboard object.  The caller should read that keyboard
  971.       to obtain input from the panel.
  972. SeeAlso: AH=12h/BH=84h
  973. ----------1512--BH05------------------------
  974. INT 15 - TopView - SEND MESSAGE - "WRITE" - WRITE TO OBJECT
  975.     AH = 12h
  976.     BH = 05h
  977.     BL = object
  978.         00h handle is DWORD on top of stack
  979.         timer: start timer to end at a specified time
  980.         keyboard: add input buffer to queue
  981.         pointer: move pointer icon to specified position
  982.         02h send message by value/status=0 to mbox (task's handle on stack)
  983.         03h send message by value/status=0 to current task's mailbox
  984.         04h add input buffer to KEYBOARD queue (handle on top of stack)
  985.         05h add input buffer to task's default KEYBOARD queue
  986.         06h add an object to OBJECTQ (handle on top of stack)
  987.         07h add an object to task's default OBJECTQ
  988.     STACK: (if mailbox)  DWORD length
  989.                  DWORD address
  990.            (if keyboard) DWORD status (scan code in keystroke mode)
  991.                  DWORD length (should be 1 in keystroke mode)
  992.                  DWORD address
  993.            (if objectq)  DWORD handle of object to add
  994.            (if timer)    DWORD 1/100ths seconds since midnight (actually
  995.                    only accurate to 1/18 sec)
  996.            (if pointer)  DWORD column relative to origin of window
  997.                  DWORD row relative to origin of window
  998. Notes:    under DV 2.2+, failed mailbox writes may return CF set (see AX=DE15h)
  999.     the data and status written to a keyboard object must match the format
  1000.       returned by the keyboard object in the current mode
  1001.     the pointer position is scaled according to the current scaling factors
  1002. SeeAlso: AH=12h/BH=04h,AH=12h/BH=85h
  1003. ----------1512--BH05-------------------------
  1004. INT 15 - TopView - SEND MESSAGE - "WRITE" - WRITE STRING TO WINDOW
  1005.     AH = 12h
  1006.     BH = 05h
  1007.     BL = window to write to
  1008.         00h DWORD on top of stack is window handle
  1009.         01h write string to task's default window
  1010.         0Ch (DV 2.26+) default window of task owning handle on top of stack
  1011.         0Dh (DV 2.26+) default window of parent of current task
  1012.     STACK: DWORD object handle if handle passed on stack
  1013.            DWORD total length of string (high word == 0)
  1014.            DWORD address of string to display
  1015. Return: indicated actions performed
  1016.     a. non-control characters are displayed (opcodes DEh and DFh control
  1017.        whether the attributes are left or changed to the current attrib)
  1018.     b. CR/LF/BS/Tab cause the usual cursor movement
  1019.     c. ESC starts a data structure with additional commands if following
  1020.        byte is less than 20h; otherwise, it is written to the window
  1021.     STACK:    DWORD handle of new window if window stream opcode E6h
  1022.         else nothing
  1023. SeeAlso: AH=12h/BH=04h,AH=12h/BH=85h
  1024.  
  1025. Data Structure:
  1026.     MAGIC  DB  1Bh
  1027.     MODE   DB  ?   ; 00h, 01h, 10h, 14h-1Fh legal
  1028.     LENGTH DW  ?   ; length of remainder in bytes
  1029.     var-length fields follow, each an OPCODE followed by
  1030.          zero or more args
  1031.  
  1032. MODE 00h (set or display values) "WINDOW STREAM"
  1033.     Opcodes:args
  1034.     00h  display 20h blanks with the default attribute
  1035.     01h-1Fh display OPCODE blanks with the default attribute
  1036.     20h  display char with default attribute 20h times
  1037.          BYTE char to repeat
  1038.     21h-3Fh display char with default attribute OPCODE-20h times
  1039.          BYTE char to repeat
  1040.     40h  display 20h blanks with specified attribute
  1041.          BYTE attribute of blanks
  1042.     41h-5Fh display OPCODE-40h blanks with specified attribute
  1043.          BYTE attribute of blanks
  1044.     60h  display next 20h characters
  1045.          20h BYTEs characters to display
  1046.     61h-7Fh display next OPCODE-60h characters
  1047.          N BYTEs characters to display
  1048.     80h-87h     display N blanks with default attribute
  1049.          BYTE low 8 bits of 11-bit count (high 3 in low 3 bits of OPCODE)
  1050.               [000h means 800h]
  1051.     88h-8Fh display N copies of the character
  1052.          BYTE low 8 bits of 11-bit count (high 3 in low 3 bits of OPCODE)
  1053.               [000h means 800h]
  1054.          BYTE character to repeat
  1055.     90h-97h     display N blanks with specified attribute
  1056.          BYTE low 8 bits of 11-bit length (high 3 in low 3 bits of OPCODE)
  1057.               [000h means 800h]
  1058.          BYTE attribute
  1059.     98h-9FH     display string at logical cursor pos
  1060.          BYTE low 8 bits of 11-bit length (high 3 in low 3 bits of OPCODE)
  1061.               [000h means 800h]
  1062.          N BYTEs string to display
  1063.     A0h  set logical cursor row
  1064.          BYTE row number (0 is top)
  1065.     A1h  set logical cursor column
  1066.          BYTE column number (0 is leftmost)
  1067.     A2h  set top edge of scrolling region
  1068.          BYTE row
  1069.     A3h  set left edge of scrolling region
  1070.          BYTE column
  1071.     A4h  set row of physical window position
  1072.          BYTE line
  1073.     A5h  set column of physical window position
  1074.          BYTE column
  1075.     A6h  set height of physical window
  1076.          BYTE #rows
  1077.     A7h  set width of physical window
  1078.          BYTE #columns
  1079.     A8h  set viewport row
  1080.          BYTE row
  1081.     A9h  set viewport column
  1082.          BYTE column
  1083.     AAh  set virtual screen height [contents of window unpredictable after]
  1084.          BYTE rows
  1085.     ABh  set virtual screen width [contents of window unpredictable after]
  1086.          BYTE columns
  1087.     ACh-AEh     unused
  1088.     AFh  set compatible/preferred video modes
  1089.          BYTE compatibility/preference mask
  1090.         bit 7    compatible with monochrome
  1091.         bit 6    compatible with color text, EGA/VGA graphics
  1092.         bit 5    compatible with medium-resolution CGA graphics
  1093.         bit 4    compatible with high-resolution CGA graphics
  1094.         bit 3    prefer monochrome
  1095.         bit 2    prefer color text, EGA/VGA graphics
  1096.         bit 1    prefer medium-resolution CGA graphics
  1097.         bit 0    prefer high-resolution CGA graphics
  1098.     B0h  move logical cursor down
  1099.          BYTE #rows (signed, negative values move up)
  1100.             [if #rows=0 and hardware cursor owner, update hw crsr]
  1101.     B1h  move logical cursor right
  1102.          BYTE #cols (signed, negative values move left)
  1103.             [if #cols=0 and hardware cursor owner, update hw crsr]
  1104.     B2h  shift top edge of scrolling region
  1105.          BYTE #rows (signed)
  1106.     B3h  shift left edge of scrolling region
  1107.          BYTE #cols (signed)
  1108.     B4h  shift physical window down
  1109.          BYTE #lines (signed)
  1110.     B5h  shift physical window right
  1111.          BYTE #columns (signed)
  1112.     B6h  expand physical window vertically
  1113.          BYTE #lines (signed)
  1114.     B7h  expand physical window horizontally
  1115.          BYTE #columns (signed)
  1116.     B8h  adjust viewport row
  1117.          BYTE #rows (signed)
  1118.     B9h  adjust viewport column
  1119.          BYTE #columns (signed)
  1120.     BAh  adjust virtual screen height [contents of window unpredict after]
  1121.          BYTE #rows to increase (signed)
  1122.     BBh  adjust virtual screen width [contents of window unpredictbl after]
  1123.          BYTE #cols to increase (signed)
  1124.     BCh-BFh     reserved (currently unused)
  1125.     C0h  set logical cursor position
  1126.          BYTE row number (0 is top border)
  1127.          BYTE column number (0 is left border)
  1128.     C1h  set top left corner of scrolling region
  1129.          BYTE row
  1130.          BYTE column
  1131.     C2h  set physical window pos
  1132.          BYTE upper left row (no top border if 0)
  1133.          BYTE upper left column (no left border if 0)
  1134.     C3h  set current window size
  1135.          BYTE #rows
  1136.          BYTE #cols
  1137.     C4h  set upper left corner of viewport (portion of virtual screen
  1138.          displayed in window)
  1139.          BYTE row
  1140.          BYTE column
  1141.     C5h  set size of virtual screen [contents unpredictable afterwards]
  1142.          BYTE #rows
  1143.          BYTE #cols
  1144.     C6h  unused
  1145.     C7h  unused
  1146.     C8h  set logical cursor relative to current position
  1147.          BYTE number of rows to move down (signed)
  1148.          BYTE number of columns to move right (signed)
  1149.           [if #rows=#cols=0 and hardware cursor owner, update hw cursr]
  1150.     C9h  shift top left corner of scrolling region
  1151.          BYTE #rows (signed)
  1152.          BYTE #cols (signed)
  1153.     CAh  set window pos relative to current position
  1154.          BYTE number of rows to shift down (signed)
  1155.          BYTE number of columns to shift right (signed)
  1156.     CBh  set window size relative to current size
  1157.          BYTE number of rows to expand (signed)
  1158.          BYTE number of cols to expand (signed)
  1159.     CCh  shift viewport relative to current position
  1160.          BYTE rows to shift (signed)
  1161.          BYTE cols to shift (signed)
  1162.     CDh  resize virtual screen
  1163.          BYTE #rows to expand (signed)
  1164.          BYTE #cols to expand (signed)
  1165.     CEh  scroll text when using E8h-EBh/F8h-FBh opcodes (default)
  1166.     CFh  scroll attributes when using  E8h-EBh/F8h-FBh opcodes
  1167.     D0h  allow window frame to extend beyond screen
  1168.     D1h  always display a complete frame, even if window extends beyond 
  1169.          edge of screen
  1170.     D2h  allow DV to change logical colors on video mode switch (default)
  1171.     D3h  application changes logical attributes
  1172.     D4h  window is visible [must redraw to actually make visible]
  1173.     D5h  window is hidden [must redraw to actually remove]
  1174.     D6h  window has frame (default)
  1175.     D7h  window unframed [must redraw to actually remove frame]
  1176.     D8h  READ/READN will read characters from window (default)
  1177.     D9h  READ/READN will read attributes from window
  1178.     DAh  use logical attributes, which may be remapped
  1179.         attributes
  1180.            1 normal text
  1181.            2 highlighted normal text
  1182.            3 help text
  1183.            4 highlighted help text
  1184.            5 error message
  1185.            6 highlighted error message
  1186.            7 emphasized text
  1187.            8 marked text
  1188.            9-16 are reverse video versions of 1-8
  1189.     DBh  use physical attributes for characters
  1190.     DCh  enable special actions for control characters (default)
  1191.     DDh  disable special control char handling, all chars displayable by
  1192.          BIOS TTY call
  1193.     DEh  write both character and attribute (default)
  1194.     DFh  write character only, leave attribute untouched
  1195.     E0h  repeat following commands through E1h opcode
  1196.          BYTE number of times to repeat (00h means 256 times)
  1197.     E1h  end of commands to repeat, start repeating them
  1198.     E2h  set current output color
  1199.          BYTE color
  1200.     E3h  clear virtual screen from scroll origin to end using current color
  1201.     E4h  redraw window
  1202.     E5h  select menu style
  1203.          BYTE style (normally 18h)
  1204.         bits 5,4 = 01 use two-letter menu entries for remainder of
  1205.           this stream
  1206.     E5h  (panel file only)
  1207.          BYTE modifier
  1208.         bits 7,6 = 11 panel stream creates new window
  1209.              = 10 panel defines new field table for existing window
  1210.              = 01 panel stream uses existing window & field table
  1211.         bit 5 = 1 stream contains a field table (create kyboard object)
  1212.         bit 4 = 1 stream defines input fields (create keyboard object)
  1213.         bit 3 = 1 stream defines select fields but not input fields
  1214.         bit 2 = 1 stream defines exclusive input window (DV 2.2)
  1215.         bit 1 reserved
  1216.         bit 0 reserved
  1217.     E6h  create new window and perform rest of manipulations in new window
  1218.          BYTE number of rows
  1219.          BYTE number of columns
  1220.          Return: DWORD object handle of new window returned on stack at end
  1221.          Note: the window is created with a physical size of 0x0 at the
  1222.              same position as the window to which this stream was sent
  1223.     E7h  no operation
  1224.     E8h  scroll area up (top left corner defined by opcode C1h)
  1225.          BYTE height
  1226.          BYTE width
  1227.     E9h  scroll area down (top left corner defined by opcode C1h)
  1228.          BYTE height
  1229.          BYTE width
  1230.     EAh  scroll area left (top left corner defined by opcode C1h)
  1231.          BYTE height
  1232.          BYTE width
  1233.     EBh  scroll area right (top left corner defined by opcode C1h)
  1234.          BYTE height
  1235.          BYTE width
  1236.     ECh  set logical attributes for window contents
  1237.          BYTE video modes command applies to
  1238.         bit 7    monochrome
  1239.         bit 6    color text, EGA/VGA graphics
  1240.         bit 5    medium-resolution CGA graphics
  1241.         bit 4    high-resolution CGA graphics
  1242.          BYTE which attributes to set
  1243.         bit 7  if set, copy single following byte to indicated attribs
  1244.         bits 4-6  # of first attribute to change - 1
  1245.         bits 0-3  # of consecutive attributes to change
  1246.          N BYTEs new attributes
  1247.     EDh  set logical attributes for window frame
  1248.          BYTE video modes command applies to (see opcode ECh)
  1249.          BYTE which attributes to set
  1250.         bit 7  if set, copy single following byte to indicated attrs
  1251.         bits 4-6  # of first attribute to change - 1
  1252.         bits 0-3  # of consecutive attributes to change
  1253.          N BYTEs new attributes
  1254.           attributes
  1255.                1 = top left corner
  1256.                2 = top right corner
  1257.                3 = bottom left corner
  1258.                4 = bottom right corner
  1259.                5 = top edge
  1260.                6 = bottom edge
  1261.                7 = left edge
  1262.                8 = right edge
  1263.     EEh  set characters for window frame
  1264.          BYTE video modes command applies to (see opcode ECh)
  1265.          BYTE which characters to set
  1266.         bit 7  if set, copy single following byte to indicated chars
  1267.         bits 4-6  # of first char to change - 1
  1268.         bits 0-3  # of consecutive chars to change
  1269.          N BYTEs new chars (same relative position as attributes above)
  1270.     EFh  set window name
  1271.          BYTE length of name (should be in range 0 to logical screen width)
  1272.          N BYTEs name
  1273.     F0h  clear input field to blanks
  1274.          BYTE field number
  1275.     F1h  fill input field with character
  1276.          BYTE field number
  1277.          BYTE char
  1278.     F2h  set color of input field
  1279.          BYTE field number (1-N)
  1280.          BYTE attribute
  1281.     F3h  set initial contents of input field
  1282.          BYTE field number (1-N)
  1283.          N BYTEs enough chars to exactly fill field as defined by op FFh
  1284.     F4h  position cursor to start of specific input field
  1285.          BYTE field number (1-N)
  1286.     F5h  change field table entry
  1287.          BYTE field number
  1288.          7-8 BYTEs field table entry (see opcode FFh below)
  1289.     F6h  set field type
  1290.          BYTE field number
  1291.          BYTE type
  1292.             00h inactive
  1293.             40h output field
  1294.             80h input field
  1295.             C0h deselected field
  1296.             C2h selected field
  1297.     F7h  "broadcast write"    write data to fields with program output bit
  1298.         set in field table entry, in field number order
  1299.          N BYTEs (total length of all program output fields)
  1300.     F8h  scroll field up a line
  1301.          BYTE field number
  1302.     F9h  scroll field down a line
  1303.          BYTE field number
  1304.     FAh  scroll field left
  1305.          BYTE field number
  1306.     FBh  scroll field right
  1307.          BYTE field number
  1308.     FCh  set field table header
  1309.          BYTE number of fields (must be <= existing number of fields)
  1310.          BYTE screen behavior bits
  1311.         bit 7  reserved
  1312.         bit 6  set if menu items may be selected via keyboard
  1313.         bit 5  set if left mouse button in "status" mode (press
  1314.             anywhere in window immediately returns control to app)
  1315.         bit 4  set if right mouse button in "status" mode
  1316.         bit 3  if set, select fields return contents or blanks rather
  1317.             than 'Y' or 'N'
  1318.         bit 2  if set, modified bits reset on return to application
  1319.         bits 0,1 = 00 no data returned on read of keyboard
  1320.                01 data returned as array of chars containing
  1321.                 all fields packed together, with no field
  1322.                 numbers
  1323.                10 data returned as numbered variable-length
  1324.                 records for all fields
  1325.                11 data returned as numbered variable-length
  1326.                 records for the fields which were modified
  1327.          BYTE current input field (updated by DESQview)
  1328.          BYTE current select field (updated by DESQview)
  1329.          BYTE attribute for select fields when they are pointed at
  1330.          BYTE attribute for select fields which have been selected
  1331.     FDh  reset modified bit for all fields
  1332.     FEh  reset selected and modified bits for all fields
  1333.     FFh  set up input fields
  1334.          6 BYTEs table header (see opcode FCh above)
  1335.          the field table entries, one for each field
  1336.          BYTE start row       \
  1337.          BYTE start column  \ if menu selection and start is to
  1338.          BYTE end row        / right or below end, select from kbd only
  1339.          BYTE end column   /
  1340.          BYTE field type
  1341.             bits 7,6 = 00 inactive (non-entry) field
  1342.                    01 echos keystrokes input to make menu selection
  1343.                    10 fill-in field
  1344.                    11 select field
  1345.             bit 5  field can be filled by broadcast write (F7h opcode)
  1346.             bit 4  reserved
  1347.             bit 3  reserved
  1348.             bit 2  reserved
  1349.             bit 1  set if field selected
  1350.             bit 0  set if field modified
  1351.          BYTE modifier
  1352.               if type is fill-in, then bit flags to determine behavior
  1353.               bit 7     if set, automatically enter CR when field full
  1354.               bit 6     move to next field when current field is full
  1355.               bit 5     if set, enter text from right end (for numbers)
  1356.               bit 4     if set, force input to uppercase
  1357.               bit 3     if set, clear old contents on first keystroke
  1358.               bit 2     if set, input returned when cursor moves out
  1359.                  of modified field ("validate",API level 2.02+)
  1360.               bit 1     reserved
  1361.               bit 0     reserved
  1362.               if select field, first key to press to activate
  1363.               00h if have to point-&-click or is an extended-ASCII
  1364.                   keystroke (only if two-key menus enabled)
  1365.          BYTE (select field only) normal color of field
  1366.          BYTE second key for select field.  This byte is present iff
  1367.               two-letter menu entries selected with opcode E5h, and
  1368.               in that case is present regardless of field type
  1369.          Note: DESQview uses and updates the actual copy of the information
  1370.            which is contained in the stream.  Thus this info must remain
  1371.            intact until after the data entry is complete.
  1372.  
  1373. MODE 01h "QUERY STREAM" (valid only for those opcodes listed here)
  1374.     A0h return logical cursor row in next byte
  1375.     A1h return logical cursor column in next byte
  1376.     A2h return top row of scrolling region in next byte
  1377.     A3h return left column of scrolling region in next byte
  1378.     A4h return row of physical window origin in next byte
  1379.     A5h return column of physical window origin in next byte
  1380.     A6h return height of physcial window in next byte
  1381.     A7h return width of physical window in next byte
  1382.     A8h return row of viewport origin in next byte
  1383.     A9h return column of viewport origin in next byte
  1384.     AAh return height of virtual screen in next byte
  1385.     ABh return width of virtual screen in next byte
  1386.     AFh return current video mode in next byte
  1387.     C0h return current logical cursor position in next two bytes
  1388.     C1h return top left corner of scrolling region in next two bytes
  1389.     C2h return current window position in next two bytes
  1390.     C3h return current window size in next two bytes
  1391.     C4h return current viewport origin in next two bytes
  1392.     C5h return current virtual screen size in next two bytes
  1393.     D0h \ overwritten with D0h if frames may fall off screen edge
  1394.     D1h /               D1h if frames always displayed entirely
  1395.     D2h \ overwritten with D2h if DESQview controls color palette
  1396.     D3h /               D3h if application changes color palette
  1397.     D4h \ overwritten with D4h if window visible
  1398.     D5h /               D5h if window hidden
  1399.     D6h \ overwritten with D6h if window has frame
  1400.     D7h /               D7h if window unframed
  1401.     D8h \ overwritten with D8h if reading characters from window
  1402.     D9h /               D9h if reading attributes from window
  1403.     DAh \ overwritten with DAh if using logical attributes
  1404.     DBh /               DBh if using physical attributes
  1405.     DCh \ overwritten with DCh if TTY control char interpretation on
  1406.     DDh /               DDh if TTY control char interpretation off
  1407.     DEh \ overwritten with DEh if writing both characters and attributes
  1408.     DFh /               DFh if leaving attributes untouched
  1409.     E2h return current color in next byte
  1410.     ECh get logical attributes for window contents
  1411.         BYTE execute call if currently in specified video mode
  1412.         bit 7    monochrome
  1413.         bit 6    color text, EGA/VGA graphics
  1414.         bit 5    medium-resolution CGA graphics
  1415.         bit 4    high-resolution CGA graphics
  1416.         BYTE which attributes to get
  1417.         bit 7 unused???
  1418.         bits 4-6 first attribute to get - 1
  1419.         bits 0-3 # consecutive attributes
  1420.         N BYTEs buffer to hold attributes
  1421.     EDh get logical attributes for window frame
  1422.         BYTE execute call if currently in video mode (see opcode ECh)
  1423.         BYTE which attributes to get
  1424.         bit 7 unused???
  1425.         bits 4-6 first attribute to get - 1
  1426.         bits 0-3 # consecutive attributes
  1427.         N BYTEs buffer to hold attributes
  1428.     EEh get characters for window frame
  1429.         BYTE execute call if currently in video mode (see opcode ECh)
  1430.         BYTE which attributes to get
  1431.         bit 7 unused???
  1432.         bits 4-6 first char to get - 1
  1433.         bits 0-3 # consecutive chars
  1434.         N BYTEs buffer to hold chars
  1435.     EFh return first N characters of current window name
  1436.         BYTE    max length of returned name
  1437.         N BYTEs buffer to hold window name
  1438.     F3h return contents of specified field
  1439.         BYTE field number
  1440.         N BYTEs buffer to hold field contents (size exactly equal to field
  1441.             size)
  1442.     F5h get field table entry
  1443.         BYTE field number
  1444.         7-8 BYTEs buffer to hold field table entry
  1445.            Notes: DV < 2.26 always returns 7 bytes
  1446.               DV 2.26+ w/ APILEVEL < 2.26 returns 8 bytes iff field
  1447.             table is using 8-byte entries and eighth byte after
  1448.             F5h is E7h (NOP); otherwise, 7 bytes are returned
  1449.               DV 2.26+ w/ APILEVEL > 2.26 returns 7 or 8 bytes
  1450.             depending on the field table entry size
  1451.     F6h get type of a field
  1452.         BYTE field number
  1453.         BYTE type
  1454.     FCh get field table header
  1455.         6 BYTEs buffer to store header
  1456.  
  1457. MODE 10h "MANAGER STREAM" (valid only for opcodes listed here)
  1458.     00h allow window to be moved horizontally
  1459.     01h allow window to be moved vertically
  1460.     02h allow window to change width
  1461.     03h allow window to change height
  1462.     04h allow window to be scrolled horizontally
  1463.     05h allow window to be scrolled vertically
  1464.     06h allow "Close Window" menu selection for application
  1465.     07h allow "Hide Window" menu selection for application
  1466.     08h allow application to be suspended ("Rearrange/Freeze")
  1467.     0Eh allow "Scissors" menu
  1468.     10h allow DESQview main menu to be popped up
  1469.     11h allow "Switch Windows" menu
  1470.     12h allow "Open Window" menu
  1471.     13h allow "Quit" menu selection
  1472.     20h-33h opposite of 00h-13h, disallow specified action
  1473.     40h notify if horizontal position of window changes
  1474.     41h notify if vertical position of window changes
  1475.     42h notify if width of window changes
  1476.     43h notify if height of window changes
  1477.     44h notify if window scrolled horizontally
  1478.     45h notify if window scrolled vertically
  1479.     46h notify if window is closed--program has to clean up and exit itself
  1480.     47h notify if window is hidden
  1481.     48h notify if "?" on main menu selected
  1482.     49h notify if pointer message sent to window
  1483.     4Ah notify if window is placed in foreground
  1484.     4Bh notify if window is placed in background
  1485.     4Ch notify if video mode changes
  1486.     4Dh notify if "Scissors" menu "Cut" option selected
  1487.     4Eh notify if "Scissors" menu "Copy" option selected
  1488.     4Fh notify if "Scissors" menu "Paste" option selected
  1489.     50h notify if DESQview main menu about to pop up
  1490.     51h notify if DESQview main menu popped down
  1491.     60h-71h     opposite of 40h-51h: don't notify on specified event
  1492.     84h attach window to parent task's window (both move together)
  1493.     85h detach window from parent task's window (may move independently)
  1494.     86h disable background operation for application
  1495.     87h enable running in background
  1496.     88h set minimum size of physical window
  1497.         BYTE rows
  1498.         BYTE columns
  1499.     89h set maximum size of physical window
  1500.         BYTE rows
  1501.         BYTE cols
  1502.     8Ah set primary asynchronous notification routine
  1503.         DWORD address of routine, 0000h:0000h means none (see also below)
  1504.     8Bh set async notification parameter
  1505.         DWORD 32-bit value passed to 8Ah async routine in DS:SI
  1506.     ACh (DV2.2+) perform regular select field attribute processing
  1507.     ADh (DV2.2+) protect attributes in selected field from being lost
  1508.     AEh make window default notify window for owning app (API level 2.00+)
  1509.     AFh set selected field marker character
  1510.         BYTE character to display at left edge of selected fields
  1511.     BCh set standard field processing mode 
  1512.     BDh set alternate field processing mode (enables cursor pad for menus)
  1513.     BEh disables changing reverse logical attributes with ECh opcode
  1514.     BFh enables changing reverse logical attributes with ECh opcode
  1515.     C0h make current window topmost in system
  1516.     C1h force current process into foreground
  1517.     C2h make current window topmost in process
  1518.     C3h position mouse pointer relative to origin of current field
  1519.         BYTE rows below upper left corner of field
  1520.         BYTE columns to right of upper left corner of field
  1521.     C4h position mouse pointer relative to origin of given field
  1522.         BYTE field number
  1523.         BYTE rows below upper left corner of field
  1524.         BYTE columns to right of upper left corner of field
  1525.     C5h orphan current window (also hides it)
  1526.         Note: must be last in stream; all subsequent commands ignored
  1527.     C6h show all windows for this process
  1528.     C7h hide all windows for this process
  1529.     C8h suspend process and hide all its windows
  1530.     C9h force current process into background
  1531.     CAh make current window bottom-most in process
  1532.     CBh cancel current window manager operation, remove DV menu, give 
  1533.         control to topmost application
  1534.     CCh orphan window and give it to the system for use as paste data
  1535.     CEh reorder windows
  1536.         DWORD pointer to null-terminated list of words
  1537.           each word is segment of object handle for a window
  1538.     FFh no operation
  1539.  
  1540. MODES 14h to 1Fh "USER STREAMS"
  1541.     normally NOPs, but may be defined by SETESC message to invoke FAR
  1542.     routines, one for each mode number
  1543.       on entry to handler,
  1544.         DS:SI -> first byte of actual stream (not header)
  1545.         CX = #bytes in stream
  1546.         ES:DI = window's handle
  1547.  
  1548. Asynchronous notification routine defined by manager stream 8Ah called with:
  1549.     ES:DI = handle of window
  1550.     DS:SI is 32-bit value set by 8Bh manager stream opcode
  1551.        mailbox contains message indicating event
  1552.           Opcode
  1553.            40h  horizontal movement
  1554.            DWORD object handle of window
  1555.            BYTE     new row
  1556.            BYTE     new col
  1557.            41h  vertical movement
  1558.            DWORD object handle of window
  1559.            BYTE     new row
  1560.            BYTE     new col
  1561.            42h  horizontal size change
  1562.            DWORD object handle of window
  1563.            BYTE     new rows
  1564.            BYTE     new cols
  1565.            43h  vertical size change
  1566.            DWORD object handle of window
  1567.            BYTE     new rows
  1568.            BYTE     new cols
  1569.            44h  scrolled horizontally
  1570.            DWORD object handle of window
  1571.            BYTE     mouse row within window
  1572.            BYTE     mouse column within window
  1573.            BYTE     field mouse is on, 0 if none
  1574.            BYTE     amount moved: >0 right, <0 left, 0 done
  1575.            45h  scrolled vertically
  1576.            DWORD object hande of window
  1577.            BYTE     mouse row within window
  1578.            BYTE     mouse column within window
  1579.            BYTE     field mouse is on, 0 if none
  1580.            BYTE     amount moved: >0 down, <0 up, 0 done
  1581.            46h  window close request
  1582.            DWORD object handle of window
  1583.            BYTE     mouse pointer row
  1584.            BYTE     mouse pointer column
  1585.            BYTE     field mouse is on, 0 if none
  1586.            47h  application's windows hidden
  1587.            48h  Help for Program selected
  1588.            DWORD object handle of window
  1589.            BYTE     mouse pointer row
  1590.            BYTE     mouse pointer column
  1591.            BYTE     field mouse is on, 0 if none
  1592.            49h  pointer message sent to window
  1593.            DWORD pointer handle which received message
  1594.            4Ah  switched to window from another ("raise")
  1595.            4Bh  switched away from the window ("lower")
  1596.            4Ch  video mode changed
  1597.            BYTE new BIOS video mode
  1598.            4Dh  Scissors/cUt selected
  1599.            DWORD object handle of window
  1600.            BYTE     row of upper left corner
  1601.            BYTE     column of upper left corner
  1602.            BYTE     field number ul corner is in, 0=none
  1603.            DWORD handle of orphaned window created with
  1604.              copy of data from specified region
  1605.            BYTE     height of region
  1606.            BYTE     width of region
  1607.            4Eh  Scissors/Copy selected
  1608.            DWORD object handle of window
  1609.            BYTE     row of upper left corner
  1610.            BYTE     column of upper left corner
  1611.            BYTE     field number ul corner is in, 0=none
  1612.            DWORD handle of orphaned window created with
  1613.              copy of data from specified region
  1614.            BYTE     height of region
  1615.            BYTE     width of region
  1616.            4Fh  Scissors/Paste selected
  1617.            DWORD object handle of window
  1618.            BYTE     row of upper left corner
  1619.            BYTE     column of upper left corner
  1620.            BYTE     field number ul corner is in, 0=none
  1621.            DWORD handle of orphaned window with data
  1622.            BYTE     height of region
  1623.            BYTE     width of region
  1624.             Note: orphaned data window should be adopted or freed
  1625.                 when done
  1626.            50h  main menu about to pop up
  1627.            51h  main menu popped down
  1628. Return: all registers unchanged
  1629. ----------1512--BH06-------------------------
  1630. INT 15 - DESQview 2.20+ - SEND MESSAGE - "SETPRI" - SET PRIORITY WITHIN OBJECTQ
  1631.     AH = 12h
  1632.     BH = 06h
  1633.     BL = object
  1634.         00h object handle in DWORD on top of stack
  1635.         mailbox, keyboard, pointer, or timer
  1636.         (DV 2.50+) window
  1637.         01h (DV 2.50+) current task's window
  1638.         04h given task's keyboard (task's handle on top of stack)
  1639.         05h current task's default keyboard
  1640.     STACK: DWORD new priority of object in task's OBJECTQ
  1641.             (new priority of task if window handle)
  1642. Notes:    initially all objects have the same default value.  Should only make 
  1643.       relative adjustments to this default value.
  1644.     when changing priorities, all objects already on the objectq are
  1645.       reordered
  1646.     for window handles, only the non-blocked task(s) with the highest
  1647.       priority receive CPU time under DESQview 2.50-2.52; the default
  1648.       priority is 0Ah
  1649. SeeAlso: AH=12h/BH=07h,AH=12h/BH=87h
  1650. ----------1512--BH07-------------------------
  1651. INT 15 - DESQview 2.20+ - SEND MESSAGE - "GETPRI" - GET PRIORITY WITHIN OBJECTQ
  1652.     AH = 12h
  1653.     BH = 07h
  1654.     BL = object
  1655.         00h object handle in DWORD on top of stack
  1656.         mailbox, keyboard, pointer, or timer
  1657.         (DV 2.50+) window
  1658.         01h (DV 2.50+) current task's window
  1659.         04h given task's keyboard (task's handle on top of stack)
  1660.         05h current task's default keyboard
  1661. Return: STACK: DWORD object priority
  1662. Note:    initially all objects have the same default value.  Should only make 
  1663.       relative adjustments to this default value.
  1664. SeeAlso: AH=12h/BH=06h
  1665. ----------1512--BH08-------------------------
  1666. INT 15 - TopView - SEND MESSAGE - "SIZEOF" - GET OBJECT SIZE
  1667.     AH = 12h
  1668.     BH = 08h
  1669.     BL = object
  1670.         00h handle in DWORD on top of stack
  1671.         window: total character positions in window
  1672.         timer: elapsed time since timer started
  1673.         pointer: number of messages queued to pointer object
  1674.         panel: number of panels in panel file
  1675.         keyboard: number of input buffers queued
  1676.         01h total chars in current task's default window
  1677.         02h number of messages in task's mailbox (task's handle on stack)
  1678.         03h number of messages in current task's mailbox
  1679.         04h number of input buffers queued in task's kbd (handle on stack)
  1680.         05h number of input buffers queued for current task's default kbd
  1681.         06h number of objects queued in OBJECTQ (task's handle on stack)
  1682.         07h number of objects queued in current task's OBJECTQ
  1683.         0Ch (DV 2.26+) total chars in window owning handle on top of stack
  1684.         0Dh (DV 2.26+) total chars in parent task's window
  1685. Return: DWORD on top of stack is result
  1686. Note:    for panel objects, a count of zero is returned if no panel file is open
  1687.       for the object
  1688. SeeAlso: AH=12h/BH=04h,AH=12h/BH=09h
  1689. ----------1512--BH09-------------------------
  1690. INT 15 - TopView - SEND MESSAGE - "LEN" - GET OBJECT LENGTH
  1691.     AH = 12h
  1692.     BH = 09h
  1693.     BL = object
  1694.         00h handle in DWORD on top of stack
  1695.         window: get chars/line
  1696.         timer: get 1/100 seconds remaining before timer expires
  1697.         mailbox: (DV/X) get number of bytes queued to mailbox
  1698.         01h get number of chars/line in current task's default window
  1699.         0Ch (DV 2.26+) get chars/line in window owning handle on top of stk
  1700.         0Dh (DV 2.26+) get chars/line in parent task's window
  1701. Return: DWORD on top of stack is length
  1702. SeeAlso: AH=12h/BH=08h
  1703. ----------1512--BH0A-------------------------
  1704. INT 15 - TopView - SEND MESSAGE - "ADDTO" - WRITE CHARS AND ATTRIBS TO WINDOW
  1705.     AH = 12h
  1706.     BH = 0Ah
  1707.     BL = window to write to
  1708.         00h window handle is DWORD on top of stack
  1709.         01h current task's default window
  1710.         0Ch (DV 2.26+) default window of task owning handle on top of stack
  1711.         0Dh (DV 2.26+) default window of parent of current task
  1712.     STACK:    DWORD count of attributes
  1713.         DWORD address of attribute string
  1714.         DWORD count of characters
  1715.         DWORD address of character string
  1716. Notes:    if one string is longer than the other, the shorter one will be reused
  1717.       until the longer one is exhausted
  1718.     the cursor is left just after the last character written
  1719. SeeAlso: AH=12h/BH=0Bh"WINDOW"
  1720. ----------1512--BH0A-------------------------
  1721. INT 15 - TopView - SEND MESSAGE - "ADDTO" - SEND MAILBOX MESSAGE/STAT BY VALUE
  1722.     AH = 12h
  1723.     BH = 0Ah
  1724.     BL = mailbox to write to
  1725.         00h handle is DWORD on top of stack
  1726.         02h default mailbox of task whose handle is on top of stack
  1727.         03h current task's default mailbox
  1728.     STACK:    DWORD    status (low byte)
  1729.         DWORD    length of message
  1730.         DWORD    address of message
  1731. Notes:    the message is copied into either system or common memory
  1732.     insufficient memory normally causes the process to be aborted; under
  1733.       DESQview 2.2+, failed writes may return CF set instead (see AX=DE15h)
  1734. SeeAlso: AH=12h/BH=0Bh"MAILBOX"
  1735. ----------1512--BH0A-------------------------
  1736. INT 15 - TopView - SEND MESSAGE - "ADDTO" - SET OBJECT BITS
  1737.     AH = 12h
  1738.     BH = 0Ah
  1739.     BL = object
  1740.         00h handle is DWORD on top of stack
  1741.         timer: start timer for specified interval
  1742.         pointer: set control flags
  1743.         keyboard: set control flags
  1744.         04h set control flags on KEYBOARD object (handle on top of stack)
  1745.         05h set control flags on task's default KEYBOARD object
  1746.     STACK: (if timer)   DWORD duration in 1/100 seconds
  1747.            (otherwise)  DWORD bits to set
  1748. SeeAlso: AH=12h/BH=0Bh"OBJECT"
  1749.  
  1750. For keyboard objects, the bits have the following significance:
  1751.     bit 15 reserved, can't be set
  1752.     bit 14 unused
  1753.     bit 13 reserved, can't be set
  1754.     bit 12-6 unused
  1755.     bit 5  (DV 2.2+) exclusive input
  1756.     bit 4  filter all keys (used with handler established by SETESC)
  1757.         if 0, only keys that would normally be displayed are filtered
  1758.     bit 3  program continues executing while input in progress
  1759.     bit 2  insert mode active for field mode
  1760.     bit 1  hardware cursor displayed when task is hardware cursor owner
  1761.         must be set if keyboard in field mode and field table includes
  1762.         input fields
  1763.     bit 0  keyboard is in field mode rather than keystroke mode
  1764.  
  1765. For pointer objects, the bits have the following significance:
  1766.     bit 15 reserved, can't be set
  1767.     bit 14-8 unused
  1768.     bit 7  mouse pointer is hidden while in window
  1769.     bit 6  get messages even if window not topmost
  1770.     bit 5  get messages even if window not foreground
  1771.     bit 4  multiple clicks separated by less than 1/3 second are counted
  1772.         and returned in a single message
  1773.     bit 3  pointer position is relative to screen origin, not window origin
  1774.     bit 2  send message on button release as well as button press
  1775.     bit 1  (DV 2.23+) send message with row=FFFFh and col=FFFFh whenever
  1776.         pointer leaves the window
  1777.     bit 0  send message only on button activity, not movement
  1778.            DV-specific, and INT 15/AX=DE0Fh must have been called first
  1779. ----------1512--BH0B-------------------------
  1780. INT 15 - TopView - SEND MESSAGE - "SUBFROM" - WRITE ATTRIBUTES TO WINDOW
  1781.     AH = 12h
  1782.     BH = 0Bh
  1783.     BL = window to write attributes to
  1784.         00h handle is DWORD on top of stack
  1785.         01h current task's default window
  1786.         0Ch (DV 2.26+) default window of task owning handle on top of stack
  1787.         0Dh (DV 2.26+) default window of parent of current task
  1788.     STACK:    DWORD number of attributes to write
  1789.         DWORD address of attributes
  1790. Note:    the attributes are written starting at the current cursor position; the
  1791.       cursor is left just after the last position written
  1792. SeeAlso: AH=12h/BH=0Ah"WINDOW"
  1793. ----------1512--BH0B-------------------------
  1794. INT 15 - TopView - SEND MESSAGE - "SUBFROM" - SEND MAILBOX MESSAGE/STAT BY REF
  1795.     AH = 12h
  1796.     BH = 0Bh
  1797.     BL = mailbox to write to
  1798.         00h handle is DWORD on top of stack
  1799.         02h default mailbox of task whose handle is on top of stack
  1800.         03h current task's default mailbox
  1801.     STACK:    DWORD    status (low byte)
  1802.         DWORD    length of message
  1803.         DWORD    address of message
  1804. Notes:    only a pointer to the message is stored, but the write may still fail
  1805.       due to insufficient memory
  1806.     under DV 2.2+, failed mailbox writes may return CF set (see AX=DE15h)
  1807. SeeAlso: AH=12h/BH=0Ah"MAILBOX"
  1808. ----------1512--BH0B-------------------------
  1809. INT 15 - TopView - SEND MESSAGE - "SUBFROM" - REMOVE OBJECT FROM OBJECTQ
  1810.     AH = 12h
  1811.     BH = 0Bh
  1812.     BL = OBJECTQ from which to remove all copies of a particular object
  1813.         06h OBJECTQ of task whose handle is on top of stack
  1814.         07h task's default OBJECTQ
  1815.     STACK:    DWORD    handle of object to remove
  1816. Note:    should be sent whenever an object is erased or closed
  1817. ----------1512--BH0B-------------------------
  1818. INT 15 - TopView - SEND MESSAGE - "SUBFROM" - RESET OBJECT BITS
  1819.     AH = 12h
  1820.     BH = 0Bh
  1821.     BL = object
  1822.         00h handle is DWORD on top of stack
  1823.         pointer: reset control flags
  1824.         keyboard: reset control flags
  1825.         04h clear control flags on KEYBOARD object (handle on top of stack)
  1826.         05h clear control flags on task's default KEYBOARD object
  1827.     STACK:    DWORD    which bits to clear (see AH=12h/BH=0Ah"OBJECT")
  1828. SeeAlso: AH=12h/BH=0Ah"OBJECT"
  1829. ----------1512--BH0C-------------------------
  1830. INT 15 - TopView - SEND MESSAGE - "OPEN" - OPEN OBJECT
  1831.     AH = 12h
  1832.     BH = 0Ch
  1833.     BL = object
  1834.         00h handle is DWORD on top of stack
  1835.         window:      fill with given character from scroll origin to end
  1836.         keyboard: attach to a window
  1837.         timer:      open
  1838.         pointer:  start taking input for window
  1839.         panel:      associate with a panel file
  1840.         01h fill task's default window with given char from scrl org to end
  1841.         02h open given task's mailbox for input (task's handle on stack)
  1842.         03h open current task's mailbox
  1843.         04h attach a KEYBOARD to a window (handle on top of stack)
  1844.         05h attach task's default KEYBOARD to a window
  1845.         06h open a task's OBJECTQ (task's handle on top of stack)
  1846.         07h open current task's OBJECTQ
  1847.         0Ch (DV 2.26+) fill def window of task owning handle on top of stck
  1848.         0Dh (DV 2.26+) fill default window of parent of current task
  1849.      STACK: (if window)   DWORD character to fill with
  1850.         (if keyboard) DWORD handle of window to attach to
  1851.         (if pointer)  DWORD handle of window to attach to
  1852.         (if panel)    DWORD length of filename or resident panel
  1853.                   DWORD address of filename or resident panel
  1854.         (otherwise)   nothing
  1855. Notes:    if first byte of panel file name is 1Bh, then the "name" IS a panel
  1856.     if first two bytes of panel file "name" are C0hC3h, then the "name" IS
  1857.       the panel file
  1858.     result code of open may be retrieved with STATUS message
  1859.     logical cursor is left at scroll origin after filling window
  1860.     the task opening a mailbox becomes its owner, and the only task allowed
  1861.       to read the mailbox
  1862.     messages are only sent to a pointer object when the mouse is positioned
  1863.       in the window to which the pointer has been attached
  1864.     there is no need to explicitly open a timer object, as ADDTO and WRITE
  1865.       messages automatically open the timer
  1866. SeeAlso: AH=12h/BH=0Dh,AH=12h/BH=14h"LOCK"
  1867. ----------1512--BH0D-------------------------
  1868. INT 15 - TopView - SEND MESSAGE - "CLOSE" - CLOSE OBJECT
  1869.     AH = 12h
  1870.     BH = 0Dh
  1871.     BL = object
  1872.         00h handle is DWORD on top of stack
  1873.         timer:      close
  1874.         keyboard: detach from window and discard queued input
  1875.         pointer:  stop taking input
  1876.         panel:      close
  1877.         mailbox:  close, unlock, and discard any pending messages
  1878.         02h close given task's mailbox (task's handle on top of stack)
  1879.         03h close task's default mailbox
  1880.         04h close KEYBOARD object (handle on top of stack)
  1881.         05h close task's default KEYBOARD
  1882.         06h close givent task's OBJECTQ (task's handle on top of stack)
  1883.         07h close current task's OBJECTQ
  1884. Notes:    when an OBJECTQ is closed, each object in the OBJECTQ is sent an
  1885.       ERASE message (AH=12h/BH=0Eh)
  1886.     when a panel object is closed, the panel file and any panels currently
  1887.       in use are freed; window and keyboard objects created by APPLY are
  1888.       not affected, but field mode input ceases
  1889.     open but idle timer objects consume a small amount of CPU time
  1890. SeeAlso: AH=12h/BH=0Ch,AH=12h/BH=0Eh,AH=12h/BH=14h"LOCK"
  1891. ----------1512--BH0E-------------------------
  1892. INT 15 - TopView - SEND MESSAGE - "ERASE" - ERASE OBJECT
  1893.     AH = 12h
  1894.     BH = 0Eh
  1895.     BL = object
  1896.         00h handle is DWORD on top of stack
  1897.         window:      clear from scroll origin to end of window
  1898.         keyboard: discard input
  1899.         timer:      cancel current interval
  1900.         pointer:  discard all pending messages
  1901.         mailbox:  discard all pending messages
  1902.         01h clear task's default window from scroll origin to end
  1903.         02h discard all queued messages in mailbox (handle on top of stack)
  1904.         03h discard all queued messages in current task's default mailbox
  1905.         04h discard all input queued to KEYBOARD (handle on top of stack)
  1906.         05h discard all input queued to task's default KEYBOARD
  1907.         06h remove all objects from OBJECTQ (task's handle on top of stack)
  1908.         07h remove all objects from current task's OBJECTQ
  1909.         0Ch (DV 2.26+) clear window of task owning handle on top of stack
  1910.         0Dh (DV 2.26+) clear default window of parent of current task
  1911. Note:    when an OBJECTQ is erased, each object in the OBJECTQ is also erased
  1912. SeeAlso: AH=12h/BH=02h
  1913. ----------1512--BH0F-------------------------
  1914. INT 15 - TopView - SEND MESSAGE - "STATUS" - GET OBJECT STATUS
  1915.     AH = 12h
  1916.     BH = 0Fh
  1917.     BL = object
  1918.         00h handle is DWORD on top of stack
  1919.         timer:     is it running?
  1920.         pointer: return status of last message
  1921.         panel:     verify success of last OPEN or APPLY
  1922.         02h return status of last msg READ from mailbox (handle on stack)
  1923.         03h return status of last msg READ from task's default mailbox
  1924.         04h get status of last msg from task's KEYBOARD (task handle on stk)
  1925.         05h get status of last msg from task's default KEYBOARD
  1926.         06h return whether OBJECTQ is open or not (handle on top of stack)
  1927.         07h return whether task's default OBJECTQ is open or not
  1928. Return: DWORD on top of stack is status
  1929. Notes:    if object is a panel object, the status indicates the error code:
  1930.       00h successful
  1931.       14h panel name not in panel directory
  1932.       15h not enough memory to apply panel
  1933.       16h invalid panel format
  1934.       17h panel file already open
  1935.       81h-92h  DOS error codes+80h            \  codes > 80h indicate
  1936.       95h not enough memory to open panel file     > that the panel was
  1937.       98h null panel file name            /  not opened
  1938.     if object is a timer, the status is:
  1939.       00000000h open but not running
  1940.       40000000h open and running
  1941.       80000000h closed
  1942.     if object is an OBJECTQ, the status is:
  1943.       00000000h open
  1944.       80000000h closed
  1945.     if object is a keyboard in keystroke mode, the status is the extended
  1946.       character code (scan code) of teh last keystroke
  1947.     if object is a keyboard in field mode, the status indicates the reason
  1948.       for the last return from the field manager
  1949.       00h Enter key pressed
  1950.       01h Button 1 or keystroke selection
  1951.       02h Button 2
  1952.       03h validation
  1953.       04h auto Enter on field
  1954.       1Bh Escape pressed
  1955.       46h ^Break pressed
  1956.       other: extended code for key terminating input
  1957.     the status of mailbox messages sent by the window manager is always 80h
  1958.     the status of a pointer message is the same as the status field in the
  1959.       message
  1960. SeeAlso: AH=12h/BH=04h"READ"
  1961. ----------1512--BH10-------------------------
  1962. INT 15 - TopView - SEND MESSAGE - "EOF" - GET OBJECT EOF STATUS
  1963.     AH = 12h
  1964.     BH = 10h
  1965.     BL = object
  1966.         00h handle is DWORD on top of stack
  1967.         window: return TRUE if logical cursor past end of window
  1968.         mailbox: ???
  1969.         01h returns TRUE if logical cursor past end of task's def window
  1970.         02h return ??? for task's mailbox (task's handle on top of stack)
  1971.         03h return ??? for current task's mailbox
  1972.         0Ch (DV 2.26+) check log crsr of window owning handle on top of stk
  1973.         0Dh (DV 2.26+) check log cursor of window of parent task
  1974. Return: DWORD on top of stack is status
  1975. ----------1512--BH11-------------------------
  1976. INT 15 - TopView - SEND MESSAGE - "AT" - POSITION OBJECT CURSOR
  1977.     AH = 12h
  1978.     BH = 11h
  1979.     BL = window for which to move cursor
  1980.         00h window's handle is DWORD on top of stack
  1981.         01h task's default window
  1982.         0Ch (DV 2.26+) default window of task owning handle on top of stack
  1983.         0Dh (DV 2.26+) default window of parent of current task
  1984.     STACK: DWORD column
  1985.            DWORD row
  1986. ----------1512--BH11-------------------------
  1987. INT 15 - TopView - SEND MESSAGE - "SETNAME" - ASSIGN NAME TO MAILBOX
  1988.     AH = 12h
  1989.     BH = 11h
  1990.     BL = mailbox to name
  1991.         00h DWORD on top of stack is mailbox handle
  1992.         02h use given task's mailbox (task's handle on top of stack)
  1993.         03h use current task's default mailbox
  1994.     STACK: DWORD length of name
  1995.            DWORD address of name
  1996. SeeAlso: AH=12h/BH=12h"GETNAME",AX=DE0Eh
  1997. ----------1512--BX1100-----------------------
  1998. INT 15 - TopView - SEND MESSAGE - "SETSCALE" - SET POINTER SCALE FACTOR
  1999.     AH = 12h
  2000.     BX = 1100h
  2001.     STACK: DWORD object handle for pointer object
  2002.            DWORD number of colums to scale pointer position to
  2003.            DWORD number of rows to scale pointer position to
  2004. SeeAlso: AH=12h/BX=1200h
  2005. ----------1512--BH12-------------------------
  2006. INT 15 - TopView - SEND MESSAGE - "READN" - GET NEXT N OBJECT BYTES
  2007.     AH = 12h
  2008.     BH = 12h
  2009.     BL = window to read from
  2010.         00h handle is DWORD on top of stack
  2011.         01h read next N chars or attributes on task's default window
  2012.         0Ch (DV 2.26+) read window of task owning handle on top of stack
  2013.         0Dh (DV 2.26+) read default window of parent of current task
  2014.     STACK: DWORD count
  2015. Return: STACK: DWORD number of bytes actually read
  2016.            DWORD address of buffer containing data
  2017. Notes:    reading starts at the current logical cursor position; the cursor is
  2018.       updated to point at the character following the last one read
  2019.     any translucent blanks (FFh) which are visible on screen are changed
  2020.       to the character which is seen through them
  2021.     the string produced by the read is placed in an input buffer which may
  2022.       be reused by the next READ or READN of a window
  2023.     window stream opcodes D8h and D9h determine whether the read returns
  2024.       characters or attributes
  2025. SeeAlso: AH=12h/BH=04h"WINDOW",AH=12h/BH=05h"WINDOW"
  2026. ----------1512--BH12-------------------------
  2027. INT 15 - DESQview 2.50+ - SEND MESSAGE - "GETNAME" - GET NAME OF MAILBOX
  2028.     AH = 12h
  2029.     BH = 12h
  2030.     BL = mailbox for which to retrieve name
  2031.         00h DWORD on top of stack is mailbox handle
  2032.         02h use given task's mailbox (task's handle on top of stack)
  2033.         03h use current task's default mailbox
  2034.     STACK: DWORD length of buffer for name
  2035.            DWORD pointer to buffer
  2036. Return: STACK: DWORD length of returned name (or size of buffer, if less)
  2037. Program: DESQview 2.5x is distributed as part of DESQview/X 1.0x
  2038. Note:    the returned name is not NUL-terminated
  2039. SeeAlso: AH=12h/BH=11h"SETNAME",AX=DE0Eh
  2040. ----------1512--BX1200-----------------------
  2041. INT 15 - TopView - SEND MESSAGE - "GETSCALE" - GET POINTER SCALE FACTOR
  2042.     AH = 12h
  2043.     BX = 1200h
  2044.     STACK: DWORD object handle for pointer
  2045. Return: STACK: DWORD pointer pos scaled as if window were this many colums wide
  2046.            DWORD pointer pos scaled as if window were this many rows high
  2047. SeeAlso: AH=12h/BX=1100h
  2048. ----------1512--BH13-------------------------
  2049. INT 15 - TopView - SEND MESSAGE - "REDRAW" - REDRAW WINDOW
  2050.     AH = 12h
  2051.     BH = 13h
  2052.     BL = window object
  2053.         00h DWORD on top of stack is handle for window to redraw
  2054.         01h redraw task's default window
  2055.         0Ch (DV 2.26+) redraw window of task owning handle on top of stack
  2056.         0Dh (DV 2.26+) redraw default window of parent of current task
  2057. SeeAlso: AH=12h/BH=05h"WINDOW",AH=12h/BH=0Eh
  2058. ----------1512--BH13-------------------------
  2059. INT 15 - DESQview 2.50+ - SEND MESSAGE - "READINTO" - GET NEXT MAIL MESSAGE
  2060.     AH = 12h
  2061.     BH = 13h
  2062.     BL = mailbox from which to read
  2063.         00h DWORD on top of stack is mailbox handle
  2064.         02h use given task's mailbox (task's handle on top of stack)
  2065.         03h use current task's default mailbox
  2066.     STACK: DWORD size of buffer in bytes
  2067.            DWORD pointer to buffer
  2068. Return: STACK: DWORD number of bytes read
  2069. Program: DESQview 2.5x is distributed as part of DESQview/X 1.0x
  2070. Notes:    this call blocks if no input is available, but will return less than
  2071.       the requested number of bytes if some (but insufficient) data is
  2072.       available
  2073.     use this call instead of AH=12h/BH=04h if the mailbox has flag bits
  2074.       4 or 5 set, as common memory may be exhausted by that call when
  2075.       attempting to read the next message
  2076. SeeAlso: AH=12h/BH=04h"READ",AH=12h/BH=05h,AH=12h/BH=16h
  2077. ----------1512--BX1300-----------------------
  2078. INT 15 - TopView - SEND MESSAGE - "SETICON" - SPECIFY POINTER ICON
  2079.     AH = 12h
  2080.     BX = 1300h
  2081.     STACK: DWORD object handle for pointer
  2082.            DWORD character to use for pointer
  2083. ----------1512--BH14-------------------------
  2084. INT 15 - TopView - SEND MESSAGE - "SETESC" - SET ESCAPE ROUTINE ADDRESS
  2085.     AH = 12h
  2086.     BH = 14h
  2087.     BL = message modifier
  2088.         00h handle is DWORD on top of stack
  2089.         01h define user stream
  2090.         04h intercept keystrokes from KEYBOARD to a window (handle on stack)
  2091.         05h intercept keystrokes from task's default KEYBOARD to a window
  2092.     STACK: (if window)   DWORD user stream number (14h-1Fh)
  2093.                  DWORD address of FAR user stream handler
  2094.            (if keyboard) DWORD address of FAR filter function
  2095.  
  2096. The keyboard filter function is called when the keyboard is in field mode.  On
  2097. entry,
  2098.     AL = character
  2099.     AH = 00h or extended ASCII code if AL = 00h
  2100.     BL = field number
  2101.     CH = cursor column
  2102.     CL = cursor row
  2103.     DL = field type modifier (sixth item in field table entry)
  2104.     DH = seventh item in field table entry
  2105.     ES:SI = window's handle
  2106.     DS:DI -> field table entry for field containing the cursor
  2107. The filter function should return
  2108.     AH = 00h use keystroke
  2109.          01h ignore keystroke
  2110.          FFh beep and ignore keystroke
  2111. Note: the filter function is not allowed to make INT 15, DOS, or BIOS calls
  2112. ----------1512--BH14-------------------------
  2113. INT 15 - TopView - SEND MESSAGE - "LOCK" - REQUEST EXCLUSIVE ACCESS TO RESOURCE
  2114.     AH = 12h
  2115.     BH = 14h
  2116.     BL = object
  2117.         00h mailbox handle is DWORD on top of stack
  2118.         02h use given task's mailbox (task's handle on top of stack)
  2119.         03h use current task's default mailbox
  2120. Note:    release exclusive access by sending CLOSE message to mailbox
  2121.     access may be requested multiple times, and requires multiple CLOSEs
  2122. SeeAlso: AH=12h/BH=0Dh
  2123. ----------1512--BH15-------------------------
  2124. INT 15 - DESQview v2.20+ - SEND MESSAGE - "SETFLAGS" - SET OBJECT FLAGS
  2125.     AH = 12h
  2126.     BH = 15h
  2127.     BL = object
  2128.         00h DWORD on top of stack
  2129.         mailbox, keyboard, or pointer only
  2130.         02h mailbox for task whose handle is on top of stack
  2131.         03h mailbox for current task
  2132.         04h keyboard for task whose handle is on top of stack
  2133.         05h keyboard for current task
  2134.     STACK: DWORD flags
  2135.         if mailbox:
  2136.             bit 0: all mail messages in common memory
  2137.             bit 1: allow write even if closed
  2138.             bit 2: don't erase messages when mailbox closed
  2139.             bit 4: (DV/X) append messages with like status and
  2140.                 sender (stream-oriented mail)
  2141.             bit 5: (DV/X) store mail in expanded memory (pool
  2142.                 grows as needed)
  2143.             bit 6: (DV/X) make mailbox into non-owned mailbox
  2144.         if keyboard:
  2145.             bit 5: exclusive input when keyboard in use for input
  2146. Return: nothing
  2147. Notes:    only available if the API level has been set to at least 2.20
  2148.     equivalent to performing SUBFROM and ADDTO calls on the object
  2149.     if a mailbox has bits 4 or 5 set, you must use "READINTO" rather than
  2150.       "READ" (see AH=12h/BX=1300h"READINTO") to retrieve messages
  2151. SeeAlso: AH=12h/BH=0Ah,AH=12h/BH=0Bh,AH=12h/BH=16h
  2152. ----------1512--BH16-------------------------
  2153. INT 15 - DESQview v2.20+ - SEND MESSAGE - "GETFLAGS" - GET OBJECT FLAGS
  2154.     AH = 12h 
  2155.     BH = 16h
  2156.     BL = object
  2157.         00h DWORD on top of stack
  2158.         mailbox, keyboard, or pointer only
  2159.         02h mailbox for task whose handle is on top of stack
  2160.         03h mailbox for current task
  2161.         04h keyboard for task whose handle is on top of stack
  2162.         05h keyboard for current task
  2163. Return: STACK: DWORD current control flags (see AH=12h/BH=15h)
  2164. Notes:    only available if the API level has been set to at least 2.20
  2165.     if a mailbox has bits 4 or 5 set, you must use "READINTO" rather than
  2166.       "READ" (see AH=12h/BH=13h"READINTO") to retrieve messages
  2167. SeeAlso: AH=12h/BH=0Ah,AH=12h/BH=0Bh,AH=12h/BH=13h"READINTO",AH=12h/BH=15h
  2168. ----------1512--BH17-------------------------
  2169. INT 15 - DESQview v2.42-2.52 - BUG
  2170.     AH = 12h
  2171.     BH = 17h
  2172.     BL = object
  2173.         00h DWORD on top of stack
  2174.         mailbox, keyboard, or pointer only
  2175.         02h mailbox for task whose handle is on top of stack
  2176.         03h mailbox for current task
  2177.         04h keyboard for task whose handle is on top of stack
  2178.         05h keyboard for current task
  2179. Notes:    due to a fencepost error, message 17h is accepted for mailboxes,
  2180.       keyboards, and pointers, but causes a random branch
  2181.     DESQview v2.50-2.52 are distributed as part of DESQview/X v1.02
  2182. ----------1512--BH80-------------------------
  2183. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2184.     AH = 12h
  2185.     BH = 80h
  2186. Note:    this function is identical to AH=12h/BH=00h, except that DESQview will
  2187.       not pop up a "Programming Error" window, instead returning an error
  2188.       code in AL:
  2189.         00h no error
  2190.         01h invalid values
  2191.         02h alias invalid
  2192.         03h handle valid but wrong type
  2193.         04h invalid handle
  2194. SeeAlso: AH=12h/BH=00h
  2195. ----------1512--BH81-------------------------
  2196. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2197.     AH = 12h
  2198.     BH = 81h
  2199. Note:    this function is identical to AH=12h/BH=01h, except that DESQview will
  2200.       not pop up a "Programming Error" window, instead returning an error
  2201.       code in AL (see AH=12h/BH=80h)
  2202. SeeAlso: AH=12h/BH=01h
  2203. ----------1512--BH82-------------------------
  2204. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2205.     AH = 12h
  2206.     BH = 82h
  2207. Note:    this function is identical to AH=12h/BH=02h, except that DESQview will
  2208.       not pop up a "Programming Error" window, instead returning an error
  2209.       code in AL (see AH=12h/BH=80h)
  2210. SeeAlso: AH=12h/BH=02h
  2211. ----------1512--BH83-------------------------
  2212. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2213.     AH = 12h
  2214.     BH = 83h
  2215. Note:    this function is identical to AH=12h/BH=03h, except that DESQview will
  2216.       not pop up a "Programming Error" window, instead returning an error
  2217.       code in AL (see AH=12h/BH=80h)
  2218. SeeAlso: AH=12h/BH=03h,AH=12h/BX=0300h
  2219. ----------1512--BH84-------------------------
  2220. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2221.     AH = 12h
  2222.     BH = 84h
  2223. Note:    this function is identical to AH=12h/BH=04h, except that DESQview will
  2224.       not pop up a "Programming Error" window, instead returning an error
  2225.       code in AL (see AH=12h/BH=80h)
  2226. SeeAlso: AH=12h/BH=04h,AH=12h/BX=0400h
  2227. ----------1512--BH85-------------------------
  2228. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2229.     AH = 12h
  2230.     BH = 85h
  2231. Note:    this function is identical to AH=12h/BH=05h, except that DESQview will
  2232.       not pop up a "Programming Error" window, instead returning an error
  2233.       code in AL (see AH=12h/BH=80h)
  2234. SeeAlso: AH=12h/BH=05h
  2235. ----------1512--BH86-------------------------
  2236. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2237.     AH = 12h
  2238.     BH = 86h
  2239. Note:    this function is identical to AH=12h/BH=06h, except that DESQview will
  2240.       not pop up a "Programming Error" window, instead returning an error
  2241.       code in AL (see AH=12h/BH=80h)
  2242. SeeAlso: AH=12h/BH=06h
  2243. ----------1512--BH87-------------------------
  2244. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2245.     AH = 12h
  2246.     BH = 87h
  2247. Note:    this function is identical to AH=12h/BH=07h, except that DESQview will
  2248.       not pop up a "Programming Error" window, instead returning an error
  2249.       code in AL (see AH=12h/BH=80h)
  2250. SeeAlso: AH=12h/BH=07h
  2251. ----------1512--BH88-------------------------
  2252. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2253.     AH = 12h
  2254.     BH = 88h
  2255. Note:    this function is identical to AH=12h/BH=08h, except that DESQview will
  2256.       not pop up a "Programming Error" window, instead returning an error
  2257.       code in AL (see AH=12h/BH=80h)
  2258. SeeAlso: AH=12h/BH=08h
  2259. ----------1512--BH89-------------------------
  2260. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2261.     AH = 12h
  2262.     BH = 89h
  2263. Note:    this function is identical to AH=12h/BH=09h, except that DESQview will
  2264.       not pop up a "Programming Error" window, instead returning an error
  2265.       code in AL (see AH=12h/BH=80h)
  2266. SeeAlso: AH=12h/BH=09h
  2267. ----------1512--BH8A-------------------------
  2268. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2269.     AH = 12h
  2270.     BH = 8Ah
  2271. Note:    this function is identical to AH=12h/BH=0Ah, except that DESQview will
  2272.       not pop up a "Programming Error" window, instead returning an error
  2273.       code in AL (see AH=12h/BH=80h)
  2274. SeeAlso: AH=12h/BH=0Ah
  2275. ----------1512--BH8B-------------------------
  2276. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2277.     AH = 12h
  2278.     BH = 8Bh
  2279. Note:    this function is identical to AH=12h/BH=0Bh, except that DESQview will
  2280.       not pop up a "Programming Error" window, instead returning an error
  2281.       code in AL (see AH=12h/BH=80h)
  2282. SeeAlso: AH=12h/BH=0Bh
  2283. ----------1512--BH8C-------------------------
  2284. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2285.     AH = 12h
  2286.     BH = 8Ch
  2287. Note:    this function is identical to AH=12h/BH=0Ch, except that DESQview will
  2288.       not pop up a "Programming Error" window, instead returning an error
  2289.       code in AL (see AH=12h/BH=80h)
  2290. SeeAlso: AH=12h/BH=0Ch
  2291. ----------1512--BH8D-------------------------
  2292. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2293.     AH = 12h
  2294.     BH = 8Dh
  2295. Note:    this function is identical to AH=12h/BH=0Dh, except that DESQview will
  2296.       not pop up a "Programming Error" window, instead returning an error
  2297.       code in AL (see AH=12h/BH=80h)
  2298. SeeAlso: AH=12h/BH=0Dh
  2299. ----------1512--BH8E-------------------------
  2300. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2301.     AH = 12h
  2302.     BH = 8Eh
  2303. Note:    this function is identical to AH=12h/BH=0Eh, except that DESQview will
  2304.       not pop up a "Programming Error" window, instead returning an error
  2305.       code in AL (see AH=12h/BH=80h)
  2306. SeeAlso: AH=12h/BH=0Eh
  2307. ----------1512--BH8F-------------------------
  2308. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2309.     AH = 12h
  2310.     BH = 8Fh
  2311. Note:    this function is identical to AH=12h/BH=0Fh, except that DESQview will
  2312.       not pop up a "Programming Error" window, instead returning an error
  2313.       code in AL (see AH=12h/BH=80h)
  2314. SeeAlso: AH=12h/BH=0Fh
  2315. ----------1512--BH90-------------------------
  2316. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2317.     AH = 12h
  2318.     BH = 90h
  2319. Note:    this function is identical to AH=12h/BH=10h, except that DESQview will
  2320.       not pop up a "Programming Error" window, instead returning an error
  2321.       code in AL (see AH=12h/BH=80h)
  2322. SeeAlso: AH=12h/BH=10h
  2323. ----------1512--BH91-------------------------
  2324. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2325.     AH = 12h
  2326.     BH = 91h
  2327. Note:    this function is identical to AH=12h/BH=11h, except that DESQview will
  2328.       not pop up a "Programming Error" window, instead returning an error
  2329.       code in AL (see AH=12h/BH=80h)
  2330. SeeAlso: AH=12h/BH=11h,AH=12h/BX=1100h
  2331. ----------1512--BH92-------------------------
  2332. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2333.     AH = 12h
  2334.     BH = 92h
  2335. Note:    this function is identical to AH=12h/BH=12h, except that DESQview will
  2336.       not pop up a "Programming Error" window, instead returning an error
  2337.       code in AL (see AH=12h/BH=80h)
  2338. SeeAlso: AH=12h/BH=12h,AH=12h/BX=1200h
  2339. ----------1512--BH93-------------------------
  2340. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2341.     AH = 12h
  2342.     BH = 93h
  2343. Note:    this function is identical to AH=12h/BH=13h, except that DESQview will
  2344.       not pop up a "Programming Error" window, instead returning an error
  2345.       code in AL (see AH=12h/BH=80h)
  2346. SeeAlso: AH=12h/BH=13h
  2347. ----------1512--BH94-------------------------
  2348. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2349.     AH = 12h
  2350.     BH = 94h
  2351. Note:    this function is identical to AH=12h/BH=14h, except that DESQview will
  2352.       not pop up a "Programming Error" window, instead returning an error
  2353.       code in AL (see AH=12h/BH=80h)
  2354. SeeAlso: AH=12h/BH=14h
  2355. ----------1512--BH95-------------------------
  2356. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2357.     AH = 12h
  2358.     BH = 95h
  2359. Note:    this function is identical to AH=12h/BH=15h, except that DESQview will
  2360.       not pop up a "Programming Error" window, instead returning an error
  2361.       code in AL (see AH=12h/BH=80h)
  2362. SeeAlso: AH=12h/BH=15h
  2363. ----------1512--BH96-------------------------
  2364. INT 15 - DESQview v2.50+ - SEND MESSAGE WITH ERROR RECOVERY
  2365.     AH = 12h
  2366.     BH = 96h
  2367. Note:    this function is identical to AH=12h/BH=16h, except that DESQview will
  2368.       not pop up a "Programming Error" window, instead returning an error
  2369.       code in AL (see AH=12h/BH=80h)
  2370. SeeAlso: AH=12h/BH=16h
  2371. ----------15BF00-----------------------------
  2372. INT 15 - Rational Systems DOS/16M - ???
  2373.     AX = BF00h
  2374.     ???
  2375. Return: ???
  2376. Note:    under DESQview/X 1.02 DVDOS4GX.DVR, this call is identical to AX=BF02h
  2377. SeeAlso: AX=BF02h
  2378. ----------15BF01-----------------------------
  2379. INT 15 - Rational Systems DOS/16M - ???
  2380.     AX = BF01h
  2381.     ???
  2382. Return: ???
  2383. Notes:    under DESQview/X 1.02 DVDOS4GX.DVR, this call is identical to AX=BF02h
  2384.     called by DOS/4GW
  2385. SeeAlso: AX=BF00h,AX=BF02h
  2386. ----------15BF02DX0000-----------------------
  2387. INT 15 - Rational Systems DOS/16M - INSTALLATION CHECK
  2388.     AX = BF02h
  2389.     DX = 0000h
  2390. Return: DX = nonzero if installed
  2391.         DX:SI -> XBRK structure (see below)
  2392. Note:    this function is also supported by DOS/4G
  2393. SeeAlso: AX=BF01h,AX=BFDCh,AX=BFDEh/BX=0000h
  2394. SeeAlso: INT 21/AH=FFh/DH=0Eh,INT 2F/AH=A1h,INT 2F/AX=F100h,INT 2F/AX=FBA1h
  2395.  
  2396. Format of XBRK structure:
  2397. Offset    Size    Description
  2398.  00h    DWORD    linear address of first available byte
  2399.  04h    DWORD    linear address of last available byte + 1 ???
  2400.  08h    DWORD    real-mode address of XBRK structure???
  2401.  0Ch    DWORD    ???
  2402.  10h  2 BYTEs    ???
  2403.  12h    WORD    segment of ???
  2404.  14h  8 BYTEs    ???
  2405.  1Ch 512 BYTEs    protected-mode IDT
  2406. 21Ch  N BYTEs    protected-mode GDT
  2407. ----------15BF03-----------------------------
  2408. INT 15 - Rational Systems DOS/4GW - UNINSTALL???
  2409.     AX = BF03h
  2410.     BX = PSP segment of extender
  2411.     ???
  2412. Return: ???
  2413. Note:    if BX is not the PSP segment of the extender, it passes the call down
  2414.       the INT 15 chain; this allows nested instances of the extender
  2415. SeeAlso: AX=BF06h
  2416. ----------15BF04-----------------------------
  2417. INT 15 - Rational Systems DOS/4GW - ???
  2418.     AX = BF04h
  2419.     BX = PSP segment of extender
  2420. Return: nothing???
  2421. Notes:    if BX is not the PSP segment of the extender, it passes the call down
  2422.       the INT 15 chain; this allows nested instances of the extender
  2423.     grabs INT 2Fh and installs handlers for INT 2F/AX=1605h-1607h
  2424. SeeAlso: INT 2F/AX=1607h/BX=22C0h
  2425. ----------15BF05-----------------------------
  2426. INT 15 - Rational Systems DOS/4GW - INITIALIZE PROTECTED-MODE INTERFACE
  2427.     AX = BF05h
  2428.     BX = PSP segment of extender
  2429. Return: nothing???
  2430. Notes:    if BX is not the PSP segment of the extender, it passes the call down
  2431.       the INT 15 chain; this allows nested instances of the extender
  2432.     calls INT 67/AX=DE01h if ???
  2433. ----------15BF06-----------------------------
  2434. INT 15 - Rational Systems DOS/4GW - ???
  2435.     AX = BF06h
  2436.     BX = PSP segment of extender
  2437.     ???
  2438. Return: ???
  2439. Note:    if BX is not the PSP segment of the extender, it passes the call down
  2440.       the INT 15 chain; this allows nested instances of the extender
  2441. SeeAlso: AX=BF03h
  2442. ----------15BFDCDX0000-----------------------
  2443. INT 15 - Rational Systems DOS/4GW - INSTALLATION CHECK
  2444.     AX = BFDCh
  2445.     DX = 0000h
  2446.     SI = 0000h
  2447. Return: DX = nonzero if installed
  2448.         DX:SI -> XBRK structure (see AX=BF02h)
  2449. SeeAlso: AX=BF02h
  2450. ----------15BFDEBX0000-----------------------
  2451. INT 15 - DESQview/X - DVDOS4GX.DVR - INSTALLATION CHECK
  2452.     AX = BFDEh
  2453.     BX = 0000h
  2454. Return: AX = ??? (0003h)
  2455.     BX = FFFFh
  2456. SeeAlso: AX=BF02h
  2457. ----------15BFDEBX0001-----------------------
  2458. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET PROCESS MANAGER NAME
  2459.     AX = BFDEh
  2460.     BX = 0001h
  2461. Return: BX = 0000h (success)
  2462.     CX:DX -> name of process manager executable
  2463. SeeAlso: AX=BFDEh/BX=0000h
  2464. ----------15BFDEBX0002-----------------------
  2465. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - SET ???
  2466.     AX = BFDEh
  2467.     BX = 0002h
  2468.     CX:DX -> ???
  2469. Return: BX = 0000h (success)
  2470. SeeAlso: AX=BFDEh/BX=0000h,AX=BFDEh/BX=0003h
  2471. ----------15BFDEBX0003-----------------------
  2472. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ???
  2473.     AX = BFDEh
  2474.     BX = 0003h
  2475. Return: BX = 0000h (success)
  2476.     CX:DX -> ???
  2477. SeeAlso: AX=BFDEh/BX=0000h,AX=BFDEh/BX=0002h
  2478. ----------15BFDEBX0004-----------------------
  2479. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - ???
  2480.     AX = BFDEh
  2481.     BX = 0004h
  2482.     CL = ???
  2483. Return: BX = 0000h (success)
  2484.     CX:DX -> XBRK structure (see AX=BF02h)
  2485. SeeAlso: AX=BFDEh/BX=0000h
  2486. ----------15BFDEBX0005-----------------------
  2487. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - ???
  2488.     AX = BFDEh
  2489.     BX = 0005h
  2490.     CX = new value for ???
  2491. Return: BX = 0000h (success)
  2492.     AX = old value of ???
  2493.     DS:SI -> ??? (if AX nonzero on return)
  2494.     ES:DI -> ??? (if AX zero on return)
  2495. Note:    called by DOS4GW.EXE
  2496. SeeAlso: AX=BFDEh/BX=0000h
  2497. ----------15BFDEBX0006-----------------------
  2498. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ???
  2499.     AX = BFDEh
  2500.     BX = 0006h
  2501. Return: BX = 0000h (success)
  2502.     AH = interrupt number??? (BEh)
  2503.     CX:DX = ???
  2504. SeeAlso: AX=BFDEh/BX=0000h,AX=BFDEh/BX=0007h,INT BE"DESQview"
  2505. ----------15BFDEBX0007-----------------------
  2506. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - SET ???
  2507.     AX = BFDEh
  2508.     BX = 0007h
  2509.     CX:DX = ???
  2510. Return: BX = 0000h (success)
  2511. SeeAlso: AX=BFDEh/BX=0000h,AX=BFDEh/BX=0006h
  2512. ----------15BFDEBX0008-----------------------
  2513. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - ???
  2514.     AX = BFDEh
  2515.     BX = 0008h
  2516.     CX = segment of ???
  2517.     DS = ???
  2518. Return: BX = status
  2519.         0000h successful
  2520.         AL = ??? (80h or C0h)
  2521.         DX = ??? (0603h) if AL=C0h
  2522.         0001h failed
  2523.         AX = 0000h
  2524. Note:    called by DOS4GW.EXE
  2525. SeeAlso: AX=BFDEh/BX=0000h
  2526. ----------15BFDEBX0009-----------------------
  2527. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET PROTECTED MODE PROGRAM LOADER
  2528.     AX = BFDEh
  2529.     BX = 0009h
  2530. Return: BX = 0000h (success)
  2531.     CX:DX -> full pathname to LOAD32.EXP
  2532. SeeAlso: AX=BFDEh/BX=0000h
  2533. ----------15BFDEBX000A-----------------------
  2534. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - DECREMENT ???
  2535.     AX = BFDEh
  2536.     BX = 000Ah
  2537. Return: BX = 0000h (success)
  2538.     AX = new value of ??? counter
  2539. Notes:    also resets a variety of values if the counter goes negative
  2540.     called by DOS4GW.EXE
  2541. SeeAlso: AX=BFDEh/BX=0000h,AX=BFDEh/BX=000Bh
  2542. ----------15BFDEBX000B-----------------------
  2543. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - INCREMENT ???
  2544.     AX = BFDEh
  2545.     BX = 000Bh
  2546. Return:    AX = new value of ??? counter
  2547. Note:    called by DOS4GW.EXE
  2548. SeeAlso: AX=BFDEh/BX=0000h,AX=BFDEh/BX=000Ah
  2549. ----------15BFDEBX000C-----------------------
  2550. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - ???
  2551.     AX = BFDEh
  2552.     BX = 000Ch
  2553.     CL = ???
  2554.         00h
  2555.         nonzero
  2556. Return: ???
  2557. SeeAlso: AX=BFDEh/BX=0000h
  2558. ----------15BFDEBX000D-----------------------
  2559. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - ???
  2560.     AX = BFDEh
  2561.     BX = 000Dh
  2562.     ???
  2563. Return: ???
  2564. SeeAlso: AX=BFDEh/BX=0000h
  2565. ----------15BFDEBX000E-----------------------
  2566. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - ???
  2567.     AX = BFDEh
  2568.     BX = 000Eh
  2569.     DX:CX -> ???
  2570. Return: AX = segment of handle for calling task
  2571.     BX = ??? (probably destroyed)
  2572.     DX:CX -> ???
  2573. SeeAlso: AX=BFDEh/BX=0000h,AX=BFDEh/BX=000Fh,AX=BFDEh/BX=0013h
  2574. ----------15BFDEBX000F-----------------------
  2575. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - ???
  2576.     AX = BFDEh
  2577.     BX = 000Fh
  2578. Return: AX = segment of handle for calling task
  2579.     BX = ??? (probably destroyed)
  2580.     DX:CX -> ???
  2581. Note:    identical to AX=BFDEh/BX=000Eh with CX:DX = 0000h:0000h
  2582. SeeAlso: AX=BFDEh/BX=000Eh,AX=BFDEh/BX=0010h
  2583. ----------15BFDEBX0010-----------------------
  2584. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET TASK HANDLE
  2585.     AX = BFDEh
  2586.     BX = 0010h
  2587. Return: AX = segment of caller's task handle
  2588.     BX destroyed
  2589. SeeAlso: AX=BFDEh/BX=000Fh
  2590. ----------15BFDEBX0011-----------------------
  2591. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ???
  2592.     AX = BFDEh
  2593.     BX = 0011h
  2594. Return: CX = code segment of DVDOS4GX.DVR
  2595.     BX = ??? (0004h)
  2596. SeeAlso: AX=BFDEh/BX=0000h
  2597. ----------15BFDEBX0012-----------------------
  2598. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ???
  2599.     AX = BFDEh
  2600.     BX = 0012h
  2601. Return: DX = code segment of DVDOS4GX.DVR
  2602.     BX = ??? (012Ch)
  2603.     CX = ??? (0006h)
  2604. SeeAlso: AX=BFDEh/BX=0000h
  2605. ----------15BFDEBX0013-----------------------
  2606. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ???
  2607.     AX = BFDEh
  2608.     BX = 0013h
  2609. Return: DX:CX -> ???
  2610. SeeAlso: AX=BFDEh/BX=000Eh
  2611. ----------15BFDEBX0014-----------------------
  2612. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - LOCK ??? MAILBOX
  2613.     AX = BFDEh
  2614.     BX = 0014h
  2615.     CX = index of ??? mailbox
  2616.         (0000h-0004h valid, but no range checking done)
  2617. Return: AX,BX destroyed
  2618. SeeAlso: AX=BFDEh/BX=0015h,AX=BFDEh/BX=0017h
  2619. ----------15BFDEBX0015-----------------------
  2620. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - UNLOCK ??? MAILBOX
  2621.     AX = BFDEh
  2622.     BX = 0015h
  2623.     CX = index of ??? mailbox
  2624.         (0000h-0004h valid, but no range checking done)
  2625. Return: AX,BX destroyed
  2626. SeeAlso: AX=BFDEh/BX=0014h,AX=BFDEh/BX=0016h
  2627. ----------15BFDEBX0016-----------------------
  2628. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - CHECK IF ??? MAILBOX OWNED
  2629.     AX = BFDEh
  2630.     BX = 0016h
  2631.     CX = index of ??? mailbox
  2632.         (0000h-0004h valid, but no range checking done)
  2633. Return: AX = status
  2634.         0000h no one owns mailbox
  2635.         0001h mailbox has an owner
  2636.     BX destroyed
  2637. SeeAlso: AX=BFDEh/BX=0015h,AX=BFDEh/BX=0017h
  2638. ----------15BFDEBX0017-----------------------
  2639. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ??? MAILBOX OWNER
  2640.     AX = BFDEh
  2641.     BX = 0017h
  2642.     CX = index of ??? mailbox
  2643.         (0000h-0004h valid, but no range checking done)
  2644. Return: AX = segment of mailbox owner's handle
  2645.     BX = segment of caller's task handle
  2646. SeeAlso: AX=BFDEh/BX=0015h,AX=BFDEh/BX=0016h
  2647. ----------15BFDEBXFFFD-----------------------
  2648. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ???
  2649.     AX = BFDEh
  2650.     BX = FFFDh
  2651. Return: CX:DX = ???
  2652. SeeAlso: AX=BFDEh/BX=FFFEh
  2653. ----------15BFDEBXFFFE-----------------------
  2654. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - SET ???
  2655.     AX = BFDEh
  2656.     BX = FFFEh
  2657.     CX:DX = ???
  2658. SeeAlso: AX=BFDEh/BX=FFFDh
  2659. ----------15BFDEBXFFFF-----------------------
  2660. INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - NOP
  2661.     AX = BFDEh
  2662.     BX = FFFFh
  2663. SeeAlso: AX=BFDEh/BX=0000h
  2664. ----------15DE00-----------------------------
  2665. INT 15 - DESQview - GET PROGRAM NAME
  2666.     AX = DE00h
  2667. Return: AX = offset into DESQVIEW.DVO of program most recently selected from
  2668.         the "Switch Windows" menu (see below)
  2669. Note:    always returns AX=0000h under DESQview/X
  2670. SeeAlso: AX=DE07h
  2671.  
  2672. Format of program entry in DESQVIEW.DVO:
  2673. Offset    Size    Description
  2674.  00h    BYTE    length of name (FFh if end of file)
  2675.  01h  N BYTEs    name
  2676.       2 BYTEs    keys to invoke program (second = 00h if only one key used)
  2677.     BYTE    program type
  2678.         00h normal program
  2679.         04h divider
  2680.         80h Delete a Program
  2681.         81h Change a Program
  2682.     WORD    ??? apparently always 0000h
  2683. ----------15DE01-----------------------------
  2684. INT 15 - DESQview - UPDATE "OPEN WINDOW" MENU
  2685.     AX = DE01h
  2686. Return: nothing
  2687. Notes:    reads DESQVIEW.DVO, disables Open menu if file not in current directory
  2688.     NOP for DESQview/X
  2689. ----------15DE02-----------------------------
  2690. INT 15 - DESQview 1.x only - SET ??? FLAG FOR CURRENT WINDOW
  2691.     AX = DE02h
  2692. Return: nothing
  2693. Note:    this call is a NOP in DV 2.x
  2694. SeeAlso: AX=DE03h
  2695. ----------15DE03-----------------------------
  2696. INT 15 - DESQview 1.x only - GET ??? FOR CURRENT WINDOW
  2697.     AX = DE03h
  2698. Return: AX = ??? for current window
  2699.     BX = ??? for current window
  2700. Note:    this call is a NOP in DV 2.x
  2701. SeeAlso: AX=DE02h
  2702. ----------15DE04-----------------------------
  2703. INT 15 - DESQview - GET AVAILABLE COMMON MEMORY
  2704.     AX = DE04h
  2705. Return: BX = bytes of common memory available
  2706.     CX = largest block available
  2707.     DX = total common memory in bytes
  2708. SeeAlso: AX=DE05h,AX=DE06h
  2709. ----------15DE05-----------------------------
  2710. INT 15 - DESQview - GET AVAILABLE CONVENTIONAL MEMORY
  2711.     AX = DE05h
  2712. Return: BX = K of memory available
  2713.     CX = largest block available
  2714.     DX = total conventional memory in K
  2715. SeeAlso: AX=DE04h,AX=DE06h
  2716. ----------15DE06-----------------------------
  2717. INT 15 - DESQview - GET AVAILABLE EXPANDED MEMORY
  2718.     AX = DE06h
  2719. Return: BX = K of expanded memory available
  2720.     CX = largest block available
  2721.     DX = total expanded memory in K
  2722. SeeAlso: AX=DE04h,AX=DE05h
  2723. ----------15DE07-----------------------------
  2724. INT 15 - DESQview - "APPNUM" - GET CURRENT PROGRAM'S NUMBER
  2725.     AX = DE07h
  2726. Return: AX = number of program as it appears on the "Switch Windows" menu
  2727. Note:    this API call may be made from a hardware interrupt handler
  2728. SeeAlso: AX=DE00h
  2729. ----------15DE08-----------------------------
  2730. INT 15 - DESQview - GET ???
  2731.     AX = DE08h
  2732. Return: AX = 0000h if ??? is not set to the current task
  2733.          0001h if ??? is set to the current task
  2734. ----------15DE09-----------------------------
  2735. INT 15 - DESQview - UNIMPLEMENTED
  2736.     AX = DE09h
  2737. Return: nothing (NOP in DV 1.x and 2.x)
  2738. ----------15DE0A-----------------------------
  2739. INT 15 - DESQview v2.00+ - "DBGPOKE" - DISPLAY CHARACTER ON STATUS LINE
  2740.     AX = DE0Ah
  2741.     BL = character
  2742. Return: character displayed, next call will display in next position (which
  2743.     wraps back to the start of the line if off the right edge of screen)
  2744. Notes:    displays character on bottom line of *physical* screen, regardless
  2745.       of current size of window (even entirely hidden)
  2746.     does not know about graphics display modes, just pokes the characters
  2747.       into display memory
  2748.     this API call may be made from a hardware interrupt handler
  2749. SeeAlso: AX=1003h
  2750. ----------15DE0B-----------------------------
  2751. INT 15 - DESQview v2.00+ - "APILEVEL" - DEFINE MINIMUM API LEVEL REQUIRED
  2752.     AX = DE0Bh
  2753.     BL = API level minor version number
  2754.     BH = API level major version number
  2755. Return: AX = maximum API level (AH = major, AL = minor)
  2756. Notes:    if the requested API level is greater than the version of DESQview, a
  2757.       "You need a newer version" error window is popped up
  2758.     the API level defaults to 1.00, and is inherited by child tasks
  2759. ----------15DE0C-----------------------------
  2760. INT 15 - DESQview v2.00+ - "GETMEM" - ALLOCATE "SYSTEM" MEMORY
  2761.     AX = DE0Ch
  2762.     BX = number of bytes
  2763. Return: ES:DI -> allocated block or 0000h:0000h (DV 2.26+)
  2764. Note:    use SETERROR (AX=DE15h) to avoid a user prompt if there is insufficient
  2765.       system memory
  2766. SeeAlso: AX=1001h,AX=102Eh,AX=DE0Dh,AX=DE15h,AX=DE19h
  2767. ----------15DE0D-----------------------------
  2768. INT 15 - DESQview v2.00+ - "PUTMEM" - DEALLOCATE "SYSTEM" MEMORY
  2769.     AX = DE0Dh
  2770.     ES:DI -> previously allocated block
  2771. Return: nothing
  2772. SeeAlso: AX=1002h,AX=DE0Ch
  2773. ----------15DE0E-----------------------------
  2774. INT 15 - DESQview v2.00+ - "FINDMAIL" - FIND MAILBOX BY NAME
  2775.     AX = DE0Eh
  2776.     ES:DI -> name to find
  2777.     CX = length of name
  2778. Return: BX = 0000h not found
  2779.          0001h found
  2780.         DS:SI = object handle
  2781. SeeAlso: AH=12h/BH=11h,AH=12h/BX=1200h"GETNAME"
  2782.  
  2783. Special mailbox names:
  2784.  "COM1" ... "COM4"    RBcomm using COM1 ... COM4
  2785.  "DESQview/X Help Engine"
  2786.  "DESQview/X Network Server"  Network Manager
  2787.  "DESQview X Server0"    X-Windows server
  2788.  "DESQview X Server7"    X-Windows printing service
  2789.  "INBOX"        DESQview/X LPD requests
  2790.  "OUTBOX"        DESQview/X LPD responses
  2791.  "WAITBOX"        semaphore to synchronize DESQview/X LPD communications
  2792. ----------15DE0F-----------------------------
  2793. INT 15 - DESQview v2.00+ - ENABLE DESQview EXTENSIONS
  2794.     AX = DE0Fh
  2795. Return: AX and BX destroyed (seems to be bug, weren't saved&restored)
  2796. Notes:    sends a manager stream with opcodes AEh, BDh, and BFh to task's window
  2797.     enables an additional mouse mode
  2798. ----------15DE10-----------------------------
  2799. INT 15 - DESQview v2.00+ - "PUSHKEY" - PUT KEY INTO KEYBOARD INPUT STREAM
  2800.     AX = DE10h
  2801.     BH = scan code
  2802.     BL = character
  2803. Return: nothing
  2804. Notes:    a later read will get the keystroke as if it had been typed by the user
  2805.     multiple pushes are read last-in first-out
  2806.     if a script exists for the pushed key in the current application, the
  2807.       script will be executed
  2808.     early copies of DV 2.00 destroy AX, BX, ES, and DI
  2809. SeeAlso: INT 16/AH=05h
  2810. ----------15DE11BL00-------------------------
  2811. INT 15 - DESQview v2.00+ - "JUSTIFY" - EN/DISABLE AUTOM. WINDOW JUSTIFICATION
  2812.     AX = DE11h
  2813.     BL = 00h      viewport will not move automatically
  2814.          nonzero  viewport will move to keep cursor visible (default)
  2815. Return: nothing
  2816. ----------15DE12BX0000-----------------------
  2817. INT 15 - DESQview v2.01+ - "CSTYLE" - SET "C"-COMPATIBLE CONTROL CHAR INTERPRET
  2818.     AX = DE12h
  2819.     BX = 0000h    select normal style (linefeed only moves down)
  2820.          nonzero  select C style (linefeed moves to start of next line)
  2821. Return: nothing
  2822. Note:    set on a per-task basis, and inherited from the parent task
  2823. ----------15DE13-----------------------------
  2824. INT 15 - DESQview v2.20+ - "GETCRIT" - GET CRITICAL NESTING COUNT
  2825.     AX = DE13h
  2826. Return: BX = number of calls to BEGINC or ENTERC (see INT 15/AX=101Bh,DE1Ch)
  2827.          without matching ENDC (see INT 15/AX=101Ch)
  2828. Note:    this API call may be made from within a hardware interrupt handler
  2829. SeeAlso: AX=101Bh,AX=101Ch,AX=DE1Bh,AX=DE1Ch
  2830. ----------15DE14-----------------------------
  2831. INT 15 - DESQview v2.20+ - GET OBJECT TYPE
  2832.     AX = DE14h
  2833.     ES:DI -> object
  2834. Return: BL = 00h not an object
  2835.          08h window or task
  2836.          09h mailbox
  2837.          0Ah keyboard
  2838.          0Bh timer
  2839.          0Ch objectq
  2840.          0Fh pointer
  2841.          10h panel
  2842. SeeAlso: AX=1016h
  2843. ----------15DE15-----------------------------
  2844. INT 15 - DESQview v2.20+ - SET ERROR HANDLING
  2845.     AX = DE15h
  2846.     BL = error handling mode
  2847.         00h post system error on all error conditions
  2848.         01h return carry flag set on calls to ADDTO, SUBFROM, and WRITE
  2849.         messages sent to mailboxes which fail due to lack of system
  2850.         or common memory
  2851.         02h (v2.26+) same as 01h, but also return null pointer for GETMEM
  2852.         calls which fail due to lack of system memory
  2853. Return: nothing
  2854. SeeAlso: AX=DE0Ch,AX=DE16h
  2855. ----------15DE16-----------------------------
  2856. INT 15 - DESQview v2.20+ - GET ERROR HANDLING
  2857.     AX = DE16h
  2858. Return: BL = current mode
  2859.         00h always post system error
  2860.         01h return carry flag set on failed mailbox writes
  2861.         02h return CF set on failed mailbox writes and NULL on failed
  2862.         GETMEM calls
  2863. SeeAlso: AX=DE15h
  2864. ----------15DE17-----------------------------
  2865. INT 15 - DESQview v2.20-2.25 - reserved
  2866.     AX = DE17h
  2867. Return: pops up "Programming error" window
  2868. Note:    AX = 1117h is NOT identical to this call under DESQview 2.20 thru 2.25
  2869. SeeAlso: AX=1117h
  2870. ----------15DE17-----------------------------
  2871. INT 15 - DESQview v2.26+ - "ASSERTMAP" - GET/SET MAPPING CONTEXT
  2872.     AX = DE17h
  2873.     BX = function
  2874.         0000h   get current mapping context without setting
  2875.         nonzero set new mapping context to BX
  2876. Return: BX = mapping context in effect before call
  2877. Notes:    mapping contexts determine conventional-memory addressability; setting
  2878.       a mapping context ensures that the associated program and data areas
  2879.       are in memory for access.  Usable by drivers, TSRs and shared
  2880.       programs.
  2881.     caller need not be running under DESQview
  2882.     this API call may be made from a hardware interrupt handler
  2883. SeeAlso: AX=1117h,AX=DE21h,INT 2F/AX=1685h
  2884. ----------15DE18-----------------------------
  2885. INT 15 - DESQview v2.20+ - internal - ???
  2886.     AX = DE18h
  2887.     BP = function number
  2888.         high byte must be 10h
  2889.         low byte is function
  2890.         00h set ???
  2891.             BL = ???  (00h-10h, video mode???)
  2892.             BH = value to store
  2893.         03h set ???
  2894.             BL = ??? (stored in driver)
  2895.         0Ah get ???
  2896.             ES:DI -> 18-byte buffer to hold ???
  2897. Note:    calls video driver (NOP for Hercules driver,probably CGA and MCGA also)
  2898. ----------15DE19-----------------------------
  2899. INT 15 - DESQview v2.23+ - "GETCOMMON" - ALLOCATE "COMMON" MEMORY
  2900.     AX = DE19h
  2901.     BX = number of bytes to allocate
  2902. Return: AX = 0000h successful
  2903.         ES:DI -> allocated block
  2904.          nonzero insufficient memory
  2905. Note:    this API call may be made from within a hardware interrupt handler
  2906. SeeAlso: AX=DE0Ch,AX=DE15h,AX=DE1Ah
  2907. ----------15DE1A-----------------------------
  2908. INT 15 - DESQview v2.23+ - "PUTCOMMON" - DEALLOCATE "COMMON" MEMORY
  2909.     AX = DE1Ah
  2910.     DS:SI -> previously allocated block
  2911. Note:    this function may be called from within a hardware interrupt handler
  2912. SeeAlso: AX=DE0Dh,AX=DE19h
  2913. ----------15DE1B-----------------------------
  2914. INT 15 - DESQview v2.23+ internal - DECREMENT CRITICAL NESTING COUNT
  2915.     AX = DE1Bh
  2916. Return: nothing
  2917. SeeAlso: AX=101Ch,AX=DE13h,AX=DE1Ch
  2918. ----------15DE1C-----------------------------
  2919. INT 15 - DESQview v2.23+ - "ENTERC" - INCREMENT CRITICAL NESTING COUNT
  2920.     AX = DE1Ch
  2921. Return: nothing
  2922. Notes:    similar to AX=101Bh, but begins the critical region without ensuring
  2923.       that DOS is free
  2924.     the official documentation states that this call should be paired with
  2925.       "ENDC" (AX=101Ch); no mention is made of AX=DE1Bh
  2926.     this API call may be made from within a hardware interrupt handler
  2927. SeeAlso: AX=101Bh,AX=101Ch,AX=DE13h,AX=DE1Bh
  2928. ----------15DE1D-----------------------------
  2929. INT 15 - DESQview v2.23+ - "PUTKEY" - FAKE USER KEYSTROKES
  2930.     AX = DE1Dh
  2931.     DX = segment of handle for task to receive keystroke
  2932.     BL = character
  2933.     BH = scan code
  2934. Return: AX = 0000h if successful
  2935.        nonzero if receiver's keyboard buffer was full
  2936. Notes:    the key is treated as though the user had pressed it, ignoring any
  2937.       script which may be bound to the key, and using the current field
  2938.       table if the keyboard object is in field processing mode
  2939.     multiple PUTKEYs are seen in the order in which they are executed
  2940. SeeAlso: AX=DE10h
  2941. ----------15DE1E-----------------------------
  2942. INT 15 - DESQview v2.23+ - "SCRNINFO" - GET TRUE VIDEO PARAMETERS
  2943.     AX = DE1Eh
  2944. Return:    CL = actual number of rows on screen
  2945.     CH = actual number of columns on screen
  2946.     BL = actual video mode (may differ from INT 10/AH=0Fh return) (v2.26+)
  2947. Note:    this API call may be made from a hardware interrupt handler
  2948. SeeAlso: INT 10/AH=0Fh
  2949. ----------15DE1F-----------------------------
  2950. INT 15 - DESQview v2.23+ - "DOSUSER" - GET HANDLE OF TASK CURRENTLY USING DOS
  2951.     AX = DE1Fh
  2952. Return: BX = segment of task handle or 0000h if no tasks are using DOS
  2953. Note:    this API call may be made from within a hardware interrupt handler
  2954. SeeAlso: AX=DE13h,INT 21/AH=34h
  2955. ----------15DE20-----------------------------
  2956. INT 15 - DESQview v2.26+ - "DISPATCHINT" - INTERRUPT ANOTHER TASK
  2957.     AX = DE20h
  2958.     BX = segment of handle of task to interupt
  2959.     DX:CX -> FAR interrupt routine
  2960.     BP,SI,DI,DS,ES as required by interrupt routine
  2961. Return: nothing
  2962. Notes:    unlike "PGMINT" (AX=1021h), DISPATCHINT may be applied to the task
  2963.       making the DISPATCHINT call
  2964.     multiple "DISPATCHINT" calls are processed in the order in which they
  2965.       were executed
  2966.     the FAR routine is entered with the current ES, DS, SI, DI, and BP
  2967.       values, using the task's internal stack (see AX=101Ah); only SS:SP
  2968.       needs to be preserved
  2969.     this API call may be made from within a hardware interrupt handler
  2970. SeeAlso: AX=1021h,AX=DE2Ah
  2971. ----------15DE21-----------------------------
  2972. INT 15 - DESQview v2.26+ - "ASSERTVIR" - CONTROL 386 SCREEN VIRTUALIZATION
  2973.     AX = DE21h
  2974.     BX = new state
  2975.         0000h turn off
  2976.         nonzero turn on
  2977. Return: BX = old state of virtualization
  2978. Notes:    this API call may be made from within a hardware interrupt handler
  2979.     under DV 2.40 and 2.42, this call appears to have no effect and always
  2980.       returns a nonzero value in BX which appears to be the offset within
  2981.       the DV common memory segment of the caller's task object; it may
  2982.       only have an effect within a hardware interrupt handler
  2983. SeeAlso: AX=1117h,AX=DE17h
  2984. ----------15DE22-----------------------------
  2985. INT 15 - DESQview v2.26+ - "PROCESSMEM" - GET TASK MEMORY STATUS
  2986.     AX = DE22h
  2987.     DX = segment of task handle
  2988. Return: DX = total amount of memory in paragraphs
  2989.     BX = amount of system memory in paragraphs
  2990.     CX = largest block of system memory available in paragraphs
  2991.     AX = flags
  2992.         bit 0: system memory resides in shared memory
  2993.         1: process's memory is swapped out
  2994.         2: process's system memory is swapped out
  2995. Notes:    if the task handle is a child task, the returned values will be for the
  2996.       process containing the task, rather than the task itself
  2997.     if the process's system memory is swapped out, BX,CX,DX remain
  2998.       unchanged, because the memory usage cannot be determined
  2999. SeeAlso: AX=DE04h,AX=DE05h,AX=DE06h
  3000. ----------15DE23-----------------------------
  3001. INT 15 U - DESQview v2.31+ - ???
  3002.     AX = DE23h
  3003.     BX = ??? IRQ number on first PIC?
  3004.     CX = ??? IRQ number on second PIC?
  3005. Return: ???
  3006. Note:    called by QEMM 6.00+
  3007. ----------15DE24-----------------------------
  3008. INT 15 - DESQview v2.40+ - "XNEWPROC" - START NEW APPLICATION
  3009.     AX = DE24h
  3010.     BX = length of .DVP data
  3011.     CX = length of ??? string
  3012.     DS:SI -> ??? string
  3013.     ES:DI -> .DVP data (see AX=102Ch)
  3014. Return: BX = segment of task handle??? or 0000h on error
  3015. Note:    this call is similar to AX=102Ch except that it can interpret the
  3016.       extended DVP data
  3017. SeeAlso: AX=102Ch
  3018. ----------15DE25-----------------------------
  3019. INT 15 - DESQview v2.40+ - "GETDVPATH" - GET DESQview DIRECTORY
  3020.     AX = DE25h
  3021.     ES:DI -> 67-byte buffer for ASCIZ directory name
  3022. Return: ES:DI buffer filled with directory from which DESQview was started
  3023. BUG:    DV 2.42 does not place a terminating NUL at the end of the directory
  3024.       name, so if the buffer is not cleared to zeros before the call,
  3025.       there is no way to tell where the directory name ends.  This bug
  3026.       has been fixed in DV 2.52 (DV/X 1.02)
  3027. SeeAlso: AX=DE2Eh,INT 21/AH=47h
  3028. ----------15DE26-----------------------------
  3029. INT 15 - DESQview v2.40+ - "GETFOREGROUND" - GET KEYBOARD FOCUS
  3030.     AX = DE26h
  3031. Return: BX = segment of handle for task with keyboard focus
  3032. Note:    under DESQview/X, the X server always has the keyboard focus unless a
  3033.       "direct" window is active
  3034. SeeAlso: AX=DE2Fh,INT 2F/AX=DE0Ah
  3035. ----------15DE27-----------------------------
  3036. INT 15 - DESQview v2.50+ - "ADDINSTANCEDATA" - ADD PER-TASK SAVE/RESTORE AREA
  3037.     AX = DE27h
  3038.     BX = type
  3039.         0000h process
  3040.         0001h task
  3041.     ES:DI -> list of Instance Item Structures (see below)
  3042. Return: CF clear if successful
  3043.         AX = ???
  3044.         BX = ???
  3045.     CF set on error
  3046.         AX = ???
  3047. Note:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3048. SeeAlso: INT 2F/AX=DE08h,INT 2F/AX=DE09h
  3049.  
  3050. Format of Instance Item Structure [one element of list]:
  3051. Offset    Size    Description
  3052.  00h    WORD    length of data area DESQview should save and restore on context
  3053.         switches (0000h = end of list)
  3054.  02h    DWORD    pointer to area to be saved/restored
  3055. ----------15DE28-----------------------------
  3056. INT 15 U - DESQview v2.50+ - ???
  3057.     AX = DE28h
  3058.     BX = segment of ??? or 0000h for default
  3059.     ???
  3060. Return: ???
  3061. Note:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3062. SeeAlso: AX=DE2Ah
  3063. ----------15DE29BX0000-----------------------
  3064. INT 15 U - DESQview v2.50+ - ???
  3065.     AX = DE29h
  3066.     BX = 0000h
  3067.     ???
  3068. Return: CF clear if successful
  3069.         ???
  3070.     CF set on error
  3071. Note:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3072. ----------15DE29BX0001-----------------------
  3073. INT 15 U - DESQview v2.50+ - ???
  3074.     AX = DE29h
  3075.     BX = 0001h
  3076.     DX = segment of window handle
  3077. Return: CF clear if successful
  3078.         AX = ???
  3079.         DX = ???
  3080.     CF set on error
  3081. Note:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3082. ----------15DE29BX0002-----------------------
  3083. INT 15 U - DESQview v2.50+ - ???
  3084.     AX = DE29h
  3085.     BX = 0002h
  3086.     DX = segment of window handle
  3087. Return: CF clear if successful
  3088.         AX = ???
  3089.         DX = ???
  3090.     CF set on error
  3091. Note:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3092. ----------15DE29BX0003-----------------------
  3093. INT 15 U - DESQview v2.50+ - ???
  3094.     AX = DE29h
  3095.     BX = 0003h
  3096.     DX = segment of window handle
  3097. Return: CF clear if successful
  3098.         ???
  3099.     CF set on error
  3100. Note:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3101. ----------15DE29BX0004-----------------------
  3102. INT 15 U - DESQview v2.50+ - GET DISPLAY NAME
  3103.     AX = DE29h
  3104.     BX = 0004h
  3105.     CX = size of buffer in bytes
  3106.     DX = segment of window handle
  3107.     ES:DI -> buffer for display name
  3108. Return: CF clear if successful
  3109.         buffer filled with ASCIZ display name (truncated if necessary) or
  3110.           null string if no display
  3111.     CF set on error
  3112. Notes:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3113.     the name ":0" refers to the local display
  3114. ----------15DE29BX0005-----------------------
  3115. INT 15 U - DESQview v2.50+ - ???
  3116.     AX = DE29h
  3117.     BX = 0005h
  3118.     ???
  3119. Return: CF clear if successful
  3120.         ???
  3121.     CF set on error
  3122. Note:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3123. ----------15DE2A-----------------------------
  3124. INT 15 - DESQview v2.50+ - "DISPATCHINTAFTERDOS" - INTERRUPT ANOTHER TASK
  3125.     AX = DE2Ah
  3126.     BX = segment of handle for task to interrupt or 0000h for caller
  3127.     DX:CX -> interrupt routine
  3128.     BP,SI,DI,DS,ES as required by interrupt routine
  3129. Return: nothing
  3130. Notes:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3131.     this call is the same as AX=DE20h except that it will delay
  3132.       interrupting the specified task until after it has exited DOS
  3133. SeeAlso: AX=1021h,AX=DE20h
  3134. ----------15DE2B-----------------------------
  3135. INT 15 - DESQview v2.50+ - "OBJNEXT" - TRAVERSE OBJECT LIST
  3136.     AX = DE2Bh
  3137.     ES:DI -> starting object
  3138.         0000h:0000h for first object in list???
  3139. Return: AX = status
  3140.         0000h successful
  3141.         ES:DI -> next object of same type (window/non-window)
  3142.         0001h failed (ES:DI was not a valid handle)
  3143. Notes:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3144.     there are two separate lists, one for window/task objects and one
  3145.       for all other objects
  3146. SeeAlso: AX=1016h,AX=DE2Ah,AX=DE2Ch
  3147. ----------15DE2CDX0100-----------------------
  3148. INT 15 - DESQview v2.50+ - "WININFO" - GET WINDOW INFORMATION
  3149.     AX = DE2Ch
  3150.     DX = window information format version (0100h for DESQview 2.5x)
  3151.     BX = segment of window handle or 0000h for default
  3152.     ES:DI -> buffer for window information (see below)
  3153. Return: AX = status
  3154.         0000h successful
  3155. Note:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3156. SeeAlso: AX=1000h,AX=1016h,AX=DE01h,AX=DE2Bh
  3157.  
  3158. Format of window information:
  3159. Offset    Size    Description
  3160.  00h    BYTE    task flag: 00h window, 01h task
  3161.  01h    BYTE    process number if owner task
  3162.         00h if non-owner task
  3163.  02h    WORD    segment of owner's handle, 0000h if orphaned
  3164.  04h    WORD    mapping context
  3165.  06h    BYTE    task status (see below)
  3166.  07h    BYTE    unused
  3167.  08h    WORD    status bits
  3168.         bit 0: DESQview process
  3169.         bit 1: process swapped out
  3170.         bit 2: process is resized direct window (suspended)
  3171.         bit 3: process suspended itself
  3172.         bit 4: user suspended process
  3173.         bit 5: process is being created
  3174.         bit 6: task is freeing another task
  3175.  0Ah    BYTE    01h if foreground-only window
  3176.  
  3177. Values for task status:
  3178.  00h "Waiting" waiting for input
  3179.  01h "Idle" keyboard poll limit reached
  3180.  03h same as 01h
  3181.  04h "Pausing" INT 15/AX=1000h pause called
  3182.  04h DV/X direct: user did something to allow task switch
  3183.  05h "ModeChg" video mode about to be changed
  3184.  06h "ModeNtf" notify that video mode changed
  3185.  07h "MoniCh" requested change to other monitor
  3186.  08h "StartPgm" control relinquished to start new process
  3187.  09h "MgrCan" made window manager CANCEL command
  3188.  0Ah "Slicing" time slice expired
  3189.  0Bh "Exit DOS" notify on DOS calls
  3190.  0Ch "Enter DOS" process is re-entering DOS
  3191.  0Dh "Terminate" INT 21/AH=4Ch or task freed
  3192.  0Eh "BrkNxt" Control-Break pressed
  3193.  0Fh "MgrCol" keyboard focus taken away
  3194.  10h "PgmInt" interrupted by API call from another task
  3195.  11h "BldOpen" call to INT 15/AX=DE01h
  3196. ----------15DE2D-----------------------------
  3197. INT 15 U - DESQview v2.50+ - GET/SET SOCKET HANDLER
  3198.     AX = DE2Dh
  3199.     CX = direction
  3200.         FFFFh set socket handler
  3201.         DX:BX -> FAR function for socket interface
  3202.             must be of the format described under INT 63"DESQview"
  3203.         other get socket handler
  3204.         Return: DX:BX -> socket handler
  3205. Notes:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3206.     the "set" subfunction is normally called only by SOCKET.DVR
  3207. SeeAlso: AX=DE2Eh,INT 63"DESQview"
  3208. ----------15DE2E-----------------------------
  3209. INT 15 U - DESQview v2.50+ - SOCKET API
  3210.     AX = DE2Eh
  3211.     DX:BX -> socket record or 0000h:0000h to create a new socket record
  3212. Return: CX = size of socket record in bytes
  3213.     DX:BX -> socket record which was used
  3214. Notes:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3215.     socket records are allocated from common memory
  3216.     for Unix compatibility, each socket and connection on a socket is
  3217.       allocated a DOS file handle (referencing an SFT for NUL) which is
  3218.       used on various calls to specify which of possibly multiple
  3219.       connections is to be operated upon
  3220. SeeAlso: AX=DE2Dh,INT 63"DESQview"
  3221.  
  3222. Format of socket record:
  3223. Offset    Size    Description
  3224.  00h    WORD    signature F0ADh
  3225.  02h    WORD    function number
  3226.         0000h initialize socket???
  3227.         0001h "gethostname"
  3228.         0002h "ioctl" check for input
  3229.         0003h "sleep" delay for specified period
  3230.         0004h "htons" convert word to network (big-endian) byte order
  3231.         0005h "select"
  3232.         0006h "bsd_close"/"so_close" close socket
  3233.         0007h NOP
  3234.         0008h "connect" initiate connection on socket
  3235.         0009h "recv"/"recvfrom" read from socket
  3236.         000Ah "socket"
  3237.         000Bh ???
  3238.         000Ch "gethostbyname"
  3239.         000Dh "send"/"sendto" write to socket
  3240.         000Eh ??? (does something to all connections for process)
  3241.         000Fh "getpid" get process identifier
  3242.         0010h "gettimeofday"
  3243.         0011h "bind" assign name to socket
  3244.         0012h "listen" listen for connections on socket
  3245.         0013h "accept" accept connection on socket
  3246.         0014h connect to X server
  3247.         0015h "gethostbyaddr" get host information for an address
  3248.         0016h "getprotobyname"
  3249.         0017h "getprotobynumber"
  3250.         0018h "getservbyname"
  3251.         0019h "getservbyport"
  3252.         001Ah "getsockname" determine name bound to socket
  3253.         001Bh "getpeername" get name of connected peer
  3254.         001Ch "getsockopt"/"setsockopt"
  3255.         001Dh "so_exit"     close all sockets for calling process
  3256.         001Eh "issock" determine whether file handle references socket
  3257.         001Fh "so_attach" reattach previously detached socket
  3258.         0020h "so_detach" temporarily detach socket
  3259.         0021h get DESQview directory
  3260.         0022h "NewProc" start new application (see AX=102Ch)
  3261.         0023h "so_linkup"
  3262.         0024h canonicalize filename
  3263.         0025h indirect INT 15h call
  3264.         0026h Network Manager interface
  3265.         0027h "so_unlink"    close connection from "so_linkup"
  3266.         0028h "raisepriority"
  3267.         0029h "lowerpriority"
  3268.         002Ah ???
  3269.         FFFFh "NetExit" (appears to be a NOP)
  3270.  04h    WORD    returned error code (see below)
  3271.  06h    WORD    maximum message size??? (usually 0400h)
  3272.  08h    WORD    PSP segment to use or 0000h if socket not valid
  3273.  0Ah    WORD    scratch space (JFT size)
  3274.  0Ch    DWORD    scratch space (JFT address)
  3275.  10h    DWORD    mailbox handle (initialized by function 0000h)
  3276.  14h    DWORD    timer object handle (initialized by function 0000h)
  3277. ---function 0000h---
  3278.  18h    WORD    (return) ???
  3279. ---function 0001h---
  3280.  18h    WORD    (return) status???
  3281.  1Ah 128 BYTEs    (return) ASCIZ hostname (empty string if not on network)
  3282.  9Ah    WORD    maximum length of hostname to return
  3283. ---function 0002h---
  3284.  18h    WORD    (return) status
  3285.  1Ah    WORD    socket's file handle
  3286.  1Ch    WORD    IOCTL function
  3287.         05h "FIONREAD" determine available input
  3288.         06h "FIONBIO" set blocking state of socket
  3289.  1Eh    WORD    (return, subfn 05h) number of bytes available for reading
  3290.         (call, subfn 06h) 0000h blocking, nonzero nonblocking
  3291. ---function 0003h---
  3292.  18h  2 BYTEs    unused
  3293.  1Ah    WORD    delay time in seconds
  3294. ---function 0004h---
  3295.  18h    WORD    (return) result in network (big-endian) byte order
  3296.  1Ah    WORD    value to convert to network byte order
  3297. ---function 0005h---
  3298.  18h    WORD    (return) number of handles meeting the specified conditions???
  3299.  1Ah    WORD    number of file handles in each bitset???
  3300.  1Ch    DWORD    bitset of socket handles to check for readability???
  3301.  20h    DWORD    bitset of socket handles to check for writability???
  3302.  24h    DWORD    bitset of socket handles to check for errors???
  3303.  28h    WORD    timeout in ??? or 0000h to block until some socket ready
  3304.  2Ah    DWORD    ???
  3305.  2Eh    DWORD    ???
  3306. ---function 0006h---
  3307.  18h    WORD    (return) status: 0000h if successful, FFFFh on error
  3308.  1Ah    WORD    socket's file handle
  3309. ---function 0008h---
  3310.  18h    WORD    (return) status: 0000h if successful, FFFFh on error
  3311.  1Ah    WORD    socket's file handle
  3312.  1Ch    WORD    0001h if socket name specified, 0000h if not
  3313.  1Eh    WORD    length of socket name
  3314.  20h  N BYTEs    name of socket to which to connect
  3315. ---function 0009h---
  3316.  18h    WORD    (return) number of bytes actually read, 0000h if connection
  3317.             closed, or FFFFh on error
  3318.  1Ah    WORD    socket's file handle
  3319.  1Ch    WORD    number of bytes to read
  3320.  1Eh    WORD    flags
  3321.  20h    WORD    0000h if no source address desired
  3322.         0001h if source address is to be stored (datagram sockets)
  3323.  22h    WORD    length of source address
  3324.  24h 110 BYTEs    source address
  3325.  92h 1K BYTEs    buffer for data to be read
  3326. ---function 000Ah---
  3327.  18h    WORD    (return) socket's file handle or FFFFh on error
  3328.  1Ah    WORD    address family (0001h,0002h)
  3329.  1Ch    WORD    socket type
  3330.  1Eh    WORD    protocol
  3331. ---function 000Bh---
  3332.  18h    WORD    (return) 0001h if ??? or FFFFh on error
  3333.  1Ah    WORD    socket's file handle
  3334.  1Eh    WORD    (call) ???
  3335. ---function 000Ch---
  3336.  18h 128 BYTEs    buffer containing ASCIZ hostname
  3337.         special case if empty string or "unix"
  3338.  98h    ???    'struct hostent' ???
  3339.  A2h    ???    (return) ???
  3340. ---function 000Dh---
  3341.  18h    WORD    (return) number of bytes actually written or FFFFh on error
  3342.  1Ah    WORD    socket's file handle
  3343.  1Ch    WORD    number of bytes to write
  3344.  1Eh    WORD    number of bytes to follow in subsequent writes???
  3345.  20h    WORD    flags
  3346.  22h    WORD    0000h if no destination specified, 0001h if destination present
  3347.  24h    WORD    ???
  3348.  26h    WORD    length of destination address
  3349.  28h 110 BYTEs    destination address
  3350.  96h 1K BYTEs    buffer containing data to be written
  3351. ---function 000Eh---
  3352.  no additional fields
  3353. ---function 000Fh---
  3354.  18h    DWORD    (return) DESQview task handle of calling process
  3355. ---function 0010h---
  3356.  18h    DWORD    (return) current time
  3357.  1Ch    DWORD    (return) ???
  3358. ---function 0011h---
  3359.  18h    WORD    (return) status: 0000h if successful, FFFFh on error
  3360.  1Ah    WORD    socket's file handle
  3361.  1Ch    WORD    length of name
  3362.  1Eh  N BYTEs    buffer for socket name
  3363. ---function 0012h---
  3364.  18h    WORD    (return) status: 0000h if successful, FFFFh on error
  3365.  1Ah    WORD    socket's file handle
  3366.  1Ch    WORD    maximum backlog of pending connections allowed on socket
  3367. ---function 0013h---
  3368.  18h    WORD    (return) file handle for new connection or FFFFh on error
  3369.  1Ah    WORD    listen()ing socket's file handle
  3370.  1Ch    WORD    (call) length of buffer for connecting entity's address
  3371.         (return) actual length of address
  3372.  1Eh  N BYTEs    buffer for connecting entity's address
  3373. ---function 0014h---
  3374.  18h    WORD    (return) socket's file handle or FFFFh on error
  3375.  1Ah  4 BYTEs    (return) ???
  3376.  1Eh    WORD    (return) ???
  3377.  20h    WORD    (return) ???
  3378.  22h 256 BYTEs    ASCIZ X display name
  3379. 122h    ???
  3380. ---function 0015h---
  3381.  18h    WORD    (call) type of address??? (test for 0001h seen)
  3382.  1Ah    WORD    (call) length of buffer for host address
  3383.  1Ch 110 BYTEs    buffer containing host address
  3384.  8Ah    WORD    (return) offset of official host name???
  3385.  8Ch    WORD    (return) offset of alias list???
  3386.  8Eh    WORD    (return) address type???
  3387.  90h    WORD    (return) length of an address in bytes???
  3388.  92h    WORD    (return) offset of address???
  3389.  9Ah  N BYTEs    (return) ??? buffer for hostname, alias list, and host address
  3390. ---function 0016h---
  3391.  18h    ???    buffer for protocol name???
  3392.  98h    ???
  3393. ---function 0017h---
  3394.  18h    WORD    (call) protocol number???
  3395.  1Ah    WORD    (return) ??? or 0001h
  3396. ---function 0018h---
  3397.  18h 128 BYTEs    buffer containing ???
  3398.  98h 128 BYTEs    buffer containing ???
  3399. 118h    WORD    (return) ???
  3400. ---function 0019h---
  3401.  18h    WORD    length of name???
  3402.  1Ah 128 BYTEs    buffer for name???
  3403.  9Ah    WORD    (return) ???
  3404. ---function 001Ah---
  3405.  18h    WORD    (return) 0000h if successful, FFFFh on error
  3406.  1Ah    WORD    socket's file handle
  3407.  1Ch    WORD    (call) length of buffer for socket name
  3408.         (return) actual length of socket name
  3409.  1Eh  N BYTEs    buffer for socket name
  3410. ---function 001Bh---
  3411.  18h    WORD    (return) status: 0000h if successful, FFFFh on error
  3412.  1Ah    WORD    socket's file handle
  3413.  1Ch    WORD    (call) size of buffer for name
  3414.         (return) actual size of name
  3415.  1Eh  N BYTEs    buffer for peer's name
  3416. ---function 001Ch---
  3417.  18h    WORD    (return) status: 0000h if successful, FFFFh on error
  3418.  1Ah    WORD    direction: 0000h to get, 0001h to set
  3419.  1Ch    WORD    socket's file handle
  3420.  1Eh    WORD    option level
  3421.  20h    WORD    option name
  3422.  22h    WORD    (call) length of buffer for option value
  3423.         (return) actual length of option value
  3424.  24h  N BYTEs    buffer for option value
  3425. ---function 001Dh---
  3426.  no additional fields
  3427. ---function 001Eh---
  3428.  18h    WORD    (return) status: 0000h ??? or 0001h ???
  3429.  1Ah    WORD    file handle which may or may not be a socket
  3430. ---function 001Fh---
  3431.  18h    WORD    (return) file handle or FFFFh on error
  3432.  1Ah    DWORD    (call) pointer to Socket Context Record (see below) of a
  3433.             previously detached socket
  3434. ---function 0020h---
  3435.  18h    WORD    (return) status: 0000h if successful or FFFFh on error
  3436.  1Ah    WORD    socket's file handle
  3437.  1Ch    DWORD    (return) pointer to Socket Context Record (see below) for
  3438.             the file handle
  3439. ---function 0021h---
  3440.  18h 64 BYTEs    buffer for DESQview startup directory (see AX=DE25h)
  3441. ---function 0022h---
  3442.  18h    DWORD    (return) task handle of new application
  3443.  1Ch    WORD    size of .DVP data
  3444.  1Eh 129 BYTEs    ASCIZ ???
  3445.  9Fh  N BYTEs    .DVP data (see AX=102Ch)
  3446. ---function 0023h---
  3447.  18h    WORD    (return) ??? or FFFFh on error
  3448.  1Ah    WORD    socket's file handle???
  3449. ---function 0024h---
  3450.  18h    WORD    (return) DOS error code (see INT 21/AH=59h)
  3451.             0000h if successful
  3452.  1Ah 129 BYTEs    ASCIZ filename/pathname
  3453. 11Bh 129 BYTEs    ASCIZ canonicalized filename/pathname (see INT 21/AH=60h)
  3454. ---function 0025h---
  3455.  18h    WORD    value of AX
  3456.  1Ah    WORD    value of BX
  3457.  1Ch    WORD    (call) value of CX for call if AH value other than 12h
  3458.         (call) number of stack parameters if AH value is 12h
  3459.         (return) returned CX for calls other than INT 15/AH=12h
  3460.  1Eh    WORD    value of DX
  3461.  20h    WORD    value of DI
  3462.  22h    WORD    value of SI
  3463.  24h    WORD    value of DS
  3464.  26h    WORD    value of ES
  3465.  28h    WORD    (return) value of FLAGS after call
  3466.  2Ah  N DWORDs    (call) stack parameters for INT 15/AH=12h call
  3467.         (return) stack results from INT 15/AH=12h call
  3468. ---function 0026h---
  3469.  18h    WORD    (call) subfunction
  3470.             0004h "so_exit"???
  3471.             0005h "gethostbyname"
  3472.             0006h "gethostname"
  3473.             0009h "socket"
  3474.             000Dh "gethostbyaddr"
  3475.             000Fh "getprotobyname"
  3476.             0010h get protocol name for protocol number
  3477.             0011h "getservbyname"
  3478.             0012h "getservbyport"
  3479.             0013h "getsockname"???
  3480.             0016h ???
  3481.             0017h kill Network Manager
  3482.             0018h "getpeername"???
  3483.             0019h ??? (called by socket function 0000h)
  3484.             001Ah ???
  3485.             001Bh "so_linkup"
  3486.             001Dh get network services
  3487.             001Fh "getpwuid"
  3488.             0020h "getpwnam"
  3489.             0021h "getpwvar"
  3490.             0022h "crypt"
  3491.             0023h "so_unlink"
  3492.             0024h "getlogin"
  3493.             0028h "sethostent"
  3494.             0029h "gethostent"
  3495.             002Ah "soaddhost"
  3496.             002Bh "soupdatehost"
  3497.             002Ch "sodeletehost"
  3498.             002Dh "setservent"
  3499.             002Eh "getservent"
  3500.             002Fh "setpwent"
  3501.             0030h "getpwent"
  3502.             0031h ???
  3503.             0032h ???
  3504.             0033h ???
  3505.             0034h get IP network number
  3506.             0035h ??? (pops up Network Manager window)
  3507.             0037h ???
  3508.             0038h get machine name and IP address
  3509.             0039h ???
  3510.         (return) status???
  3511.  1Ah    WORD    (call) size of parameter data
  3512.         (return) size of returned data
  3513.  1Ch  N BYTEs    (call) parameter data required by call (see below)
  3514.         (return) result data (see below)
  3515. ---function 0027h---
  3516.  18h    WORD    (return) status: 0000h if successful, FFFFh on error
  3517.  1Ah    WORD    socket's file handle
  3518. ---functions 0028h,0029h---
  3519.  18h    WORD    (call) file handle for which to set priority low/high
  3520.             FFFFh to change calling task's priority
  3521. ---function 002Ah---
  3522.  no additional fields
  3523.  
  3524. Format of Function 0026h/Subfunction 000Fh data:
  3525. Offset    Size    Description
  3526.  00h  8 BYTEs    (return) ???
  3527.  
  3528. Format of Function 0026h/Subfunction 0010h data:
  3529. Offset    Size    Description
  3530.  00h  2 BYTEs    (return) ???
  3531.  02h    WORD    (return) protocol number
  3532.  04h    WORD    (call) protocol number for which to get name
  3533.  06h    WORD    (return) ???
  3534.  08h    var    (return) ASCIZ protocol name
  3535.  N    var    (return) ASCIZ protocol name
  3536.  
  3537. Format of Function 0026h/Subfunction 0011h data:
  3538. Offset    Size    Description
  3539.  00h  8 BYTEs    ???
  3540.  08h    var    (return) ASCIZ protocol name
  3541.     var    (return) ASCIZ ??? name
  3542.     var    (return) ASCIZ ??? name
  3543.  
  3544. Format of Function 0026h/Subfunction 0012h data:
  3545. Offset    Size    Description
  3546.  00h  8 BYTEs    (return) ???
  3547.  
  3548. Format of Function 0026h/Subfunction 0013h data:
  3549. Offset    Size    Description
  3550.  00h 116 BYTEs    (return) ???
  3551.  
  3552. Format of Function 0026h/Subfunction 0016h data:
  3553. Offset    Size    Description
  3554.  00h  4 BYTEs    (return) ???
  3555.  
  3556. Format of Function 0026h/Subfunction 0018h data:
  3557. Offset    Size    Description
  3558.  00h 116 BYTEs    (return) ???
  3559.  
  3560. Format of Function 0026h/Subfunction 0019h data:
  3561. Offset    Size    Description
  3562.  00h  4 BYTEs    (return) ???
  3563.  04h    DWORD    (return) task handle of ???
  3564.  
  3565. Format of Function 0026h/Subfunction 001Ah data:
  3566. Offset    Size    Description
  3567.  00h 38 BYTEs    (return) ???
  3568.  
  3569. Format of Function 0026h/Subfunction 001Bh data:
  3570. Offset    Size    Description
  3571.  00h 10 BYTEs    (return) ???
  3572.  
  3573. Format of Function 0026h/Subfunction 001Dh return data [array]:
  3574. Offset    Size    Description
  3575.  00h    WORD    ??? or FFFFh if end of array
  3576.  02h  7 BYTEs    ???
  3577.  09h 27 BYTEs    ASCIZ name of service
  3578.  
  3579. Format of Function 0026h/Subfunction 0024h return data:
  3580. Offset    Size    Description
  3581.  00h    var    ASCIZ username
  3582.  
  3583. Format of Function 0026h/Subfunction 0030h data:
  3584. Offset    Size    Description
  3585.  00h    WORD    (call) UID or 0000h for current user
  3586.         (return) ???
  3587.  02h    WORD    (return) UID
  3588.  04h  6 BYTEs    (return) ???
  3589.  0Ah    var    (return) ASCIZ username
  3590.     var    (return) ASCIZ encrypted password
  3591.     var    (return) ASCIZ initial ("home") directory
  3592.  
  3593. Format of Function 0026h/Subfunction 0034h data:
  3594. Offset    Size    Description
  3595.  00h  1-3 BYTEs    IP network number of caller's machine (low byte first)
  3596.  
  3597. Format of Function 0026h/Subfunction 0038h return data:
  3598. Offset    Size    Description
  3599.  00h    BYTE    ???
  3600.  01h  4 BYTEs    IP address
  3601.  05h    var    ASCIZ machine name
  3602.     ???
  3603.  
  3604. Values for error code:
  3605.  0000h successful
  3606.  0009h "BADF" bad file handle
  3607.  000Ch "ENOMEM" out of memory
  3608.  000Eh "EFAULT" bad address
  3609.  0016h "EINVAL" invalid argument
  3610.  0018h "EMFILE" too many open files
  3611.  0020h "EPIPE" ??? broken pipe
  3612.  0023h "EWOULDBLOCK" operation cannot be completed at this time
  3613.  0024h "EINPROGRESS" operation now in progress
  3614.  0026h "ENOTSOCK" socket invalid
  3615.  0028h "EMSGSIZE" message too long to send atomically
  3616.  002Ch "ESOCKTNOSUPPORT" socket type not supported
  3617.  002Fh "EAFNOSUPPORT" address family not supp. by protocol fam.
  3618.  0031h "EDOM" argument too large
  3619.  0038h "EISCONN" socket is already connected
  3620.  0039h "ENOTCONN" socket is not connected
  3621.  
  3622. Format of Socket Context Record:
  3623. Offset    Size    Description
  3624.  00h    DWORD    pointer to next Socket Context Record, 0000h:0000h if last
  3625.  04h    WORD    SFT index for socket, 00FFh if not connected, FFFFh if detached
  3626.  06h    WORD    PSP segment of owner or 0000h
  3627.  08h    WORD    mapping context of owning window
  3628.  0Ah  2 BYTEs    ???
  3629.  0Ch    WORD    address family
  3630.  0Eh    WORD    socket type
  3631.  10h    WORD    protocol
  3632.  12h    WORD    socket state
  3633.         0001h created
  3634.         0002h bound
  3635.         0003h listening???
  3636.         0005h connected
  3637.  14h    DWORD    timer object handle
  3638.  18h    DWORD    object handle (mailbox???)
  3639.  1Ch    DWORD    object handle of parent of above object or 0000h:0000h
  3640.  20h    DWORD    pointer to ??? or 0000h
  3641.  24h  6 BYTEs    ???
  3642.  2Ah    WORD    file handle for socket or FFFFh
  3643.  2Ch  2 BYTEs    ???
  3644.  2Eh    WORD    nonzero if socket nonblocking
  3645. ---network connections only---
  3646.  30h  2 BYTEs    ???
  3647.  32h    WORD    ???
  3648.  34h  4 BYTEs    IP address of remote (big-endian)
  3649.  38h  6 BYTEs    ???
  3650. ----------15DE2F-----------------------------
  3651. INT 15 - DESQview v2.50+ - "VIDEONOTIFY" - HAS DIRECT WINDOW BEEN ACTIVE?
  3652.     AX = DE2Fh
  3653. Return: BX = status
  3654.         0001h keyboard focus has been given to a direct window since the
  3655.         last call
  3656.         0000h if not
  3657. Notes:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3658.     Quarterdeck states that this call will not be available under future
  3659.       versions of DESQview Classic
  3660. ----------15DE30-----------------------------
  3661. INT 15 - DESQview v2.50+ - "GETDVXVERSION" - GET DESQview/X VERSION
  3662.     AX = DE30h
  3663. Return: BX = version (BH=major, BL=minor) or 0000h if not DESQview/X
  3664. Notes:    DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
  3665.     you must first check the DESQview version to verify that it is 2.50 or
  3666.       greater
  3667. SeeAlso: INT 21/AH=2Bh/CX=4445h
  3668. ----------1605-------------------------------
  3669. INT 16 - KEYBOARD - STORE KEYSTROKE IN KEYBOARD BUFFER (AT/PS w enh keybd only)
  3670.     AH = 05h
  3671.     CH = scan code
  3672.     CL = ASCII character
  3673. Return: AL = 00h if successful
  3674.          01h if keyboard buffer full
  3675. Note:    under DESQview, the following "keystrokes" invoke the following
  3676.       actions when they are read from the keyboard buffer:
  3677.         38FBh or FB00h    switch to next window (only if main menu
  3678.                 popped up)
  3679.         38FCh or FC00h    pop up DESQview main menu
  3680.         38FEh or FE00h    close the current window
  3681.         38FFh or FF00h    pop up DESQview learn menu
  3682. SeeAlso: AH=00h,AH=71h,AH=FFh,INT 15/AX=DE10h
  3683. ----------212B--CX4445-----------------------
  3684. INT 21 - DESQview - INSTALLATION CHECK
  3685.     AH = 2Bh
  3686.     CX = 4445h ('DE')
  3687.     DX = 5351h ('SQ')
  3688.     AL = subfunction (DV v2.00+)
  3689.         01h get version
  3690.         Return: BX = version (BH = major, BL = minor)
  3691.         Note: early copies of v2.00 return 0002h
  3692.         02h get shadow buffer info, and start shadowing
  3693.         Return: BH = rows in shadow buffer
  3694.             BL = columns in shadow buffer
  3695.             DX = segment of shadow buffer
  3696.         04h get shadow buffer info
  3697.         Return: BH = rows in shadow buffer
  3698.             BL = columns in shadow buffer
  3699.             DX = segment of shadow buffer
  3700.         05h stop shadowing
  3701. Return: AL = FFh if DESQview not installed
  3702. Notes:    in DESQview v1.x, there were no subfunctions; this call only identified
  3703.       whether or not DESQview was loaded.  DESQview v2.52 performs function
  3704.       01h for all subfunction requests 0Ch and higher and appears to ignore
  3705.       all lower-numbered functions not listed here.
  3706.     DESQview versions 2.5x are part of DESQview/X v1.0x.
  3707. BUG:    subfunction 05h does not appear to work correctly in DESQview 2.52
  3708. SeeAlso: INT 10/AH=FEh,INT 10/AH=FFh,INT 15/AX=1024h,INT 15/AX=DE30h
  3709. ----------2130FFCX4445-----------------------
  3710. INT 21 - DESQ??? - INSTALLATION CHECK
  3711.     AX = 30FFh
  3712.     CX = 4445h ("DE")
  3713.     DX = 5351h ("SQ")
  3714. Return: BH = 05h if installed
  3715.     ???
  3716. Note:    called by DUBLDISK.COM v2.6; this function is not supported by
  3717.       DESQview, so it may be for DESQview's precursor DESQ.
  3718. SeeAlso: AX=4404h"DUBLDISK"
  3719. ----------214402-----------------------------
  3720. INT 21 U - Quarterdeck - QEMM-386 v5+ - GET API ENTRY POINT
  3721.     AX = 4402h
  3722.     BX = file handle for device "QEMM386$"
  3723.     CX = 0004h
  3724.     DS:DX -> DWORD buffer for API entry point
  3725. Return: CF clear if successful
  3726.         buffer filled (see INT 67/AH=3Fh for entry point parameters)
  3727.     CF set on error
  3728.         AX = error code (01h,05h,06h,0Dh) (see AH=59h)
  3729. SeeAlso: AX=4402h"HOOKROM",INT 2F/AX=D201h/BX=5145h,INT 67/AH=3Fh
  3730. ----------214402-----------------------------
  3731. INT 21 U - Quarterdeck - QEMM-386 v6+ - GET ???
  3732.     AX = 4402h
  3733.     BX = file handle for device "EMMXXXX0"
  3734.     CX = 0006h (size of buffer in bytes)
  3735.     DS:DX -> buffer for ???
  3736.         first byte must be 01h on entry
  3737. Return: CF clear if successful
  3738.         buffer filled (see INT 67/AH=3Fh function 1B00h)
  3739.     CF set on error
  3740.         AX = error code (01h,05h,06h,0Dh) (see AH=59h)
  3741. Note:    this call always returns an error if Windows3 support has been disabled
  3742.       with the NW3 switch to QEMM386.SYS
  3743. SeeAlso: INT 2F/AX=D201h/BX=5145h,INT 67/AH=3Fh
  3744. ----------214402-----------------------------
  3745. INT 21 U - Quarterdeck - HOOKROM.SYS - GET HOOKED VECTOR TABLE
  3746.     AX = 4402h
  3747.     BX = file handle for device "HOOKROM$"
  3748.     CX = 0004h
  3749.     DS:DX -> DWORD buffer for address of hooked vector table (see below)
  3750. Return: CF clear if successful
  3751.         DS:DX buffer filled
  3752.     CF set on error
  3753.         AX = error code (01h,05h,06h,0Dh) (see AH=59h)
  3754. SeeAlso: AX=4402h"QEMM"
  3755.  
  3756. Format of hooked vector table entry:
  3757. Offset    Size    Description
  3758.  00h  5 BYTEs    FAR jump to actual interrupt handler
  3759.         (end of table if first byte is not EAh)
  3760.  05h    BYTE    interrupt vector number
  3761. ----------29---------------------------------
  3762. INT 29 C - DOS 2+ - FAST CONSOLE OUTPUT
  3763.     AL = character to display
  3764. Return: nothing
  3765. Notes:    automatically called when writing to a device with bit 4 of its device
  3766.       driver header set (see also INT 21/AH=52h)
  3767.     COMMAND.COM v3.2 and v3.3 compare the INT 29 vector against the INT 20
  3768.       vector and assume that ANSI.SYS is installed if the segment is larger
  3769.     the default handler under DOS 2.x and 3.x simply calls INT 10/AH=0Eh
  3770.     the default handler under DESQview 2.2 understands the <Esc>[2J
  3771.       screen-clearing sequence, calls INT 10/AH=0Eh for all others
  3772. SeeAlso: INT 79
  3773. ----------2A2001-----------------------------
  3774. INT 2A - MS Networks or NETBIOS - ???
  3775.     AX = 2001h
  3776.     ???
  3777. Return: ???
  3778. Note:    intercepted by DESQview 2.x
  3779. ----------2F4310-----------------------------
  3780. INT 2F - EXTENDED MEMORY SPECIFICATION (XMS) - GET DRIVER ADDRESS
  3781.     AX = 4310h
  3782. Return: ES:BX -> driver entry point
  3783. Note:    HIMEM.SYS v2.77 chains to previous handler if AH is not 00h or 10h
  3784. SeeAlso: AX=4300h
  3785.  
  3786. Perform a FAR call to the driver entry point with AH set to the function code
  3787.     AH    function
  3788.     34h  (QEMM 5.11 only, undocumented) ???
  3789.     44h  (QEMM 5.11 only, undocumented) ???
  3790. Notes:    HIMEM.SYS requires at least 256 bytes free stack space
  3791.     the XMS driver need not implement functions 10h through 12h to be
  3792.       considered compliant with the standard
  3793. BUG:    HIMEM v3.03-3.07 crash on an 80286 machine if any of the 8Xh functions
  3794.       are called
  3795.  
  3796. Format of EMM structure:
  3797. Offset    Size    Description
  3798.  00h    DWORD    number of bytes to move (must be even)
  3799.  04h    WORD    source handle
  3800.  06h    DWORD    offset into source block
  3801.  0Ah    WORD    destination handle
  3802.  0Ch    DWORD    offset into destination block
  3803. Notes:    if source and destination overlap, only forward moves (source base
  3804.       less than destination base) are guaranteed to work properly
  3805.     if either handle is zero, the corresponding offset is interpreted
  3806.       as a real-mode address referring to memory directly addressable
  3807.       by the processor
  3808.  
  3809. Error codes returned in BL:
  3810.     00h successful
  3811.     80h function not implemented
  3812.     81h Vdisk was detected
  3813.     82h an A20 error occurred
  3814.     8Eh a general driver error
  3815.     8Fh unrecoverable driver error
  3816.     90h HMA does not exist
  3817.     91h HMA is already in use
  3818.     92h DX is less than the /HMAMIN= parameter
  3819.     93h HMA is not allocated
  3820.     94h A20 line still enabled
  3821.     A0h all extended memory is allocated
  3822.     A1h all available extended memory handles are allocated
  3823.     A2h invalid handle
  3824.     A3h source handle is invalid
  3825.     A4h source offset is invalid
  3826.     A5h destination handle is invalid
  3827.     A6h destination offset is invalid
  3828.     A7h length is invalid
  3829.     A8h move has an invalid overlap
  3830.     A9h parity error occurred
  3831.     AAh block is not locked
  3832.     ABh block is locked
  3833.     ACh block lock count overflowed
  3834.     ADh lock failed
  3835.     B0h only a smaller UMB is available
  3836.     B1h no UMB's are available
  3837.     B2h UMB segment number is invalid
  3838. ----------2FD200BX5144-----------------------
  3839. INT 2F U - Quarterdeck - QEMM/QRAM/VIDRAM/MANIFEST v5.0+ - INSTALLATION CHECK
  3840.     AX = D200h
  3841.     BX = 5144h ("QD")
  3842.     CX = 4D45h ("ME")
  3843.     DX = 4D30h ("M0")
  3844. Return: AL = FFh installed      
  3845.     if BX,CX,DX registers were as specified on entry:
  3846.         BX = 4D45h ("ME")
  3847.         CX = 4D44h ("MD")
  3848.         DX = 5652h ("VR")
  3849. Notes:    QEMM/QRAM/VIDRAM/MANIFEST/etc will search for a free AH value from D2h
  3850.       through FFh, then C0h through D1h
  3851.     for AL <> 0, if the BX/CX/DX values don't match a the identifier of a
  3852.       Quarterdeck product, it just chains to the previous INT 2F handler
  3853. ----------2FD201BX4849-----------------------
  3854. INT 2F U - Quarterdeck - GET QD HIMEM PRESENCE
  3855.     AX = D201h
  3856.     BX = 4849h ("HI")
  3857.     CX = 4D45h ("ME")
  3858.     DX = 4D51h ("MQ")
  3859. Return: BX = 4F4Bh ("OK")
  3860.     ES:DI -> HIMEM entry point
  3861. Notes:    QEMM/QRAM/VIDRAM/MANIFEST will search for a free AH value from D2h
  3862.       through FFh, then C0h through D1h
  3863. SeeAlso: AX=D201h/BX=5145h
  3864. ----------2FD201BX4849-----------------------
  3865. INT 2F U - Quarterdeck - QEMM/QRAM v5.0+ - GET HIRAM MEMORY CHAIN
  3866.     AX = D201h
  3867.     BX = 4849h ("HI")
  3868.     CX = 5241h ("RA")
  3869.     DX = 4D30h ("M0")
  3870. Return: BX = 4F4Bh ("OK")
  3871.     CX = segment of start of HIRAM chain
  3872.     DX = QEMM/QRAM code segment
  3873. Notes:    QEMM/QRAM/VIDRAM/MANIFEST will search for a free AH value from D2h
  3874.       through FFh, then C0h through D1h
  3875.     QEMM and QRAM both responded the same
  3876.     the HIRAM memory chain has the same format as the regular DOS 4.0
  3877.       memory chain (see INT 21/AH=52h), except that XMS Upper Memory Blocks
  3878.       have the block header program name field set to "UMB"; blocks whose
  3879.       "owner" field is set to the QEMM/QRAM code segment returned in DX
  3880.       are locked out regions such as video memory and ROMs.
  3881. ----------2FD201BX4D41-----------------------
  3882. INT 2F U - Quarterdeck - MANIFEST v1.0+ - INSTALLATION CHECK
  3883.     AX = D201h
  3884.     BX = 4D41h ("MA")
  3885.     CX = 4E49h ("NI")
  3886.     DX = 4645h ("FE")
  3887. Return: BX = 5354h ("ST")
  3888. Note:    QEMM/QRAM/VIDRAM/MANIFEST will search for a free AH value from D2h
  3889.       through FFh, then C0h through D1h
  3890. ----------2FD201BX4D45-----------------------
  3891. INT 2F U - Quarterdeck - DVDOS4GX.DVR - ???
  3892.     AX = D201h
  3893.     BX = 4D45h ("ME")
  3894.     CX = 5155h ("QU")
  3895.     DX = 5044h ("PD")
  3896. Return: ???
  3897. Notes:    AH=D2h is the default; use the Quarterdeck installation check described
  3898.       under AX=D200h
  3899.     called by QEMM 6.03
  3900. ----------2FD201BX5145-----------------------
  3901. INT 2F U - Quarterdeck - QEMM v5.0+ - INSTALLATION CHECK
  3902.     AX = D201h
  3903.     BX = 5145h ("QE")
  3904.     CX = 4D4Dh ("MM")
  3905.     DX = 3432h ("42")
  3906. Return: BX = 4F4Bh ("OK")
  3907.     ES:DI -> QEMM API entry point (see INT 67/AH=3Fh)
  3908. Notes:    QEMM/QRAM/VIDRAM/MANIFEST will search for a free AH value from D2h
  3909.       through FFh, then C0h through D1h
  3910.     this call is not available under QEMM v6.00 unless Windows3 support
  3911.       has been disabled with the NW3 switch to QEMM386.SYS
  3912. SeeAlso: AX=D201h/BX=4849h,INT 67/AH=3Fh
  3913. ----------2FD201BX5649-----------------------
  3914. INT 2F U - Quarterdeck - VIDRAM v5.0+ - INSTALLATION CHECK
  3915.     AX = D201h
  3916.     BX = 5649h ("VI")
  3917.     CX = 4452h ("DR")
  3918.     DX = 414dh ("AM")
  3919. Return: BX = 4F4Bh ("OK")
  3920.     ES:DI -> VIDRAM entry point
  3921. Note:    QEMM/QRAM/VIDRAM/MANIFEST will search for a free AH value from D2h
  3922.       through FFh, then C0h through D1h
  3923.  
  3924. Call VIDRAM entry point with:
  3925.     AH = 00h get status
  3926.         Return: AL = VIDRAM state (see below)
  3927.             BL = extra RAM status
  3928.                 00h VIDRAM does not use extra RAM
  3929.                 01h VIDRAM uses EMS as extra RAM
  3930.                 02h VIDRAM uses EGA as extra RAM
  3931.             BH = feature flags
  3932.                 bit 0: override enabled
  3933.                 bit 1: mapped memory detected in A000h-B000h range
  3934.                 bit 2: top of memory not at 640K
  3935.                 bit 3: MDA detected
  3936.                 bit 4: high RAM exists in video area
  3937.                 bit 5: mapped memory detected in video area
  3938.                 bits 6-7: reserved???
  3939.             CL = current monitor (01h = mono, 80h = color)
  3940.             SI = current top of memory (paragraph)
  3941.             DI = segment of start of HiRAM chain
  3942.     AH = 01h setup
  3943.         AL = VIDRAM state (00h off, 01h no EGA graphics, 02h no graph)
  3944.         BL = extra RAM status (see above)
  3945.         BH = feature flags (see above)
  3946.         CL = monitor (01h = monochrome, 80h = color)
  3947.         SI = new top of memory (paragraph)
  3948.         DI = segment of start of HiRAM chain
  3949.     AH = 02h get end address of VIDRAM code
  3950.         Return: ES:DI -> VIDRAM partial map context (see below)
  3951. Return: CF set on error
  3952.     CF clear if successful
  3953.  
  3954. Format of partial map context (EMS 3.2):
  3955. Offset    Size    Description
  3956.  00h    BYTE    EMS version ID (32h)
  3957.  01h    WORD    EMM handle for this entry
  3958.  03h    BYTE    number of frames
  3959.  04h    BYTE    first page frame
  3960.  05h    WORD    offset from ES to previously saved map
  3961.  
  3962. Format of partial map context (EMS 4.0):
  3963. Offset    Size    Description
  3964.  00h    BYTE    EMS version ID (40h)
  3965.  01h    WORD    mappable segment count
  3966.  03h  N WORD    mappable segments
  3967.     WORD    offset to previously saved map???
  3968. ----------2FDE00BX4445-----------------------
  3969. INT 2F - DESQview v2.26+ External Device Interface - INSTALLATION CHECK
  3970.     AX = DE00h
  3971.     BX = 4445h ("DE")
  3972.     CX = 5844h ("XD")
  3973.     DX = 4931h ("I1")
  3974. Return: AL = FFh if installed (even if other registers do not match)
  3975.     if BX,CX, and DX were as specified on entry,
  3976.         BX = 4845h ("HE")
  3977.         CX = 5245h ("RE")
  3978.         DX = 4456h ("DV")
  3979. Notes:    AH=DEh is the default XDI multiplex number, but may range from C0h-FFh
  3980.     programs should check for XDI starting at DEh to FFh, then C0h to DDh
  3981.     the XDI handler should not issue any DOS or BIOS calls, nor should it
  3982.       issue DESQview API calls other than those allowed from hardware ints
  3983. SeeAlso: AX=DE02h,INT 15/AX=5400h
  3984. ----------2FDE01-----------------------------
  3985. INT 2F - DESQview v2.26+ External Device Interface - DRIVER CUSTOM SUBFUNCTION
  3986.     AX = DE01h
  3987.     BX = driver ID
  3988.     other registers as needed by driver
  3989. Notes:    XDI drivers should pass this call through to previous handler if ID
  3990.       does not match
  3991.     DESQview never calls this function
  3992. ----------2FDE01BX4450-----------------------
  3993. INT 2F U - Quarterdeck QDPMI.SYS v1.0 - INSTALLATION CHECK
  3994.     AX = DE01h
  3995.     BX = 4450h ("DP")
  3996.     CX = 4D49h ("MI")
  3997.     DX = 3039h ("09")
  3998. Return: AL = FFh if installed
  3999.         BX = 4D42h ("MB")
  4000.         CX = 4921h ("I!")
  4001.         DX = 8F4Fh
  4002.         ES:DI -> filename of DPMI host overlay
  4003. Note:    the installation check consists of testing for the existence of the
  4004.       character device QDPMI$$$
  4005. ----------2FDE01BX5242-----------------------
  4006. INT 2F - DESQview v2.26+ XDI - CUSTOM SUBFUNCTION, Ralf Brown's XDI drivers
  4007.     AX = DE01h
  4008.     BX = 5242h ("RB")
  4009.     CX:DX = program identifier
  4010.         656F7000h ("eop",0) for DVeop
  4011. Return: AX = 5242h ("RB") if installed
  4012.         ES:BX -> data or entry point
  4013.         CX = version number (CH = major, CL = minor)
  4014.  
  4015. Call DVeop entry point with:
  4016.     ES:DI -> callback address or 0000h:0000h to remove callback
  4017. Return: AX = status
  4018.         0000h failed (callback table full or attempted to remove non-
  4019.             existent callback)
  4020.         0001h successful
  4021.         ES:DI -> chaining address
  4022.     BX,CX,DX destroyed
  4023. Notes:    the callback function is called with a simulated interrupt when the
  4024.       DESQview window containing it is closed; it should perform all
  4025.       necessary cleanup and then perform a FAR jump to the chaining address
  4026.       or an IRET if the chaining address is 0000h:0000h
  4027.     if the program wishes to remove itself before the window is closed, it
  4028.       should call the DVeop entry point with the previously returned
  4029.       chaining address and ignore the returned chaining address.
  4030. ----------2FDE01BX7474-----------------------
  4031. INT 2F - DESQview v2.26+ XDI - CUSTOM SUBFUNCTION, DVTXDI.COM
  4032.     AX = DE01h
  4033.     BX = 7474h
  4034.     CL = function
  4035.         00h installation check
  4036.         Return: AL = FFh
  4037.         01h get process handle
  4038.         DX = keys on Open Window menu (DL = first, DH = second)
  4039.         Return: AX = process handle or 0000h if not running
  4040.         02h (v1.3+) set TMAN handle
  4041.         DX = TMAN process handle
  4042.         03h (v1.3+) set open keys to ignore on next CL=01h call
  4043.         DX = keys on Open Window menu (DL = first, DH = second)
  4044. Return: BX = 4F4Bh ("OK")
  4045.     DL destroyed
  4046. Note:    DVTXDI is distributed as part of the shareware products DVTree (DOS
  4047.      shell/DESQview process manager) and DVTMAN by Mike Weaver
  4048. ----------2FDE01BX7575-----------------------
  4049. INT 2F - DESQview v2.26+ XDI - CUSTOM SUBFUNCTION, DVSIXDI.COM
  4050.     AX = DE01h
  4051.     BX = 7575h
  4052.     CX = function
  4053.         0000h installation check
  4054.         Return: AX = 00FFh if installed
  4055.         0001h turn on notification (currently unused)
  4056.         Return: AX = 0001h
  4057.         0002h turn off notification (currently unused)
  4058.         Return: AX = 0001h
  4059.         0003h get process information
  4060.         Return: AX = status
  4061.                 0000h failed
  4062.                 0001h successful
  4063.                 BX = last instantaneous time slice
  4064.                     in 1/100s (v1.10)
  4065.                     in 1/18s (v1.11+)
  4066.                 CX = number of processes
  4067.                 DX = number of "(starting)" records (v2.00+)
  4068.                 SI = number of records in process info array
  4069.                      (v2.00+) (always 15 for v1.x)
  4070.                 ES:DI -> process info array (see below)
  4071.         0004h get version
  4072.         Return: AH = major version
  4073.             AL = minor version
  4074.         0005h (v1.10+) get time since DESQview started
  4075.         Return: DX:AX = 1/100s since DV start (v1.10)
  4076.             DX:AX = 1/18s since DV start (v1.11+)
  4077.         0006h (v1.10+) get number of task switches
  4078.         Return: DX:AX = total task switches
  4079.             CX = task switches in last instantaneous interval
  4080. Notes:    DVSIXDI is part of the DVSI (DESQview System Information) package by
  4081.       Daniel J. Bodoh
  4082.     for v1.00, function 0003h allocates common memory, which the caller
  4083.       must deallocate after reading the process information; only the
  4084.       currently used records are placed in the buffer
  4085.     for v1.10+, function 0003h merely returns a pointer to the internal
  4086.       array of process information; the caller should make a copy of the
  4087.       array while inside a critical section (see INT 15/AX=101Bh).    Only
  4088.       those records with bit 7 of the first byte set are valid.
  4089.  
  4090. Format of information for one process (v1.00):
  4091. Offset    Size    Description
  4092.  00h    BYTE    flags
  4093.         bit 7: process slot is valid
  4094.  01h    WORD    offset into DESQVIEW.DVO of program's record if started from
  4095.         Open Windows menu, else undefined
  4096.  03h    WORD    Switch Windows window number
  4097.  05h    WORD    segment of process handle
  4098.  07h    WORD    number of tasks owned by process
  4099.  09h    WORD    mapping context of process
  4100.  0Bh    DWORD    hook for other programs
  4101.  
  4102. Format of information for one process (v1.10-v2.00):
  4103. Offset    Size    Description
  4104.  00h    BYTE    flags
  4105.         bit 7: valid record
  4106.             6: (v2.00+) record is allocated; if bit 7 clear, process
  4107.             is "(starting)" and only offsets 01h and 09h are valid
  4108.             5: (v2.00+) this app currently owns the CPU
  4109.             4: reserved (0)
  4110.             3: DESQview system task
  4111.             2: reserved (0)
  4112.             1: task has keyboard (currently unused)
  4113.             0: task swapped out (currently unused)
  4114.  01h    WORD    Open Window keys
  4115.  03h    WORD    Switch Windows number
  4116.  05h    WORD    segment of process handle
  4117.  07h    WORD    number of tasks for process
  4118.  09h    WORD    process mapping context
  4119.  0Bh    DWORD    time process started (relative to start of DESQview)
  4120.  0Fh    DWORD    time process last got CPU (relative to start of DESQview)
  4121.  13h    DWORD    time process last gave up CPU (relative to start of DESQview)
  4122.  17h    DWORD    total CPU time since process started
  4123.  1Bh    DWORD    CPU time at start of current instantaneous interval
  4124.  1Fh    DWORD    CPU time in current instantaneous interval
  4125.  23h    DWORD    hook for other programs
  4126. Note:    all times are in 1/100s for v1.10, in 1/18s for v1.11+
  4127. ----------2FDE01BXFFFE-----------------------
  4128. INT 2F U - DESQview v2.26+ XDI - DVXMS.DVR - ???
  4129.     AX = DE01h
  4130.     BX = FFFEh
  4131.     CX = 4D47h ("MG")
  4132.     DX = 0052h (0,"R")
  4133. Return: AL = FFh
  4134.     DX = 584Dh
  4135. ----------2FDE02-----------------------------
  4136. INT 2F C - DESQview v2.26+ External Dev Interface - DV INITIALIZATION COMPLETE
  4137.     AX = DE02h
  4138.     BX = mapping context of DESQview
  4139.     DX = handle of DESQview system task
  4140. Note:    driver should pass this call to previous handler after doing its work
  4141. SeeAlso: AX=DE03h,AX=DE0Fh,INT 15/AX=5400h
  4142. ----------2FDE03-----------------------------
  4143. INT 2F C - DESQview v2.26+ External Dev Interface - DV TERMINATION
  4144.     AX = DE03h
  4145.     BX = mapping context of DESQview
  4146.     DX = handle of DESQview system task
  4147. Notes:    driver should pass this call to previous handler before doing its work
  4148.     DESQview makes this call when it is exiting, but before unhooking any
  4149.       interrupt vectors
  4150. SeeAlso: AX=DE02h,AX=DE0Fh,INT 15/AX=5407h
  4151. ----------2FDE04-----------------------------
  4152. INT 2F C - DESQview v2.26+ External Dev Interface - ADD PROCESS
  4153.     AX = DE04h
  4154.     BX = mapping context of new process
  4155.     DX = handle of process
  4156. Return: nothing
  4157. Notes:    XMS XDI handler (installed by default) allocates a 22-byte record
  4158.       (see below) from "common" memory to control access to XMS memory
  4159.     all DOS, BIOS, and DV API calls are valid in handler
  4160.     driver should pass this call to previous handler after processing it
  4161. SeeAlso: AX=DE05h,AX=DE06h,INT 15/AX=5401h
  4162.  
  4163. Format of XMS XDI structure:
  4164. Offset    Size    Description
  4165.  00h    DWORD    pointer to 10-byte record???
  4166.  04h    DWORD    pointer to next XMS XDI structure
  4167.  08h    WORD    mapping context
  4168.  0Ah    BYTE    ???
  4169.  0Bh  5 BYTEs    XMS entry point to return for INT 2F/AX=4310h
  4170.         (FAR jump to next field)
  4171.  10h  6 BYTEs    FAR handler for XMS driver entry point
  4172.         (consists of a FAR CALL followed by RETF)
  4173. ----------2FDE05-----------------------------
  4174. INT 2F C - DESQview v2.26+ External Dev Interface - REMOVE PROCESS
  4175.     AX = DE05h
  4176.     BX = mapping context of process
  4177.     DX = handle of last task in process
  4178. Return: nothing
  4179. Notes:    XMS XDI handler releases the structure allocated by AX=DE04h
  4180.     driver should pass this call to previous handler before processing it
  4181.     all DOS, BIOS, and DV API calls except those generating a task switch
  4182.       are valid in handler
  4183. SeeAlso: AX=DE04h,AX=DE07h,INT 15/AX=5402h
  4184. ----------2FDE06-----------------------------
  4185. INT 2F C - DESQview v2.26+ External Dev Interface - CREATE TASK
  4186.     AX = DE06h
  4187.     BX = mapping context of process containing task
  4188.     DX = handle of new task
  4189. Notes:    driver should pass this call to previous handler after processing it
  4190.     all DOS, BIOS, and DV API calls are valid in handler
  4191. ----------2FDE07-----------------------------
  4192. INT 2F C - DESQview v2.26+ External Dev Interface - TERMINATE TASK
  4193.     AX = DE07h
  4194.     BX = mapping context of process containing task
  4195.     DX = handle of task
  4196. Notes:    driver should pass this call to previous handler before processing it
  4197.     all DOS, BIOS, and DV API calls except those generating a task switch
  4198.       are valid in handler
  4199. SeeAlso: AX=DE04h,AX=DE06h,AX=DE10h
  4200. ----------2FDE08-----------------------------
  4201. INT 2F C - DESQview v2.26+ External Dev Interface - SAVE STATE
  4202.     AX = DE08h
  4203.     BX = mapping context of task being switched from
  4204.     DX = handle of task being switched from
  4205. Notes:    invoked prior to task swap, interrupts, etc
  4206.     driver should pass this call to previous handler after processing it
  4207. SeeAlso: AX=DE09h,INT 15/AX=5403h,INT 15/AX=DE27h
  4208. ----------2FDE09-----------------------------
  4209. INT 2F C - DESQview v2.26+ External Dev Interface - RESTORE STATE
  4210.     AX = DE09h
  4211.     BX = mapping context of task being switched to
  4212.     DX = handle of task being switched to
  4213. Notes:    state is restored except for interrupts
  4214.     driver should pass this call to previous handler before processing it
  4215. SeeAlso: AX=DE08h,INT 15/AX=5404h,INT 15/AX=DE27h
  4216. ----------2FDE0A-----------------------------
  4217. INT 2F C - DESQview v2.26+ External Dev Interface - CHANGE KEYBOARD FOCUS
  4218.     AX = DE0Ah
  4219.     BX = mapping context of task receiving focus
  4220.     DX = handle of running task
  4221. Notes:    driver should pass this call to previous handler before processing it
  4222.     this call often occurs inside a keyboard interrupt
  4223. SeeAlso: INT 15/AX=DE26h,INT 15/AX=DE2Fh
  4224. ----------2FDE0B-----------------------------
  4225. INT 2F C - DESQview v2.26+ External Dev Interface - DVP PROCESSING COMPLETE
  4226.     AX = DE0Bh
  4227.     BX = mapping context of DESQview system task
  4228.     CX = number of system memory paragraphs required for the use of all
  4229.         XDI drivers (DV will add this to system memory in DVP buffer)
  4230.     DX = handle of DESQview system task
  4231.     SI = mapping context of new process if it starts
  4232.     ES:DI -> DVP buffer
  4233. Return: CX incremented as needed
  4234. Notes:    once DV invokes this function, the DVP buffer contents may be changed
  4235.     driver should pass this call to previous handler before processing it
  4236. ----------2FDE0C-----------------------------
  4237. INT 2F C - DESQview v2.26+ External Dev Interface - SWAP OUT PROCESS
  4238.     AX = DE0Ch
  4239.     BX = mapping context of task being swapped out
  4240.     DX = handle of DESQview system task
  4241. Note:    driver should pass this call to previous handler after processing it
  4242. ----------2FDE0D-----------------------------
  4243. INT 2F C - DESQview v2.26+ External Dev Interface - SWAP IN PROCESS
  4244.     AX = DE0Dh
  4245.     BX = mapping context of process just swapped in
  4246.     DX = handle of DESQview system task
  4247. Note:    driver should pass this call to previous handler before processing it
  4248. ----------2FDE0E-----------------------------
  4249. INT 2F C - DESQview v2.26+ External Dev Interface - DVP START FAILED
  4250.     AX = DE0Eh
  4251.     BX = mapping context of DESQview system task
  4252.     DX = handle of DESQview system task
  4253.     SI = mapping context of failed process (same as for call to AX=DE0Bh)
  4254. Note:    driver should pass this call to previous handler after processing it
  4255. ----------2FDE0F-----------------------------
  4256. INT 2F C - DESQview v2.50+ External Dev Interface - INITIALIZE DV
  4257.     AX = DE0Fh
  4258. Note:    DESQview 2.50+ calls this function just before it completes its
  4259.       initialization.  At the time of the call, DESQview has not yet
  4260.       changed any interrupt vectors
  4261. SeeAlso: AX=DE02h
  4262. ----------2FDE10-----------------------------
  4263. INT 2F C - DESQview v2.50+ External Dev Interface - FREE TASK
  4264.     AX = DE10h
  4265.     BX = mapping context of process
  4266.     DX = task handle of process
  4267. Note:    DESQview 2.50+ calls this function before it frees the task; it is
  4268.       similar to AX=DE07h but allows the XDI handler to make calls which
  4269.       cause context switches
  4270. SeeAlso: AX=DE06h,AX=DE07h
  4271. ----------4B8102DX0000-----------------------
  4272. INT 4B - Virtual DMA Specification (VDS) - GET VERSION
  4273.     AX = 8102h
  4274.     DX = 0000h
  4275. Return: CF clear if successful
  4276.         AH = major version number
  4277.         AL = minor version number
  4278.         BX = product number
  4279.         0000h for Quadtel's QMAPS and Hewlett-Packard's HPMM.SYS
  4280.         0001h for Microsoft's EMM386.EXE
  4281.         4560h ("E`") for Qualitas' 386MAX
  4282.         4D43h ("MC") for V Communication's Memory Commander
  4283.         5145h ("QE") for Quarterdeck's QEMM-386
  4284.         CX = product revision number
  4285.         always 0000h for QMAPS and HPMM.SYS
  4286.         always 0001h for Microsoft's EMM386.EXE v4.20-4.41
  4287.         SI:DI = maximum DMA buffer size
  4288.         DX = flags
  4289.         bit 0: PC/XT bus (DMA in first megabyte only)
  4290.             1: physical buffer/remap region in first megabyte
  4291.             2: automatic remap enabled
  4292.             3: all memory is physically contiguous
  4293.          4-15: reserved (zero)
  4294.     CF set on error
  4295.         AL = error code (see below)
  4296. Note:    bit 5 of 0040h:007Bh is supposed to be set if VDS is supported; this is
  4297.       apparently not always the case
  4298. SeeAlso: INT 31
  4299. ----------4B810D-----------------------------
  4300. INT 4B - QEMM-386 - BUG
  4301.     AX = 810Dh
  4302. Note:    the code in QEMM v5.11 and 6.00 jumps to an invalid location on this
  4303.       call
  4304. ----------50---------------------------------
  4305. INT 50 - IRQ0 relocated by DESQview
  4306. Notes:    this is the default location for older versions; DESQview v2.26+
  4307.       searches for unused ranges of interrupts and uses the lowest
  4308.       available range in its list for relocating these IRQs and the next
  4309.       lowest for relocating IRQ8-IRQ15
  4310.     a range of eight interrupts starting at a multiple of 8 is considered
  4311.       available if all vectors are identical and it has not been excluded
  4312.       with an /XB:nn commandline switch
  4313.     the list of ranges for v2.26 is 50h,58h,68h,78h,F8h (if < two of these
  4314.       are available, F8h and then 50h are used anyway)
  4315.     the list of ranges for v2.31+ is 68h,78h,88h-B8h,F8h (if < two of these
  4316.       are available, F8h and then F0h are used anyway)
  4317. SeeAlso: INT 08"IRQ0",INT 51"DESQview",INT 54"DESQview",INT 58"DESQview"
  4318. ----------51---------------------------------
  4319. INT 51 - through 53 - IRQ1-IRQ3 relocated by DESQview
  4320. Note:    this is the default location for older versions; see INT 50"DESQview"
  4321.       for details of interrupt relocation
  4322. SeeAlso: INT 50"DESQview",INT 54"DESQview",INT 58"DESQview"
  4323. ----------54---------------------------------
  4324. INT 54 - through 57 - IRQ4-IRQ7 relocated by DESQview
  4325. Note:    this is the default location for older versions; see INT 50"DESQview"
  4326.       for details of interrupt relocation
  4327. SeeAlso: INT 50"DESQview",INT 58"DESQview"
  4328. ----------58---------------------------------
  4329. INT 58 - IRQ8 relocated by DESQview 2.26+
  4330. Note:    this is the default, but other INTs may be used (see INT 50"DESQview")
  4331. SeeAlso: INT 50"DESQview",INT 70
  4332. ----------59---------------------------------
  4333. INT 59 - IRQ9 relocated by DESQview 2.26+
  4334. Note:    this is the default, but other INTs may be used (see INT 50"DESQview")
  4335. SeeAlso: INT 50"DESQview",INT 71
  4336. ----------5A---------------------------------
  4337. INT 5A - IRQ10 relocated by DESQview 2.26+
  4338. Note:    this is the default, but other INTs may be used (see INT 50"DESQview")
  4339. SeeAlso: INT 50"DESQview",INT 72
  4340. ----------5B---------------------------------
  4341. INT 5B - IRQ11 relocated by DESQview 2.26+
  4342. Note:    this is the default, but other INTs may be used (see INT 50"DESQview")
  4343. SeeAlso: INT 50"DESQview",INT 73
  4344. ----------5C---------------------------------
  4345. INT 5C - IRQ12 relocated by DESQview 2.26+
  4346. Note:    this is the default, but other INTs may be used (see INT 50"DESQview")
  4347. SeeAlso: INT 50"DESQview",INT 74
  4348. ----------5D---------------------------------
  4349. INT 5D - IRQ13 relocated by DESQview 2.26+
  4350. Note:    this is the default, but other INTs may be used (see INT 50"DESQview")
  4351. SeeAlso: INT 50"DESQview",INT 75
  4352. ----------5E---------------------------------
  4353. INT 5E - IRQ14 relocated by DESQview 2.26+
  4354. Note:    this is the default, but other INTs may be used (see INT 50"DESQview")
  4355. SeeAlso: INT 50"DESQview",INT 76
  4356. ----------5F---------------------------------
  4357. INT 5F - IRQ15 relocated by DESQview 2.26+
  4358. Note:    this is the default, but other INTs may be used (see INT 50"DESQview")
  4359. SeeAlso: INT 50"DESQview",INT 77
  4360. ----------63---------------------------------
  4361. INT 63 - DESQview/X - SOCKET API
  4362. Notes:    parameters are passed by patching!! data field immediately following
  4363.       the entry point, as detailed below; the preferred method for calling
  4364.       the socket API is via INT 15/AX=DE2Eh
  4365.     the installation check consists of testing for the string "dvxunix"
  4366.       (yes, lowercase) at offset 9 from the interrupt handler start
  4367. SeeAlso: INT 15/AX=DE2Eh,INT BE"DESQview"
  4368.  
  4369. Format of interrupt handler entry:
  4370. Offset    Size    Description
  4371.  00h  3 BYTEs    near jump or short jump + NOP to actual interrupt handler
  4372.  03h    WORD    offset from following pointer for initial top of local stack
  4373.  05h    DWORD    pointer to argument/stack block (see INT 15/AX=DE2Eh)
  4374.  09h  7 BYTEs    signature "dvxunix"
  4375. ----------673F--CX5145-----------------------
  4376. INT 67 U - QEMM-386 v4.23+ - INSTALLATION CHECK
  4377.     AH = 3Fh
  4378.     CX = 5145h ("QE")
  4379.     DX = 4D4Dh ("MM")
  4380. Return: AH = 00h if installed
  4381.         ES:DI -> QEMM API entry point
  4382. Notes:    if no other program has hooked INT 67, an alternate installation
  4383.       check is to test for the string
  4384.       "QUARTERDECK EXPANDED MEMORY MANAGER 386" at offset 14h in the INT 67
  4385.       handler's segment; the word at offset 12h contains the offset in
  4386.       the handler's segment of the API entry point
  4387.     MICEMM (Micronics Expanded Memory Manager) versions 2.0C and 4D support
  4388.       the alternate QEMM installation check and entry point functions 00h,
  4389.       02h, and 03h; version 4D only provides the signature string if the
  4390.       commandline argument "DV" is provided
  4391.     386MAX v6.01 responds to this call, but DESQview 2.42 does not
  4392.       recognize the returned entry point as providing QEMM's capabilities
  4393.       because a) only functions 0Ch (different from QEMM 0Ch) and
  4394.             1000h-1009h are supported,
  4395.           b) status is returned as for EMS functions, not QEMM funcs
  4396.           c) the protected-mode entry point returned by function 1000h
  4397.             only supports functions    0Ch, 1004h, 1005h, and 100Ah
  4398.     the string check mentioned above is not supported by 386MAX
  4399. SeeAlso: AH=DDh,AX=5BF0h,AX=FFA5h,INT 15/AX=11DEh,INT 21/AX=4402h"QEMM"
  4400. SeeAlso: INT 21/AX=4402h"386MAX",INT 2F/AX=D201h/BX=5145h
  4401.  
  4402. Call QEMM entry point with:
  4403.     AH = 00h get QEMM state
  4404.         Return: CF clear
  4405.             AL = QEMM state
  4406.                 bit 0 set if QEMM turned OFF
  4407.                 bit 1 set if in "Auto" mode
  4408.     AH = 01h set QEMM state
  4409.         AL = new state
  4410.             bit 0 set: place QEMM in OFF state
  4411.         Return: CF clear if successful
  4412.             CF set on error
  4413.     AH = 02h get ???
  4414.         Return: CF clear
  4415.             AX = segment of ??? data structure
  4416.             Data Structure
  4417.             Offset    Size    Description
  4418.              00h    DWORD    page table entry for ???
  4419.                 ???
  4420.     AH = 03h get QEMM version
  4421.         Return: CF clear
  4422.             AX = BX = version in BCD
  4423.         Notes:    the official docs only state that the version is
  4424.               returned in BX
  4425.             MICEMM returns AX=0001h, BX unchanged
  4426.     AH = 04h allocate 4K page and set AUTO/ON mode
  4427.         Return: CF clear if successful
  4428.                 DX = page number of a 4K page
  4429.             CF set if unable to allocate page
  4430.         Note:    QEMM mode unchanged if not AUTO/OFF
  4431.     AH = 05h free 4K page and turn QEMM off
  4432.         DX = page number returned by function 04h
  4433.         Return: CF clear
  4434.         Note:    QEMM mode unchanged if not AUTO/ON
  4435.     AH = 06h make new mapping context???
  4436.         DX = page number of 4K page to hold page table
  4437.         Return: CF clear
  4438.         Note:    copies page table into given page and then sets ???
  4439.               page table entry to point at copy
  4440.     AH = 07h get mapping context
  4441.         Return: CF clear
  4442.             DX = page number of page table for current mapping
  4443.                 context
  4444.     AH = 08h set mapping context???
  4445.         DX = linear page number of page table
  4446.         Return: CF clear
  4447.     AH = 09h get linear page number for page table entry
  4448.         CX = page table index
  4449.         Return: CF clear
  4450.             DX = linear page number
  4451.     AH = 0Ah set linear page number for page table entry
  4452.         CX = page table index
  4453.         DX = linear page number
  4454.         Return: CF clear
  4455.     AH = 0Bh map 4K pages
  4456.         BX = number of pages
  4457.         CX = first page number (must be 0100h to allocate HMA)
  4458.         DX = EMS handle (memory belonging to EMS handle will be mapped
  4459.             into the address space beginning with the first page
  4460.             allocated to the handle)
  4461.         Return: AH = 00h
  4462.     AH = 0Ch get available memory
  4463.         Return: CF clear
  4464.             BX = 0001h
  4465.             CX = total 4K pages???
  4466.             DX = number of 4K pages free
  4467.     AH = 0Dh ??? (related to callbacks)
  4468.         AL = 00h/01h/02h ???
  4469.         Return: CF clear
  4470.     AH = 0Eh set ??? callbacks
  4471.         DS:BX -> FAR routine for ???
  4472.         ES:DX -> FAR routine for ???
  4473.         Return: CF clear
  4474.         Note:    DS:BX callback should return BX=???; ES:DX is called
  4475.               with BX=???, and should set the ??? from which the
  4476.               other handler read the value of BX.  BH and BL
  4477.               appear to be separate values.
  4478.     AH = 0Fh unmap 4K pages
  4479.         CX = first page number
  4480.         DX = number of pages
  4481.         Return: CF clear
  4482.             AL = 00h/01h if ???
  4483.         Note:    if CX=0100h and DX=0010h, the HMA is remapped to
  4484.               simulate a disabled A20
  4485.     AX = 1000h get protected-mode interface
  4486.         DS:SI -> 16-byte buffer for two GDT entries
  4487.         ES:DI -> buffer for 4K page table
  4488.         Return: CF clear
  4489.             EAX = offset of protected-mode API entry point
  4490.             DS:SI buffer filled with two GDT descriptors
  4491.                 first is QEMM code segment, second is data???
  4492.             ES:DI buffer filled with 4K page table
  4493.             DI points to first unused page table entry
  4494.         SeeAlso: INT 67/AX=DE01h
  4495.     AX = 1001h get CPU debug registers
  4496.         ES:DI -> buffer for debug registers (8 DWORDs)
  4497.         Return: CF clear
  4498.             BL = INT01 handling (see function 1002h)
  4499.             ES:DI buffer filled
  4500.     AX = 1002h set CPU debug registers
  4501.         BL = INT01 handling
  4502.             00h     reflect all debugging exceptions as V86-mode INT 01's
  4503.             else convert debugging exceptions other than single-step
  4504.                into V86-mode INT 03's, single-step to INT 01's
  4505.         ES:DI -> buffer containing debug registers (8 DWORDs)
  4506.         Return: CF clear
  4507.         Notes:    identical to INT 67/AX=DE09h if BL=01h
  4508.             the INT01 handling flag is set to 01h by the general-
  4509.               protection violation handler for certain privileged
  4510.               instructions
  4511.     AX = 1003h get machine status word CR0
  4512.         Return: CF clear
  4513.             EAX = contents of CR0
  4514.         SeeAlso: INT 67/AX=DE07h
  4515.     AX = 1004h allocate a 4K page
  4516.         Return: CF clear if successful
  4517.                 EDX = linear address of allocated page
  4518.             CF set on error
  4519.         SeeAlso: INT 67/AX=DE04h
  4520.     AX = 1005h free 4K page
  4521.         EDX = linear address of page to free
  4522.         Return: CF clear
  4523.         SeeAlso: INT 67/AX=DE05h
  4524.     AX = 1006h NOP
  4525.         Return: CF set
  4526.     AX = 1007h get maximum physical memory address
  4527.         Return: CF clear
  4528.             EDX = physical address of highest 4K memory page
  4529.         SeeAlso: INT 67/AX=DE02h
  4530.     AX = 1008h get physical address of page in first megabyte
  4531.         CX = page number (linear address shifted right 12 bits)
  4532.         Return: CF clear
  4533.             EDX = linear address of page
  4534.         SeeAlso: function 1F00h
  4535.     AX = 1009h switch to protected mode
  4536.         ESI = linear address in first megabyte of system reg values
  4537.             (see INT 67/AX=DE0Ch)
  4538.         interrupts disabled
  4539.         Return: interrupts disabled
  4540.             GDTR, IDTR, LDTR, TR loaded
  4541.             SS:ESP must have at least 16 bytes space, and the
  4542.                 entry point is required to set up a new stack
  4543.                 before enabling interrupts
  4544.             EAX, ESI, DS, ES, FS, GS destroyed
  4545.     AX = 100Ah switch back to virtual-86 mode
  4546.         DS = selector for data segment from function 1000h
  4547.         SS:ESP in first megabyte of linear memory
  4548.         interrupts disabled
  4549.         STACK:    QWORD  return address from FAR call to 32-bit segment
  4550.             DWORD  EIP
  4551.             DWORD  CS
  4552.             DWORD  reserved for EFLAGS
  4553.             DWORD  ESP
  4554.             DWORD  SS
  4555.             DWORD  ES
  4556.             DWORD  DS
  4557.             DWORD  FS
  4558.             DWORD  GS
  4559.         will switch to virtual86 mode with interrupts disabled, all
  4560.           segment registers loaded, and EAX destroyed.
  4561.     AH = 11h get memory type map
  4562.         AL = zero/nonzero ??? (set by QEMM.COM but apparently ignored
  4563.             by QEMM 6.00)
  4564.         ES:DI -> 256-byte buffer for memory types
  4565.         Return: CF clear
  4566.             BL = ???
  4567.             ES:DI buffer filled
  4568.         Note:    each byte of the buffer corresponds to a 4K page, and
  4569.               contains the type of that page: 00h = mappable,
  4570.               02h = mapped ROM, 03h = high RAM, 04h = excluded,
  4571.               05h = video, 06h = ROM, 07h = adapter ROM,
  4572.               08h = split ROM, 09h = page frame, 0Ah = RAMmable,
  4573.               0Bh = conventional
  4574.     AH = 12h get HIRAM chain
  4575.         Return: CF clear
  4576.             BX = segment of first MCB in high memory
  4577.                 0000h if no high memory
  4578.     AX = 1300h VIDRAMEGA???
  4579.         BL = 00h copy ???
  4580.              nonzero copy ??? (reverse)
  4581.         Return: CF clear
  4582.             AL = 00h if all pages clean
  4583.                = 01h if any page dirty
  4584.     AX = 1301h check if ???
  4585.         DX:DI = start address of range to check ???
  4586.         CX = length of range
  4587.         Return: CF clear
  4588.             CX = ??? (0000h or 1000h)
  4589.     AX = 1302h ???
  4590.         BL = ???
  4591.         BH = ???
  4592.         CX = ???
  4593.         SI = offset of ???
  4594.         DI = offset of ???
  4595.         ???
  4596.         Return: CF clear
  4597.             ???
  4598.         Note:    disables certain interrupts at the two 8259 PICs during
  4599.               execution; also modifies CRT controller during
  4600.               execution under certain circumstances
  4601.     AX = 1303h ??? EMS allocation
  4602.         BX = number of pages of EMS to allocate
  4603.         ???
  4604.         Return: CF clear if successful
  4605.             CF set on error
  4606.             ???
  4607.     AX = 1304h EMS deallocation
  4608.         DX = EMS handle
  4609.         Return: CF clear
  4610.     AX = 1305h ???
  4611.         CX = ???
  4612.         Return: CF clear
  4613.         Note:    disables certain interrupts at the two 8259 PICs during
  4614.               execution (see AX=130Ch)
  4615.     AX = 1306h set DESQview critical section counter address
  4616.         ES:BX -> WORD DESQview critical section counter or 0000h:0000h
  4617.         Return: CF clear
  4618.         Note:    also sets pointer in low-memory part of QEMM to current
  4619.               value of INT 15 if ES:BX not 0000h:0000h
  4620.     AX = 1307h ???
  4621.         Return: CF clear
  4622.         Note:    disables certain interrupts at the two 8259 PICs during
  4623.               execution (see AX=130Ch)
  4624.     AX = 1308h ???
  4625.         BL = ??? (zero/nonzero)
  4626.         Return: CF clear
  4627.     AX = 1309h Hercules mode-change support
  4628.         ES:BX -> new address for Hercules mode-change callback
  4629.         Return: CF clear
  4630.         Note:    the callback function is called whenever the CRTC mode
  4631.               register is written, with AL set to the value written
  4632.     AX = 130Ah virtualize EGA/VGA I/O ports 03C8h/03C9h???
  4633.         CX:DX -> buffer for storing CRTC register contents???
  4634.             or 0000h:0000h to disable
  4635.         Return: CF clear
  4636.     AX = 130Bh ???
  4637.         BL = ???
  4638.         Return: CF clear
  4639.             ???
  4640.     AX = 130Ch set interrupts to mask
  4641.         BX = interrupts to mask out during AX=1302h,AX=1307h,AX=1308h,
  4642.             AX=130Dh,AX=1310h (BL = master PIC, BH = slave PIC)
  4643.         Return: CF clear
  4644.     AX = 130Dh ???
  4645.         ???
  4646.         Return: CF clear
  4647.         Note:    disables certain interrupts at the two 8259 PICs during
  4648.               execution (see AX=130Ch)
  4649.     AX = 130Eh ??? (modifies CRT controller setup)
  4650.         ???
  4651.         Return: CF clear
  4652.     AX = 130Fh reset ???
  4653.         Return: CF clear
  4654.     AX = 1310h ???
  4655.         ???
  4656.         Return: CF clear
  4657.         Note:    disables certain interrupts at the two 8259 PICs during
  4658.               execution (see AX=130Ch)
  4659.     AX = 1311h set ???
  4660.         BL = ???
  4661.         Return: CF clear
  4662.     AX = 1312h (v6.02) NOP???
  4663.         Note:    called by DV 2.42, but appears to be a NOP in QEMM 6.02
  4664.     AX = 1400h ???
  4665.         ES:DI -> ??? data structure (at least 24 bytes)
  4666.         BL = ???
  4667.         Return: AX = ???
  4668.         Data structure
  4669.         Offset    Size    Description
  4670.          00h    WORD    ???
  4671.          02h    DWORD    far pointer to ???
  4672.          06h    DWORD    far pointer to ??? pointer array (see below)
  4673.          0Ah    DWORD    far pointer to ???
  4674.          0Eh    DWORD    ???
  4675.          12h    WORD    segment of ???
  4676.          14h    DWORD    far pointer to ???
  4677.         Pointer array
  4678.         Offset    Size    Description
  4679.          00h    WORD    number of pointers to follow
  4680.          02h  N DWORDs    far pointers to ???
  4681.         Note: QEMM converts the pointers into linear addresses in place
  4682.     AX = 1401h ???
  4683.         Return: CF clear
  4684.             ???
  4685.     AX = 1402h ???
  4686.         BL = function
  4687.             00h NOP
  4688.             01h ???
  4689.             02h ???
  4690.             other ???
  4691.         ES:DI -> ???
  4692.         Return: CF clear
  4693.             ???
  4694.         Data structure
  4695.         Offset    Size    Description
  4696.          00h    WORD    segment of ??? (X, word at X:0136h set to X)
  4697.          02h    WORD    segment of ??? (word at X:0124h set to this)
  4698.          04h    WORD    number of paragraphs of ???
  4699.          06h  3 WORDs    ??? (copied to X:0000h)
  4700.          0Ch    WORD    ???
  4701.     AX = 1403h add ??? to list and ??? (execute func 1406h)
  4702.         ES:DI -> ??? structure added to end of ??? list
  4703.             (at least 31 bytes, DWORD at offset 06h used for
  4704.              storing pointer to next struc, WORD at offset 00h
  4705.              seems to be a key or index)
  4706.         Return: CF clear
  4707.     AX = 1404h NOP
  4708.     AX = 1405h remove ??? from ??? list
  4709.         BX = key???
  4710.         Return: CF clear
  4711.     AX = 1406h ???
  4712.         ???
  4713.         Return: CF clear
  4714.             ???
  4715.     AX = 1407h ???
  4716.         ???
  4717.         Return: CF clear
  4718.             ???
  4719.     AX = 1408h ???
  4720.         ???
  4721.         Return: CF clear
  4722.             ???
  4723.     AX = 1409h ???
  4724.         ???
  4725.         Return: CF clear
  4726.             ???
  4727.     AX = 140Ah ???
  4728.         BX = ???
  4729.         Return: CF clear
  4730.             ???
  4731.     AX = 140Bh ???
  4732.         BX = ???
  4733.         Return: CF clear
  4734.             SI = segment of 256-byte buffer???
  4735.     AH = 15h ???
  4736.         ES:BX -> ??? or 0000h:0000h
  4737.         Return: CF clear
  4738.      ---QEMM v5.00+ ---
  4739.     AX = 1600h get memory access status
  4740.         ES:DI -> 256-byte buffer
  4741.         Return: ES:DI buffer filled
  4742.         Note:    each byte of the buffer indicates the status of a 4K
  4743.               page (bit 0 set if read, bit 1 set if written)
  4744.     AX = 1601h set memory access status
  4745.         ES:DI -> 256-byte buffer containing access statuses (see above)
  4746.     AH = 17h get memory usage statistics
  4747.         ES:DI -> 81-byte buffer for memory statistics (see below)
  4748.         Return: CF clear
  4749.      ---QEMM v5.11+ ---
  4750.     AH = 18h check whether conventional memory mapped into address range
  4751.         ES:BX = starting address
  4752.         CX = number of 4K pages
  4753.         Return: CF clear
  4754.             AL = 00h one or more pages is remapped
  4755.                  01h all pages in range are conventional memory
  4756.                 (physical address == virtual address)
  4757.     AH = 19h NOP
  4758.         Return: CF set
  4759.     AH = 1Ah I/O port access
  4760.         AL = subfunction
  4761.             00h get byte from I/O port
  4762.             Return: BL = port value
  4763.             01h send byte to I/O port
  4764.             BL = value to send
  4765.             02h send byte to I/O port, get byte from following port
  4766.             BH = value to send
  4767.             Return: BL = value read
  4768.             03h send bytes to two consecutive I/O ports
  4769.             BH = value for first I/O port (DX)
  4770.             BL = value for second I/O port (DX+1)
  4771.         DX = port number
  4772.         Return: CF clear
  4773.     AH = 1Bh MS Windows 3 support
  4774.         AL = subfunction
  4775.             00h get ???
  4776.             ES:DI -> buffer for ??? data structure
  4777.             Return: CF set on error
  4778.                 CF clear if successful
  4779.             Data structure:
  4780.             Offset    Size    Description
  4781.              00h    DWORD    pointer to ???
  4782.              04h    BYTE    ??? (v6.00 sets to 01h)
  4783.              05h    BYTE    ??? (v6.00 sets to 00h or 0Bh)
  4784.             SeeAlso: INT 21/AX=4402h"QEMM"
  4785.             01h ???
  4786.             Return: CF set on error
  4787.                 CF clear if successful
  4788.             02h ???
  4789.             Return: CF set on error
  4790.                 CF clear if successful
  4791.             03h MS Windows initializing
  4792.             CX = segment from which Windows init broadcast made???
  4793.             DL = Windows startup flags???
  4794.             DI = Windows version number (major in upper byte)
  4795.             Return: ???
  4796.             SeeAlso: INT 2F/AX=1605h
  4797.             04h MS Windows terminating
  4798.             Return: CF clear
  4799.             05h determine whether program is driver???
  4800.             DS:DX -> ASCIZ filename
  4801.             Return: CF clear
  4802.                 AL = 01h if string ends in ".DRV"
  4803.                    = FFh if string ends in "GDI.EXE"
  4804.                    = 00h otherwise
  4805.             06h ???
  4806.             CX = length of data pointed at by DS:DX
  4807.             DS:DX -> ???
  4808.             Return: CF clear
  4809.             07h BUG: QEMM 6.00-6.03 accept this and branch randomly
  4810.             else Return: CF set
  4811.     AH = 1Ch protected-mode hardware interrupt handlers ???
  4812.         AL = subfunction
  4813.             00h restore??? IRQ0-7 handlers
  4814.             01h set??? IRQ0-7 handlers
  4815.             ES:DI -> 8 DWORDs containing ???
  4816.             02h restore??? IRQ8-15 handlers
  4817.             03h set??? IRQ8-15 handlers
  4818.             ES:DI -> 8 DWORDs containing ???
  4819.         BUG: although the jump table only contains four entries,
  4820.             QEMM 6.00 will attempt to use it for any value of
  4821.             AL between 00h and 2Ah, thus branching unpredictably
  4822.             for AL=04h-2Ah
  4823.      ---QEMM v6.00+ ---
  4824.     AH = 1Dh Stealth interrupts
  4825.         AL = subfunction
  4826.             00h switch to pre-Stealth interrupt vector table
  4827.             Note:    also switches VGA Save table pointer
  4828.                   (0040h:00A8h)    and overwrites the vectors
  4829.                   currently assigned for use by the two
  4830.                   interrupt controllers (see INT 67/AX=DE0Ah)
  4831.                   with the vectors for INT 08-0F and 70-77 (to
  4832.                   avoid crashing the system).
  4833.             01h restore user interrupt vector table
  4834.             Notes:    interrupts should be disabled around the
  4835.                   AX=1D00h and AX=1D01h calls because QEMM does
  4836.                   not modify the memory maps to map in ROM, so
  4837.                   an interrupt could be disastrous
  4838.                 clears any pending IRQ7 at end of function
  4839.             else
  4840.             Return: CF set
  4841.     AH = 1Eh Stealth information
  4842.         AL = subfunction
  4843.             00h get Stealth configuration
  4844.             Return: BL = flags
  4845.                     bit 0: conventional memory sorted
  4846.                     bit 1: conventional memory filled
  4847.                     bit 2: ???
  4848.                     bit 3: ???
  4849.                     bit 4: expanded memory is in use
  4850.                     bit 5: ???
  4851.                 BH = ??? (always 00h for v6.00)
  4852.                 CL = stealth type (00h none,46h Frame,4Dh Map)
  4853.                 CH = ??? (zero/nonzero important)
  4854.                 DX = ??? (always 0000h for v6.00)
  4855.                 SI = ??? (always 0000h for v6.00)
  4856.                 DI = ??? (always 0000h for v6.00)
  4857.             01h get number of Stealth'ed ROMs
  4858.             Return: CF clear
  4859.                 BX = number of Stealth'ed ROMs
  4860.             02h get Stealth'ed ROM info
  4861.             ES:DI -> buffer for Stealth ROM info (see below)
  4862.             Return: CF clear
  4863.                 BX = number of Stealth'ed ROMs
  4864.                 ES:DI buffer filled
  4865.             else
  4866.             Return: CF set
  4867.     AH = 1Fh page table manipulation
  4868.         AL = subfunction
  4869.             00h get page table entry
  4870.             CX = page number
  4871.             Return: EDX = page table entry
  4872.                 CF clear
  4873.             01h set page table entry
  4874.             CX = page number
  4875.             EDX = page table entry
  4876.             Return: CF clear
  4877.             SeeAlso: function 1008h
  4878.             else
  4879.             Return: CF set
  4880.     AH = 20h asynchronous disk access support???
  4881.         AL = subfunction
  4882.             00h get ???
  4883.             Return: CF clear
  4884.                 BL = flags
  4885.                     bit 7: ??? (set if Stealth:F or :M active)
  4886.                     bit 0: ???
  4887.             01h set ???
  4888.             BL = ??? (bit 0 only)
  4889.             Return: CF clear
  4890.             else
  4891.             Return: CF set
  4892.     AH = 21h Stealth support
  4893.         AL = subfunction
  4894.             00h copy data from Stealthed address space
  4895.             DS:SI -> start address of hidden memory to copy
  4896.             ES:DI -> buffer for copied data
  4897.             ECX = number of bytes to copy
  4898.             Return: CF clear if successful
  4899.                 CF set on error (DS:SI < C000h:0000h or
  4900.                          DS:SI + ECX > 1M)
  4901.             else
  4902.             Return: CF set
  4903.     ---QEMM v6.03 only---
  4904.     AH = 22h DESQview/X support
  4905.         AL = subfunction
  4906.             00h get ???
  4907.             Return: CF clear
  4908.                 ES:DI -> ???
  4909.             01h set ???
  4910.             ES:DI -> ??? or 0000h:0000h
  4911.             Return: CF clear if successful
  4912.                 CF set on error
  4913.     other
  4914.         Return: CF set
  4915.  
  4916. Format of QEMM 6.0 memory statistics:
  4917. Offset    Size    Description
  4918.  00h    BYTE    01h if Shadow RAM found, 00h otherwise
  4919.  01h    DWORD    initial conventional memory in bytes
  4920.  05h    DWORD    initial extended memory in bytes
  4921.  09h    DWORD    initial expanded memory in bytes
  4922.  0Dh    DWORD    initial "top" or "shadow" memory in bytes
  4923.  11h    DWORD    Unavailable conventional memory in bytes
  4924.  15h    DWORD    Unavailable extended memory in bytes
  4925.  19h    DWORD    Unavailable expanded memory in bytes
  4926.  1Dh    DWORD    Unavailable "top" or "shadow" memory in bytes
  4927.         Add to offset 49h for Total unavailable top/shadow.
  4928.  21h    DWORD    QEMM code size in bytes
  4929.  25h    DWORD    QEMM data size in bytes
  4930.  29h    DWORD    bytes used for TASKS=
  4931.  2Dh    DWORD    DMA buffer size
  4932.  31h    DWORD    bytes used for MAPS=
  4933.  35h    DWORD    bytes of high RAM
  4934.  39h    DWORD    bytes used by mapped ROMs
  4935.  3Dh    DWORD    bytes of conventional memory provided by QEMM
  4936.  41h    DWORD    bytes of extended memory NOT converted by QEMM (EXT=xxx)
  4937.  45h    DWORD    bytes of EMS/XMS pool memory provided by QEMM
  4938.  49h    DWORD    Unavailable "top" or "shadow" memory in bytes
  4939.         Add to offset 1Dh for Total unavailable top/shadow.
  4940.  4Dh    DWORD    conventional memory overhead in bytes
  4941.         (set to 0 by QEMM.COM prior to call)
  4942.  
  4943. Format of Stealth ROM info [array]:
  4944. Offset    Size    Description
  4945.  00h    WORD    starting segment of ROM
  4946.  02h    WORD    length of ROM in paragraphs
  4947. ----------67DE01-----------------------------
  4948. INT 67 - Virtual Control Program Interface - GET PROTECTED MODE INTERFACE
  4949.     AX = DE01h
  4950.     ES:DI -> 4K page table buffer
  4951.     DS:SI -> three descriptor table entries in GDT
  4952.         first becomes code segment descriptor, other two for use by
  4953.         main control program
  4954. Return: AH = 00h successful
  4955.         DI -> first unused page table entry in buffer
  4956.         EBX -> protected mode entry point in code segment
  4957.     AH = nonzero  failed
  4958. Note:    protected mode entry point may be called with AX=DE00h-DE05h and
  4959.       AX=DE0Ch (in each case, all other registers as appropriate for
  4960.       the function)
  4961. SeeAlso: INT 2F/AX=1687h,INT 67/AH=3Fh
  4962.  
  4963. QEMM v6.03 protected mode entry point may also be called with:
  4964.     AX = DF00h ???
  4965.         ???
  4966.         Return: ???
  4967.     AX = DF01h ???
  4968.         ???
  4969.         Return: ???
  4970. ----------71---------------------------------
  4971. INT 71 - IRQ9 - REDIRECTED TO INT 0A BY BIOS
  4972. Notes:    may be masked by setting bit 1 on I/O port A1h
  4973.     the default BIOS handler invokes INT 0A for compatibility, since the
  4974.       pin for IRQ2 on the PC expansion bus became the pin for IRQ9 on the
  4975.       AT expansion bus.
  4976.     under DESQview, only the INT 15h vector and BASIC segment address (the
  4977.       word at 0000h:0510h) may be assumed to be valid for the handler's
  4978.       process
  4979. SeeAlso: INT 0A,INT 59
  4980. ----------74---------------------------------
  4981. INT 74 - IRQ12 - POINTING DEVICE (PS)
  4982. Notes:    may be masked by setting bit 4 on I/O port A1h
  4983.     under DESQview, only the INT 15h vector and BASIC segment address (the
  4984.       word at 0000h:0510h) may be assumed to be valid for the handler's
  4985.       process
  4986. SeeAlso: INT 33,INT 5C
  4987. ----------75---------------------------------
  4988. INT 75 - IRQ13 - MATH COPROCESSOR EXCEPTION (AT and up)
  4989.    redirected to INT 02 by the BIOS, for compatibility with the PC
  4990. Notes:    may be masked by setting bit 5 on I/O port A1h
  4991.     not all clones wire the coprocessor to generate this IRQ; some systems
  4992.       generate an NMI (see INT 02) or assert the -ERROR pin on the CPU
  4993.       (see INT 10"COPROCESSOR")
  4994.     under DESQview, only the INT 15h vector and BASIC segment address (the
  4995.       word at 0000h:0510h) may be assumed to be valid for the handler's
  4996.       process
  4997. SeeAlso: INT 10"COPROCESSOR",INT 5D
  4998. ----------BE---------------------------------
  4999. INT BE - DESQview/X - ???
  5000. Note:    points at an IRET
  5001. SeeAlso: INT 15/AX=BFDEh/BX=0006h,INT 63"DESQview"
  5002. ---------------------------------------------
  5003. This compilation is Copyright (c) 1989,1990,1991,1992,1993 Ralf Brown
  5004. ---------------------------------------------
  5005. ARPA: ralf@cs.cmu.edu
  5006. UUCP: {ucbvax,harvard}!cs.cmu.edu!ralf
  5007. BIT:  ralf%cs.cmu.edu@carnegie
  5008. FIDO: Ralf Brown 1:129/26.1
  5009.     or post a message to me in the DR_DEBUG echo (I probably won't see it
  5010.     unless you address it to me)
  5011. CIS:  >INTERNET:ralf@cs.cmu.edu
  5012.