home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddkx86v5.zip / DDKX86 / SRC / DEV / MOUSE / SERIAL.ASM < prev    next >
Assembly Source File  |  1995-04-14  |  25KB  |  778 lines

  1. ;*DDK*************************************************************************/
  2. ;
  3. ; COPYRIGHT (C) Microsoft Corporation, 1989
  4. ; COPYRIGHT    Copyright (C) 1995 IBM Corporation
  5. ;
  6. ;    The following IBM OS/2 WARP source code is provided to you solely for
  7. ;    the purpose of assisting you in your development of OS/2 WARP device
  8. ;    drivers. You may use this code in accordance with the IBM License
  9. ;    Agreement provided in the IBM Device Driver Source Kit for OS/2. This
  10. ;    Copyright statement may not be removed.;
  11. ;*****************************************************************************/
  12.  
  13. ;/*************************************************************************
  14. ;*
  15. ;* SOURCE FILE NAME = SERIAL.ASM
  16. ;*
  17. ;* DESCRIPTIVE NAME = Serial Mouse specific code
  18. ;*
  19. ;*
  20. ;* VERSION      V2.0
  21. ;*
  22. ;* DATE         07/16/91
  23. ;*
  24. ;* DESCRIPTION  This file contains the code specific to serial
  25. ;*              mice.
  26. ;*
  27. ;*              The list of the currently known serial pointing
  28. ;*              devices that are detectible are listed below;
  29. ;*
  30. ;*              MS Serial Mouse
  31. ;*              MS BallPoint Mouse
  32. ;*              MousePen by Appoint
  33. ;*
  34. ;*              Other serial known serial pointing devices are
  35. ;*              listed below;
  36. ;*
  37. ;* NOTES         Autodetection not implemented for these
  38. ;*
  39. ;*               PC Mouse System Mouse
  40. ;*               Visi On Mouse
  41. ;*               Logitech Serial Mouse
  42. ;*               Kensignton Serial Mouse
  43. ;*
  44. ;* FUNCTIONS
  45. ;*
  46. ;*
  47. ;*
  48. ;*
  49. ;* STRUCTURES   NONE
  50. ;*
  51. ;* EXTERNAL REFERENCES
  52. ;*
  53. ;*              NONE
  54. ;*
  55. ;* EXTERNAL FUNCTIONS
  56. ;*
  57. ;*              NONE
  58. ;*
  59. ;* CHANGE ACTIVITY =
  60. ;*   DATE      FLAG        APAR   CHANGE DESCRIPTION
  61. ;*   --------  ----------  -----  --------------------------------------
  62. ;*   mm/dd/yy  @Vr.mpppxx  xxxxx  xxxxxxx
  63. ;*   04/04/93              53232  Add support for Logitech middle button
  64. ;**************************************************************************
  65.  
  66.  
  67. .xlist
  68.        include mouse.inc
  69. ;      include infoseg.inc
  70. .list
  71.  
  72. .386p
  73.  
  74. ;*
  75. ;*    External Mouse Module Data References
  76. ;*
  77.  
  78.        extrn DeviceData          : byte
  79.        extrn actvirqbit          : word
  80.        extrn gMEvent             : byte
  81.        extrn LATLSBSave          : byte
  82.        extrn LATMSBSave          : byte
  83.        extrn LCRSave             : byte
  84.        extrn MCRSave             : byte
  85.        extrn IERSave             : byte
  86.        extrn ABIOS_Mch           : byte
  87.  
  88.  
  89.        extrn oddpts              : word
  90.        extrn Int_Packet          : word
  91.        extrn PortBase            : word
  92.        extrn DevStatus           : word
  93.        extrn ByteCount           : word
  94.        extrn GDT_Seg             : word
  95.  
  96.        extrn Device_Help         : dword
  97.  
  98.        extrn SetupForWait        : near
  99.        extrn IsWaitOver          : near
  100.  
  101.        extrn GIDC_Entry          : far
  102.  
  103.        extrn _RM_MSE_AllocPorts    :far
  104.        extrn _RM_MSE_DeallocPorts  :far
  105.  
  106.  
  107. CSEG     SEGMENT   WORD  PUBLIC  USE16  'CODE'
  108.          ASSUME    CS:CSEG, SS:nothing, ES:nothing, DS:nothing
  109.  
  110. ;*
  111. ;*    Module Procs made Public for other Mouse Modules
  112. ;*
  113.  
  114.        public  CheckforMSSDevice
  115.        public  TestforMSSDevice
  116.        public  SaveCOMSetting
  117.        public  RestoreCOMSetting
  118.        public  SetupCOMForMouse
  119.        public  ResetSerialMouse
  120.        public  InitComPort
  121.  
  122.  
  123. ;/***************************************************************************
  124. ;*
  125. ;* FUNCTION NAME = CheckforMSSDevice
  126. ;*
  127. ;* DESCRIPTION   = This procedure will attempt to find a serial mouse
  128. ;*                 connected to the serial port at the given base I/O address
  129. ;*
  130. ;*
  131. ;* INPUT         =  NONE
  132. ;*
  133. ;* OUTPUT        =  carry clear     A serial mouse was found
  134. ;*                  AL              IRQ # for the mouse
  135. ;*                  BL              Bit mask giving interrupt level
  136. ;*                  DX              Base address of COM port
  137. ;*                  COM port is set up for mouse and mouse has been reset.
  138. ;*
  139. ;*                  carry set       No mouse was found
  140. ;*
  141. ;*                   ALTERS  AX, BX, CX
  142. ;*
  143. ;* RETURN-NORMAL =  NONE
  144. ;*
  145. ;*
  146. ;* RETURN-ERROR  =  NONE
  147. ;*
  148. ;* CALLS         =  TestforMSSDevice     CONTEXT = INIT.
  149. ;**************************************************************************/
  150.  
  151. CheckforMSSDevice  proc  near
  152.  
  153.         push es
  154.         mov  cx, SHORTDELAY
  155. cfmd_1:
  156.         mov  DeviceData.ComNum, 0
  157.         .repeat
  158.            push 40h
  159.            pop  es
  160.            xor  bh, bh
  161.            mov  bl, DeviceData.ComNum
  162.            shl  bx, 1
  163.            mov  dx, word ptr es:[bx]
  164.            mov  PortBase, dx
  165.            inc  DeviceData.ComNum
  166.            .if <NONZERO dx>
  167.  
  168.               pusha
  169.               push dx
  170.               call _RM_MSE_AllocPorts
  171.               or ax, ax
  172.               pop dx
  173.               popa
  174.               jnz PortCOMClaimed
  175.  
  176.               call TestforMSSDevice
  177.               jnc  cmd_exit
  178.  
  179.               pusha
  180.               call _RM_MSE_DeallocPorts
  181.               popa
  182. PortCOMClaimed:
  183.            .endif
  184.         .until <DeviceData.ComNum eq 4>
  185.  
  186. ;*
  187. ;* No response on normal BIOS com port addresses... now try others...
  188. ;*
  189.  
  190.         mov     si,offset oddpts
  191.         mov     DeviceData.ComNum,255           ;255=non-standard port address
  192.         mov     dx, word ptr [si]
  193.         .repeat
  194.            mov  PortBase, dx
  195.            .if <NONZERO dx>
  196.               pusha
  197.               push dx
  198.               call _RM_MSE_AllocPorts
  199.               or ax, ax
  200.               pop dx
  201.               popa
  202.               jnz  short PortMSSClaimed
  203.  
  204.               push si
  205.               call TestforMSSDevice
  206.               pop  si
  207.               jnc  cmd_exit
  208.  
  209.               pusha
  210.               call _RM_MSE_DeallocPorts
  211.               popa
  212. PortMSSClaimed:
  213.            .endif
  214.            add  si,2
  215.          mov     dx, word ptr [si]
  216.         .until <dx eq 0>
  217.  
  218.         .if <cx eq SHORTDELAY>
  219.            mov  cx, LONGDELAY
  220.            jmp  cfmd_1
  221.         .endif
  222.  
  223.         mov  DeviceData.ComNum, 0
  224.         stc
  225.  
  226. cmd_exit:
  227.         pop  es
  228.         ret
  229.  
  230. CheckforMSSDevice  endp
  231.  
  232. ;/***************************************************************************
  233. ;*
  234. ;* FUNCTION NAME = TestforMSSDevice
  235. ;*
  236. ;* DESCRIPTION   = This procedure will attempt to find a serial mouse
  237. ;*                 connected to the serial port at the given base I/O address.
  238. ;*
  239. ;*
  240. ;*
  241. ;*
  242. ;*
  243. ;*
  244. ;*
  245. ;*
  246. ;* INPUT         = DX              Base address of COM port to be tested
  247. ;*                 CX              Delay time between power up and power down
  248. ;*
  249. ;* OUTPUT        = carry clear     A serial mouse was found
  250. ;*                 AL              IRQ # for the mouse
  251. ;*                 BL              Bit mask giving interrupt level
  252. ;*                 DX              Base address of COM port
  253. ;*                 COM port is set up for mouse and mouse has been reset.
  254. ;*
  255. ;*                 carry set       No mouse was found
  256. ;*
  257. ;*                 ALTERS  AX, BX, CX
  258. ;*
  259. ;* RETURN-NORMAL = NONE.
  260. ;*
  261. ;*
  262. ;* RETURN-ERROR  = NONE.
  263. ;*
  264. ;* CALLS         = SaveCOMSetting, SetupCOMForMouse, RestoreCOMSetting
  265. ;*                  ResetSerialMouse
  266. ;**************************************************************************/
  267.  
  268.  
  269. TestforMSSDevice  proc  near
  270.  
  271.         push dx
  272.  
  273.         address IIR FROM RXB
  274.         in   al,dx                      ; AL=contents of Interrupt ID reg.
  275.         pop  dx
  276.  
  277.         .if <bit al z 0f8h>             ; Make sure bits 3-7 are all 0!
  278.  
  279.            call    SaveCOMSetting       ; Save the current setting
  280.            call    SetupCOMForMouse     ; Set up COM port to talk to mouse.
  281.            call    ResetSerialMouse     ; Reset mouse to see if it is there.
  282.            .if <c>
  283.               call RestoreCOMSetting    ; No Mouse! Restore COM port.
  284.            .endif
  285.  
  286.         .else
  287.            stc
  288.         .endif
  289.         ret
  290.  
  291.  
  292. TestforMSSDevice  endp
  293.  
  294. ;/***************************************************************************
  295. ;*
  296. ;* FUNCTION NAME = SaveCOMSetting
  297. ;*
  298. ;* DESCRIPTION   = This procedure will save the current state of the
  299. ;*                 COM port given.
  300. ;*
  301. ;* INPUT         = DX              Base address of COM port.
  302. ;*
  303. ;* OUTPUT        = NONE. ALTERS AX.
  304. ;*
  305. ;*
  306. ;* RETURN-NORMAL = NONE.
  307. ;*
  308. ;*
  309. ;* RETURN-ERROR  = NONE.
  310. ;*
  311. ;*
  312. ;**************************************************************************/
  313.  
  314.  
  315. SaveCOMSetting  proc  near
  316.  
  317.         push dx                         ; Save base I/O address.
  318.         address LCR FROM RXB            ; Get address of Line Control Register.
  319.         DelayIn al,dx                   ; Get current contents.
  320.         mov  LCRSave, al                ; Save them.
  321.         or   al, LC_DLAB                ; Set up to access divisor latches.
  322.         DelayOut dx,al
  323.         address LATMSB FROM LCR         ; Get address of high word of divisor
  324.         DelayIn al,dx                   ;  latch and save its current contents.
  325.         mov LATMSBSave, al
  326.         address LATLSB FROM LATMSB      ; Get address of low word of divisor
  327.         DelayIn al,dx                   ;  latch and save its current contents.
  328.         mov  LATLSBSave, al
  329.         address LCR FROM LATLSB         ; Get address of Line Control Register
  330.         mov  al, LCRSave                 ;  and disable access to divisor.
  331.         and  al, NOT LC_DLAB
  332.         DelayOut dx,al
  333.         address MCR FROM LCR            ; Get address of Modem Control Register
  334.         DelayIn al,dx                   ;  and save its current contents.
  335.         mov  MCRSave, al
  336.         address IER FROM MCR            ; Get address of Interrupt Enable Reg-
  337.         DelayIn al,dx                   ;  ister and save its current contents.
  338.         mov  IERSave, al
  339.         pop  dx                         ; Restore base I/O address.
  340.         ret
  341.  
  342. SaveCOMSetting  endp
  343.  
  344. ;/***************************************************************************
  345. ;*
  346. ;* FUNCTION NAME = RestoreCOMSetting
  347. ;*
  348. ;* DESCRIPTION   = This procedure will restore the state of the COM port
  349. ;*
  350. ;* INPUT         = DX              Base address of COM port.
  351. ;*
  352. ;* OUTPUT        = NONE.  ALTERS AX.
  353. ;*
  354. ;*
  355. ;* RETURN-NORMAL = NONE
  356. ;*
  357. ;*
  358. ;* RETURN-ERROR  = NONE
  359. ;*
  360. ;*
  361. ;**************************************************************************/
  362.  
  363.  
  364. RestoreCOMSetting  proc  near
  365.  
  366.         push    dx                      ; Save base I/O address.
  367.         address LCR FROM RXB            ; Get address of Line Control Register.
  368.         mov     al,LC_DLAB              ; Set up to access divisor latches.
  369.         DelayOut dx,al
  370.         address LATMSB FROM LCR         ; Get address of high word of divisor
  371.         mov     al, LATMSBSave          ;  and restore it.
  372.         DelayOut dx,al
  373.         address LATLSB FROM LATMSB      ; Get address of low word of divisor
  374.         mov     al, LATLSBSave          ;  and restore it.
  375.         DelayOut dx,al
  376.         address LCR FROM LATLSB         ; Get address of Line Control Register
  377.         mov     al, LCRSave             ;  and restore it, disabling access to
  378.         and     al,NOT LC_DLAB          ;  the divisor latches.
  379.         DelayOut dx,al
  380.         address MCR FROM LCR            ; Get addres of Modem Control Register
  381.         mov     al, MCRSave             ;  and restore it.
  382.         DelayOut dx,al
  383.         address IER FROM MCR            ; Get address of Interrupt Enable Reg-
  384.         mov     al, IERSave             ;  ister and restore it.
  385.         DelayOut dx,al
  386.         pop     dx                      ; Restore base I/O address.
  387.         ret
  388.  
  389. RestoreCOMSetting  endp
  390.  
  391. ;/***************************************************************************
  392. ;*
  393. ;* FUNCTION NAME = SetupCOMForMouse
  394. ;*
  395. ;* DESCRIPTION   = This procedure will set up the given COM port so that
  396. ;*                 it can talk to a serial mouse.
  397. ;*
  398. ;* INPUT         = DX              Base address of COM port to set up
  399. ;*
  400. ;* OUTPUT        = COM port set up, all interrupts disabled at COM port
  401. ;*
  402. ;* RETURN-NORMAL = NONE
  403. ;*
  404. ;*
  405. ;* RETURN-ERROR  = NONE
  406. ;*
  407. ;*
  408. ;**************************************************************************/
  409.  
  410. SetupCOMForMouse  proc  near
  411.  
  412.         push dx                         ; Save base I/O address.
  413.         address LCR FROM RXB            ; Get address of Line Control Reg.
  414.         mov  al, LC_DLAB                ; Set up to access divisor latches.
  415.         DelayOut dx,al
  416.         address LATMSB FROM LCR         ; Get address of high word of divisor
  417.         mov  al, HIGH DIV_1200          ;  latch and set it with value for
  418.         DelayOut dx,al                  ;  1200 baud.
  419.         address LATLSB FROM LATMSB      ; Get address of low word of divisor
  420.         mov  al, LOW DIV_1200           ;  latch and set it with value for
  421.         DelayOut dx,al                  ;  1200 baud.
  422.         address LCR FROM LATLSB         ; Get address of Line Control Reg.
  423.         mov  al, LC_BITS7+LC_STOP1+LC_PNONE ;7 data bits, 1 stop bit, no parity
  424.         DelayOut dx,al                  ; Set up data format.
  425.         address IER FROM LCR            ; Get address of Int. Enable Register
  426.         xor  al, al                     ; Disable all interrupts at the COM
  427.         DelayOut dx,al                  ;  port level.
  428.         address LSR FROM IER            ; Get address of Line Status Reg.
  429.         DelayIn al,dx                   ; Read it to clear any errors.
  430.         pop  dx                         ; Restore base I/O address
  431.         ret
  432.  
  433. SetupCOMForMouse  endp
  434.  
  435. ;/***************************************************************************
  436. ;*
  437. ;* FUNCTION NAME = ResetSerialMouse
  438. ;*
  439. ;* DESCRIPTION   = This procedure will reset a serial mouse on the given COM
  440. ;*                 port and will return an indication of whether a mouse
  441. ;*                 responded or not
  442. ;*
  443. ;* INPUT         = ENTRY   DX              Base I/O address of COM port to use
  444. ;*                         CX              Number of msecs to use for delays
  445. ;*
  446. ;* OUTPUT        = EXIT    carry clear     Mouse responded and is now reset
  447. ;*
  448. ;*                         carry set       No mouse responded!
  449. ;*
  450. ;* NOTES         = This routine assumes that all interrupts at the COM port
  451. ;*                 have been disabled
  452. ;*
  453. ;* RETURN-NORMAL = NONE
  454. ;*
  455. ;*
  456. ;* RETURN-ERROR  = NONE
  457. ;*
  458. ;*
  459. ;**************************************************************************/
  460.  
  461.  
  462. ResetSerialMouse  proc  near
  463.  
  464.         push dx
  465.         push cx
  466.  
  467.         address MCR FROM RXB            ; Get address of Modem Control Reg.
  468.         mov     al,MC_DTR               ; Set DTR active; RTS, OUT1, and OUT2
  469.         DelayOut dx,al                  ;  inactive. This powers down mouse.
  470.  
  471.         push    cx                      ; Save amount of time to delay.
  472.         call    SetupForWait            ; Setup BX:CX & ES:DI for delay
  473.  
  474. ;*
  475. ;* Now, we wait the specified amount of time, throwing away any stray data
  476. ;* data that we receive. This gives the mouse time to properly reset itself.
  477. ;*
  478.  
  479.         address RXB FROM MCR            ; Get address of Receive Buffer.
  480.         .repeat
  481.            DelayIn al,dx                ; Read and ignore any stray data.
  482.            call    IsWaitOver           ; Determine if we've delayed enough.
  483.         .until <c>
  484.  
  485.         address LSR FROM RXB            ; Get address of Line Status Reg.
  486.         DelayIn al,dx                   ; Read it to clear any errors.
  487.         address MCR FROM LSR            ; Get address of Modem Control Reg.
  488.         mov  al, MC_DTR+MC_RTS+MC_OUT2  ; DTR,RTS,OUT2 active. OUT1 inactive.
  489.         DelayOut dx,al                  ; This powers up the mouse.
  490.  
  491.         pop  cx                         ; Get amount of time to delay.
  492.         call SetupForWait               ; Setup BX:CX & ES:DI for delay
  493.  
  494. ;*
  495. ;* We give the mouse the specified amount of time to respond by sending us
  496. ;* an M or a B for a Ballpoint device. If it doesn't, or we get more than
  497. ;* 3 characters that aren't an M or a B, we return a failure indication.
  498. ;*
  499.  
  500.         address LSR FROM MCR            ; Get address of Line Status Reg.
  501.         mov     si,3                    ; Read up to 3 chars from port.
  502.  
  503. rsm_lookforMorB:
  504.         .repeat
  505.            DelayIn al,dx                ; Get current status.
  506.            test    al,LS_DR             ; Is there a character in Receive Buff?
  507.            jnz     short rsm_gotchar    ; Yes! Go and read it.
  508.            call    IsWaitOver           ; No, determine if we've timed out.
  509.         .until <c>                      ; Haven't timed out; keep looking.
  510.         jmp  short rsm_leave            ; Timed out. Leave with carry set.
  511.  
  512. rsm_gotchar:
  513.         address RXB FROM LSR            ; Get address of Receive Buffer.
  514.         DelayIn al,dx                   ; Get character that was sent to us.
  515.         cmp     al, 'M'                 ; Is it an M?
  516.         je      short rsm_lookfor3but   ; Yes! The mouse must be out there. ;           
  517.         cmp     al, 'B'                 ; Was it a B?
  518.         je      short rsm_leave         ; Yes, we have a ballpoint.
  519.         address LSR FROM RXB            ; Oh well. Get address of LSR again.
  520.         dec     si                      ; Have we read 3 chars yet?
  521.         jnz     short rsm_lookforMorB   ; Nope, we'll give him another try.
  522.         stc                             ; Didn't find an M. Indicate failure.
  523.         jmp     short rsm_leave         ; No mouse, let exit.
  524.  
  525. rsm_lookfor3but:                        ;           
  526.         mov     cx,SHORTDELAY           ; Get amount of time to delay.
  527.         call    SetupForWait            ; Setup BX:CX & ES:DI for delay
  528.  
  529.         address LSR FROM RXB            ; Get address of Line Status Reg.
  530.         .repeat
  531.            DelayIn al,dx                ; Get current status.
  532.            test    al,LS_DR             ; Is there a character in Receive Buff?
  533.            jnz     short rsm_tst3but    ; Yes! Go and read it.
  534.            call    IsWaitOver           ; No, determine if we've timed out.
  535.         .until <c>                      ; Haven't timed out; keep looking.
  536.  
  537.         clc                             ; clear carry since we found MS mouse
  538.         jmp  short rsm_leave            ; Timed out. Leave now
  539.  
  540. rsm_tst3but:
  541.         address RXB FROM LSR            ; Get address of Receive Buffer.
  542.         DelayIn al,dx                   ; Get character that was sent to us.
  543.  
  544.         .if <al eq '3'>                 ; Is three button mouse attached?
  545.            mov DeviceData.NumButt, 3    ; Indicate three button mouse
  546.         .endif
  547.  
  548.         clc                             ; clear carry since we found MS mouse
  549.                                         ;           
  550. rsm_leave:
  551.         pop  cx
  552.         pop  dx
  553.         ret
  554.  
  555. ResetSerialMouse  endp
  556.  
  557. ; Interrupt Entry Points for MSS_Find_Int
  558. intjtb  proc    far
  559. COPT1   equ     $
  560. tint00: call    minint
  561. COPT2   equ     $
  562. tint01: call    minint
  563. tint02: call    minint
  564. tint03: call    minint
  565. tint04: call    minint
  566. tint05: call    minint
  567. tint06: call    minint
  568. tint07: call    minint
  569. tint08: call    minint
  570. tint09: call    minint
  571. tint10: call    minint
  572. tint11: call    minint
  573. tint12: call    minint
  574. tint13: call    minint
  575. tint14: call    minint
  576. tint15: call    minint
  577. intjtb  endp
  578.  
  579. minint  proc    near
  580.         pop     ax                      ;ax=ret offset for IRQ determination
  581.         mov     bx,COPT2-COPT1
  582.         sub     ax,offset tint01
  583.         idiv    bl
  584.         xor     ah,ah
  585.         mov     si,ax
  586.         inc     actvirqbit[si]
  587.         stc                             ;don't claim the interrupt
  588.         db      0cbh                    ; far RET
  589. minint  endp
  590.  
  591. ;/***************************************************************************
  592. ;*
  593. ;* FUNCTION NAME = MSS_Find_Int
  594. ;*
  595. ;* DESCRIPTION   = Find out what IRQ is selected for 8250
  596. ;*
  597. ;* INPUT         = BX = base port of chip
  598. ;*                 DS = our DS
  599. ;*
  600. ;* OUTPUT        =  NONE
  601. ;*
  602. ;*
  603. ;* RETURN-NORMAL =  NC - BH=IRQ level
  604. ;*                       AL=8259 mask byte
  605. ;*                       AH=2nd 8259 mask byte
  606. ;* RETURN-ERROR  =  C - multiple or no interrupt level found
  607. ;*
  608. ;**************************************************************************/
  609.  
  610.         public  MSS_Find_Int
  611. MSS_Find_Int proc  near
  612.         push    bx
  613.         mov     ax,offset tint01
  614.         mov     bx,1
  615.         mov     dx,01bh                 ; non-shared & SetIRQ
  616.  
  617. finnx:  call    Device_Help             ; invoke Dev Help
  618.         add     ax,COPT2-COPT1
  619.         inc     bx
  620.         cmp     bx,16
  621.         jne     finnx
  622.         pop     bx                      ; get base port back
  623.  
  624.         mov     dx,bx
  625.         add     dx,3
  626.         in      al,dx
  627.         and     al,7Fh                  ;DLAB=0
  628.         out     dx,al
  629.         sub     dx,2
  630.         mov     al,2
  631.         out     dx,al                   ; turn on THRE interrupts
  632.         add     dx,3
  633.         mov     al,12                   ; turn on Out1 & Out2 for IRQs
  634.                                         ; RTS & DTR are off so that mouse is
  635.                                         ; dead; this prevents interrupts from
  636.                                         ; stuff other than what we're doing.
  637.         out     dx,al
  638.         jmp     $+2
  639.         jmp     $+2
  640.         mov     dx,bx                   ; get back to THR
  641.         out     dx,al
  642.         jmp     $+2
  643.         jmp     $+2
  644.         jmp     $+2
  645.         jmp     $+2
  646.         jmp     $+2
  647.         jmp     $+2
  648.         out     dx,al                   ; fill THR after THR has gone to TSR
  649.         mov     cx,0FFFFh
  650. spinr:  loop    spinr
  651.  
  652.         add     dx,1                    ; get to IER
  653.         mov     al,0
  654.         out     dx,al                   ; turn off THRE interrupts
  655.         add     dx,3
  656.         mov     al,0Fh                  ; turn on OUT2, OUT1, RTS & DTR
  657.         out     dx,al
  658.         jmp     $+2
  659.         jmp     $+2
  660.  
  661.  
  662.         mov     bx,1
  663.         mov     dx,01ch                 ; release the IRQ
  664.  
  665. finn2:  call    Device_Help             ; invoke Dev Help
  666.         inc     bx
  667.         cmp     bx,16
  668.         jne     finn2
  669.         mov     si,offset actvirqbit    ;get bitmap of triggered ints
  670.  
  671. ;*
  672. ;* SI now has the starting offset to an array of interrupt counts... we want
  673. ;* to find which one had exactly 2 INTs (since we generated 2).
  674. ;*
  675.  
  676.         xor     bx,bx
  677.  
  678. fsornx: cmp     byte ptr [si],2
  679.         jz      fndint
  680.         inc     bx
  681.         inc     si
  682.         cmp     bx,16
  683.         jne short fsornx
  684. multint:stc                             ;opps! multiple or no interrupts!
  685.         ret
  686.  
  687. fndint: mov     ax,1
  688.         push    cx
  689.         mov     cl,bl
  690.         mov     bh,bl
  691.         shl     ax,cl
  692.         pop     cx
  693.         clc
  694.         ret
  695.  
  696.  
  697. MSS_Find_Int endp
  698. ;/***************************************************************************
  699. ;*
  700. ;* FUNCTION NAME = InitComPort
  701. ;*
  702. ;* DESCRIPTION   = Enable mouse IRQ level at the 8259.
  703. ;*
  704. ;*
  705. ;* INPUT         = AX = function code
  706. ;*                 DS = our DS
  707. ;*                 ES = callers DS
  708. ;*
  709. ;* OUTPUT        = none (Stack is clean on return.  AX, CX, DX, SI, and DI
  710. ;*                      registers are changed.)
  711. ;*
  712. ;* RETURN-NORMAL = Always, mouse IRQ enabled.
  713. ;*
  714. ;*
  715. ;* RETURN-ERROR  = n/a
  716. ;*
  717. ;*
  718. ;**************************************************************************/
  719.  
  720. InitComPort  proc  near
  721.  
  722.         cli
  723.         mov  dx, PortBase               ; get base port
  724.  
  725. ;*
  726. ;* Set Data avail in INT Enable Reg
  727. ;*
  728.  
  729.         address IER FROM RXB
  730.         mov  al, IERMASK
  731.         delayout dx, al
  732. ;*
  733. ;* Read stray data
  734. ;*
  735.  
  736.         address RXB FROM IER
  737.         xor  cx, cx                     ; Loop for a while
  738.  
  739. joesloop:
  740.         delayin al, dx
  741.         loop joesloop
  742.  
  743.         sti                             ; allow ints now
  744.  
  745. ;*
  746. ;* We must zero out the BIOS Date Area for the Communications Line
  747. ;* Port Base address.
  748. ;*                     40:0 for Com Port 1
  749. ;*                     40:2 for Com Port 2
  750. ;*                     40:4 for Com Port 3
  751. ;*                     40:6 for Com Port 4
  752. ;*
  753.  
  754.         mov  bl, DeviceData.ComNum
  755.         cmp  bl, 255                    ; nonstandard port address?
  756.         je   inidun
  757.         dec  bl
  758.         xor  bh, bh
  759.         shl  bx, 1
  760.         push 40h
  761.         pop  es
  762.         mov  word ptr es:[bx], 0
  763.  
  764.         .if <ABIOS_Mch eq TRUE>
  765.            mov  al, 06h                  ; Async Device ID
  766.            mov  bl, DeviceData.ComNum    ; Get 1st LID
  767.            xor  dh, dh                   ; reserved, must be 0
  768.            mov  dl, DevHlp_GetLIDEntry   ; ABIOS function
  769.            call Device_Help              ; invoke Dev Help
  770.         .endif
  771.  
  772. inidun: ret
  773.  
  774. InitComPort  endp
  775.  
  776. CSEG     ENDS
  777.          END
  778.