home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddkx86v5.zip / DDKX86 / SRC / DEV / MOUSE / INIT.ASM < prev    next >
Assembly Source File  |  1995-04-14  |  49KB  |  1,340 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 = INIT.ASM
  16. ;*
  17. ;* DESCRIPTIVE NAME = Device Independent init routines
  18. ;*
  19. ;*
  20. ;* VERSION      V2.0
  21. ;*
  22. ;* DATE         02/29/92
  23. ;*
  24. ;* DESCRIPTION  Device Independent init routines
  25. ;*
  26. ;* FUNCTIONS    Mouse_Init        ()
  27. ;*              InitFSCB2         ()
  28. ;*              FindQSize         ()
  29. ;*              FindTypeOverRider ()
  30. ;*              FindRelaxed       ()
  31. ;*              FindSType         ()
  32. ;*              Emi_Init          ()
  33. ;*              SkipWhiteSpace    ()
  34. ;*              gmDeviceInit      ()
  35. ;*              SetupForWait      ()
  36. ;*
  37. ;* NOTES        This file contains the Mouse Device Driver
  38. ;*              initialization code.  It is disposed of after
  39. ;*              successful initialization.  This is the last module
  40. ;*              in the link list.
  41. ;*
  42. ;* STRUCTURES   NONE
  43. ;*
  44. ;* EXTERNAL REFERENCES
  45. ;*
  46. ;*              NONE
  47. ;*
  48. ;* EXTERNAL FUNCTIONS
  49. ;*
  50. ;*              NONE
  51. ;*
  52. ;* CHANGE ACTIVITY =
  53. ;*   DATE      FLAG        APAR   CHANGE DESCRIPTION
  54. ;*   --------  ----------  -----  --------------------------------------
  55. ;*   mm/dd/yy  @Vr.mpppxx  xxxxx  xxxxxxx
  56. ;*   02/29/92              DCR 509
  57. ;*
  58. ;*
  59. ;**************************************************************************
  60.  
  61.  
  62. .386p
  63.  
  64. .xlist
  65.         include mouse.inc
  66.         include basemaca.inc
  67.         include infoseg.inc
  68.         include emiidc.inc                                          ;emi
  69.         include devclass.inc                                        ;emi
  70.         include singleq.inc                                         ;emi
  71. .list
  72.  
  73. ;*
  74. ;*    External Mouse Module Data References
  75. ;*
  76.  
  77.  
  78.        extrn  Num_Grps          : byte
  79.        extrn  TypeName          : byte
  80.        extrn  STypeName         : byte
  81.        extrn  DDD               : byte
  82.        extrn  DDD2              : byte
  83.        extrn  DeviceData        : byte
  84.        extrn  Mouse$            : byte
  85.        extrn  DfltEQs           : byte
  86.        extrn  SG0               : byte
  87.        extrn  SG1               : byte
  88.        extrn  SG3               : byte
  89.        extrn  TypeOverRider     : byte
  90.        extrn  SType             : byte
  91.        extrn  ABIOS_Mch         : byte
  92.        extrn  Enable_8259       : byte
  93.        extrn  Disable_8259      : byte
  94.        extrn  Enable_28259      : byte
  95.        extrn  Disable_28259     : byte
  96.        extrn  EmiDD             : byte                             ;emi
  97.        extrn  EmiDDName         : byte                             ;emi
  98.        extrn  EmiFlags          : byte                             ;emi
  99.        extrn  EmiMvt            : byte                             ;emi
  100.        extrn  Int_Packet        : byte                             ;emi
  101.        extrn  SInt_Packet       : byte                             ;emi
  102.        extrn  MEvent            : byte                             ;emi
  103.        extrn  DeviceData        : byte                             ;emi
  104.        extrn  Relaxed           : byte
  105.        extrn Init_Time           : byte
  106.  
  107.        extrn  DDDInit           : word
  108.        extrn  Eq_Length         : word
  109.        extrn  GDT_Seg           : word
  110.        extrn  SMData            : word
  111.        extrn  usQSize           : word
  112.        extrn  PortBase          : word
  113.        extrn  First_Port        : word
  114.        extrn  Dev_LID           : word
  115.        extrn  DevStatus         : word
  116.        extrn  EMaskMax          : word                             ;emi
  117.  
  118.        extrn  Device_Help       : dword
  119.        extrn  _Device_Help      : dword
  120.        extrn  InfoSegAddr       : dword
  121.  
  122.        extrn  PDDCMD_MSEEntry   : near
  123.        extrn  DOSSMREGISTERDD   : far
  124.  
  125.        extrn CheckforPDIDevice   : near
  126.        extrn PDI_Int_Handler     : near
  127.        extrn PDIInit             : near
  128.        extrn SetupCOMForMouse    : near
  129.        extrn ResetSerialMouse    : near
  130.  
  131.        extrn CheckforMSSDevice   : near
  132.        extrn MSS_Int_Handler     : near
  133.        extrn InitComPort         : near
  134.        extrn MSS_Find_Int        : near
  135.  
  136.        extrn CheckforINPDevice   : near
  137.        extrn INP_Int_Handler     : near
  138.        extrn InportInit          : near
  139.  
  140.        extrn CheckforBUSDevice   : near
  141.        extrn BUS_Int_Handler     : near
  142.        extrn BusInit             : near
  143.        extrn EmiEntryPoint       : near                         ;emi
  144.  
  145.        extrn _RM_MSE_CreateDriver  :far
  146.        extrn _RM_MSE_CreateAdapter :far
  147.        extrn _RM_MSE_CreateDevice  :far
  148.        extrn _RM_MSE_AllocPorts    :far
  149.        extrn _RM_MSE_AllocIRQ      :far
  150.        extrn _RM_MSE_DestroyDriver :far
  151.  
  152.  
  153.        public Mouse_Init
  154.        public InitFSCB2
  155.        public FindQSize
  156.        public FindTypeOverRider
  157.        public FindSType
  158.        public SkipWhiteSpace
  159.        public gmDeviceInit
  160.        public SetupForWait
  161.        public IsWaitOver
  162.  
  163. CSEG     SEGMENT   WORD  PUBLIC  USE16 'CODE'
  164.          ASSUME    CS:CSEG, SS:nothing, ES:nothing, DS:nothing
  165.  
  166. CSEG2  SEGMENT   WORD  PUBLIC  USE16 'SWAPCODE'
  167. CSEG2  ENDS
  168.  
  169. ;*
  170. ;*      Module Procs made Public for other Mouse Modules
  171. ;*
  172.        PUBLIC  Mouse_Init
  173.  
  174. ENDCODE   EQU   $           ; start of init throw away code
  175.  
  176.  
  177. ;************************************************************************
  178. ;*
  179. ;*  FUNCTION NAME :  Mouse_Init
  180. ;*
  181. ;*  DESCRIPTION   :  Mouse Device Driver H/W Initialization
  182. ;*                     Routine.
  183. ;*
  184. ;*                   This is the main initialization routine.  It
  185. ;*                      performs the following steps:
  186. ;*                         1.  Gets system variables and sets up msgs.
  187. ;*                         2.  Parse the config.sys parameters.
  188. ;*                         3.  Issue DevHlp AttachDD on TYPE= parm
  189. ;*                             device driver name.
  190. ;*                         4.  Initialize session control blocks
  191. ;*
  192. ;*  NOTES         :  This routine is discarded after initialization.
  193. ;*
  194. ;*  ENTRY POINT   :  Mouse_Init        LINKAGE:  CALL NEAR
  195. ;*
  196. ;*  INPUT         :  ES:BX points to the OS/2 Init request block.
  197. ;*
  198. ;*  RETURN-NORMAL :  Request Block status field set to indicate
  199. ;*                   function complete, no error.
  200. ;*
  201. ;*  RETURN-ERROR  :  Request Block pointer fields set to indicat
  202. ;*                   initialization failure.
  203. ;*
  204. ;*  EFFECTS       :  Stack is clean on return, AX, CX, DX, SI, and DI
  205. ;*                   registers are changed.
  206. ;*
  207. ;*  INTERNAL REFERENCES:
  208. ;*     ROUTINES   :  NONE
  209. ;*
  210. ;*  EXTERNAL REFERENCES:
  211. ;*     DevHelps   :  GetDOSVar, AttachDD
  212. ;*
  213. ;************************************************************************
  214.  
  215. Mouse_Init  Proc  Far
  216.  
  217.       ?frame = 0                         ; Get Local/Temp Stack Frame
  218.       LocalVar TempES,  WORD             ; For ES register
  219.       LocalVar TempBX,  WORD             ; For BX register
  220.       LocalVar TempDI,  WORD             ; For DI register
  221.  
  222.       EnterProc
  223.  
  224.       mov  TempES, es                    ; Save register values in
  225.       mov  TempBX, bx                    ; Temporary Stack Frame
  226.  
  227.       mov  es:[bx].PktStatus, 0          ; Clear RB Error Status Flag
  228. ;*
  229. ;* Save Device Help router entry point.
  230. ;*
  231.       mov  di, word ptr es:[bx].InitDevHlp  ; Load DevHlp Entry Pt Offset
  232.       mov  word ptr Device_Help, di         ; Save DevHlp Offset
  233.       mov  word ptr _Device_Help, di        ; Save DevHlp Offset
  234.       mov  di, word ptr es:[bx].InitDevHlp+2; Load DevHlp Entry Pt Selector
  235.       mov  word ptr Device_Help+2, di       ; Save DevHlp Selector
  236.       mov  word ptr _Device_Help+2, di      ; Save DevHlp Selector
  237. ;*
  238. ;* Use DevHlp (GetDOSVar) to get a pointer to the GDT
  239. ;*
  240.  
  241.       mov  al, GDTINFOINDEX              ; Request GDT InfoSeg value = 1
  242.       mov  dl, DevHlp_GetDOSVar          ; DevHelp function number
  243.       call Device_Help                   ; On Return AX:BX -> to req var
  244.  
  245.       .if <c>                            ; GetDOSVar failed
  246.          jmp  mi_error
  247.       .endif
  248.  
  249.       mov  es, ax                        ; Get the GDT level 0 selector and
  250.       mov  ax, word ptr es:[bx]          ; Overwrite the level 3 Selector
  251.       mov  GDT_Seg, ax                   ; Save GDT Selector
  252.  
  253.       xor  si, si
  254.       mov  es, word ptr GDT_Seg          ; Use the GDT Infoseg selector to
  255.       mov  al, es:[si].SIS_MaxScrnGrp    ; Groups in the system.
  256.       mov  Num_Grps, al                  ; Save # SG's value
  257.  
  258. ;*
  259. ;* Use DEVHLP (GetDOSVar) to get LDT InfoSeg
  260. ;*
  261.       push  es
  262.       mov   al, LDTINFOINDEX              ; get LDT InfoSeg variable
  263.       mov   dl, DevHlp_GetDOSVar          ; Devhelp function number
  264.       call  Device_Help                   ; Invoke GetDOSVar function
  265.                                           ; AX:BX points to LDT InfoSeg
  266.       mov   es, ax                        ; Get LDT info addr
  267.       les   bx, dword ptr es:[bx]         ; LDT InfoSeg Addr
  268.       mov   word ptr InfoSegAddr,bx
  269.       mov   word ptr InfoSegAddr+2,es
  270.       pop   es
  271. ;*
  272. ;* Register with the Resource Manager
  273. ;*
  274.       inc Init_Time
  275.       pusha
  276.       push es
  277.       mov ax, 1                             ; MOUSESYS
  278.       push ax
  279.       call _RM_MSE_CreateDriver
  280.       pop ax
  281.       pop es
  282.       popa
  283. ;*
  284. ;* Initialize the extended mouse interface (EMI)                           ;emi
  285. ;*                                                                          ;emi
  286.  
  287.       call Emi_Init                                                       ;emi
  288.  
  289.       mov  es, TempES                    ; Restore register values from
  290.       mov  bx, TempBX                    ; Temporary Stack Frame
  291.  
  292. ;*
  293. ;* Now begin parsing the config.sys line.  Field InitParms points to the
  294. ;* 1st character after device= on the line for the MOUSE.SYS dd.
  295. ;*
  296.  
  297.       les  di, es:[bx].InitParms         ; load address to config.sys line
  298.       mov  si, di                        ; save starting point
  299. ;*
  300. ;* We will first search for the last occasion of the backslash character.
  301. ;* This will then point us to MOUSE.SYS and whatever follows. This search
  302. ;* was added for            In this            we added support for extended chars
  303. ;* in the DEVICE=  line of config.sys. If no backslash chars are encountered
  304. ;* our pointer remains at the 1st char after the device= statement.
  305. ;*
  306.  
  307.       .while <<byte ptr es:[di]> ne 0>   ; For all chars on line
  308.          .if <<byte ptr es:[di]> eq '\'> ; If lower case alpha char
  309.             mov  si, di                  ; New starting point
  310.             inc  si
  311.          .endif
  312.          inc di
  313.       .endwhile
  314.  
  315.       mov  di, si                        ; es:di -> MOUSE.SYS ...
  316.       mov  al, es:[di]
  317. ;*
  318. ;* Skip over MOUSE.SYS to the 1st non blank character or EOL is reached.
  319. ;*
  320.  
  321.       .while < al ne ' ' > AND           ; Skip everything until a
  322.       .while < al ne ',' > AND           ; Blank, comma, Tab, or EOLN
  323.       .while < al ne TAB > AND           ; Is encountered
  324.       .while < al ne LF > AND
  325.       .while < al ne CR > AND
  326.       .while <al ne 0>
  327.          inc  di                         ; Update line index
  328.          mov  al, es:[di]                ; Get next char
  329.       .endwhile
  330. ;*
  331. ;* At this point ES:DI points to the first character after MOUSE.SYS and
  332. ;* AL holds that character value. We will convert the remaining characters
  333. ;* to upper case.
  334. ;*
  335.  
  336.       mov  TempDI, di
  337.       push di
  338.       .while < al ne 0>
  339.          .if <al ge 'a'> AND       ; and if a lower case letter
  340.          .if <al le 'z'>
  341.             add  al, 'A'-'a'       ; convert to upper case
  342.             mov  es:[di], al
  343.          .endif
  344.          inc  di
  345.          mov  al, es:[di]
  346.       .endwhile
  347.       pop  di
  348.  
  349.       call FindRelaxed
  350.  
  351.       mov  es, TempES              ; offset to char string
  352.       mov  di, TempDI              ; offset to char string
  353.  
  354.       call  FindQSize
  355.       .if <c>
  356.          jmp  mi_error
  357.       .endif
  358.  
  359.       mov  ax, usQSize
  360.       imul ax, ELRec_Size          ; QSize value in AX, use it to
  361.       mov  Eq_Length, ax           ; Calc event que size (Bytes)
  362.  
  363.       call  FindTypeOverRider
  364.       .if <c>
  365.          jmp  mi_error
  366.       .endif
  367.  
  368.       .if <TypeOverRider eq TRUE>
  369.          mov  bx, offset TypeName  ; offset to dependent DD name
  370.          mov  di, offset DDD       ; attachDD return structure
  371.          mov  dl, DevHlp_AttachDD  ; function number
  372.          call Device_Help          ; go do the attach
  373.          .if <nc>                  ; if successfull
  374.             or   DDDInit, DI_IDC   ; show IDC init needed
  375.          .else                     ; else we are now attached
  376.             jmp  mi_error
  377.          .endif                    ; end error check on attach
  378.       .else
  379.          call gmDeviceInit
  380.          jc  mi_error
  381.       .endif
  382.  
  383.       mov  es, TempES                    ; offset to char string
  384.       mov  di, TempDI                    ; offset to char string
  385.  
  386.       call FindSType
  387.  
  388.       .if <SType eq TRUE>
  389.          mov  bx, offset STypeName       ; offset to 2nd dependent DD name
  390.          mov  di, offset DDD2            ; attachDD return structure
  391.          mov  dl, DevHlp_AttachDD        ; function number
  392.          call Device_Help                ; go do the attach
  393.          .if <nc>                        ; if successfull
  394.             or   DDDInit, DI_IDC         ; show IDC init needed
  395.          .else                           ; else we are now attached
  396.             jmp  mi_error
  397.          .endif                          ; end error check on attach
  398.       .endif
  399.  
  400.       lea  si, Mouse$                    ; set ds:si -> mouse$ in data seg
  401.       push CSEG2                         ; 
  402.       pop  es                            ; 
  403.       mov  di, offset PDDCMD_MSEEntry    ; es:di -> 16:16 entry
  404.       mov  dl, DevHlp_RegisterPDD        ; specify function
  405.       call Device_Help                   ; go call function
  406.  
  407. ;*
  408. ;*     Now register ourselves with the session manager so that we will be
  409. ;*     notified of all screen group switch control.  If that works then
  410. ;*     initialize the pre-allocated screen group control blocks (harderror,
  411. ;*     shell, and pop-up).  Then set the end of code and data segments so
  412. ;*     that both will be shrunk.
  413. ;*
  414.  
  415.       push ds
  416.       push offset SMData
  417.       call DOSSMREGISTERDD
  418.  
  419.       .if <ZERO ax>
  420.          mov  bx, offset DfltEQs
  421.          lea  si, SG0                    ; offset of SG0
  422.          call InitFSCB2                  ; initialize it
  423.          mov  [si].E_Queue, bx           ; Get pointer to event queue
  424.  
  425.          lea  si, SG1                    ; offset of SG1
  426.          call InitFSCB2                  ; initialize it
  427.          add  bx, Eq_Length              ; next queue area
  428.          mov  [si].E_Queue, bx           ; store starting offset
  429.  
  430.          lea  si, SG3                    ; offset of SG3
  431.          call InitFSCB2                  ; initialize it
  432.          add  bx, Eq_Length              ; next queue area
  433.          mov  [si].E_Queue, bx           ; store starting offset
  434.          add  bx, Eq_Length              ; total size of 3 event queues
  435.          mov  dx, bx                     ; size of preallocated event queues
  436.       .else
  437.          jmp  mi_error
  438.       .endif
  439.  
  440.       mov  es, TempES                    ; restore init packet selector
  441.       mov  bx, TempBX                    ; restore init packet offset
  442.  
  443.       .if <DeviceData.MouseType eq PDI_DEVICE>
  444.          lea   ax, CheckforMSSDevice     ; 56543
  445.       .elseif <DeviceData.MouseType eq MSS_DEVICE>
  446.          lea   ax, INP_Int_Handler
  447.       .elseif <DeviceData.MouseType eq INP_DEVICE>
  448.          lea   ax, BUS_Int_Handler
  449.       .elseif <DeviceData.MouseType eq BUS_DEVICE>
  450.          lea   ax, CheckforPDIDevice
  451.       .else
  452.          lea   ax, PDI_Int_Handler
  453.       .endif
  454.  
  455.       mov  word ptr es:[bx].InitEcode, ax   ; set end of code
  456.       mov  ax, dx                           ; add size of 3 event queues
  457.       mov  word ptr es:[bx].InitEdata, ax   ; send end of data
  458.       jmp  mi_exit
  459.  
  460. mi_error:
  461.       pusha
  462.       call _RM_MSE_DestroyDriver
  463.       popa
  464.       mov  es, TempES                    ; LocalVar = Req Blk Selector
  465.       mov  bx, TempBX                    ; LocalVar = Req Blk Offset
  466.       or   es:[bx].PktStatus, INITBAD    ; Flag Hard Init Err = ABORT
  467.       mov  word ptr es:[bx].InitEcode, 0 ; set end of code
  468.       mov  word ptr es:[bx].InitEdata, 0 ; set end of data
  469.  
  470. mi_exit:
  471.       mov Init_Time, 0
  472.       LeaveProc
  473.       ret                         ; return to strategy
  474.  
  475. Mouse_Init  EndP
  476.  
  477. ;************************************************************************
  478. ;*
  479. ;*  FUNCTION NAME :  InitFSCB2
  480. ;*
  481. ;*  DESCRIPTION   : Initialize the Full Screen Control Block
  482. ;*
  483. ;*                  This routine is called to initial the control
  484. ;*                  block used for a Full Screen Group.
  485. ;*
  486. ;*  NOTES         : This routine is an exact duplicate of InitFSCB. By
  487. ;*                  adding a copy here we are able to put InitFSCB into
  488. ;*                  the swappable code segment. This routine is only used
  489. ;*                  at init time therefore it will be discarded with
  490. ;*                  the rest of the init code.
  491. ;*
  492. ;*  INPUT         :  ds:si points to the FSCB to initialize
  493. ;*
  494. ;*  OUTPUT        : ds:si points to the control block
  495. ;*
  496. ;*  SIDE EFFECTS  :  stack is clean.
  497. ;*
  498. ;************************************************************************
  499. ;* PSEUDOCODE :
  500. ;*
  501. ;* BeginSub  InitFSCB2
  502. ;*
  503. ;*  call DDDD(DisableDevice) to disable the mouse
  504. ;*  return
  505. ;*
  506. ;* EndSub  InitFSCB2
  507. ;*
  508. ;************************************************************************
  509.  
  510. InitFSCB2  proc  near
  511.  
  512.  
  513.         mov [si].Hdle_Cntr, 0        ; Init handle counter to zero
  514.  
  515.         mov ax, si                   ; Get offset to start of FS CB
  516.         add ax, SRec_Size            ; End of FS CB is start of event queue
  517.         mov [si].E_Queue, ax         ; Get pointer to event queue
  518.  
  519.         mov [si].Eq_PID, 0           ; 
  520.         mov [si].D_Status, 0
  521.         mov [si].Chain_Size, 0       ; 
  522.         mov [si].Chain_Hdle, 0       ; 
  523.         mov [si].Screen_Entp, 0      ; 
  524.         mov [si].Screen_Tble, 0      ; 
  525.         mov [si].Screen_DOff, 0      ; 
  526.         mov [si].Screen_DSeg, 0      ; 
  527.         mov [si].MLength, 0          ; 
  528.         mov [si].Ptr_Flags, 0        ; 
  529.         mov [si].Cur_Config, 0       ; 
  530.         mov [si].CfgOffset, 0        ; 
  531.         mov [si].CfgSelector, 0      ; 
  532.         ret
  533.  
  534. InitFSCB2  endp
  535.  
  536. ;************************************************************************
  537. ;*
  538. ;*  FUNCTION NAME :  FindQSize
  539. ;*
  540. ;*  DESCRIPTION   :  Find the QUEUE size specified by the
  541. ;*                     caller via the QSIZE= parameter in the
  542. ;*                     CONFIG.SYS file.
  543. ;*
  544. ;*  FUNCTION      :  This routine is called with ES:DI pointing to the
  545. ;*                   first character after DEVICE=. It first looks for
  546. ;*                   the last occurance of the backslash '\' character
  547. ;*                   and resets the pointer to the next character
  548. ;*                   which should be the first character of the device
  549. ;*                   driver name. It then resets the pointer to the
  550. ;*                   first character after the device driver name.
  551. ;*                   It changes all lower case letters to uppercase
  552. ;*                   letters for less character testing. It then
  553. ;*                   looks for the keywords QSIZE, then =, then
  554. ;*                   COM. The next character after COM is the port
  555. ;*                   number. The number is checked if it is between
  556. ;*                   1 and 8. If so, this number is returned to
  557. ;*                   the caller in the AX register with the carry
  558. ;*                   flag clear.
  559. ;*
  560. ;*  ENTRY POINT   :  FindQSize         LINKAGE:  CALL NEAR
  561. ;*
  562. ;*  INPUT         :  ES:DI points to DEVICE=uest block.
  563. ;*
  564. ;*  RETURN-NORMAL : Carry flag clear
  565. ;*                  AX = com port number
  566. ;*
  567. ;*  RETURN-ERROR  :  Carry flag set
  568. ;*
  569. ;*  EFFECTS       :  Stack is clean on return, NO registers changed.
  570. ;*
  571. ;*  INTERNAL REFERENCES:
  572. ;*     ROUTINES   :  None
  573. ;*
  574. ;*  EXTERNAL REFERENCES:
  575. ;*     ROUTINES   :  None.
  576. ;*
  577. ;*  CONTEXT       :
  578. ;*                   Init time strategy request.
  579. ;*
  580. ;************************************************************************
  581.  
  582.  
  583. FindQSize  proc  near
  584.  
  585.        push  es
  586.        push  si
  587.        push  di
  588.  
  589.        .while < <byte ptr es:[di]> ne 'Q'>
  590.          .if < <byte ptr es:[di]> ne 0 >
  591.             inc  di
  592.          .else
  593.            .if  <bit EmiFlags nz EMI_ACTIVE>           ;emi
  594.               mov  usQSize, DEFAULT_QSIZE              ;emi
  595.            .else                                       ;emi
  596.               mov  usQSize, 10
  597.            .endif                                      ;emi
  598.            clc                                         ;emi
  599.            jmp fqs_exit
  600.          .endif
  601.        .endwhile
  602.  
  603.        .if < <byte ptr es:[di+1]> ne 'S'> OR
  604.        .if < <byte ptr es:[di+2]> ne 'I'> OR
  605.        .if < <byte ptr es:[di+3]> ne 'Z'> OR
  606.        .if < <byte ptr es:[di+4]> ne 'E'>
  607.           stc
  608.           jmp  fqs_exit
  609.        .endif
  610.  
  611.        add di, 5
  612.        call  SkipWhiteSpace
  613.  
  614.        .if < <byte ptr es:[di]> eq '='>
  615.           inc  di
  616.        .else
  617.           stc
  618.           jmp  fqs_exit
  619.        .endif
  620.  
  621.        call SkipWhiteSpace
  622.  
  623.         xor     si,si
  624. nxtdig: mov     al,es:[di]
  625.         cmp     al,' '
  626.         je      eodigs
  627.         cmp     al,TAB
  628.         je      eodigs
  629.         cmp     al,0
  630.         je      eodigs
  631.         cmp     al,'0'
  632.         jl      badext
  633.         cmp     al,'9'
  634.         jg      badext
  635.         xor     ah,ah
  636.         sub     al,'0'
  637.         imul    si,10
  638.         add     si,ax
  639.         inc     di
  640.         jmp short nxtdig
  641. eodigs: cmp     si,0
  642.         jle     badext
  643. notmin: cmp     si,100
  644.         jle     goodex
  645. badext: stc
  646.         jmp short fqs_exit
  647. goodex: mov     usQSize,si
  648.         clc
  649. fqs_exit:
  650.         pop     di
  651.         pop     si
  652.         pop     es
  653.         ret
  654.  
  655. FindQSize  endp
  656.  
  657. ;************************************************************************
  658. ;*
  659. ;*  FUNCTION NAME :  FindTypeOverRider
  660. ;*
  661. ;*  DESCRIPTION   :  Find the TYPE= over rider
  662. ;*
  663. ;*                   This routine is called with ES:DI pointing to the
  664. ;*                   first whitespace character after MOUSE.SYS on the
  665. ;*                   DEVICE= line in the CONFIG.SYS file. It will
  666. ;*                   search for the first occurance of TYPE= and
  667. ;*                   grab the device driver name specified. The
  668. ;*                   device driver name will be copied to the TypeName
  669. ;*                   location which will be used for idc communication.
  670. ;*
  671. ;*
  672. ;*  ENTRY POINT   :  FindTypeOverRider       LINKAGE:  CALL NEAR
  673. ;*
  674. ;*  INPUT         :  ES:DI points to the first character after MOUSE.SYS
  675. ;*                   on the DEVICE= line in the CONFIG.SYS file.
  676. ;*
  677. ;*                    TypeOverRider has been initialized to TRUE
  678. ;*
  679. ;*
  680. ;*  RETURN-NORMAL : Carry flag clear
  681. ;*                          TypeName updated
  682. ;*                          TypeOverRider = TRUE if found
  683. ;*                                        = FALSE not found
  684. ;*
  685. ;*                          ES:DI points to the first whitespace character
  686. ;*                                after the device name just found.
  687. ;*
  688. ;*  RETURN-ERROR  :  Carry flag set
  689. ;*
  690. ;*  EXIT-NOTE     : The TypeOverRider will be set to FALSE if
  691. ;*
  692. ;*  EFFECTS       :  Stack is clean on return, NO registers changed.
  693. ;*
  694. ;*  INTERNAL REFERENCES:
  695. ;*     ROUTINES   :  None
  696. ;*
  697. ;*  EXTERNAL REFERENCES:
  698. ;*     ROUTINES   :  None.
  699. ;*
  700. ;*  CONTEXT:
  701. ;*           Init time strategy request.
  702. ;*
  703. ;************************************************************************
  704.  
  705. FindTypeOverRider  proc  near
  706.  
  707.        push es
  708.        push di
  709. ;*                                                                        ;emi
  710. ;* the following code fixes a     in the GA code that wouldn't allow      ;emi
  711. ;* QSIZE and TYPE parms                                                   ;emi
  712. ;*                                                                        ;emi
  713.  
  714.        .repeat                                                            ;emi
  715.           mov  al, byte ptr es:[di]                                       ;emi
  716.           .while <al ne 'T'>                                              ;emi
  717.             .if <zero al>              ; At EOL                           ;emi
  718.                mov TypeOverRider,FALSE ; default is TRUE                  ;emi
  719.                clc                     ; indicate NONE found              ;emi
  720.                jmp fto_exit                                               ;emi
  721.              .endif                                                       ;emi
  722.              inc di                                                       ;emi
  723.              mov  al, byte ptr es:[di]                                    ;emi
  724.           .endwhile                                                       ;emi
  725.  
  726.           inc di                                                          ;emi
  727.  
  728.           .if < <byte ptr es:[di-2]> ne 'S'> AND  ; Might be "STYPE"      ;emi
  729.           .if < <byte ptr es:[di+0]> eq 'Y'> AND                          ;emi
  730.           .if < <byte ptr es:[di+1]> eq 'P'> AND                          ;emi
  731.           .if < <byte ptr es:[di+2]> eq 'E'>                              ;emi
  732.              add di, 3                                                    ;emi
  733.              call  SkipWhiteSpace                                         ;emi
  734.              .leave <<byte ptr es:[di]> eq '='>   ; Leave when '=' found  ;emi
  735.           .endif                                                          ;emi
  736.        .until                                                             ;emi
  737.  
  738.        inc  di                                    ; skip the '=' sign     ;emi
  739.  
  740.        call SkipWhiteSpace
  741.  
  742.        lea  si, TypeName
  743.        mov  al, es:[di]
  744.  
  745.        .while < al ne 0>   AND          ; save DD Device Driver entry point
  746.        .while < al ne ' '> AND
  747.        .while < al ne TAB>
  748.           mov  [si], al
  749.           inc  si
  750.           inc  di
  751.           mov  al, es:[di]
  752.        .endwhile
  753.  
  754. fto_exit:
  755.        pop  di
  756.        pop  es
  757.        ret
  758.  
  759. FindTypeOverRider  endp
  760.  
  761. ;************************************************************************
  762. ;*
  763. ;*  FUNCTION NAME :  FindRelaxed
  764. ;*
  765. ;*  DESCRIPTION   :  Find the RELAXED keyword
  766. ;*
  767. ;*                   This routine is called with ES:DI pointing to the
  768. ;*                   first whitespace character after MOUSE.SYS on the
  769. ;*                   DEVICE= line in the CONFIG.SYS file. It will
  770. ;*                   search for the first occurance of RELAXED
  771. ;*
  772. ;*  ENTRY POINT   :  FindRelaxed             LINKAGE:  CALL NEAR
  773. ;*
  774. ;*  INPUT         :  ES:DI points to the first character after MOUSE.SYS
  775. ;*                   on the DEVICE= line in the CONFIG.SYS file.
  776. ;*
  777. ;*
  778. ;*  RETURN-NORMAL : Carry flag clear
  779. ;*
  780. ;*                    ES:DI points to the first whitespace character
  781. ;*                     after the device name just found.
  782. ;*
  783. ;*  RETURN-ERROR  :  Carry flag set
  784. ;*
  785. ;*  EFFECTS       :  Stack is clean on return, NO registers changed.
  786. ;*
  787. ;*  INTERNAL REFERENCES:
  788. ;*     ROUTINES   :  None
  789. ;*
  790. ;*  EXTERNAL REFERENCES:
  791. ;*     ROUTINES   :  None.
  792. ;*
  793. ;*  CONTEXT       :
  794. ;*           Init time strategy request.
  795. ;*
  796. ;************************************************************************
  797.  
  798. FindRelaxed        proc  near
  799.  
  800.        push es
  801.        push di
  802.  
  803.        .repeat
  804.           mov  al, byte ptr es:[di]
  805.           .while <al ne 'R'>
  806.             .if <zero al>              ; At EOL
  807.                clc                     ; indicate not found
  808.                jmp fr_exit
  809.              .endif
  810.              inc di
  811.              mov  al, byte ptr es:[di]
  812.           .endwhile
  813.  
  814.           inc di
  815.  
  816.           .if < <byte ptr es:[di+0]> eq 'E'> AND
  817.           .if < <byte ptr es:[di+1]> eq 'L'> AND
  818.           .if < <byte ptr es:[di+2]> eq 'A'> AND
  819.           .if < <byte ptr es:[di+3]> eq 'X'> AND
  820.           .if < <byte ptr es:[di+4]> eq 'E'> AND
  821.           .if < <byte ptr es:[di+5]> eq 'D'>
  822.                 mov     Relaxed,1     ; relax our sync checking
  823.           .endif
  824.        .until
  825.  
  826. fr_exit:
  827.        pop  di
  828.        pop  es
  829.        ret
  830.  
  831. FindRelaxed        endp
  832.  
  833.  
  834. ;************************************************************************
  835. ;*
  836. ;*  FUNCTION NAME :  FindSType
  837. ;*
  838. ;*  DESCRIPTION   :  Check to see if the STYPE= parameter
  839. ;*                     has been specified on the DEVICE=
  840. ;*                     line in the CONFIG.SYS file.
  841. ;*
  842. ;*  FUNCTION      :  This routine is called with ES:DI pointing to the
  843. ;*                    first whitespace character after MOUSE.SYS on the
  844. ;*                    DEVICE= line in the CONFIG.SYS file.
  845. ;*
  846. ;*  ENTRY POINT   :  FindSType               LINKAGE:  CALL NEAR
  847. ;*
  848. ;*  INPUT         :  ES:DI points to the first character after MOUSE.SYS
  849. ;*                     on the DEVICE= line in the CONFIG.SYS file.
  850. ;*
  851. ;*                      SType has been initialized to FALSE
  852. ;*
  853. ;*
  854. ;*  RETURN-NORMAL : SType = TRUE if found
  855. ;*                     = FALSE not found
  856. ;*
  857. ;*  RETURN-ERROR  :  Carry flag set
  858. ;*
  859. ;*  EFFECTS:
  860. ;*
  861. ;*  INTERNAL REFERENCES:
  862. ;*     ROUTINES   :  None
  863. ;*
  864. ;*  EXTERNAL REFERENCES:
  865. ;*     ROUTINES   :  None.
  866. ;*
  867. ;*  CONTEXT       :
  868. ;*                    Init time strategy request.
  869. ;*
  870. ;************************************************************************
  871.  
  872.  
  873. FindSType  proc  near
  874. ;*
  875. ;* the following code fixes a     in the GA code that wouldn't allow     ;emi
  876. ;* QSIZE and STYPE parms                                                 ;emi
  877. ;*                                                                       ;emi
  878.  
  879.        .repeat                                                            ;emi
  880.           mov  al, byte ptr es:[di]                                       ;emi
  881.           .while <al ne 'S'>                                              ;emi
  882.             .if <zero al>                                                 ;emi
  883.                clc                                                        ;emi
  884.                jmp fst_exit                                               ;emi
  885.              .endif                                                       ;emi
  886.              inc di                                                       ;emi
  887.              mov  al, byte ptr es:[di]                                    ;emi
  888.           .endwhile                                                       ;emi
  889.           inc di                                                          ;emi
  890.           .if < <byte ptr es:[di+0]> eq 'T'> AND                          ;emi
  891.           .if < <byte ptr es:[di+1]> eq 'Y'> AND                          ;emi
  892.           .if < <byte ptr es:[di+2]> eq 'P'> AND                          ;emi
  893.           .if < <byte ptr es:[di+3]> eq 'E'>                              ;emi
  894.              add di, 4                                                    ;emi
  895.              call  SkipWhiteSpace                                         ;emi
  896.              .leave <<byte ptr es:[di]> eq '='>                           ;emi
  897.           .endif                                                          ;emi
  898.        .until                                                             ;emi
  899.        inc  di    ; skip the = sign                                       ;emi
  900.  
  901.        call SkipWhiteSpace
  902.  
  903.        lea  si, STypeName
  904.        mov  al, es:[di]
  905.  
  906.        .while < al ne 0>   AND
  907.        .while < al ne ' '> AND
  908.        .while < al ne TAB>
  909.           mov  [si], al
  910.           inc  si
  911.           inc  di
  912.           mov  al, es:[di]
  913.           mov  SType, TRUE
  914.        .endwhile
  915.  
  916. fst_exit:
  917.        ret
  918.  
  919. FindSType  endp
  920.  
  921. ;********************************************************************
  922. ;*
  923. ;*  FUNCTION NAME :  Emi_Init
  924. ;*
  925. ;*  DESCRIPTION   :  Initialize EMI
  926. ;*
  927. ;*  FUNCTION      :  Make connection with the emi driver. Check to see
  928. ;*                   if the aux port is being used by the emi driver.
  929. ;*
  930. ;*                   This is here instead of in EMI.ASM so it will
  931. ;*                   get freed after initialization.
  932. ;*
  933. ;*  ENTRY POINT   :  Emi_Init           LINKAGE:  CALL NEAR
  934. ;*
  935. ;*  INPUT         :  none
  936. ;*                   DS - MOUSE$ data selector
  937. ;*
  938. ;*  RETURN-NORMAL : OK
  939. ;*
  940. ;*  RETURN-ERROR  :  Never.
  941. ;*
  942. ;*  EFFECTS       :  Set global switch indicating if emi is active and
  943. ;*                   whether the Aux port is being used.
  944. ;*
  945. ;*  INTERNAL REFERENCES:
  946. ;*     ROUTINES   :  NONE
  947. ;*
  948. ;*
  949. ;*  EXTERNAL REFERENCES:
  950. ;*     ROUTINES   :  NONE
  951. ;*     DevHelps   :  AttachDD
  952. ;*
  953. ;************************************************************************
  954.  
  955.  
  956.                                                                         ;emi
  957. Emi_Init proc  near                                                     ;emi
  958. ;*                                                                      ;emi
  959. ;* attach to the emi driver                                             ;emi
  960. ;*                                                                      ;emi
  961.  
  962.   mov  bx, offset EmiDDName        ; driver name                        ;emi
  963.   mov  di, offset EmiDD            ; attachDD return structure          ;emi
  964.   mov  dl, DevHlp_AttachDD         ; function number                    ;emi
  965.   call Device_Help                 ; go do the attach                   ;emi
  966.   .if  nc                          ; if successfull                     ;emi
  967.      or   EmiFlags,EMI_ACTIVE+EMI_NEED_CONFIG ;present and needs config ;emi
  968. ;*                                                                      ;emi
  969. ;* see if emi will be using the aux port by searching the device table  ;emi
  970. ;* for emi devices that request use of the aux port                     ;emi
  971. ;*                                                                      ;emi
  972.  
  973.      mov  al, DHGETDOSV_DEVICECLASSTABLE                                ;emi
  974.      mov  cx, DEVCLASS_INPUT    ; input class                           ;emi
  975.      mov  dl, DevHlp_GetDOSVar  ; function number                       ;emi
  976.      call Device_Help                                                   ;emi
  977.      .if  nc                                                            ;emi
  978.         mov  es, ax                                                     ;emi
  979.         mov  cx, es:[bx].DCCount                                        ;emi
  980.         .if  <nonzero cx>                                               ;emi
  981.            add  bx,DCTableEntries-DCCount                               ;emi
  982.            .repeat                                                      ;emi
  983.               .if  <bit es:[bx].DCFlags nz REG_EXT_IF> AND              ;emi
  984.               .if  <bit es:[bx].DCFlags nz REG_AUX>                     ;emi
  985.                  or   EmiFlags,EMI_AUX_BUSY ;aux port to be used by emi ;emi
  986.               .endif                                                    ;emi
  987.            .loop                                                        ;emi
  988.         .endif                                                          ;emi
  989.      .endif                                                             ;emi
  990.  
  991. ;*                                                                      ;emi
  992. ;* fill in the Mouse Variable Table                                     ;emi
  993. ;*                                                                      ;emi
  994.  
  995.      lea si, EmiMvt                                                     ;emi
  996.                                                                         ;emi
  997.      lea ax, EmiEntryPoint                ; IDC entry point             ;emi
  998.      mov word ptr EmiMvt.EmiEntry,ax                                    ;emi
  999.      mov ax, cs                                                         ;emi
  1000.      and ax, 0fff8h                                                     ;emi
  1001.      mov word ptr EmiMvt.EmiEntry+2,ax                                  ;emi
  1002.                                                                         ;emi
  1003.      lea ax,Int_Packet                    ; Interrupt packets           ;emi
  1004.      mov word ptr EmiMvt.IntPacket,  ax                                 ;emi
  1005.      mov word ptr EmiMvt.IntPacket+2,ds                                 ;emi
  1006.      lea ax,SInt_Packet                                                 ;emi
  1007.      mov word ptr EmiMvt.SIntPacket,  ax                                ;emi
  1008.      mov word ptr EmiMvt.SIntPacket+2,ds                                ;emi
  1009.                                                                         ;emi
  1010.      lea ax,MEvent.Mon_Time               ; Where to pass time stamp    ;emi
  1011.      mov word ptr EmiMvt.TimeStamp,  ax                                 ;emi
  1012.      mov word ptr EmiMvt.TimeStamp+2,ds                                 ;emi
  1013.                                                                         ;emi
  1014.      lea ax,DeviceData                    ; Where to find DeviceData    ;emi
  1015.      mov word ptr EmiMvt.SDevData,ax                                    ;emi
  1016.      mov word ptr EmiMvt.SDevData+2,ds                                  ;emi
  1017.                                                                         ;emi
  1018.      lea ax,EMaskMax                      ; Where to find Event Mask    ;emi
  1019.      mov word ptr EmiMvt.EventMask,ax                                   ;emi
  1020.      mov word ptr EmiMvt.EventMask+2,ds                                 ;emi
  1021.                                                                         ;emi
  1022.   .endif                                                                ;emi
  1023.   ret                                                                   ;emi
  1024. Emi_Init  Endp                                                          ;emi
  1025.  
  1026. ;************************************************************************
  1027. ;*
  1028. ;*  FUNCTION NAME :  SkipWhiteSpace
  1029. ;*
  1030. ;*  DESCRIPTION   :  This routine will skip over all tabs and
  1031. ;*                     blank spaces.
  1032. ;*
  1033. ;*  FUNCTION      :  This routine is called with ES:DI pointing a
  1034. ;*                   character string. The pointer will be incremented
  1035. ;*                   to point to the first non-whitespace character
  1036. ;*
  1037. ;*  ENTRY POINT   :  SkipWhiteSpace    LINKAGE:  CALL NEAR
  1038. ;*
  1039. ;*  INPUT         :  ES:DI points to the character string.
  1040. ;*
  1041. ;*  RETURN-NORMAL : Always
  1042. ;*                    ES:DI - will point to the first non-whitespace
  1043. ;*                       character encountered.
  1044. ;*
  1045. ;*  RETURN-ERROR  :  None
  1046. ;*
  1047. ;*
  1048. ;*  INTERNAL REFERENCES:
  1049. ;*     ROUTINES   :  None
  1050. ;*
  1051. ;*  EXTERNAL REFERENCES:
  1052. ;*     ROUTINES   :  None.
  1053. ;*
  1054. ;*  CONTEXT       :
  1055. ;*                    Init time strategy request.
  1056. ;*
  1057. ;************************************************************************
  1058.  
  1059.  
  1060. SkipWhiteSpace  proc  near
  1061.  
  1062.         .while < <byte ptr es:[di]> eq ' '> OR
  1063.         .while < <byte ptr es:[di]> eq TAB >
  1064.            inc  di
  1065.         .endwhile
  1066.         ret
  1067.  
  1068. SkipWhiteSpace  endp
  1069.  
  1070. ;*********************************************************************
  1071. ;*
  1072. ;*  FUNCTION NAME :  gmDeviceInit
  1073. ;*
  1074. ;*  DESCRIPTION   :  Generic Pointing Device Support Init
  1075. ;*
  1076. ;*  FUNCTION      :  This routine initializes the hardware dependent
  1077. ;*                   device driver.
  1078. ;*
  1079. ;*  ENTRY POINT   :  gmDeviceInit      LINKAGE:  CALL NEAR
  1080. ;*
  1081. ;*  INPUT         :  ES:BX points to the request block.
  1082. ;*
  1083. ;*  RETURN-NORMAL :  Device is initialized.
  1084. ;*
  1085. ;*  RETURN-ERROR  :  Device left disabled.
  1086. ;*
  1087. ;*  EFFECTS       :  Stack is clean on return, NO registers changed.
  1088. ;*
  1089. ;*  INTERNAL REFERENCES:
  1090. ;*     ROUTINES   :  None
  1091. ;*
  1092. ;*  EXTERNAL REFERENCES:
  1093. ;*     ROUTINES   :  NONE
  1094. ;*
  1095. ;*********************************************************************
  1096.  
  1097.  
  1098. gmDeviceInit  Proc  Near
  1099.  
  1100. ;*
  1101. ;* Now check to make sure we are loading on an ABIOS machine.
  1102. ;*
  1103.  
  1104.        mov  al, 0bh                      ; APD Device ID
  1105.        mov  bl, 1                        ; Get 1st LID
  1106.        xor  dh, dh                       ; reserved, must be 0
  1107.        mov  dl, DevHlp_GetLIDEntry       ; ABIOS function
  1108.        call Device_Help                  ; invoke Dev Help
  1109.  
  1110.        .if <nc>                          ; If this is an ABIOS machine
  1111.            mov  ABIOS_Mch, TRUE          ; ABIOS_Mch initially set to FALSE
  1112.            mov  dl, DevHlp_FreeLIDEntry
  1113.            call Device_Help              ; give LID back for now
  1114.        .elseif < ax ne Error_ABIOS_Not_Present >
  1115.            mov  ABIOS_Mch, TRUE
  1116.        .endif
  1117. ;;*
  1118. ;;* 84853 - Move this code down below so it checks for serial mouse first.
  1119. ;;*
  1120. ;;*       .if <bit EmiFlags z  EMI_AUX_BUSY>                             ;emi
  1121. ;;*          call  CheckforPDIDevice
  1122. ;;*          .if  <nc>
  1123. ;;*             mov  DeviceData.MouseType, PDI_DEVICE
  1124. ;;*             mov  DeviceData.IRQ, 12
  1125. ;;*             mov  ax, offset PDI_Int_Handler
  1126. ;;*             jmp  jc1
  1127. ;;*          .endif
  1128. ;;*       .endif                                                         ;emi
  1129.  
  1130.        call  CheckforMSSDevice
  1131.        .if  <nc>
  1132.           mov  DeviceData.MouseType, MSS_DEVICE
  1133.           mov  bx, PortBase
  1134.           mov  DeviceData.ComPort, bx
  1135. ;* AGGGH!  and  bx, 0f00h
  1136. ;*         inc  bh
  1137. ;*  THIS   mov  DeviceData.IRQ, bh
  1138. ;*   IS
  1139. ;*  VERY   mov  cl, bh
  1140. ;* COM1-4  mov  ax, 0001h             ; Build 8259 IC Mask
  1141. ;* SPEC-   shl  ax, cl                ; from returned IRQ #
  1142. ;*  IFIC
  1143.  
  1144.           call MSS_Find_Int           ; find selected interrupt level
  1145.           jnc  havint
  1146.  
  1147.           mov  bx, PortBase           ; couldn't autodetect... hardwire it
  1148.           and  bx, 0f00h
  1149.           inc  bh
  1150.           mov  DeviceData.IRQ, bh
  1151.  
  1152.           mov  cl, bh
  1153.           mov  ax, 0001h              ; Build 8259 IC Mask
  1154.           shl  ax, cl                 ; from returned IRQ #
  1155.  
  1156. havint:   mov  DeviceData.IRQ,bh
  1157.           mov  Disable_8259, al       ; Save Disable 8259 Mask
  1158.           mov  Disable_28259, ah      ; Save Disable 2nd 8259 Mask
  1159.           not  ax                     ; Invert Mask for Enable Bits
  1160.           mov  Enable_8259, al        ; Save Enable 8259 Mask
  1161.           mov  Enable_28259, ah       ; Save Enable 2nd 8259 Mask
  1162.  
  1163.           mov  dx,PortBase            ;DEBUG
  1164.           mov  cx,LONGDELAY           ;DEBUG
  1165.           call SetupCOMForMouse       ;DEBUG
  1166.           call ResetSerialMouse       ;DEBUG
  1167.  
  1168.           mov  ax, offset MSS_Int_Handler
  1169.           jmp  jc1
  1170.        .endif
  1171. ;;*
  1172. ;;* 84853  This was moved here from above.
  1173. ;;*
  1174.        .if <bit EmiFlags z  EMI_AUX_BUSY>                             ;emi
  1175.           call  CheckforPDIDevice
  1176.           .if  <nc>
  1177.              mov  DeviceData.MouseType, PDI_DEVICE
  1178.              mov  DeviceData.IRQ, 12
  1179.              mov  ax, offset PDI_Int_Handler
  1180.              jmp  jc1
  1181.           .endif
  1182.        .endif                                                         ;emi
  1183.  
  1184.        .if <ABIOS_Mch eq FALSE>
  1185.           call CheckforINPDevice
  1186.           .if <nc>
  1187.              mov  DeviceData.MouseType, INP_DEVICE
  1188.              mov  DeviceData.IRQ, al
  1189.              mov  ax, offset INP_Int_Handler
  1190.              jmp  jc1
  1191.           .endif
  1192.  
  1193.           call CheckforBUSDevice
  1194.           .if <nc>
  1195.              mov  First_Port, BUS_First_Possible
  1196.              mov  DeviceData.MouseType, BUS_DEVICE
  1197.              mov  DeviceData.IRQ, al
  1198.              mov  ax, offset BUS_Int_Handler
  1199.              jmp  jc1
  1200.           .endif
  1201.  
  1202.        .endif
  1203. ;*
  1204. ;* If we reach this point we haven't found any pointing devices. We must
  1205. ;* still load because the install program has to be able to call the ioctl
  1206. ;* GetPointerDeviceID.
  1207. ;*
  1208.  
  1209.        clc                                ; nothing found
  1210.        jmp  jc2
  1211.  
  1212. ;*
  1213. ;* Now go claim the IRQ level.
  1214. ;*
  1215.  
  1216. jc1:
  1217.        xor bh, bh
  1218.        mov bl, DeviceData.IRQ              ; get IRQ needed
  1219.  
  1220.        pusha
  1221.        push es
  1222.        push bx
  1223.        call _RM_MSE_AllocIRQ
  1224.        or ax, ax
  1225.        pop bx
  1226.        pop es
  1227.        popa
  1228.        jne  short IRQTaken
  1229.  
  1230.        mov  dh, 01h                        ; share the level
  1231.        mov  dl, DevHlp_SetIRQ              ; function number
  1232.        call Device_Help                    ; go do it
  1233.  
  1234.        .if <c>                             ; if error
  1235.           xor  dh, dh                      ; IRQ level as unshared
  1236.           call Device_Help                 ; try again
  1237.           .if <c>                          ; if error
  1238.              jmp  jc2
  1239.           .endif
  1240.        .endif
  1241. IRQTaken:
  1242.  
  1243.       .if <DeviceData.MouseType eq PDI_DEVICE>
  1244.          call  PDIInit
  1245.       .elseif <DeviceData.MouseType eq MSS_DEVICE>
  1246.          call  InitComPort
  1247.       .elseif <DeviceData.MouseType eq INP_DEVICE>
  1248.          call  InportInit
  1249.       .elseif <DeviceData.MouseType eq BUS_DEVICE>
  1250.          call  BusInit
  1251.       .endif
  1252.  
  1253.       or   DevStatus, gREADENABLE         ; We are now ready for events
  1254.  
  1255.       pusha
  1256.       push es
  1257.       mov al, DeviceData.MouseType
  1258.       xor ah, ah
  1259.       push ax
  1260.       call _RM_MSE_CreateAdapter
  1261.       pop ax
  1262.       call _RM_MSE_CreateDevice
  1263.       pop  es
  1264.       popa
  1265.  
  1266. jc2:
  1267.        ret
  1268. gmDeviceInit  endp
  1269.  
  1270.  
  1271. ;******************************************************************************
  1272. ;*
  1273. ;* FUNCTION NAME   : SetupForWait
  1274. ;*
  1275. ;* DESCRIPTION     : This procedure accepts the number of milliseconds that we
  1276. ;*                   we will want to delay for and will set things up for wait.
  1277. ;*
  1278. ;* ENTRY           : CX            Number of milliseconds to delay for
  1279. ;*                   GDT_Seg       Gives bimodal address of System Info Seg
  1280. ;*
  1281. ;* EXIT            : BX:CX         Dword value giving ending time
  1282. ;*                   ES:DI         Points at dword in SIS giving current time
  1283. ;*                   Interrupts enabled
  1284. ;*
  1285. ;*                   ALTERS  BX, CX, DI, ES
  1286. ;******************************************************************************
  1287.  
  1288. SetupForWait  proc  near
  1289.  
  1290.         xor     bx,bx                 ; BX:CX give # msecs to delay.
  1291.         mov     es, GDT_Seg           ; ES address SIS.
  1292.         mov     di, SIS_MsCount       ; ES:DI points at msec counter.
  1293.  
  1294.         cli                           ; Interrupts off while accessing time.
  1295.         add     cx,word ptr es:[di]   ; Determine ending time by adding the
  1296.         adc     bx,word ptr es:[di+2] ;  amount of the delay to the time.
  1297.         sti                           ; Make sure interrupts are enabled!
  1298.  
  1299.         ret
  1300.  
  1301. SetupForWait  endp
  1302.  
  1303. ;*****************************************************************************
  1304. ;*
  1305. ;* FUNCTION NAME: IsWaitOver
  1306. ;*
  1307. ;* DESCRIPTION  : This procedure accepts the current time and the ending time
  1308. ;*                and retruns an indication of whether the current time is past
  1309. ;*                the ending time.
  1310. ;* ENTRY        :
  1311. ;*                   BX:CX        Ending time value (double word)
  1312. ;*                   ES:DI        Points at current time (double word)
  1313. ;* EXIT         :
  1314. ;*                   Carry clear  Current time is not past ending time
  1315. ;*                   Carry set    Current time is past ending time
  1316. ;*
  1317. ;*                   ALTERS  none
  1318. ;******************************************************************************
  1319.  
  1320.  
  1321. IsWaitOver  proc  near
  1322.  
  1323.         cli                             ; No interrupts (time may change).
  1324.         cmp     bx,word ptr es:[di+2]   ; Compare high words first.
  1325.                                         ; Current time exceeds ending time,
  1326.                                         ;  leave with carry set.
  1327.         jne     short iwo_leave         ; Current time does not exceed ending
  1328.                                         ;  time, leave with carry clear.
  1329.         cmp     cx,word ptr es:[di]     ; High words are equal. Return with
  1330.                                         ;  result of comparison of low words.
  1331.  
  1332. iwo_leave:                              ; Carry set or clear appropriately.
  1333.         sti                             ; Interrupts ok again.
  1334.         ret
  1335.  
  1336. IsWaitOver  endp
  1337.  
  1338. CSEG     ENDS
  1339.          END
  1340.