home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_GEN / ASM32.ZIP / MULTIWIN.DOC < prev    next >
Text File  |  1993-12-06  |  19KB  |  665 lines

  1.  
  2. ************************  MULTI-WINDOW SUBSYSTEM  ****************************
  3.  
  4. ASM32 Multi-Window text mode video subroutines
  5. Copyright (C) 1993 Douglas Herr ■ All rights reserved
  6.  
  7. ASM32's multi-window system allows several pop-up windows to be stored
  8. at any given time, and permits any one window or any group of overlapping
  9. or non-overlapping windows to be displayed on the screen in any position
  10. and in any order.  Pop-up windows may be created, printed to, cleared or
  11. moved whether displayed or hidden.  Up to 10 pop-up windows may be open at
  12. any time.
  13.  
  14. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  15.  
  16. MWBORDER:    puts single- or double-lined border, or character border,
  17.              around an open window; sets border flag.
  18.              The Multi-Window border flag prevents MWClear, MWFill, MWPrint
  19.              and MWCenter from over-writing the border for the selected
  20.              window.
  21. Source:      mwborder.asm (mwinit.asm)
  22.  
  23. Call with:   BX = window handle
  24.              AH = border color attribute
  25.              AL = border type: -1 = double line
  26.                                 0 = single line
  27.                     1 through 254 = ASCII character
  28. Returns:     if CF = 0, no error
  29.              if CF = 1, handle not valid or window dimensions too small
  30. Uses:        flags
  31. Example:
  32.  
  33. include model.inc
  34.  
  35. extrn   mwinit:near, mwopen:near, mwborder:near
  36.  
  37. include dataseg.inc
  38. whandle dw 0
  39. wdata   dw 0,0,19,39            ; 20 rows, 40 columns
  40. @curseg ends
  41.  
  42. include codeseg.inc
  43.         .
  44.         .
  45.         .
  46.         call    mwinit
  47.         lea     ebx,wdata       ; point to window corner data
  48.         call    mwopen          ; open window in multi-window system
  49.         jc      problem         ; if error, go take care of it
  50.         mov     whandle,ax      ;  else save window handle
  51.  
  52. ; give the window a single-lined border in red
  53.         mov     bx,ax           ; handle in BX
  54.         mov     al,0
  55.         mov     ah,12
  56.         call    mwborder
  57.  
  58. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  59.  
  60. MWCENTER:    centers a string in selected window
  61. Source:      mwcenter.asm (mwprint.asm, mwinit.asm)
  62.  
  63. Call with:   BX = window handle
  64.              DS:[ESI] -> ASCIIZ string
  65.              DH = window row
  66.              AH = color attribute
  67. Returns:     DL = window column used by MWPrint
  68. Uses:        AL, DL, flags
  69.  
  70. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  71.  
  72. MWCLEAR:     clears a window managed by the MultiWindow system
  73. source:      mwclear.asm (mwinit.asm)
  74.  
  75. Call with:   BX = window handle
  76.              AH = color attribute
  77.              if the window's border is enabled, it is not cleared
  78. Returns:     nothing
  79. Uses:        AX, flags
  80. Example:     see example for MWNoBorder
  81.  
  82.  
  83.  
  84. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  85.  
  86. MWCLOSE:     releases a window's memory buffer
  87. Source:      mwinit.asm
  88.  
  89. Call with:   BX = valid window handle
  90. Returns:     if CF = 0, no error
  91.              if CF = 1, bad handle
  92. Uses:        flags
  93. Example:
  94.  
  95. include model.inc
  96.  
  97. extrn   mwtop:near, mwclose:near
  98.  
  99. include codeseg.inc
  100.         .
  101.         .
  102.         .
  103.  
  104.         mov    bx,window_handle
  105. ; all done with this window
  106. ; first I want to move it to the top of the window "stack"
  107. ; so the next window I open will be on top
  108.  
  109.         call   mwtop
  110.  
  111. ; then get rid of it
  112.         call   mwclose
  113.  
  114.  
  115. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  116.  
  117. MWCLOSEALL   close all open windows, releasing buffers
  118. Source:      mwclose.asm (mwinit.asm)
  119.  
  120. Call with:   no parameters
  121. Returns:     nothing
  122. Uses:        nothing; all registers and flags are saved
  123. Example:
  124.  
  125.         call   mwcloseall
  126.  
  127.  
  128. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  129.  
  130. MWDEFAULT:   change default status of opened windows
  131. Source:      mwdef.asm (mwinit.asm)
  132.  
  133. Call with:   AL = option bits
  134.               bit 0  if zero, hide windows
  135.                      if one, display window
  136.               bit 2  if zero, no shadow
  137.                      if one, shadow enabled
  138.              MWDefault affects only windows opened AFTER MWDefault is called.
  139.              Does not change the status of previously-opened windows.
  140. Returns:     nothing
  141. Uses:        AL
  142. Example:
  143.  
  144. include model.inc
  145.  
  146. extrn   mwinit:near, mwopen:near
  147. extrn   mwdefault:near
  148.  
  149. include codeseg.inc
  150.         .
  151.         .
  152.         .
  153.         call    mwinit
  154.         mov     al,101b            ; all windows with shadow and unhidden
  155.         call    mwdefault          ; update defaults
  156.  
  157.  
  158. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  159.  
  160. MWDISPLAY:   display open windows on the screen
  161. Source:      mwinit.asm
  162.  
  163. Call with:   no parameters
  164.              MWDisplay updates the screen by displaying all unhidden
  165.              open windows.  No windows will ever show up on the screen
  166.              if you don't call MWDisplay.  You must call MWInit before
  167.              using MWDisplay.
  168. Returns:     nothing
  169. Uses:        nothing
  170. Example:     see example code for MWPrint
  171.  
  172.  
  173. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  174.  
  175. MWHIDE:      hide selected window
  176.              a "hidden" window is ignored by MWDISPLAY
  177. Source:      mwinit.asm
  178.  
  179. Call with:   BX = window handle
  180. Returns:     if CF = 0, no error
  181.              if CF = 1, bad handle number
  182. Uses:        flags
  183. Example:
  184.  
  185. include model.inc
  186.  
  187. extrn   mwinit:near, mwopen:near, mwhide:near
  188.  
  189. include dataseg.inc
  190. whandle dw 0
  191. wdata   dw 0,0,19,39           ; 20 rows, 40 columns
  192. @curseg ends
  193.  
  194. include codeseg.inc
  195.         .
  196.         .
  197.         .
  198.         call   mwinit
  199.         lea    ebx,wdata       ; point to window corner data
  200.         call   mwopen          ; open window in multi-window system
  201.         jc     problem         ; if error, go take care of it
  202.         mov    whandle,ax      ;  else save window handle
  203.         mov    bx,ax           ; copy handle to AX
  204.         call   mwhide          ; don't display window when MWDisplay is called
  205.  
  206.  
  207.  
  208. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  209.  
  210. MWHIDEALL:   hide all open windows
  211. Source:      mwhide.asm (mwinit.asm)
  212.  
  213. Call with:   no parameters
  214. Returns:     nothing
  215. Uses:        nothing
  216. Example:
  217.  
  218. include model.inc
  219.  
  220. extrn   mwinit:near, mwhideall:near
  221. extrn   mwopen:near, mwdisplay:near
  222.  
  223. include codeseg.inc
  224.         call    mwinit
  225.  
  226. ; program opens several windows
  227.         .
  228.         .
  229.         .
  230.  
  231. ; make all open windows disappear
  232.         call    mwhideall
  233.         call    mwdisplay
  234.  
  235.  
  236.  
  237. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  238.  
  239. MWINIT:      initializes multi-window system.  Several pop-up windows may
  240.              be popped onto or removed from a base screen in any order.
  241.              You must re-initialize the multi-window system each time the
  242.              base screen changes.  MWInit does not affect any open windows.
  243. Source:      mwinit.asm (screen.asm, smem.asm)
  244.  
  245. Call with:   no parameters
  246. Returns:     AX = segment address of saved base screen
  247. Uses:        AX
  248. Example:
  249.  
  250. include model.inc
  251.  
  252. extrn   mwinit:near
  253.  
  254. include codeseg.inc
  255.         .
  256.         .
  257.         call   mwinit
  258.  
  259. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  260.  
  261. MWNOBORDER:  clears the border flag for the associated window
  262. Source:      mwborder.asm (mwinit.asm)
  263.  
  264. Call with:   BX = window handle
  265. Returns:     if CF = 0, no error
  266.              if CF = 1, bad handle number
  267. Uses:        flags
  268. Example:
  269.  
  270. include model.inc
  271.  
  272. extrn   mwinit:near, mwopen:near
  273. extrn   mwborder:near, mwnoborder:near
  274. extrn   mwclear:near
  275.  
  276. include dataseg.inc
  277. window_handle dw 0
  278. wdata         dw 0,0,19,39            ; 20 rows, 40 columns
  279. @curseg ends
  280.  
  281. include codeseg.inc
  282.         .
  283.         .
  284.         .
  285.         call    mwinit
  286.         lea     ebx,wdata          ; point to window corner data
  287.         call    mwopen             ; open window in multi-window system
  288.         jc      problem            ; if error, go take care of it
  289.         mov     window_handle,ax   ;  else save window handle
  290.  
  291. ; give the window a single-lined border in red
  292.         mov     bx,ax              ; handle in BX
  293.         mov     al,0
  294.         mov     ah,12
  295.         call    mwborder
  296.         .
  297.         .
  298.  
  299. ; some time later, I want to clear the ENTIRE window, including the border
  300.         mov     bx,window_handle
  301.         call    mwnoborder
  302.         mov     ah,any_old_color
  303.         call    mwclear
  304.  
  305.  
  306. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  307.  
  308. MWNOSHADOW:  disables "shadow" effect for selected window
  309. Source:      mwshadow.asm (mwinit.asm)
  310.  
  311. Call with:   BX = window handle
  312. Returns:     if CF = 0, no error
  313.              if CF = 1, bad handle number
  314. Uses:        flags
  315. Example:
  316.  
  317. include model.inc
  318.  
  319. extrn   mwinit:near, mwopen:near, mwnoshadow:near
  320.  
  321. include dataseg.inc
  322. whandle dw 0
  323. wdata   dw 0,0,19,39           ; 20 rows, 40 columns
  324. @curseg ends
  325.  
  326. include codeseg.inc
  327.         .
  328.         .
  329.         .
  330.         call   mwinit
  331.         lea    ebx,wdata       ; point to window corner data
  332.         call   mwopen          ; open window in multi-window system
  333.         jc     problem         ; if error, go take care of it
  334.         mov    whandle,ax      ;  else save window handle
  335.         mov    bx,ax           ; copy handle to AX
  336.         call   mwnoshadow      ; disable shadow for this window
  337.  
  338.  
  339.  
  340. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  341.  
  342. MWOPEN:      opens a pop-up window for subsequent display
  343. Source:      mwinit.asm (screen.asm, smem.asm)
  344.  
  345. Call with:   DS:[EBX] pointing to window corner data
  346.  
  347.              Up to 10 windows may be open at any time; if you need more,
  348.              you will need to change MWINDOW_COUNT in mwinit.asm and
  349.              re-assemble.  If two or more windows overlap on the screen,
  350.              the one opened last will be displayed on top of the other(s).
  351.              The window appearing on top may be changed with MWTop.
  352.  
  353.              Note the default status of all opened windows:
  354.                hidden
  355.                no shadow
  356.                no border
  357.  
  358.              You may change the status of any open window with
  359.              MWUnHide, MWHide, MWShadow, MWNoShadow, MWBorder and MWNoBorder;
  360.  
  361.              All open windows may be hidden or un-hidden with
  362.              MWHideAll or MWUnHideAll;
  363.  
  364.              The default status of newly-opened windows may be changed
  365.              with MWDefault.
  366.  
  367. Returns:     if CF = 0, AX = multi-window handle
  368.              if CF = 1, insufficient memory for window
  369. Uses:        AX, flags
  370. Example:
  371.  
  372. include model.inc
  373.  
  374. extrn   mwinit:near, mwopen:near
  375.  
  376. include dataseg.inc
  377. whandle dw 0
  378. wdata   dw 0,0,19,39           ; 20 rows, 40 columns
  379.                                ; upper left corner of screen
  380. @curseg ends
  381.  
  382. include codeseg.inc
  383.         .
  384.         .
  385.         .
  386.         call   mwinit
  387.         lea    ebx,wdata       ; point to window corner data
  388.         call   mwopen          ; open window in multi-window system
  389.         jc     problem         ; if error, go take care of it
  390.         mov    whandle,ax      ;  else save window handle
  391.  
  392.  
  393. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  394.  
  395. MWPRINT:     print an ASCIIZ string to an open window
  396. Source:      mwprint.asm (mwinit.asm)
  397.  
  398. Call with:   BX = window handle
  399.              DS:[ESI] pointing to an ASCIIZ string
  400.              AH = color attribute
  401.              DH = window row, DL = window column
  402. Returns:     nothing
  403. Uses:        AL
  404. Example:
  405.  
  406. include  model.inc
  407.  
  408. extrn   mwinit:near, mwopen:near
  409. extrn   mwprint:near, mwdisplay:near
  410.  
  411. include dataseg.inc
  412. window_handle dw 0
  413. wdata         dw 0,0,19,39            ; 20 rows, 40 columns
  414. row           db 1
  415. column        db 1
  416. color         db 23
  417. window_string db 'Print this in the window',0
  418. @curseg ends
  419.  
  420. include codeseg.inc
  421.         .
  422.         .
  423.         .
  424.         call    mwinit
  425.         lea     ebx,wdata          ; point to window corner data
  426.         call    mwopen             ; open window in multi-window system
  427.         jc      problem            ; if error, go take care of it
  428.         mov     window_handle,ax   ;  else save window handle
  429.  
  430.         lea     esi,window_string  ; point to text
  431.         mov     bx,ax              ; AX is still the handle
  432.         mov     dh,row             ; offset from top of window
  433.         mov     dl,column          ; offset from left side of window
  434.                                    ; ROW and COLUMN are relative to BORDER
  435.                                    ; if border is enabled
  436.         mov     ah,color
  437.         call    mwprint
  438.         call    mwdisplay          ; show all unhidden windows on the screen
  439.  
  440.  
  441.  
  442. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  443.  
  444. MWPRINTCE:   prints a string in selected window & clears to edge of window
  445.              clears to border if the window's border is enabled
  446. Source:      mwprint.asm (mwinit.asm)
  447.  
  448. Call with:   BX = window handle
  449.              DS:[ESI] pointing to an ASCIIZ string
  450.              AH = color attribute
  451.              DH = window row, DL = window column
  452. Returns:     nothing
  453. Uses:        AL
  454. Example:     see MWPrint
  455.  
  456.  
  457. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  458.  
  459. MWSELECT:    determines which window is visible at screen coordinate
  460. Source:      mwselect.asm (mwinit.asm)
  461.  
  462. Call with:   DH = screen row, DL = screen column
  463. Returns:     if CF = 0, BX = handle of window visible at these coordinates
  464.              if CF = 1, no window visible at these coordinates
  465. Uses:        BX, flags
  466. Example:
  467.  
  468. include model.inc
  469.  
  470. extrn   mwselect:near, mwtop:near
  471.  
  472. include codeseg.inc
  473.         .
  474.         .
  475.         .
  476.  
  477. ; the mouse has been scurrying around the screen
  478. ; and the program has detected a mouse button press
  479. ; the mouse cursor is at row 3, column 14
  480.  
  481. ; determine which window the mouse has landed on
  482.         mov     dh,3
  483.         mov     dl,14
  484.         call    mwselect              ; get window visible at (3,14)
  485.         jc      no_window             ;  error? mouse must have had an itch
  486.         call    mwtop                 ; put this window on top of all others
  487.  
  488.  
  489. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  490.  
  491. MWSHADOW:    enables "shadow" effect for selected window
  492. Source:      mwshadow.asm (mwinit.asm)
  493.  
  494. Call with:   BX = window handle
  495. Returns:     if CF = 0, no error
  496.              if CF = 1, bad handle
  497. Uses:        flags
  498. Example:
  499.  
  500. include model.inc
  501.  
  502. extrn   mwinit:near, mwopen:near, mwshadow:near
  503.  
  504. include dataseg.inc
  505. whandle dw 0
  506. wdata   dw 0,0,19,39           ; 20 rows, 40 columns
  507. @curseg ends
  508.  
  509. include codeseg.inc
  510.         .
  511.         .
  512.         .
  513.         call   mwinit
  514.         lea    ebx,wdata       ; point to window corner data
  515.         call   mwopen          ; open window in multi-window system
  516.         jc     problem         ; if error, go take care of it
  517.         mov    whandle,ax      ;  else save window handle
  518.         mov    bx,ax           ; copy handle to AX
  519.         call   mwshadow        ; enable shadow for this window
  520.  
  521.  
  522. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  523.  
  524. MWTITLE:     center an ASCIIZ string at the top of an open window
  525. Source:      mwtitle.asm (mwcenter.asm, mwinit.asm)
  526.  
  527. Call with:   BX = window handle
  528.              DS:[ESI] pointing to an ASCIIZ string
  529.              AH = color attribute
  530.              MWTitle prints the window title at the top of the window,
  531.              overwriting the border (if it is enabled).
  532. Returns:     nothing
  533. Uses:        AL
  534. Example:
  535.  
  536. include  model.inc
  537.  
  538. extrn   mwinit:near, mwopen:near
  539. extrn   mwtitle:near, mwdisplay:near
  540.  
  541. include dataseg.inc
  542. window_handle dw 0
  543. wdata         dw 0,0,19,39            ; 20 rows, 40 columns
  544. row           db 1
  545. column        db 1
  546. color         db 23
  547. window_string db 'Window Title',0
  548. @curseg ends
  549.  
  550. include codeseg.inc
  551.         .
  552.         .
  553.         .
  554.         call    mwinit
  555.         lea     ebx,wdata          ; point to window corner data
  556.         call    mwopen             ; open window in multi-window system
  557.         jc      problem            ; if error, go take care of it
  558.         mov     window_handle,ax   ;  else save window handle
  559.  
  560.         lea     esi,window_string  ; point to text
  561.         mov     bx,ax              ; AX is still the handle
  562.         mov     ah,color
  563.         call    mwtitle
  564.         call    mwdisplay          ; show all unhidden windows on the screen
  565.  
  566.  
  567.  
  568. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  569.  
  570. MWTOP:       displays selected window on top of all others
  571. Source:      mwtop.asm (mwinit.asm)
  572.  
  573. Call with:   BX = window handle
  574. Returns:     DF = 0
  575.              if CF = 0, no error
  576.              if CF = 1, bad handle number
  577. Uses:        flags
  578. Example:
  579.  
  580. include model.inc
  581.  
  582. extrn   mwselect:near, mwtop:near
  583.  
  584. include codeseg.inc
  585.         .
  586.         .
  587.         .
  588.  
  589. ; the mouse has been scurrying around the screen
  590. ; and the program has detected a mouse button press
  591. ; the mouse cursor is at row 3, column 14
  592.  
  593. ; determine which window the mouse has landed on
  594.         mov     dh,3
  595.         mov     dl,14
  596.         call    mwselect              ; get window visible at (3,14)
  597.         jc      no_window             ;  error? mouse must have had an itch
  598.         call    mwtop                 ; put this window on top of all others
  599.  
  600.  
  601. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  602.  
  603. MWUNHIDE:    allow selected window to be displayed
  604. Source:      mwinit.asm
  605.  
  606. Call with:   BX = window handle
  607. Returns:     if CF = 0, no error
  608.              if CF = 1, bad handle number
  609. Uses:        flags
  610. Example:
  611.  
  612. include model.inc
  613.  
  614. extrn   mwinit:near, mwopen:near, mwunhide:near
  615.  
  616. include dataseg.inc
  617. whandle dw 0
  618. wdata   dw 0,0,19,39           ; 20 rows, 40 columns
  619. @curseg ends
  620.  
  621. include codeseg.inc
  622.         .
  623.         .
  624.         .
  625.         call   mwinit
  626.         lea    ebx,wdata       ; point to window corner data
  627.         call   mwopen          ; open window in multi-window system
  628.         jc     problem         ; if error, go take care of it
  629.         mov    whandle,ax      ;  else save window handle
  630.         mov    bx,ax           ; copy handle to AX
  631.         call   mwunhide        ; display window when MWDisplay is called
  632.  
  633.  
  634.  
  635. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  636.  
  637. MWUNHIDEALL: unhide all open windows
  638. Source:      mwunhide.asm (mwinit.asm)
  639.  
  640. Call with:   no parameters
  641. Returns:     nothing
  642. Uses:        nothing
  643. Example:
  644.  
  645. include model.inc
  646.  
  647. extrn   mwinit:near, mwunhideall:near
  648. extrn   mwopen:near, mwdisplay:near
  649.  
  650. include codeseg.inc
  651.         .
  652.         call    mwinit
  653.         .
  654. ; program opens several windows
  655.         .
  656.         .
  657.         .
  658.  
  659. ; make all open windows visible
  660.         call    mwunhideall
  661.         call    mwdisplay
  662.  
  663.  
  664.  
  665.