home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / fortran / mslang / mouse_32 / mouse.asm < prev    next >
Assembly Source File  |  1993-06-16  |  18KB  |  711 lines

  1. ;* MOUSE - Module of mouse functions. To use it, include the MOUSE.FI and
  2. ;* MOUSE.FD files in your program. The following functions are public:
  3. ;*
  4. ;*   MOUSEINIT      - Initialize mouse
  5. ;*   GETMOUSEEVENT  - Get information about most recent mouse event
  6. ;*   SETPTRVIS      - Set visibility of pointer to HIDE or SHOW
  7. ;*   SETPTRPOS      - Set position of pointer
  8. ;*   GETPTRPOS      - Get pointer position and button status
  9. ;*
  10. ;* The following structure is defined:
  11. ;*
  12. ;*   EVENT      -   Defines x, y, and mouse status of a mouse event
  13. ;*   BTN_STS    -   Defines x, y, and button status of a mouse button
  14. ;*
  15. ;* This file illustrates the most important principles of writing
  16. ;* assembler routines for 32-bit FORTRAN. These include:
  17. ;*
  18. ;*   - Use .386 and .MODEL flat to set up the appropriate instruction
  19. ;*     set and segmentation model.
  20. ;*
  21. ;*   - Declare FORTRAN routines with STDCALL attribute. Declare C
  22. ;*     routines with the C attribute. You can do this globally with
  23. ;*     .MODEL or individually on each function.
  24. ;*
  25. ;*   - If your routine uses EBX, ESI, or EDI, save the registers at
  26. ;*     routine entry and restore at exit. You will seldom need to touch
  27. ;*     segment registers, but if you do, you must save and restore.
  28. ;*     Do not modify FS or GS.
  29. ;*
  30. ;*   - You can call most DOS and BIOS interrupts. The list of supported
  31. ;*     interrupts and functions and the method of calling them is similar
  32. ;*     to that of the DOS Protected Mode Interface (DPMI). A specification
  33. ;*     for this interface is available from Intel. In summary, functions
  34. ;*     that do not pass or receive addresses are used exactly the same
  35. ;*     in 32-bit as in 16-bit. Functions that take segmented addresses
  36. ;*     in 16-bit take flat addresses in extended registers in 32-bit.
  37. ;*     For example, a function that passes an address in DS:DX in 16-bit
  38. ;*     passes an address in EDX in 32-bit.
  39.  
  40.     .386
  41.  
  42.     ; Allow fInit, fWait, and WAIT as names instead of instructions
  43.     OPTION  NOKEYWORD: <fInit fWait WAIT>
  44.  
  45.     .MODEL  flat, stdcall
  46.  
  47. ;* Internal information used by various mouse functions.
  48. MOUINFO         STRUCT
  49.  
  50.    fExist       DWORD   1
  51.    fInit        DWORD   0
  52.    fGraph       DWORD   0
  53.    xVirtual     SWORD   0
  54.    yVirtual     SWORD   0
  55.    xActual      SWORD   0
  56.    yActual      SWORD   0
  57.    xLast        SWORD   0
  58.    yLast        SWORD   0
  59.    bitBtnLast   DWORD   0
  60.    cBtn         DWORD   0
  61.  
  62. MOUINFO         ENDS
  63.  
  64. ;* Mouse event structure
  65. EVENT           STRUCT  4
  66.   x             SWORD   0
  67.   y             SWORD   0
  68.   bitBtn        DWORD   0
  69. EVENT           ENDS
  70.  
  71. ;* Mouse button states structure
  72. BTN_STS         STRUCT  4
  73.   x             SWORD   0
  74.   y             SWORD   0
  75.   Btn           SWORD   0
  76.   BtnState      SWORD   0
  77. BTN_STS         ENDS
  78.  
  79. ;* Structure for getvideoconfig from FGRAPH.FD
  80. VIDEOCONFIG     STRUCT  4
  81.   numxpixels    SWORD   0       ; number of pixels on X axis
  82.   numypixels    SWORD   0       ; number of pixels on Y axis
  83.   numtextcols   SWORD   0       ; number of text columns available
  84.   numtextrows   SWORD   0       ; number of text rows available
  85.   numcolors     SWORD   0       ; number of actual colors
  86.   bitsperpixel  SWORD   0       ; number of bits per pixel
  87.   numvideopages SWORD   0       ; number of available video pages
  88.   mode          SWORD   0       ; current video mode
  89.   adapter       SWORD   0       ; active display adapter
  90.   monitor       SWORD   0       ; active display monitor
  91.   memory        SWORD   0       ; adapter video memory in K bytes
  92. VIDEOCONFIG     ENDS
  93.  
  94. ;* Prototype for C function
  95. _getvideoconfig PROTO   C vc:PTR VIDEOCONFIG
  96.  
  97. ;* Constants for keyboard function
  98. NO_WAIT         EQU     0
  99. WAIT            EQU     1
  100. CLEAR_WAIT      EQU     2
  101.  
  102.     .DATA
  103.  
  104. ;* Mouse information variable with mouse exist initialized to 1
  105. mi      MOUINFO <1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0>
  106.  
  107.     .CODE
  108.  
  109. ;* MOUSEINIT - Initialize mouse and turns on mouse pointer. Initializes
  110. ;* all internal variables used by other mouse functions. This function
  111. ;* should be called whenever a new video mode is set, since internal
  112. ;* variables are mode-dependent.
  113. ;*
  114. ;* Params: none
  115. ;*
  116. ;* Return: 0 if no mouse available, otherwise number of buttons available
  117.  
  118. MOUSEINIT PROC USES ebx
  119.  
  120.     LOCAL vc:VIDEOCONFIG
  121.     LOCAL pMode:PTR CHAR
  122.  
  123.     ; Call graphics function to get configuration information
  124.     INVOKE  _getvideoconfig,
  125.         ADDR vc
  126.  
  127.     mov     mi.fInit, 1     ; We have called initialize
  128.     sub     eax, eax        ; Mouse function 0, reset mouse
  129.     mov     ebx, eax
  130.     mov     mi.cBtn, eax    ; Assume no mouse buttons
  131.     int     33h
  132.     mov     mi.fExist, eax  ; Set existence flag for future calls
  133.     or      ax, ax          ; If AX = 0, there is no mouse
  134.     jz      nomouse
  135.     mov     mi.cBtn, ebx    ; Save number of mouse buttons for return
  136. nomouse:
  137.  
  138.     .IF !mi.fExist
  139.         sub eax, eax        ; Return 0 if no mouse
  140.         ret
  141.     .ENDIF
  142.  
  143.  
  144.     ; Set graphics flag.
  145.     .IF vc.numxpixels
  146.         mov     mi.fGraph, 1
  147.         mov     ax, vc.numypixels
  148.         dec     ax
  149.         mov     mi.yActual, ax
  150.         mov     ax, vc.numxpixels
  151.         dec     ax
  152.         mov     mi.xActual, ax
  153.     .ELSE
  154.         mov mi.fGraph, 0
  155.     .ENDIF
  156.  
  157.     ; The mouse works on a virtual screen of 640 x pixels by
  158.     ; (8 * textrows) vertical pixels. By default, it assumes
  159.     ; 640 x 200 for 25-line mode. You must call function 8 to
  160.     ; adjust for other screen sizes.
  161.  
  162.     mov     mi.xVirtual, 639
  163.     .IF mi.fGraph
  164.         ; mi.yVirtual = vc.numypixels - 1;
  165.         mov     ax, vc.numypixels
  166.         dec     ax
  167.         mov     mi.yVirtual, ax
  168.     .ELSE
  169.         ; mi.yVirtual = (vc.numtextrows SHL 3) - 1;
  170.         mov     ax, vc.numtextrows
  171.         shl     ax, 3
  172.         dec     ax
  173.         mov     mi.yVirtual, ax
  174.     .ENDIF
  175.  
  176.     sub     ebx, ebx        ; Clear high word
  177.     mov     eax, 8          ; Set minimum and maximum vertical
  178.     sub     ecx, ecx        ; Minimum is 0
  179.     mov     dx, mi.yVirtual ; Maximum is 8 * rows (or rows SHL 3)
  180.     int     33h             ; Adjust for 25, 30, 43, 50, or 60 lines
  181.  
  182.     mov     ax, 1           ; Turn on mouse pointer
  183.     int     33h
  184.  
  185.     mov     ax, 3           ; Get initial position and button status
  186.     int     33h
  187.     mov     mi.xLast, cx    ; Save internally
  188.     mov     mi.yLast, dx
  189.     mov     mi.bitBtnLast, ebx
  190.  
  191.     mov     eax, mi.cBtn    ; Return the number of mouse buttons
  192.  
  193.     ret
  194.  
  195. MOUSEINIT ENDP
  196.  
  197.  
  198. ;* GETMOUSEEVENT - Check to see if there has been a change in the state since
  199. ;* the last call to mouse event. If event occurred, update event structure.
  200. ;*
  201. ;* Changes detected are: new mouse position and changes in the state of one
  202. ;* of the buttons (if a button had been depressed at the time getmouseevent
  203. ;* was called and is releasd at the next call, the button state changed).
  204. ;*
  205. ;* Note: It will NOT detect a button click that happend between calls to
  206. ;* getmouseevent; use GetButtonPress instead.
  207. ;*
  208. ;* Params: pEvent - Pointer to event structure
  209. ;*
  210. ;* Return: 1 if event, 0 if no event; and may put current position in pEvent
  211.  
  212. GETMOUSEEVENT PROC USES ebx,
  213.     pEvent:PTR EVENT
  214.  
  215.     LOCAL rtn:DWORD
  216.  
  217.     ; Make sure that mouse is initialized and exists.
  218.     .IF !mi.fInit
  219.         INVOKE      MOUSEINIT
  220.     .ENDIF
  221.  
  222.     .IF !mi.fExist
  223.         sub    eax, eax     ; Return 0
  224.         ret
  225.     .ENDIF
  226.  
  227.     sub     ebx, ebx        ; Clear high word
  228.     mov     ax, 3           ; Get Mouse position and button status
  229.     int     33h
  230.     sub     eax, eax        ; Assume no event
  231.  
  232.     cmp     cx, mi.xLast    ; Has column changed?
  233.     jne     isevent
  234.     cmp     dx, mi.yLast    ; Has row changed?
  235.     jne     isevent
  236.     cmp     ebx, mi.bitBtnLast  ; Has button changed?
  237.     je      noevent
  238. isevent:
  239.     mov     eax, 1          ; If something changed, event occurred
  240.     mov     mi.xLast, cx    ; Update internal variables
  241.     mov     mi.yLast, dx
  242.     mov     mi.bitBtnLast, ebx
  243. noevent:
  244.     mov     rtn, eax         ; Set return value
  245.  
  246.     ; If event, put adjusted values in structure.
  247.     .IF eax
  248.  
  249.         ; If graphics mode, adjust virtual mouse position to actual
  250.         ; screen coordinates.
  251.  
  252.         .IF mi.fGraph
  253.  
  254.         ; pEvent.x = (mi.xLast * mi.xActual) / mi.xVirtual;
  255.         sub     edx, edx
  256.         movzx   eax, mi.xLast
  257.         movzx   ecx, mi.xActual
  258.         mul     ecx
  259.  
  260.         movzx   ecx, mi.xVirtual
  261.         div     ecx
  262.  
  263.         mov     ecx, pEvent
  264.         mov     (EVENT PTR [ecx]).x, ax
  265.  
  266.         ; pEvent.y = (mi.yLast * mi.yActual) / mi.yVirtual;
  267.  
  268.         movzx   eax, mi.yLast
  269.         movzx   ecx, mi.yActual
  270.         mul     ecx
  271.  
  272.         movzx   ecx, mi.yVirtual
  273.         div     ecx
  274.  
  275.         mov     ecx, pEvent
  276.         mov     [ecx].EVENT.y, ax
  277.  
  278.         ; If text mode, adjust virtual mouse position to 1-based
  279.         ; row/column.
  280.         .ELSE
  281.  
  282.         ; pEvent.x = (mi.xLast SHR 3) + 1;
  283.         movzx   eax, mi.xLast
  284.         shr     eax, 3
  285.         inc     eax
  286.  
  287.         mov     ecx, pEvent
  288.         mov     [ecx].EVENT.x, ax
  289.  
  290.         ; pEvent.y = (mi.yLast SHR 3) + 1;
  291.  
  292.         movzx   eax, mi.yLast
  293.         shr     eax, 3
  294.         inc     eax
  295.  
  296.         mov     ecx, pEvent
  297.         mov     [ecx].EVENT.y, ax
  298.  
  299.         .ENDIF
  300.  
  301.         ; pEvent.bitBtn = mi.bitBtnLast;
  302.  
  303.         mov     eax, mi.bitBtnLast
  304.         mov     [ecx].EVENT.bitBtn, eax
  305.  
  306.     .ENDIF
  307.     mov     eax, rtn
  308.     ret
  309.  
  310. GETMOUSEEVENT ENDP
  311.  
  312.  
  313.  
  314. ;* GETPTRPOS - Get mouse pointer position and button status regardless of
  315. ;* whether there was an event.
  316. ;*
  317. ;* Params: pEvent - Pointer to event structure
  318. ;*
  319. ;* Return: 0 if no mouse, otherwise 1 (ignored by FORTRAN)
  320.  
  321. GETPTRPOS PROC USES ebx,
  322.     pEvent:PTR EVENT
  323.  
  324.     ; Make sure that mouse is initialized and exists.
  325.     .IF !mi.fInit
  326.         INVOKE MOUSEINIT
  327.     .ENDIF
  328.  
  329.     .IF !mi.fExist
  330.         sub     eax, eax
  331.         ret
  332.     .ENDIF
  333.  
  334.     sub     ebx, ebx        ; Clear upper word
  335.     mov     ax, 3           ; Get Mouse position and button status
  336.     int     33h
  337.     mov     eax, pEvent
  338.     mov     (EVENT PTR [eax]).x, cx
  339.     mov     (EVENT PTR [eax]).y, dx
  340.     mov     (EVENT PTR [eax]).bitBtn, ebx
  341.  
  342.     ; If graphics mode, adjust virtual mouse position to actual
  343.     ; screen coordinates.
  344.     .IF mi.fGraph
  345.  
  346.         ; pEvent.x = (pEvent.x * mi.xActual) / mi.xVirtual;
  347.  
  348.         sub     edx, edx
  349.  
  350.         mov     ecx, pEvent
  351.         movzx   ecx, (EVENT PTR [ecx]).x
  352.         movzx   eax, mi.xActual
  353.         mul     ecx
  354.  
  355.         movzx   ecx, mi.xVirtual
  356.         div     ecx
  357.  
  358.         mov     ecx, pEvent
  359.         mov     (EVENT PTR [ecx]).x, ax
  360.  
  361.         ; pEvent.y = (pEvent.y * mi.yActual) / mi.yVirtual;
  362.  
  363.         mov     ecx, pEvent
  364.         movzx   ecx, (EVENT PTR [ecx]).y
  365.         movzx   eax, mi.yActual
  366.         mul     ecx
  367.  
  368.         movzx   ecx, mi.yVirtual
  369.         div     ecx
  370.  
  371.         mov     ecx, pEvent
  372.         mov     [ecx].EVENT.y, ax
  373.  
  374.  
  375.     ; If text mode, adjust virtual mouse position to 1-based
  376.     ; row/column.
  377.     .ELSE
  378.  
  379.         ; pEvent.x = pEvent.x SHR 3
  380.         ; pEvent.x = pEvent.x + 1
  381.  
  382.         mov     ecx, pEvent
  383.         movzx   eax, (EVENT PTR pEvent[ecx]).x
  384.         shr     eax, 3
  385.         inc     eax
  386.         mov     (EVENT PTR pEvent[ecx]).x, ax
  387.  
  388.         ; pEvent.y = pEvent.y SHR 3
  389.         ; pEvent.y = pEvent.y + 1
  390.  
  391.         movzx   eax, (EVENT PTR pEvent[ecx]).y
  392.         shr     eax, 3
  393.         inc     eax
  394.         mov     (EVENT PTR pEvent[ecx]).y, ax
  395.  
  396.     .ENDIF
  397.  
  398.     mov     eax, 1
  399.  
  400.     ret
  401.  
  402. GETPTRPOS ENDP
  403.  
  404.  
  405.  
  406. ;* SETPTRPOS - Set mouse pointer position.
  407. ;*
  408. ;* Params: x - column position in text modes, actual x coordinate in graphics
  409. ;*         y - row position in text modes, actual y coordinate in graphics
  410. ;*
  411. ;* Return: 0 if no mouse, otherwise 1 (ignored by FORTRAN)
  412.  
  413. SETPTRPOS PROC,
  414.     x:DWORD,
  415.     y:DWORD
  416.  
  417.     ; Make sure that mouse is initialized and exists.
  418.     .IF !mi.fInit
  419.         INVOKE MOUSEINIT
  420.     .ENDIF
  421.  
  422.     .IF !mi.fExist
  423.         sub    eax, eax
  424.         ret
  425.     .ENDIF
  426.  
  427.     ; If graphics, adjust actual coordinates to virtual coordinates.
  428.     .IF mi.fGraph
  429.  
  430.         ; x = (x * mi.xActual) / mi.xVirtual;
  431.         sub     edx, edx
  432.         movzx   eax, mi.xActual
  433.         mul     x
  434.         movzx   ecx, mi.xVirtual
  435.         div     ecx
  436.         mov     x, eax
  437.  
  438.         ; y = (y * mi.yActual) / mi.yVirtual;
  439.         movzx   eax, mi.yActual
  440.         mul     y
  441.         movzx   ecx, mi.yVirtual
  442.         div     ecx
  443.         mov     y, eax
  444.  
  445.     ; If text, adjust row/column to 0-based virtual coordinates.
  446.     .ELSE
  447.  
  448.         ; x = x - 1
  449.         ; x = x SHL 3
  450.         dec    x
  451.         shl    x, 3
  452.  
  453.         ; y = y - 1
  454.         ; y = x SHL 3
  455.         dec    y
  456.         shl    y, 3
  457.  
  458.     .ENDIF
  459.  
  460.     mov     ax, 4               ; Set mouse position
  461.     mov     ecx, x
  462.     mov     edx, y
  463.     int     33h
  464.  
  465.     mov     eax, 1
  466.     ret
  467.  
  468. SETPTRPOS ENDP
  469.  
  470.  
  471.  
  472. ;* GETBUTTONPRESS - Get button press status and mouse pointer position at the
  473. ;* time the button was last pressed. 
  474. ;*
  475. ;* Params: btns - Pointer to button states structure
  476. ;*         btns.Btn  - select button: left 0, right 1, middle 2 (if any)
  477. ;*
  478. ;* Return: 0 if no mouse, otherwise number of button presses for selected button
  479. ;*             since last call to GETBUTTONPRESS
  480. ;*         btns.x,btns.y  - is the position of the last button press
  481. ;*         btns.BtnState
  482.  
  483. GETBUTTONPRESS PROC USES ebx,
  484.     btns:PTR BTN_STS
  485.  
  486.     LOCAL rtn:DWORD
  487.  
  488.     ; Make sure that mouse is initialized and exists.
  489.     .IF !mi.fInit
  490.         INVOKE MOUSEINIT
  491.     .ENDIF
  492.  
  493.     .IF !mi.fExist
  494.         sub     eax, eax
  495.         ret
  496.     .ENDIF
  497.  
  498.     mov     eax, btns
  499.     movzx   ebx, [eax].BTN_STS.Btn ;select button
  500.     mov     ax, 5            ; Get selected button's press status and position
  501.     int     33h
  502.     mov     rtn, ebx         ; Set return value (number of times button pressed)
  503.     mov     ebx, btns
  504.     mov     [ebx].BTN_STS.x, cx   ; position of last button press
  505.     mov     [ebx].BTN_STS.y, dx
  506.     mov     [ebx].BTN_STS.BtnState, ax
  507.     mov     [ebx].BTN_STS.y, dx
  508.  
  509.     ; If graphics mode, adjust virtual mouse position to actual
  510.     ; screen coordinates.
  511.     .IF mi.fGraph
  512.  
  513.         ; btns.x = (btns.x * mi.xActual) / mi.xVirtual;
  514.  
  515.         sub     edx, edx
  516.  
  517.         mov     ecx, btns
  518.         movzx   ecx, [ecx].BTN_STS.x
  519.         movzx   eax, mi.xActual
  520.         mul     ecx
  521.  
  522.         movzx   ecx, mi.xVirtual
  523.         div     ecx
  524.  
  525.         mov     ecx, btns
  526.         mov     [ecx].BTN_STS.x, ax
  527.  
  528.         ; btns.y = (btns.y * mi.yActual) / mi.yVirtual;
  529.  
  530.         mov     ecx, btns
  531.         movzx   ecx, [ecx].BTN_STS.y
  532.         movzx   eax, mi.yActual
  533.         mul     ecx
  534.  
  535.         movzx   ecx, mi.yVirtual
  536.         div     ecx
  537.  
  538.         mov     ecx, btns
  539.         mov     [ecx].BTN_STS.y, ax
  540.  
  541.  
  542.     ; If text mode, adjust virtual mouse position to 1-based
  543.     ; row/column.
  544.     .ELSE
  545.  
  546.         ; btns.x = btns.x SHR 3
  547.         ; btns.x = btns.x + 1
  548.  
  549.         mov     ecx, btns
  550.         movzx   eax, [ecx].BTN_STS.x
  551.         shr     eax, 3
  552.         inc     eax
  553.         mov     [ecx].BTN_STS.x, ax
  554.  
  555.         ; btns.y = btns.y SHR 3
  556.         ; btns.y = btns.y + 1
  557.  
  558.         movzx   eax, [ecx].BTN_STS.y
  559.         shr     eax, 3
  560.         inc     eax
  561.         mov     [ecx].BTN_STS.y, ax
  562.  
  563.     .ENDIF
  564.  
  565.     mov     eax, rtn
  566.  
  567.     ret
  568.  
  569. GETBUTTONPRESS ENDP
  570.  
  571.  
  572.  
  573. ;* GETBUTTONRELEASE - Get button release status and mouse pointer position at the
  574. ;* time the button was last released. 
  575. ;*
  576. ;* Params: btns - Pointer to button states structure
  577. ;*         btns.Btn  - select button: left 0, right 1, middle 2 (if any)
  578. ;*
  579. ;* Return: 0 if no mouse, otherwise number of button releases for selected button
  580. ;*             since last call to GETBUTTONRELEASE
  581. ;*         btns.x,btns.y  - is the position of the last button release
  582. ;*         btns.BtnState
  583.  
  584. GETBUTTONRELEASE PROC USES ebx,
  585.     btns:PTR BTN_STS
  586.  
  587.     LOCAL rtn:DWORD
  588.  
  589.     ; Make sure that mouse is initialized and exists.
  590.     .IF !mi.fInit
  591.         INVOKE MOUSEINIT
  592.     .ENDIF
  593.  
  594.     .IF !mi.fExist
  595.         sub     eax, eax
  596.         ret
  597.     .ENDIF
  598.  
  599.     mov     eax, btns
  600.     movzx   ebx, [eax].BTN_STS.Btn ;select button
  601.     mov     ax, 6            ; Get selected button's release status and position
  602.     int     33h
  603.     mov     rtn, ebx         ; Set return value (number of times button released)
  604.     mov     ebx, btns
  605.     mov     [ebx].BTN_STS.x, cx   ; position of last button release
  606.     mov     [ebx].BTN_STS.y, dx
  607.     mov     [ebx].BTN_STS.BtnState, ax
  608.     mov     [ebx].BTN_STS.y, dx
  609.  
  610.     ; If graphics mode, adjust virtual mouse position to actual
  611.     ; screen coordinates.
  612.     .IF mi.fGraph
  613.  
  614.         ; btns.x = (btns.x * mi.xActual) / mi.xVirtual;
  615.  
  616.         sub     edx, edx
  617.  
  618.         mov     ecx, btns
  619.         movzx   ecx, [ecx].BTN_STS.x
  620.         movzx   eax, mi.xActual
  621.         mul     ecx
  622.  
  623.         movzx   ecx, mi.xVirtual
  624.         div     ecx
  625.  
  626.         mov     ecx, btns
  627.         mov     [ecx].BTN_STS.x, ax
  628.  
  629.         ; btns.y = (btns.y * mi.yActual) / mi.yVirtual;
  630.  
  631.         mov     ecx, btns
  632.         movzx   ecx, [ecx].BTN_STS.y
  633.         movzx   eax, mi.yActual
  634.         mul     ecx
  635.  
  636.         movzx   ecx, mi.yVirtual
  637.         div     ecx
  638.  
  639.         mov     ecx, btns
  640.         mov     [ecx].BTN_STS.y, ax
  641.  
  642.  
  643.     ; If text mode, adjust virtual mouse position to 1-based
  644.     ; row/column.
  645.     .ELSE
  646.  
  647.         ; btns.x = btns.x SHR 3
  648.         ; btns.x = btns.x + 1
  649.  
  650.         mov     ecx, btns
  651.         movzx   eax, [ecx].BTN_STS.x
  652.         shr     eax, 3
  653.         inc     eax
  654.         mov     [ecx].BTN_STS.x, ax
  655.  
  656.         ; btns.y = btns.y SHR 3
  657.         ; btns.y = btns.y + 1
  658.  
  659.         movzx   eax, [ecx].BTN_STS.y
  660.         shr     eax, 3
  661.         inc     eax
  662.         mov     [ecx].BTN_STS.y, ax
  663.  
  664.     .ENDIF
  665.  
  666.     mov     eax, rtn
  667.  
  668.     ret
  669.  
  670. GETBUTTONRELEASE ENDP
  671.  
  672.  
  673.  
  674. ;* SETPTRVIS - Set pointer visibility.
  675. ;*
  676. ;* Params: state - SHOW or HIDE
  677. ;*
  678. ;* Return: 0 if no mouse or invalid range, otherwise 1 (ignored by FORTRAN)
  679.  
  680. SETPTRVIS PROC,
  681.     pv:DWORD
  682.  
  683.     ; Make sure that mouse is initialized and exists.
  684.     .IF !mi.fInit
  685.         INVOKE MOUSEINIT
  686.     .ENDIF
  687.  
  688.     .IF !mi.fExist
  689.         sub    eax, eax
  690.         ret
  691.     .ENDIF
  692.  
  693.     mov     eax, pv         ; Show or hide mouse pointer
  694.     cmp     eax, 1
  695.     jb      EExit
  696.     cmp     eax, 2
  697.     ja      EExit
  698.     int     33h
  699.     mov     eax, 1
  700. Exit:
  701.     ret
  702. EExit:
  703.     sub     eax, eax
  704.     jmp     Exit
  705.  
  706. SETPTRVIS ENDP
  707.  
  708.  
  709.         END
  710.  
  711.