home *** CD-ROM | disk | FTP | other *** search
/ Shareware Supreme Volume 6 #1 / swsii.zip / swsii / 163 / QTEC9305.ZIP / DVAWARE.TEC < prev    next >
Text File  |  1992-07-27  |  17KB  |  346 lines

  1. ID:AW Making a Program DESQview-aware
  2. Quarterdeck Technical Note #250
  3. By Michael Bolton
  4. Last revised: July 20, 1992
  5.  
  6.  
  7. Q. What is a DESQview-aware program?
  8. Q. Why should I make my program DESQview-aware?
  9. Q. How do I make my program DESQview-aware?
  10.  
  11. DESQview users don't just want their programs to run as well inside DESQview
  12. as outside; they want them to run even better.  They want to use DESQview's
  13. Learn feature to make typing repetitive commands to the program easier -- and
  14. DESQview's Transfer feature to move information from one program to another.
  15. They want their programs to print or do heavy processing in background while
  16. they continue to work in another program in foreground.  They want their
  17. programs, when idle, to avoid degrading the multitasking of programs that are
  18. active.  It's easy to modify a program to do all this.
  19.  
  20. Additionally, hidden deep inside DESQview 2 is a powerful API (Application
  21. Program Interface) that lets programs control and interact with DESQview and
  22. with other programs running in DESQview.  You may easily modify your program
  23. to be "DESQview-aware" -- to employ one set of strategies when it is not
  24. running under DESQview, and to use the power of DESQview's API when it is
  25. running under DESQview.  The DESQview API Reference Manual (which includes the
  26. Assembler interfaces to the API), libraries for C, Clipper, Pascal, Basic, and
  27. dBase, the API Panel Design Tool, and the API Debugger are all available from
  28. Quarterdeck Office Systems; see Quarterdeck Technical Note #211, "DESQview API
  29. General Information" (APIBRO.TEC) for more details.  You may obtain technotes
  30. from the Quarterdeck BBS (310-314-3227), by calling QFAX (our automated
  31. FAX-back service, at 310-314-3214), on Compuserve (go QUARTERDECK, library 2),
  32. or BIX.  Many technotes are also available on large local BBSs, often in
  33. "DESQview" or "multitasking" file areas.
  34.  
  35. For a program's users to be able to take advantage of DESQview's Transfer and
  36. Learn features, the program must get keystrokes from DOS or the BIOS.  If the
  37. program reads the keyboard hardware to get keys these features won't work
  38. -- making the program less powerful than other programs in DESQview.
  39.  
  40. Programs that call DOS or the BIOS to move the cursor and display information
  41. on the screen run in a small window without modification.  The user can use
  42. such a program while simultaneously viewing information for another program.
  43. More importantly, such programs will run in background without writing on top
  44. of the information displayed by the program that's running in foreground.
  45.  
  46. There's no good reason not to use the BIOS to move the hardware cursor, as
  47. these functions are easy to use and quite fast.  However, both DOS and the
  48. BIOS are comparatively slow at writing to the screen, so many programs write
  49. directly to the screen memory for performance reasons.
  50.  
  51. Programs that write directly to the video buffer typically determine during
  52. intialization whether they should run on a monochrome or a color monitor.
  53. They select a video segment at B000h for a monochrome or B800h for a color
  54. display.  DESQview provides a new call that supplies the caller with an
  55. alternative video buffer address.  A program can write text into this buffer
  56. exactly as if it were the hardware video buffer.  DESQview will automatically
  57. take care of displaying only the information that falls within the current
  58. window area while updating the entire logical screen.
  59.  
  60. The following code sequence checks for DESQview's presence and then requests
  61. the alternate buffer address:
  62.  
  63.          MOV ES, VIDEO_HARDWARE_SEG      ; set ES = video hardware segment
  64.          MOC CX, 'DE'                    ; set CX to 4445h, DX to 5351h
  65.          MOV DX, 'SQ'                    ; an invalid date
  66.          MOV AX, 2B01h                   ; DOS's set date function
  67.          INT 21h                         ; call DOS
  68.          CMP AL, 0FFh                    ; did DOS see it as invalid?
  69.          JE NO_DESQVIEW                  ; if so, DESQview isn't there
  70.          MOV MAJOR_VERSION, BH           ; else DESQview returns version #
  71.          MOV MINOR_VERSION, BL           ; (no real reason to store these)
  72.  
  73.                                          ; since DESQview is running, get
  74.                                          ; the alternate screen buffer
  75.          MOV AH, 0FEh                    ; DESQview's get buffer function
  76.          INT 10h                         ; returns ES:DI as alternate buffer
  77.  
  78. NO_DESQVIEW:
  79.          MOV VIDEO_BUFFER_SEG, ES
  80.  
  81. This code assumes that you've already determined whether you're on a
  82. monochrome or color monitor and have set either B000h or B800h into the
  83. VIDEO_BUFFER_SEG variable.  It then checks if DESQview is running. If it is,
  84. it makes a DESQview BIOS call to get the alternate video buffer address into
  85. ES:DI, and then finishes by setting the correct buffer address (either the
  86. original hardware address or the one DESQview provided) into the
  87. VIDEO_BUFFER_SEG variable.
  88.  
  89. If you're familiar with TopView's API, you'll note that TopView supports an
  90. equivalent call to find an alternate screen buffer.  TopView, however,
  91. requires that another call be made every time you write into the buffer to
  92. tell TopView that something has changed (the 0FFh interrupt 10h call).
  93. DESQview supports this call as well, but DOES NOT require it.
  94.  
  95. There is no need to synchronize with video retrace when writing into this
  96. buffer.  DESQview will automatically synchronize when the information is
  97. written to the "real" screen.  So, the program might actually update the
  98. screen faster inside of a small DESQview window than it does outside of
  99. DESQview.
  100.  
  101. Once you've added this code to the program (and converted to using the BIOS to
  102. manipulate the cursor -- if you weren't doing so already), the program will
  103. run in a small DESQview window and users will be able to run the program in
  104. background without any problems.
  105.  
  106. (Programs which write text or graphics directly to the screen may also run in
  107. background, without modification, under DESQview 386, which consists of
  108. DESQview and QEMM-386, running together on a 386 or 486 processor.  See
  109. Quarterdeck Technical Note #229 "What is Virtualizing?" (VIRTUALI.TEC) for
  110. more information on this.)
  111.  
  112. However, using the DESQview API, there are still a few optimizations you can
  113. make to be sure the program mulititasks as efficiently as possible -- so that
  114. neither the program nor other programs running concurrently with it are
  115. needlessly degraded.  There are three routines that you might want to add to
  116. the program to achieve this optimization.
  117.  
  118. * DV_PAUSE:  If the program waits for input when it's idle, DESQview
  119.   won't waste any processor time on it until the user types the next
  120.   key.  However, if the program sits in a loop polling the keyboard when
  121.   it's basically idle, you'll probably want to use the DV_PAUSE call to
  122.   relinquish the remainder of your time slice when you see that the event
  123.   you're polling for hasn't yet occurred.  This minimizes the effect of
  124.   the program's polling loop on other programs running in background.
  125.  
  126. * DV_BEGIN_CRITICAL:  This call is used in conjunction with the call
  127.   DV_END_CRITICAL to define a section of code the DESQview won't "slice
  128.   out of".   Use this for timimg critical operations.
  129.  
  130. * DV_END_CRITICAL:  This call defines the end of a critical section of
  131.   code.
  132.  
  133. These routines, and the two others listed below, are contained in the listing
  134. of the DESQview interfaces modules below.  This listing can be assembled with
  135. the IBM or Microsoft Assembler and then linked with the program.  It should
  136. work "as is" when linked to Assembler or C programs.  It isn't linkable "as
  137. is" to MS Pascal, Turbo Pascal or Compiled BASIC -- but can be easily adapted
  138. to these languages as well.  Contact Quarterdeck if you need assistance.
  139.  
  140. The other two routines in this listing are:
  141.  
  142. * DV_GET_VERSION:  Returns a zero if the program is NOT running under
  143.   DESQview.  Otherwise, it returns the current DESQview version number.
  144.   If the program already uses DOS or the BIOS to write to the screen,
  145.   you should call this routine (rather than DV_GET_VIDEO_BUFFER) when
  146.   you initialize the program.
  147.  
  148. * DV_GET_VIDEO_BUFFER:  Takes the hardware video segment on the stack
  149.   and returns that segment (if DESQview isn't present) or returns the
  150.   segment of DESQview's alternate video buffer.  You should call this
  151.   routine when you initialize the program if the program normally writes
  152.   directly to the video buffer.
  153.  
  154.  
  155.             TITLE DESQview Interfaces
  156.  
  157. DVINT_SEG SEGMENT 'CODE'
  158.    ASSUME: CS:DVINT_SEG
  159.  
  160.    PUBLIC DV_GET_VERSION
  161.    PUBLIC DV_GET_VIDEO_BUFFER
  162.    PUBLIC DV_PAUSE
  163.    PUBLIC DV_BEGIN_CRITICAL
  164.    PUBLIC DV_END
  165.  
  166. IN_DV   DB 0
  167. DV_GET_VERSION PROC FAR
  168.  
  169. ; Returns in AH/AL the DESQview major/minor version numbers, and sets
  170. ; up the IN_DV variable for later use
  171. ; Returns 0 in AX if DESQview isn't there
  172.  
  173.                PUSH BX
  174.                PUSH CX
  175.                PUSH DX
  176.                MOV CX, 'DE'       ; set CX to 4445h; DX to 5351h
  177.                MOV DX, 'SQ'       ; (an invalid date)
  178.                MOV AX, 2B01h      ; DOS's set date function
  179.                INT 21h            ; call DOS
  180.                CMP AL, 0FFh       ; did DOS see it as invalid?
  181.                JE NO_DESQVIEW     ; if so, DESQview isn't there
  182.                MOV AX, BX         ; AH = major version; AL = minor version
  183.                MOV CS:IN_DV, 1    ; Set internal variable used by
  184.                JMP SHORT DVGV_X   ; other routines
  185. NO_DESQVIEW:
  186.                SUB AX, AX         ; return no DESQview (version 0)
  187. DVGV_X:
  188.                POP DX
  189.                POP CX
  190.                POP BX
  191.                RET
  192. DV_GET_VERSION ENDP
  193.  
  194. DV_GET_VIDEO_BUFFER PROC FAR
  195.  
  196. ; Takes the hardware video segment on the stack and returns that segment
  197. ; (if DESQview is not present) or DESQview's alternate video buffer in
  198. ; AX.  Sets up the IN_DV variable for later use.  Call this instead of
  199. ; DV_GET_VERSION if your program writes directly to video memory
  200. ; As presented here, this is a C-callable function; the caller is
  201. ; responsible for cleaning up the stack.
  202.  
  203.                PUSH BP
  204.                MOV BP, SP
  205.                PUSH DI              ; DI may be modified by this call
  206.                PUSH ES
  207.                MOV ES, [BP+6]       ; put the hardware segment into ES
  208.                CALL DV_GET_VERSION  ; Returns AX=0 if not in DESQview
  209.                TEST AX, AX          ; In DV?
  210.                JZ DVGVB_X           ; Jump if not
  211.  
  212. ; Since DESQview is running, get the alternate screen buffer
  213.  
  214.                MOV AH, 0FEh         ; DV's get buffer function
  215.                INT 10h              ; Return ES as segment of alternate buffer
  216. DVGVB_X:
  217.                MOV AX, ES           ; return correct video buffer in ES
  218.                POP ES
  219.                POP DI
  220.                POP BP
  221.                RET
  222.  
  223. DV_GET_VIDEO_BUFFER ENDP
  224.  
  225. ; Note that in previous versions of this code, there were two calls in the
  226. ; DESQview manual which switched the process on to and off of DESQview's
  227. ; stack.  In current versions of DESQview, these calls are not needed and so
  228. ; are not made - thus the procedure API_CALL has been eliminated.
  229.  
  230. DV_PAUSE       PROC FAR
  231.  
  232. ; This routine gives up the rest of your program's time slice.  Takes no
  233. ; parameters and returns nothing
  234.  
  235.                CMP CS:IN_DV, 1      ; Are we in DESQview?
  236.                JNE DVP_X            ; If not, nothing to do
  237.                PUSH AX              ; Else make the pause function call
  238.                MOV AX, 1000h        ; This is the function code
  239.                INT 15h              ; Make that call
  240.                POP AX
  241. DVP_X:         RET
  242. DV_PAUSE       ENDP
  243.  
  244. DV_BEGIN_CRITICAL PROC FAR
  245.  
  246. ; This routine tells DESQview not to slice away from your program until
  247. ; you make a DV_END_CRITICAL call.  Takes no parameters and returns nothing
  248.  
  249.                CMP CS:IN_DV, 1      ; Are we in DESQview?
  250.                JNE DVBC_X           ; If not, nothing to do
  251.                PUSH AX              ; Else make the begin critical call
  252.                MOV AX, 101Bh        ; This is the function code
  253.                INT 15h              ; Make the call
  254.                POP AX
  255. DVBC_X:        RET
  256.  
  257. DV_BEGIN_CRITICAL ENDP
  258.  
  259. DV_END_CRITICAL PROC FAR
  260.  
  261. ; This routine tells DESQview that it is all right to slice away from
  262. ; your program again.  Takes no parameters and returns nothing.
  263.  
  264.                CMP CS:IN_DV, 1      ; Are we in DESQview?
  265.                JNE DVEC_X           ; If not, nothing to do
  266.                PUSH AX              ; Else make the end critical call
  267.                MOV AX, 101Ch        ; This is the function code
  268.                INT 15h              ; Make the call
  269.                POP AX
  270. DVEC_X:        RET
  271. DV_END_CRITICAL ENDP
  272.  
  273.  
  274. DVINT_SEG      ENDS
  275.                END
  276.  
  277. NOTE:  Indiscriminate use of critical regions, either too often or for too
  278. long, may hamper DESQview's multitasking.  Most programs, including many
  279. timing-critical communications programs, work just fine in DESQview without
  280. any use of critical regions.
  281.  
  282. The principal beneficiaries would be programs that use DOS directly, without
  283. using interrupt 21, leaving DESQview in ignorance that a program has gone into
  284. DOS, which is not re-entrant.  Unfortunately, many versions of network server
  285. software do this.  When DESQview has not been informed that a program is in
  286. DOS, DESQview cannot prevent another program from entering DOS.
  287.  
  288. The most important use of a critical region is to prevent re-entry of
  289. non-re-entrant code that could be shared by another program.  A much better
  290. (and in fact, the recommended) solution is to write re-entrant code.
  291.  
  292. For more information on making a program DESQview-aware, please consult the
  293. API Reference Manual.
  294.  
  295. DESQview version 2.26 (and above) issues informative messages to third-party
  296. software so that software can monitor certain DESQview operations such as
  297. starting a task or swapping out a process.  These messages can be useful for
  298. allocating/deallocating resources (e.g., memory) on a process-by-process
  299. basis, communicating with tasks running within DESQview, rescheduling tasks,
  300. etc.  DESQview permits this through the External Device Interface (XDI) --
  301. Quarterdeck's specification for communicating with external drivers.  These
  302. drivers may be implemented either as a DOS device driver (loaded by
  303. CONFIG.SYS), a Terminate and Stay Resident program (TSR) loaded before or
  304. after DESQview, or as a DESQview shared program (shared among several
  305. processes).
  306.  
  307. Within the XDI, there are several subfunctions that inform the driver what
  308. action DESQview has just performed or is about to perform.
  309.  
  310. XDI_CHECK_PRESENCE                  Check for XDI driver presence
  311. XDI_RESERVED_SUBFUNC                XDI driver custom subfunction
  312. XDI_START_DV                        DV System initialization complete
  313. XDI_END_DV                          DV System termination
  314. XDI_START_PROC                      Process creation
  315. XDI_END_PROC                        Process termination
  316. XDI_START_TASK                      Task creation
  317. XDI_END_TASK                        Task termination
  318. XDI_SAVE_STATE                      Task state save
  319. XDI_RESTORE_STATE                   Task state restore
  320. XDI_KEYBOARD                        Change of keyboard focus
  321. XDI_PROCESS_DVP                     Processing of DVP file complete
  322. XDI_SWAPPING_OUT                    Swap out of DV process
  323. XDI_SWAPPED_IN                      Swap in of DV process
  324. XDI_FAILED_DVP                      DV process creation failure
  325.  
  326. DESQview's XDI is fully documented in Quarterdeck's API Reference Manual.
  327. Contact Quarterdeck for full information on DESQview's XDI specification.
  328.  
  329. Quarterdeck is happy to assist developers of commercial software who would
  330. like to make their applications work better under DESQview.
  331.  
  332. Quarterdeck Office Systems
  333. 150 Pico Boulevard
  334. Santa Monica, California
  335. 90405
  336.  
  337. (310) 392-9851
  338.  
  339.   ************************************************************************
  340.   *          Trademarks are property of their respective owners.         *
  341.   *This technical note may be copied and distributed freely as long as it*
  342.   *is distributed in its entirety and it is not distributed for profit.  *
  343.   *          Copyright (C) 1992 by Quarterdeck Office Systems            *
  344.   ************************ E N D   O F   F I L E *************************
  345.  
  346.