home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / QBAS / WNDTOOL5.ZIP / MOUSE.ASM < prev    next >
Assembly Source File  |  1989-06-29  |  23KB  |  716 lines

  1. ;TITLE: MOUSE.ASM
  2.  
  3. MOUSE       EQU 33H
  4. CURSOR_ON   EQU 0001
  5. CURSOR_OFF  EQU 0002
  6. FALSE       EQU 0
  7. TRUE        EQU NOT FALSE
  8. PRESSED     EQU TRUE
  9. NOT_PRESSED EQU FALSE
  10.  
  11. BASIC_SETUP MACRO
  12.               PUSH    BP
  13.               MOV     BP,SP
  14.  
  15.               PUSH    AX
  16.               PUSH    BX
  17.               PUSH    CX
  18.               PUSH    DX
  19.  
  20.               PUSH    SI
  21.               PUSH    DI
  22.               PUSH    DS
  23.               PUSH    ES
  24.               ENDM
  25.  
  26. BASIC_CLEANUP MACRO
  27.               CLD
  28.               POP     ES
  29.               POP     DS
  30.               POP     DI
  31.               POP     SI
  32.               POP     DX
  33.               POP     CX
  34.               POP     BX
  35.               POP     AX
  36.               POP     BP
  37.               ENDM
  38.  
  39. ;
  40. ;CODE      SEGMENT BYTE PUBLIC ;CODE;
  41. ;          ASSUME CS:CODE
  42.  
  43.         DOSSEG                  ;requires MASM 5.0 or higher
  44.         .MODEL  medium
  45.  
  46. ;       Define all publicly accessible routines.
  47.           PUBLIC MMCHECK
  48.           PUBLIC MMCURSORON
  49.           PUBLIC MMCURSOROFF
  50.           PUBLIC MMCLICK
  51.           PUBLIC MMButtonPress
  52.           PUBLIC MMButtonRelease
  53.           PUBLIC MMBUTTON
  54.           PUBLIC MMGETLOC
  55.           PUBLIC MMGETLOCINFO
  56.           PUBLIC MMSETLOC
  57.           PUBLIC MMSETRANGE
  58.  
  59.           .CODE
  60.  
  61. ;
  62. ;
  63. ;******************************************************************************
  64. ;*      THIS CALL MUST BE MADE BEFORE ANY OTHER MOUSE CALLS WILL FUNCTION     *
  65. ;******************************************************************************
  66. ;
  67. ; BASIC: CALL MMCHECK(MOUSE%)
  68. ;
  69. ; FUNCTION=0
  70. ;
  71. ;          CHECK FOR AN INSTALLED MOUSE, RESET THE MOUSE, INITIALIZE ALL MOTION
  72. ;          COUNTERS AND SET MOUSE TO CENTER POSITION.
  73. ;
  74. ;        ENTRY PARAMETERS:
  75. ;                         AH=0    (INITIALIZE/RESET MOUSE)
  76. ;
  77. ;        EXIT PARAMETERS :
  78. ;
  79. ;                         AX = 0  IF NO MOUSE INSTALLED
  80. ;                         BX = NUMBER OF BUTTONS ON THE MOUSE
  81. ;
  82. ;
  83. MMCHECK       PROC    FAR
  84.  
  85.               BASIC_SETUP
  86.  
  87.               XOR     AX,AX                     ;POINT TO MEMORY SEGMENT 0
  88.               MOV     ES,AX
  89.  
  90.               XOR     BX,BX
  91.  
  92.               MOV     SI,MOUSE*4h               ;CALCULATE MOUSE INTERRUPT OFFSET
  93.  
  94.               CMP     AX,ES:[SI+2]              ;HAS A MOUSE HANDLER BEEN INSTALLED
  95.               JNZ     _MOUSE_INITIALIZE
  96.  
  97.               CMP     AX,ES:[SI]
  98.               JZ      _MOUSE_NOT_FOUND          ;SEGMENT:OFFSET WAS ALL ZEROS (NO MOUSE DRIVER)
  99.  
  100. _MOUSE_INITIALIZE:
  101.               INT     MOUSE
  102.  
  103.               OR      AX,AX                     ;WAS A MOUSE FOUND?
  104.               JNZ     _MOUSE_FOUND              ;yes!
  105.  
  106. _MOUSE_NOT_FOUND:
  107.               MOV     BX,0                      ;INDICATE MOUSE NOT FOUND
  108. _MOUSE_FOUND:
  109.               MOV     SI,[BP+6]                 ;RETURN THE NUMBER OF MOUSE BUTTONS
  110.               MOV     [SI],BX
  111.  
  112.               MOV     CS:_MOUSE,BX              ;SAVE THE NUMBER OF MOUSE BUTTONS FOUND
  113.  
  114.               BASIC_CLEANUP
  115.  
  116. MMCHECK_EXIT:
  117.               RET     2d
  118.  
  119. MMCHECK       ENDP
  120.  
  121. ;
  122. ;
  123. ;
  124. ; BASIC: CALL MMCURSORON
  125. ;
  126. ; FUNCTION=1
  127. ;
  128. ;        IF THE CURSOR IS OFF,THE CURSOR WILL STILL FOLLOW THE MOUSES
  129. ;        MOVEMENTS, BUT THE CURSOR WILL NOT BE SEEN UNTIL TURNED ON.
  130. ;
  131. ;        ENTRY PARAMETERS:
  132. ;
  133. ;                         AH=1    (TURN MOUSE CURSOR ON)
  134. ;
  135. ;        EXIT PARAMETERS :
  136. ;
  137. ;
  138. MMCURSORON    PROC    FAR
  139.               CMP     CS:_MOUSE,0               ;IS A MOUSE INSTALLED AND INITIALIZED
  140.               JZ      MMCURSORON_EXIT           ;NO
  141.  
  142.               BASIC_SETUP
  143.  
  144.               MOV     AX,CURSOR_ON
  145.               MOV     AX,0001H
  146.               INT     MOUSE
  147.  
  148.               BASIC_CLEANUP
  149.  
  150. MMCURSORON_EXIT:
  151.               RET
  152.  
  153. MMCURSORON    ENDP
  154.  
  155. ;
  156. ;
  157. ; BASIC: CALL MMCURSOROFF
  158. ;
  159. ; FUNCTION=2
  160. ;
  161. ;        HIDE THE DISPLAY CURSOR. THE CURSOR WILL STILL FOLLOW THE MOUSES
  162. ;        MOVEMENTS, BUT THE CURSOR WILL NOT BE SEEN.
  163. ;
  164. ;        ENTRY PARAMETERS:
  165. ;
  166. ;                         AH=2    (TURN MOUSE CURSOR OFF)
  167. ;
  168. ;        EXIT PARAMETERS :
  169. ;
  170. ;
  171. ;
  172. MMCURSOROFF   PROC    FAR
  173.               CMP     CS:_MOUSE,0               ;IS A MOUSE INSTALLED AND INITIALIZED
  174.               JZ      MMCURSOROFF_EXIT          ;NO
  175.  
  176.               BASIC_SETUP
  177.  
  178.               MOV     AX,CURSOR_OFF
  179.               MOV     AX,0002H
  180.               INT     MOUSE
  181.  
  182.               BASIC_CLEANUP
  183.  
  184. MMCURSOROFF_EXIT:
  185.               RET
  186.  
  187. MMCURSOROFF   ENDP
  188.  
  189.  
  190. ;
  191. ;
  192. ; BASIC: CALL MMGETLOC(COL%,ROW%)
  193. ;
  194. ; FUNCTION=3
  195. ;
  196. ;        ENTRY PARAMETERS:
  197. ;
  198. ;                         AH=3    (GET CURRENT MOUSE CURSOR LOCATION)
  199. ;
  200. ;        EXIT PARAMETERS :
  201. ;
  202. ;                         BX = BUTTON STATUS FOR ALL BUTTONS (BIT SET=PRESSED)
  203. ;                         CX = X COORDINATE
  204. ;                         DX = Y COORDINATE
  205. ;
  206. ;
  207. ;        NOTE: THE 'X' CO-ORDINATE IS A VALUE FROM 0-639 (COLUMN) AND THE
  208. ;             'Y' CO-ORDINATE (ROW) IS A VALUE FROM 0-199. TO 'NORMALIZE'
  209. ;             THE CO-ORDINATE VALUES FOR A 80X25 TEXT SCREEN, DIVIDE EACH
  210. ;             VALUE BY 8. IF YOU ARE IN LOW RES GRAPHICS , DIVIDE BY 2.
  211. ;             IF YOU ARE IN HIGH RES GRAPHICS , THE VALUES ARE FINE.
  212. ;
  213. ;        NOTE: THE BUTTON STATUS WORD RETURNS THE PRESSED STATUS FOR ALL
  214. ;             BUTTONS. EACH BIT IN THE WORD CORRESPONDS TO ONE BUTTON:
  215. ;             (BIT 0=1ST BUTTON, BIT 1=SECOND BUTTON..ETC).
  216. ;             IF A BIT IS SET (1)  THEN ITS ASSOCIATED BUTTON IS CURRENTLY
  217. ;             PRESSED DOWN.
  218. ;
  219. ;
  220. MMGETLOC      PROC    FAR
  221.               CMP     CS:_MOUSE,0               ;IS A MOUSE INSTALLED AND INITIALIZED
  222.               JZ      MMGETLOC_EXIT             ;NO
  223.  
  224.               BASIC_SETUP
  225.  
  226.               MOV     AX,0003H
  227.               INT     MOUSE
  228.  
  229.               MOV     SI,[BP+8]                 ;RETURN THE 'X' CO-ORDINATE  (COLUMN)
  230.               MOV     [SI],CX
  231.  
  232.               MOV     SI,[BP+6]                 ;RETURN THE 'Y' COORDINATE   (ROW)
  233.               MOV     [SI],DX
  234.  
  235.               BASIC_CLEANUP
  236.  
  237. MMGETLOC_EXIT:
  238.               RET     4d
  239.  
  240. MMGETLOC      ENDP
  241.  
  242. ;
  243. ;
  244. ; BASIC: CALL MMGETLOCINFO(BUTTONS%,COL%,ROW%)
  245. ;
  246. ; FUNCTION=3
  247. ;
  248. ;        ENTRY PARAMETERS:
  249. ;
  250. ;                         AH=3    (GET CURRENT MOUSE CURSOR LOCATION)
  251. ;
  252. ;        EXIT PARAMETERS :
  253. ;
  254. ;                         BX = BUTTON STATUS FOR ALL BUTTONS (BIT SET=PRESSED)
  255. ;                         CX = X COORDINATE
  256. ;                         DX = Y COORDINATE
  257. ;
  258. ;
  259. ;        NOTE: THE 'X' CO-ORDINATE IS A VALUE FROM 0-639 (COLUMN) AND THE
  260. ;             'Y' CO-ORDINATE (ROW) IS A VALUE FROM 0-199. TO 'NORMALIZE'
  261. ;             THE CO-ORDINATE VALUES FOR A 80X25 TEXT SCREEN, DIVIDE EACH
  262. ;             VALUE BY 8. IF YOU ARE IN LOW RES GRAPHICS , DIVIDE BY 2.
  263. ;             IF YOU ARE IN HIGH RES GRAPHICS , THE VALUES ARE FINE.
  264. ;
  265. ;        NOTE: THE BUTTON STATUS WORD RETURNS THE PRESSED STATUS FOR ALL
  266. ;             BUTTONS. EACH BIT IN THE WORD CORRESPONDS TO ONE BUTTON:
  267. ;             (BIT 0=1ST BUTTON, BIT 1=SECOND BUTTON..ETC).
  268. ;             IF A BIT IS SET (1)  THEN ITS ASSOCIATED BUTTON IS CURRENTLY
  269. ;             PRESSED DOWN.
  270. ;
  271. ;
  272. MMGETLOCINFO  PROC    FAR
  273.               CMP     CS:_MOUSE,0               ;IS A MOUSE INSTALLED AND INITIALIZED
  274.               JZ      MMGETLOCINFO_EXIT         ;NO
  275.  
  276.               BASIC_SETUP
  277.  
  278.               MOV     AX,0003H
  279.               INT     MOUSE
  280.  
  281.               MOV     SI,[BP+0AH]                 ;RETURN THE BUTTONS PRESSED STATUS
  282.               MOV     [SI],BX
  283.  
  284.               MOV     SI,[BP+08H]                 ;RETURN THE 'X' CO-ORDINATE  (COLUMN)
  285.               MOV     [SI],CX
  286.  
  287.               MOV     SI,[BP+6H]                 ;RETURN THE 'Y' COORDINATE   (ROW)
  288.               MOV     [SI],DX
  289.  
  290.  
  291.               BASIC_CLEANUP
  292.  
  293. MMGETLOCINFO_EXIT:
  294.               RET     6d
  295.  
  296. MMGETLOCINFO  ENDP
  297.  
  298. ;
  299. ;
  300. ;
  301. ; BASIC: CALL MMSETLOC(COL%,ROW%)
  302. ;
  303. ; FUNCTION=4
  304. ;
  305. ;        ENTRY PARAMETERS:
  306. ;
  307. ;                         AH=4    (SET CURRENT MOUSE CURSOR LOCATION)
  308. ;                         CX = X COORDINATE
  309. ;                         DX = Y COORDINATE
  310. ;
  311. ;        EXIT PARAMETERS :
  312. ;
  313. ;                         BX = BUTTON STATUS FOR ALL BUTTONS (BIT SET=PRESSED)
  314. ;                         CX = X COORDINATE
  315. ;                         DX = Y COORDINATE
  316. ;
  317. ;
  318. ;        NOTE: THE 'X' CO-ORDINATE IS A VALUE FROM 0-639 (COLUMN) AND THE
  319. ;             'Y' CO-ORDINATE (ROW) IS A VALUE FROM 0-199. TO 'NORMALIZE'
  320. ;             THE CO-ORDINATE VALUES FOR A 80X25 TEXT SCREEN, DIVIDE EACH
  321. ;             VALUE BY 8. IF YOU ARE IN LOW RES GRAPHICS , DIVIDE BY 2.
  322. ;             IF YOU ARE IN HIGH RES GRAPHICS , THE VALUES ARE FINE.
  323. ;
  324. ;        NOTE: THE BUTTON STATUS WORD RETURNS THE PRESSED STATUS FOR ALL
  325. ;             BUTTONS. EACH BIT IN THE WORD CORRESPONDS TO ONE BUTTON:
  326. ;             (BIT 0=1ST BUTTON, BIT 1=SECOND BUTTON..ETC).
  327. ;            IF A BIT IS SET (1)  THEN ITS ASSOCIATED BUTTON IS CURRENTLY
  328. ;             PRESSED DOWN.
  329. ;
  330. MMSETLOC      PROC    FAR
  331.               CMP     CS:_MOUSE,0               ;IS A MOUSE INSTALLED AND INITIALIZED
  332.               JZ      MMSETLOC_EXIT             ;NO
  333.  
  334.               BASIC_SETUP
  335.  
  336.               MOV     SI,[BP+8]                 ;GET THE 'X' CO-ORDINATE (COLUMN) TO SET
  337.               MOV     CX,[SI]
  338.  
  339.               MOV     SI,[BP+6]                 ;GET THE 'Y' CO-ORDINATE (ROW) TO SET
  340.               MOV     DX,[SI]
  341.  
  342.               MOV     AX,0004H
  343.               INT     MOUSE
  344.  
  345.               BASIC_CLEANUP
  346.  
  347. MMSETLOC_EXIT:
  348.               RET     4d
  349.  
  350. MMSETLOC      ENDP
  351.  
  352. ;
  353. ;
  354. ; BASIC: CALL MMCLICK(LEFT.BUTTON%,RIGHT.BUTTON%)
  355. ;
  356. ; FUNCTION=5
  357. ;
  358. ;        ENTRY PARAMETERS:
  359. ;
  360. ;                         AH=5    (GET BUTTON PRESS INFO)
  361. ;                         AL=O-?  (BUTTON NUMBER TO GET INFO FOR)
  362. ;
  363. ;        EXIT PARAMETERS :
  364. ;
  365. ;                         AX = BUTTON STATUS FOR ALL BUTTONS (BIT SET=PRESSED)
  366. ;                         BX = NUMBER OF PRESSES FOR THIS BUTTON SINCE LAST CALL
  367. ;                              (0=32768)
  368. ;                         CX = X COORDINATE AT LAST PRESS TIME
  369. ;                         DX = Y COORDINATE AT LAST PRESS TIME
  370. ;
  371. ;        NOTE: THE BUTTON STATUS WORD RETURNS THE PRESS/RELEASE STATUS FOR ALL
  372. ;             BUTTONS. EACH BIT IN THE WORD CORRESPONDS TO ONE BUTTON:
  373. ;             (BIT 0=1ST BUTTON, BIT 1=SECOND BUTTON..ETC).
  374. ;             IF A BIT IS SET (1)  THENS ITS ASSOCIATED BUTTON IS CURRENTLY
  375. ;             PRESSED DOWN.
  376. ;
  377. ;              FUNCTION 5 DOES NOT DOESN'T DETECT OVERFLOW.
  378. ;
  379. ;              THE PRESS COUNT IS RESET TO ZERO(0) AFTER EACH CALL.
  380. ;
  381. ;              THE VALUES OF THE HORIZONTAL AND VERTICAL COORDINATES ARE IN
  382. ;             IN THE RANGES DEFINED BY THE VIRTUAL SCREEN. THESE VALUES
  383. ;             REPRESENT THE CURSOR POSITION WHEN YOU LAST PRESSED THE BUTTON,
  384. ;             NOT THE CURSOR/S CURRENT POSITION.
  385. ;
  386. MMclick       PROC    FAR
  387.               CMP     CS:_MOUSE,0               ;IS A MOUSE INSTALLED AND INITIALIZED
  388.               JZ      MMclick_EXIT              ;NO
  389.  
  390.               BASIC_SETUP
  391.  
  392.               MOV     BX,0000H                  ;GET RELEASE INFO FOR BUTTON 1 (LEFT)
  393.               MOV     AX,0005H
  394.               INT     MOUSE
  395.  
  396.               MOV     SI,[BP+8]                 ;PASS BACK NUMBER OF RELEASES FOR THIS BUTTON
  397.               MOV     [SI],BX
  398.  
  399.               MOV     BX,0001H                  ;GET RELEASE INFO FOR BUTTON 2 (RIGHT)
  400.               MOV     AX,0005H
  401.               INT     MOUSE
  402.  
  403.               MOV     SI,[BP+6]                 ;PASS BACK NUMBER OF RELEASES FOR THIS BUTTON
  404.               MOV     [SI],BX
  405.  
  406.               BASIC_CLEANUP
  407.  
  408. MMclick_EXIT:
  409.               RET     4d
  410.  
  411. MMclick       ENDP
  412.  
  413. ;
  414. ;
  415. ; FUNCTION=5
  416. ;
  417. ; BASIC: CALL MMButtonPress(MMButton%,_
  418. ;                           MMButton.status%,_
  419. ;                           MMButton.presses%,_
  420. ;                           MMPress.xord%,_
  421. ;                           MMPress.yord%)
  422. ;        ENTRY PARAMETERS:
  423. ;
  424. ;                         AH=5    (GET BUTTON PRESS INFO)
  425. ;                         AL=O-?  (BUTTON NUMBER TO GET INFO FOR)
  426. ;
  427. ;        EXIT PARAMETERS :
  428. ;
  429. ;                         AX = BUTTON STATUS FOR ALL BUTTONS (BIT SET=PRESSED)
  430. ;                         BX = NUMBER OF PRESSES FOR THIS BUTTON SINCE LAST
  431. ;                              CALL (0-65535)
  432. ;                         CX = X COORDINATE AT LAST PRESS TIME
  433. ;                         DX = Y COORDINATE AT LAST PRESS TIME
  434. ;
  435. ;        NOTE: THE BUTTON STATUS WORD RETURNS THE CURRENT PRESSED/RELEASED
  436. ;             STATUS FOR ALL BUTTONS. EACH BIT IN THE WORD CORRESPONDS TO
  437. ;             ONE BUTTON: (BIT 0=1ST BUTTON, BIT 1=SECOND BUTTON..ETC).
  438. ;              IF A BIT IS SET (1)  THENS ITS ASSOCIATED BUTTON IS CURRENTLY
  439. ;             PRESSED DOWN.
  440. ;
  441. ;              FUNCTION 5 DOES NOT DOESN'T DETECT OVERFLOW.
  442. ;
  443. ;              THE PRESS COUNT IS RESET TO ZERO(0) AFTER EACH CALL.
  444. ;
  445. ;              THE VALUES OF THE HORIZONTAL AND VERTICAL COORDINATES ARE IN
  446. ;             IN THE RANGES DEFINED BY THE VIRTUAL SCREEN. THESE VALUES
  447. ;             REPRESENT THE CURSOR POSITION WHEN YOU LAST PRESSED THE BUTTON,
  448. ;             NOT THE CURSOR/S CURRENT POSITION.
  449. ;
  450. MMButtonPress PROC    FAR
  451.               BASIC_SETUP
  452.  
  453.               XOR     AX,AX                     ;SETUP IN CASE MOUSE NOT INSTALLED
  454.               XOR     BX,BX
  455.               XOR     CX,CX
  456.               XOR     DX,DX
  457.  
  458.               CMP     CS:_MOUSE,0               ;IS A MOUSE INSTALLED AND INITIALIZED
  459.               JZ      MMButtonPress_exit        ;NO
  460.  
  461.               MOV     SI,[BP+0EH]                 ;GET THE MOUSE BUTTON THAT YOU WANT CHECKED
  462.               MOV     BX,[SI]
  463.  
  464.               MOV     AX,0005H
  465.               INT     MOUSE
  466.  
  467. MMButtonPress_exit:
  468.               MOV     SI,[BP+0CH]               ;BUTTON STATUS FOR ALL BUTTONS
  469.               MOV     [SI],AX
  470.  
  471.               MOV     SI,[BP+0AH]               ;NUMBER OF RELEASES FOR THIS BUTTON
  472.               MOV     [SI],BX
  473.  
  474.               MOV     SI,[BP+08H]               ;X COORDINATE AT LAST PRESS TIME
  475.               MOV     [SI],CX
  476.  
  477.               MOV     SI,[BP+06H]               ;Y COORDINATE AT LAST PRESS TIME
  478.               MOV     [SI],DX
  479.  
  480.  
  481.               BASIC_CLEANUP
  482.  
  483.               RET     10D
  484.  
  485. MMButtonPress ENDP
  486.  
  487. ;
  488. ;
  489. ; FUNCTION=6
  490. ;
  491. ; BASIC: CALL MMButtonRelease(MMButton%,_
  492. ;                             MMButton.status%,_
  493. ;                             MMButton.releases%,_
  494. ;                             MMPress.xord%,_
  495. ;                             MMPress.yord%)
  496. ;        ENTRY PARAMETERS:
  497. ;
  498. ;                         AH=6    (GET BUTTON RELEASE INFO)
  499. ;                         AL=O-?  (BUTTON NUMBER TO GET INFO FOR)
  500. ;
  501. ;        EXIT PARAMETERS :
  502. ;
  503. ;                         AX = BUTTON STATUS FOR ALL BUTTONS (BIT SET=PRESSED)
  504. ;                         BX = NUMBER OF RELEASES FOR THIS BUTTON SINCE LAST
  505. ;                              CALL (0-65535)
  506. ;                         CX = X COORDINATE AT LAST RELEASE TIME
  507. ;                         DX = Y COORDINATE AT LAST RELEASE TIME
  508. ;
  509. ;        NOTE: THE BUTTON STATUS WORD RETURNS THE CURRENT PRESS/RELEASE STATUS
  510. ;             FOR ALL BUTTONS. EACH BIT IN THE WORD CORRESPONDS TO ONE BUTTON:
  511. ;             (BIT 0=1ST BUTTON, BIT 1=SECOND BUTTON..ETC).
  512. ;              IF A BIT IS SET (1)  THENS ITS ASSOCIATED BUTTON IS CURRENTLY
  513. ;             PRESSED DOWN.
  514. ;
  515. ;              FUNCTION 6 DOES NOT DOESN'T DETECT OVERFLOW.
  516. ;
  517. ;              THE RELEASE COUNT IS RESET TO ZERO(0) AFTER EACH CALL.
  518. ;
  519. ;              THE VALUES OF THE HORIZONTAL AND VERTICAL COORDINATES ARE IN
  520. ;             IN THE RANGES DEFINED BY THE VIRTUAL SCREEN. THESE VALUES
  521. ;             REPRESENT THE CURSOR POSITION WHEN YOU LAST RELEASED THE BUTTON,
  522. ;             NOT THE CURSOR'S CURRENT POSITION.
  523. ;
  524. MMButtonRelease PROC    FAR
  525.               BASIC_SETUP
  526.  
  527.               XOR     AX,AX                     ;SETUP IN CASE MOUSE NOT INSTALLED
  528.               XOR     BX,BX
  529.               XOR     CX,CX
  530.               XOR     DX,DX
  531.  
  532.               CMP     CS:_MOUSE,0               ;IS A MOUSE INSTALLED AND INITIALIZED
  533.               JZ      MMButtonRelease_exit      ;NO
  534.  
  535.               MOV     SI,[BP+0EH]               ;GET THE MOUSE BUTTON THAT YOU WANT CHECKED
  536.               MOV     BX,[SI]
  537.  
  538.               MOV     AX,0006H
  539.               INT     MOUSE
  540.  
  541. MMButtonRelease_exit:
  542.               MOV     SI,[BP+0CH]               ;BUTTON STATUS FOR ALL BUTTONS
  543.               MOV     [SI],AX
  544.  
  545.               MOV     SI,[BP+0AH]               ;NUMBER OF RELEASES FOR THIS BUTTON
  546.               MOV     [SI],BX
  547.  
  548.               MOV     SI,[BP+08H]               ;X COORDINATE AT LAST RELEASE TIME
  549.               MOV     [SI],CX
  550.  
  551.               MOV     SI,[BP+06H]               ;Y COORDINATE AT LAST RELEASE TIME
  552.               MOV     [SI],DX
  553.  
  554.               BASIC_CLEANUP
  555.  
  556.               RET     10D
  557.  
  558. MMButtonRelease ENDP
  559.  
  560. ;
  561. ;
  562. ;
  563. ; BASIC: CALL MMBUTTON(LEFT.BUTTON%,RIGHT.BUTTON%)
  564. ;
  565. ; FUNCTION=6
  566. ;
  567. ;
  568. ;
  569. ;        ENTRY PARAMETERS:
  570. ;
  571. ;                         AH=6    (GET BUTTON RELEASE INFO)
  572. ;                         AL=O-?  (BUTTON NUMBER TO GET INFO FOR)
  573. ;
  574. ;        EXIT PARAMETERS :
  575. ;
  576. ;                         AX = BUTTON STATUS FOR ALL BUTTONS (BIT SET=PRESSED)
  577. ;                         BX = NUMBER OF RELEASE FOR THIS BUTTON
  578. ;                              (0=32768)
  579. ;                         CX = X COORDINATE AT LAST RELEASE TIME
  580. ;                         DX = Y COORDINATE AT LAST RELEASE TIME
  581. ;
  582. ;        NOTE: THE BUTTON STATUS WORD RETURNS THE PRESSED STATUS FOR ALL
  583. ;             BUTTONS. EACH BIT IN THE WORD CORRESPONDS TO ONE BUTTON:
  584. ;             (BIT 0=1ST BUTTON, BIT 1=SECOND BUTTON..ETC).
  585. ;             IF A BIT IS SET (1)  THENS ITS ASSOCIATED BUTTON IS CURRENTLY
  586. ;             PRESSED DOWN.
  587. ;
  588. ;              FUNCTION 6 DOES NOT DOESN'T DETECT OVERFLOW.
  589. ;
  590. ;              THE RELEASE COUNT IS RESET TO ZERO(0) AFTER EACH CALL.
  591. ;
  592. ;              THE VALUES OF THE HORIZONTAL AND VERTICAL COORDINATES ARE IN
  593. ;             IN THE RANGES DEFINED BY THE VIRTUAL SCREEN. THESE VALUES
  594. ;             REPRESENT THE CURSOR POSITION WHEN YOU LAST RELEASED THE BUTTON,
  595. ;             NOT THE CURSOR'S CURRENT POSITION.
  596. ;
  597.  
  598. MMbutton      PROC    FAR
  599.               CMP     CS:_MOUSE,0               ;IS A MOUSE INSTALLED AND INITIALIZED
  600.               JZ      MMbutton_EXIT             ;NO
  601.  
  602.               BASIC_SETUP
  603.  
  604.  
  605.               XOR     BX,BX                     ;
  606.  
  607.  
  608.               MOV     AX,0006                   ;CHECK WHICH BUTTONS HAVE BEEN RELEASED
  609.               INT     MOUSE
  610.  
  611.               MOV     BX,NOT_PRESSED            ;ASSUME "FALSE" (NOT PRESSED) FOR BUTTON 1
  612.  
  613.               SHR     AX,1                      ;BUTTON 1 (LEFT PRESSED) ?
  614.               JNB     MMbutton_1                ;NO,
  615.  
  616.               MOV     BX,PRESSED                ;"TRUE" (PRESSED)
  617. MMbutton_1:
  618.               MOV     SI,[BP+8]                 ;RETURN BUTTON 1 (LEFT) PRESSED/RELEASED STATE
  619.               MOV     [SI],BX
  620.  
  621.               MOV     BX,NOT_PRESSED            ;ASSUME "FALSE" (NOT PRESSED) FOR BUTTON 2
  622.  
  623.               SHR     AX,1                      ;BUTTON 2 (RIGHT) PRESSED?
  624.               JNB     MMbutton_2                ;NO
  625.  
  626.               MOV     BX,PRESSED                ;"TRUE" (PRESSED)
  627. MMbutton_2:
  628.               MOV     SI,[BP+6]                 ;RETURN BUTTON 2 (RIGHT) PRESSED/RELEASED STATE
  629.               MOV     [SI],BX
  630.  
  631.               BASIC_CLEANUP
  632.  
  633. MMbutton_EXIT:
  634.               RET     4d
  635. MMbutton      ENDP
  636.  
  637. ;
  638. ;
  639. ; BASIC: CALL MMSETRANGE(LFTCOL%,TOPROW%,RGTCOL%,BOTROW%)
  640. ;
  641. ; FUNCTION=7 & 8
  642. ;
  643. ;        SET THE MINIMUM AND MAXIMUM VALUES FOR THE MOUSE'S 'X' AND 'Y'
  644. ;        AXIS AND ALSO SET THE GAIN VALUE FOR THE MOUSE.
  645. ;
  646. ;        ENTRY PARAMETERS:
  647. ;
  648. ;                         AH=7    (SET THE MOUSES X AND Y AXIS)
  649. ;                         CX = MINIMUM 'X' COORDINATE (UPPER LEFT COLUMN)
  650. ;                         DX = MINIMUM 'Y' COORDINATE (UPPER LEFT ROW)
  651. ;
  652. ;                         AH=8    (SET THE MOUSES X AND Y AXIS)
  653. ;                         CX = MAXIMUM 'X' COORDINATE (LOWER RIGHT COLUMN)
  654. ;                         DX = MAXIMUM 'Y' COORDINATE (LOWER RIGHT ROW)
  655. ;
  656. ;                         BX = MOUSE GAIN VALUE (0-255)
  657. ;
  658. ;        EXIT PARAMETERS :
  659. ;
  660. ;
  661. ;
  662. ;        NOTE: THE 'X' CO-ORDINATE IS A VALUE FROM 0-639 (COLUMN) AND THE
  663. ;             'Y' CO-ORDINATE (ROW) IS A VALUE FROM 0-199. TO 'NORMALIZE'
  664. ;             THE CO-ORDINATE VALUES FOR A 80X25 TEXT SCREEN, DIVIDE EACH
  665. ;             VALUE BY 8. IF YOU ARE IN LOW RES GRAPHICS , DIVIDE BY 2.
  666. ;             IF YOU ARE IN HIGH RES GRAPHICS , THE VALUES ARE FINE.
  667. ;
  668. ;
  669. ;        NOTE: IF A LARGE GAIN VALUE IS USED, VERY LITTLE MOVEMENT OF THE
  670. ;              MOUSE CAUSES A LARGE 'X' OR 'Y' CHANGE.
  671. ;
  672. MMSETRANGE    PROC    FAR
  673.               CMP     CS:_MOUSE,0               ;IS A MOUSE INSTALLED AND INITIALIZED
  674.               JZ      MMSETRANGE_EXIT           ;NO
  675.  
  676.               BASIC_SETUP
  677.  
  678. ;SET HORIZONTAL (X)
  679.               MOV     SI,[BP+0CH]               ;GET UPPER LEFT COLUMN CO-ORDINATE - "X"
  680.               MOV     CX,[SI]
  681.               MOV     SI,[BP+08H]               ;GET BOTTOM RIGHT COLUMN CO-ORDINATE - "X"
  682.               MOV     DX,[SI]
  683.  
  684.               MOV     AX,0007H                  ;SET HORIZONMTAL (X)
  685.               INT     MOUSE
  686.  
  687. ;SET VERTICLE (Y)
  688.               MOV     SI,[BP+0AH]               ;GET UPPER LEFT ROW CO-ORDINATE - "Y"
  689.               MOV     CX,[SI]
  690.               MOV     SI,[BP+06H]               ;GET BOTTOM RIGHT ROW CO-ORDINATE - "Y"
  691.               MOV     DX,[SI]
  692.  
  693.               MOV     AX,0008H                  ;SET VERTICLE (Y)
  694.               INT     MOUSE
  695.  
  696. ;SET THE GAIN VALUE
  697. ;             MOV     SI,[BP+0EH]               ;GET THE GAIN VALUE
  698. ;             MOV     BX,[SI]
  699.  
  700. ;             MOV     AX,000FH                  ;SET THE GAIN VALUE
  701. ;             INT     MOUSE
  702.  
  703.               BASIC_CLEANUP
  704.  
  705. MMSETRANGE_EXIT:
  706. ;             RET     10d                       ;IF MOUSE GAIN IMPLEMENTED
  707.               RET     8d
  708.  
  709. MMSETRANGE    ENDP
  710.  
  711.  
  712. _MOUSE        DW      0
  713.  
  714. ;CODE         ENDS
  715.               END
  716.