home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddkx86v5.zip / DDKX86 / SRC / PEN / PENTKT / PENBASE / INIT.ASM < prev    next >
Assembly Source File  |  1995-04-14  |  20KB  |  648 lines

  1. ;*DDK*************************************************************************/
  2. ;
  3. ; COPYRIGHT    Copyright (C) 1995 IBM Corporation
  4. ;
  5. ;    The following IBM OS/2 WARP source code is provided to you solely for
  6. ;    the purpose of assisting you in your development of OS/2 WARP device
  7. ;    drivers. You may use this code in accordance with the IBM License
  8. ;    Agreement provided in the IBM Device Driver Source Kit for OS/2. This
  9. ;    Copyright statement may not be removed.;
  10. ;*****************************************************************************/
  11. ;      /*****************************************************************/
  12. ;      /*                                                               */
  13. ;      /*                                                               */
  14. ;      /*****************************************************************/
  15. ;      /******************* START OF SPECIFICATIONS *********************/
  16. ;      /*                                                               */
  17. ;      /*  SOURCE FILE NAME: INIT.ASM                                   */
  18. ;      /*                                                               */
  19. ;      /*  DESCRIPTIVE NAME: Initialization routine                     */
  20. ;      /*                                                               */
  21. ;      /*                                                               */
  22. ;      /*  STATUS:  Version 1.0                                         */
  23. ;      /*                                                               */
  24. ;      /*  NOTES: Perform all functions needed to initialize the        */
  25. ;      /*         driver. Routines are provided to parse the config.sys */
  26. ;      /*         line and to modify the driver name and driver device  */
  27. ;      /*         name.                                                 */
  28. ;      /*                                                               */
  29. ;      /*         Unit 0 variables are provided as follows:             */
  30. ;      /*         index 0 = device error count                          */
  31. ;      /*         index 1 = panic codes                                 */
  32. ;      /*                                                               */
  33. ;      /*         These variables can be queried with the pen device    */
  34. ;      /*         driver tool. Panic codes are defined in PEN.INC and   */
  35. ;      /*         provide problem determination if the driver is not    */
  36. ;      /*         functional.                                           */
  37. ;      /*                                                               */
  38. ;      /*  ENTRY POINTS:                                                */
  39. ;      /*      See public statements                                    */
  40. ;      /*  EXTERNAL REFERENCES:                                         */
  41. ;      /*      See extrn statements                                     */
  42. ;      /*                                                               */
  43. ;      /******************* END  OF  SPECIFICATIONS *********************/
  44. .xlist
  45.   include pensegs.inc
  46.   include pen.inc
  47.   include penei.inc
  48.   include penidc.inc
  49.   include penioctl.inc
  50.   include devsym.inc
  51.   include devhlp.inc
  52.   include struc.inc
  53. .list
  54.  
  55. .286p
  56.  
  57. ;------------------------------------------------------------------------------
  58. ;  external data references
  59. ;------------------------------------------------------------------------------
  60.  
  61. extrn DDHdr1 : byte
  62. extrn Dev_ErrorCount : dword
  63. extrn Dev_Lev_Major : byte
  64. extrn Dev_Lev_Minor : byte
  65.  
  66. ;------------------------------------------------------------------------------
  67. ;  external routines
  68. ;------------------------------------------------------------------------------
  69.  
  70. extrn Dev_Init   : near
  71. extrn Loc_Init   : near
  72. extrn But_Init   : near
  73. extrn Dsp_Init   : near
  74. extrn Tim_Init   : near
  75. extrn Trc_Init   : near
  76. extrn Vmc_Init   : near
  77. extrn Idc_DriverEntryPoint : near
  78. extrn Gio_AddDCB : near
  79. extrn Dsp_callback :near
  80.  
  81. ;------------------------------------------------------------------------------
  82. ; local equates
  83. ;------------------------------------------------------------------------------
  84.  
  85. GDTINFOINDEX equ    1
  86.  
  87. ;------------------------------------------------------------------------------
  88. ; global data declarations
  89. ;------------------------------------------------------------------------------
  90. public Device_Help,RegCaps0
  91.  
  92. DSEG segment
  93.  
  94. Device_Help   dd 0 ; Dev helper entry point
  95.  
  96. public dcb0
  97.   dcb0        DCB_DRV <>      ; driver dcb
  98. public RegCaps0
  99.   RegCaps0    DDCAP   <>      ; device driver registration packet
  100.  
  101. ; define unit 0 unit variables, accessable via query|set unit variable IOCTL
  102.  
  103. public DDPanic
  104. UVAR_COUNT    equ  2
  105. numUVars DD UVAR_COUNT
  106. UVarss   DD 0                 ; 0= error count
  107. DDPanic  DD PANIC_DDS         ; 1= panic numbers (init to DDS not contact us)
  108.  
  109.  
  110. Public GDTInfoSeg
  111. GDTInfoSeg dw  0     ; Save GDT Selector to info seg
  112.  
  113. DSEG ends
  114.  
  115. ;------------------------------------------------------------------------------
  116. ; local init data declarations
  117. ;------------------------------------------------------------------------------
  118.  
  119. DSEGI SEGMENT
  120.   public ENDDATA
  121.   ENDDATA label byte ; used to figure end of init data to free
  122.   deviceName    db  'DRIVER  '    ; device name
  123.   public ParmLine
  124.   ParmLine      dd 0 ; pointer to config.sys line
  125.   public InitPkt
  126.   InitPkt   dd 0
  127. DSEGI ends
  128.  
  129. CSEGI SEGMENT
  130.   ASSUME    CS:CSEGI, SS:nothing, ES:nothing, DS:DGROUP
  131.   public ENDCODE
  132.   ENDCODE label near  ; used to know where to truncate after INIT command
  133. ;------------------------------------------------------------------------------
  134. ; OS/2 initialization routine entry point
  135. ; es:bx = request packet
  136. ;------------------------------------------------------------------------------
  137. public Init_Init
  138. Init_Init Proc  Near
  139.  
  140. ; Get the address to the DevHelp router and save in our DS.
  141.  
  142.   mov     word ptr InitPkt, bx
  143.   mov     word ptr InitPkt+2, es
  144.   push es
  145.   push bx
  146.  
  147. .386p
  148.   mov  edx,dword ptr es:[bx.InitpBPB]      ; get config.sys statement pointer
  149.   mov  ParmLine, edx
  150.   mov  edx,dword ptr es:[bx].InitDevHlp
  151.   mov  Device_Help, edx
  152. .286p
  153.  
  154. ; get the info seg
  155.  
  156.   push es
  157.   push bx
  158.   mov  al, GDTINFOINDEX         ; Request GDT InfoSeg value = 1
  159.   mov  dl, DevHlp_GetDOSVar     ; DevHelp function number
  160.   call Device_Help              ; Invoke GetDOSVar Function
  161.   .if  c
  162.      PANIC PANIC_DEVHLP1
  163.   .else
  164.      mov  es, ax                ; Get the GDT level 0 selector and
  165.      mov  ax, word ptr es:[bx]  ; Overwrite the level 3 Selector
  166.      mov  GDTInfoSeg, ax        ; Save GDT Selector
  167.   .endif
  168.   pop  bx
  169.   pop  es
  170.  
  171. ; add a dcb for the driver to list as unit 0
  172.  
  173.   lea  bx, dcb0
  174.   call Gio_AddDCB
  175.   call initDCB0
  176.   call Tim_Init
  177.  
  178. ; Set up all devices and add all DCBs
  179.  
  180.   les  di,ParmLine ; Set ES:DI -> to config.sys
  181.   call Dev_Init
  182.   .if  <zero ax>
  183.  
  184. ; register with penPM device services
  185.  
  186.      mov  si, offset DDHdr1 + 10       ; driver name
  187.      mov  ax, cs
  188.      mov  bx, offset Idc_DriverEntryPoint
  189.      mov  cx, 2
  190.      mov  di, REG_EXT_IF
  191.      mov  dl, DevHlp_RegisterDeviceClass
  192.      call Device_Help
  193.      .if c
  194.         PANIC PANIC_DEVHLP2
  195.      .endif
  196.  
  197. ; do device type initializations
  198.  
  199.      CALL_TYPE Loc_Init,DT_LOCATOR
  200.      CALL_TYPE But_Init,DT_BUTTON
  201.      CALL_TYPE Dsp_Init,DT_DISPLAY
  202.      CALL_ALL  Int_ChkNames
  203.  
  204. ; do driver initialazations
  205.  
  206.      les  di,ParmLine ; Set ES:DI -> to config.sys line
  207.      call Trc_Init
  208.      les  di,ParmLine ; Set ES:DI -> to config.sys line
  209.      call Vmc_Init
  210.      xor  ax,ax
  211.   .endif
  212.  
  213. ; free the init code and data segments
  214.  
  215.   pop  bx
  216.   pop  es
  217.   mov  byte ptr es:[bx].InitcUnit, 0
  218.   .if  <zero ax>
  219.      mov  word ptr es:[bx].InitpEnd, offset ENDCODE
  220.      mov  word ptr es:[bx].InitpEnd+2, offset ENDDATA
  221.   .else
  222.      mov  es:[bx].PktStatus, ax         ; set error return code
  223.      mov  word ptr es:[bx].InitpEnd, 0
  224.      mov  word ptr es:[bx].InitpEnd+2, 0
  225.      PANIC PANIC_DEVINIT ; This won't show up since the dd will terminate
  226.   .endif
  227.   ret
  228.  
  229. Init_Init  EndP
  230.  
  231. ;------------------------------------------------------------------------------
  232. ; Set up the driver device DCB
  233. ;------------------------------------------------------------------------------
  234. public initDCB0
  235. initDCB0 proc
  236.   mov  dcb0.dcb_@RegCaps, offset RegCaps0
  237.   mov  al, dcb0.dcb_Unit
  238.   mov  bx, dcb0.dcb_@regCaps
  239.   mov  [bx].ccap_unit, al
  240.   mov  [bx].ccap_device_type,DT_DRIVER
  241.   mov  [bx].ccap_length, size DDCAP
  242.   mov  al, Dev_Lev_Major
  243.   mov  [bx].ddcap_rev_major,al
  244.   mov  al, Dev_Lev_Minor
  245.   mov  [bx].ddcap_rev_minor,al
  246.   mov  [bx].ddcap_ioc_major,PEN_IOCTL_LEV_MAJOR
  247.   mov  [bx].ddcap_ioc_minor,PEN_IOCTL_LEV_MINOR
  248.   mov  [bx].ddcap_eif_major,PEN_EI_LEV_MAJOR
  249.   mov  [bx].ddcap_eif_minor,PEN_EI_LEV_MINOR
  250.   mov  [bx].ddcap_idc_major,PEN_DDS_LEV_MAJOR
  251.   mov  [bx].ddcap_idc_minor,PEN_DDS_LEV_MINOR
  252.  
  253.   mov  si, offset DDHdr1 + 10       ; driver name
  254.   lea  di, [bx].ccap_driver_name
  255.   cld
  256.   push ds
  257.   pop  es
  258.   mov  cx,SIZEOF_DRIVER_NAME
  259.   rep  movsb
  260.   mov  si, offset deviceName        ; device name
  261.   lea  di, [bx].ccap_device_name
  262.   mov  cx, SIZEOF_DRIVER_NAME
  263.   rep  movsb
  264.  
  265.   mov  dcb0.dcb_@UVars,      offset numUVars
  266.  
  267.   mov  dcb0.dcb_@Dev_quv,    offset unit0_quv
  268.   mov  dcb0.dcb_@Dev_suv,    offset unit0_suv
  269.   mov  dcb0.dcb_@Dev_Start,  offset Null_rtn
  270.  
  271.   mov  dcb0.dcb_@Dev_CallBack,offset Dsp_callback
  272.   ret
  273. initDCB0 endp
  274.  
  275. ;------------------------------------------------------------------------------
  276. ; make sure all names are null terminated
  277. ;------------------------------------------------------------------------------
  278. public  Int_ChkNames
  279. Int_ChkNames proc
  280.   mov di,[bx].dcb_@RegCaps
  281.   mov [di].ccap_device_name+SIZEOF_DEVICE_NAME-1,0
  282.   stc ;do all
  283.   ret
  284. Int_ChkNames endp
  285.  
  286. CSEGI    ENDS
  287.  
  288. ;-- ROUTINES FOR DRIVER DEVICE ------------------------------------------------
  289. ;
  290. ;------------------------------------------------------------------------------
  291.  
  292. ;------------------------------------------------------------------------------
  293. ; Query unit variable, variable 0 is used to return the number of device errors
  294. ;------------------------------------------------------------------------------
  295.  
  296. CSEG segment
  297.      ASSUME    CS:CGROUP, SS:nothing, ES:nothing, DS:DGROUP
  298.  
  299. public unit0_quv
  300. unit0_quv proc
  301.  .if <ax eq 0>
  302.     .386p
  303.     mov  edx,Dev_ErrorCount
  304.     .286p
  305.  .endif
  306.  ret
  307. unit0_quv endp
  308.  
  309. ;------------------------------------------------------------------------------
  310. ; Query unit variable, variable 0 can be reset to 0
  311. ;------------------------------------------------------------------------------
  312. public unit0_suv
  313. unit0_suv proc
  314.  .if <ax eq 0>
  315.     .386p
  316.     mov  Dev_ErrorCount,edx
  317.     .286p
  318.  .endif
  319.  ret
  320. unit0_suv endp
  321.  
  322. ;------------------------------------------------------------------------------
  323. ; Avaiable for use
  324. ;------------------------------------------------------------------------------
  325. public Null_rtn
  326. Null_rtn proc
  327.   xor ax,ax
  328.   ret
  329. Null_rtn endp
  330.  
  331. public Null_rtn_far
  332. Null_rtn_far proc far
  333.   stc
  334.   ret
  335. Null_rtn_far endp
  336.  
  337. CSEG     ENDS
  338.  
  339. ;-- SOME UTILITY ROUTINES FOR INIT TIME ---------------------------------------
  340. ;
  341. ;------------------------------------------------------------------------------
  342. CSEGI SEGMENT
  343.   ASSUME    CS:CSEGI, SS:nothing, ES:nothing, DS:DGROUP
  344.  
  345. ;------------------------------------------------------------------------------
  346. ; Set Driver Name
  347. ; si = driver name (8 characters)
  348. ;------------------------------------------------------------------------------
  349. public SetDriverName
  350. SetDriverName proc
  351.   cld
  352.   push ds
  353.   pop  es
  354.  
  355.   push si                       ;fix up device header
  356.   mov  di, offset DDHdr1 + 10
  357.   mov  cx,SIZEOF_DRIVER_NAME
  358.   rep  movsb
  359.   pop  si
  360.  
  361.   lea  di,RegCaps0.ccap_driver_name    ;fix up dcb 0
  362.   mov  cx,SIZEOF_DRIVER_NAME
  363.   rep  movsb
  364.   ret
  365. SetDriverName endp
  366.  
  367. ;------------------------------------------------------------------------------
  368. ; Set Device Name
  369. ; si = device name (SIZEOF_DEVICE_NAME characters,null terminated)
  370. ;------------------------------------------------------------------------------
  371. public SetDeviceName
  372. SetDeviceName proc
  373.   cld
  374.   push ds
  375.   pop  es
  376.  
  377.   lea  di,RegCaps0.ccap_device_name    ;fix up dcb 0
  378.   mov  cx,SIZEOF_DEVICE_NAME
  379.   .repeat
  380.      movsb
  381.      .leave <<byte ptr [si]> eq 0>
  382.   .loop
  383.   ret
  384. SetDeviceName endp
  385.  
  386. ;------------------------------------------------------------------------------
  387. ; Set IDC Entry point
  388. ; di = device dependent IDC entry point
  389. ;------------------------------------------------------------------------------
  390. public SetIDCEntry
  391. SetIDCEntry   proc
  392.   mov word ptr DDHdr1 + 8,di
  393.   ret
  394. SetIDCEntry   endp
  395.  
  396.  
  397. CR equ 0dh
  398. LF equ 0ah
  399.  
  400. ;*********************** String Compare w/o Case ****************************
  401. ;* ENTRY:
  402. ;*    ds:si => ASCIIZ string 1 ( master )
  403. ;*    es:di => ASCII  string 2 ( to compare )
  404. ;* EXIT:
  405. ;*    ax    ==  0          strings equal for length of master
  406. ;*    ax    == -1  (FFFF)  string 1 less than string 2
  407. ;*    ax    ==  1          string 1 greater than string 2
  408. ;*   es:[di] => next character after match string if ax == 0
  409. ;* USES:
  410. ;*    si, di
  411. ;*    Direction Flag Cleared
  412. ;* DESCRIPTION:
  413. ;*    Will compare string 2 to string 1.  Strings must macth over the whole
  414. ;*    length of string 1.  If string 2 has characters past the end of string
  415. ;*    1, then that is still a match
  416. ;****************************************************************************
  417. public str_i_cmp
  418. str_i_cmp proc near
  419.  
  420.         ; test for end of string 1
  421. sic_loop:
  422.         cmp     byte ptr [si], 0
  423.         jnz     sic_not_end
  424.         mov     ax, 0
  425.         jmp     sic_done
  426.  
  427.         ; compare the current two characters ( after converting to upper case )
  428. sic_not_end:
  429.         mov     al, es:[di]
  430.         inc     di
  431.         call    to_upper
  432.         mov     ah, al
  433.  
  434.         mov     al, [si]
  435.         inc     si
  436.         call    to_upper
  437.  
  438.         sub     al, ah
  439.         je      sic_loop
  440.  
  441.         ; getting here means string are diffrent
  442.         mov     ax, 1                   ; assume str1 > str2
  443.         jnc     sic_done                ; actually test
  444.         mov     ax, 0FFFFh              ; fix assumtion as it was wrong
  445.  
  446. sic_done:
  447.         ret
  448. str_i_cmp endp
  449.  
  450. ;**************************** Skip Over Whitespace **************************
  451. ;* Function:    Advance to next non-whitespace character
  452. ;* Entry:       es:[di] => ascii text
  453. ;* Exit:        es:[di] => next non-whitespace or end of string
  454. ;* Preserves:   all except di
  455. ;****************************************************************************
  456. public skip_white
  457. skip_white proc near
  458.         dec     di
  459.  
  460. sw_loop:
  461.         inc     di
  462.         call is_white
  463.         jz      sw_loop
  464.  
  465.         ; not white space, return
  466.         ret
  467. skip_white endp
  468.  
  469. ;************************** Skip To Next Whitespace *************************
  470. ;* Function:    Advance to next whitespace character
  471. ;* Entry:       es:[di] => ascii text
  472. ;* Exit:        es:[di] => next whitespace or end of string
  473. ;* Preserves:   all except di
  474. ;****************************************************************************
  475. public skip_to_white
  476. skip_to_white proc near
  477.         push    ax
  478.  
  479. stw_loop:
  480.         mov     al, es:[di]
  481.         cmp     al, ' '
  482.         jz      stw_done
  483.         cmp     al, CR
  484.         jz      stw_done
  485.         cmp     al, LF
  486.         jz      stw_done
  487.         cmp     al, 0
  488.         jz      stw_done
  489.         cmp     al, 09h         ; tab
  490.         jz      stw_done
  491.  
  492.         ; not white space, advance
  493.         inc     di
  494.         jmp     stw_loop
  495.  
  496. stw_done:
  497.         pop     ax
  498.         ret
  499. skip_to_white endp
  500.  
  501. ;************************** Is Whitespace? *************************
  502. ;* Function:    Test character for whitespace
  503. ;* Entry:       es:[di] => ascii text
  504. ;* Exit:        zero flag set if whitespace
  505. ;* Preserves:   all
  506. ;****************************************************************************
  507. public is_white
  508. is_white  proc near
  509.         push    ax
  510.  
  511.         mov     al, es:[di]
  512.         cmp     al, ' '
  513.         jz      iw_done
  514.         cmp     al, ','
  515.         jz      iw_done
  516.         cmp     al, 09h         ; tab
  517.         jz      iw_done
  518.  
  519. iw_done:
  520.         pop     ax
  521.         ret
  522. is_white  endp
  523.  
  524. ;************************** Is End of Line? *************************
  525. ;* Function:    Test character for end of line character (CR,LF,0)
  526. ;* Entry:       es:[di] => ascii text
  527. ;* Exit:        zero flag set if end of line
  528. ;* Preserves:   all
  529. ;****************************************************************************
  530. public is_endln
  531. is_endln  proc near
  532.         push    ax
  533.  
  534.         mov     al, es:[di]
  535.         cmp     al, CR
  536.         jz      ie_done
  537.         cmp     al, LF
  538.         jz      ie_done
  539.         cmp     al, 0
  540.         jz      ie_done
  541.  
  542. ie_done:
  543.         pop     ax
  544.         ret
  545. is_endln  endp
  546.  
  547.  
  548.  
  549. ;********************** Convert Character to Upper Case *********************
  550. ;* ENTRY:
  551. ;*    al    = char to convert
  552. ;* EXIT:
  553. ;*    al    = converted ( if needed) char
  554. ;* USES:
  555. ;*    none
  556. ;****************************************************************************
  557. public to_upper
  558. to_upper proc near
  559.         cmp     al, 'a'
  560.         jb      tu_done
  561.         cmp     al, 'z'
  562.         ja      tu_done
  563.         sub     al, 'a'-'A'
  564. tu_done:
  565.         ret
  566. to_upper endp
  567.  
  568. ;***************************** Get Hex Number *******************************
  569. ;* Function:    Parse a hex number from an ascii string
  570. ;* Entry:       es:[di] => ascii text
  571. ;* Exit:        es:[di] => first non hex character
  572. ;*              ax value of number
  573. ;* Preserves:   std C
  574. ;****************************************************************************
  575. public get_hex_num
  576. get_hex_num proc near
  577.  
  578.         mov     ax, 0
  579.  
  580. ghn_loop:
  581.         mov     bl, es:[di]
  582.         cmp     bl, '0'
  583.         jb      ghn_exit
  584.         cmp     bl, '9'
  585.         ja      ghn_tst_let
  586.         sub     bl, '0'
  587.         jmp     ghn_add
  588.  
  589. ghn_tst_let:
  590.         and     bl, not ('A' xor 'a')   ; convert letter to uppercase
  591.         cmp     bl, 'A'
  592.         jb      ghn_exit
  593.         cmp     bl, 'F'
  594.         ja      ghn_exit
  595.         sub     bl, 'A' - 10            ; bl = ( bl - 'A') + 10
  596.  
  597. ghn_add:
  598.         mov     cl, 4
  599.         shl     ax, cl
  600.         add     al, bl
  601.         jmp     ghn_adv
  602.  
  603. ghn_adv:
  604.         inc     di
  605.         jmp     ghn_loop
  606.  
  607. ghn_exit:
  608.         ret
  609. get_hex_num endp
  610.  
  611. ;***************************** Get Hex Number *******************************
  612. ;* Function:    Parse a deciaml number from an ascii string
  613. ;* Entry:       es:[di] => ascii text
  614. ;* Exit:        es:[di] => first non hex character
  615. ;*              ax value of number
  616. ;* Preserves:   std C
  617. ;****************************************************************************
  618. temp    equ     bp-2
  619. public get_dec_num
  620. get_dec_num proc near
  621.         enter   2,0
  622.  
  623.         xor     ax,ax
  624.         xor     bx,bx
  625.         mov     word ptr [temp],10
  626.  
  627. gdn_loop:
  628.         mov     bl, es:[di]
  629.         cmp     bl, '0'
  630.         jb      gdn_exit
  631.         cmp     bl, '9'
  632.         ja      gdn_exit
  633.         sub     bl, '0'
  634.  
  635. gdn_add:
  636.         imul    word ptr [temp]
  637.         add     ax, bx
  638.         inc     di
  639.         jmp     gdn_loop
  640.  
  641. gdn_exit:
  642.         leave
  643.         ret
  644. get_dec_num endp
  645.  
  646. CSEGI    ENDS
  647.          END
  648.