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

  1. ;*DDK*************************************************************************/
  2. ;
  3. ; COPYRIGHT (C) Award Software International Inc., 1994
  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.                 name    SSPCICUT
  13.                 page    60, 132
  14.                 title   'SSPCICUT'
  15. ;******************************************************************************
  16. ;*
  17. ;*                            File SSPCICUT.ASM
  18. ;*
  19. ;*                     Socket Services PCIC Utilities
  20. ;*
  21. ;*
  22. ;*
  23. ;******************************************************************************
  24.  
  25.                 include ssmac.inc           ; Macros
  26.                 include ssdefs.inc          ; Sockets Services definitions
  27.                 include ss_segm.inc         ; Segment definitions
  28.                 include ssPCIC.inc          ; PCIC module defs
  29.                 include ssmsg.inc           ; Messages
  30.  
  31.  
  32. ;*****************************************************************************
  33. ;*                         --- Segment ResData ---
  34. ;*****************************************************************************
  35. sBegin          ResData
  36. DevExtSpeed     db      10, 12, 13, 15, 20, 25, 30      ; PCMCIA mantissa
  37.                 db      35, 40, 45, 50, 55, 60, 70, 80
  38. DevSpeed        db      25, 20, 15, 10                  ; Divided by 10
  39. sEnd            ResData
  40.  
  41.  
  42. ;*****************************************************************************
  43. ;*                         --- Segment ResCode ---
  44. ;*****************************************************************************
  45. sBegin          ResCode
  46.  
  47.  
  48. ;*****************************************************************************
  49. ;*                            --- couDelay ---
  50. ;*
  51. ;*     Purpose: Delay execution
  52. ;*       Input: AX - Milliseconds to delay
  53. ;*      Output: none
  54. ;* Scratch reg: none
  55. ;*     Written: by Alexis A.Piatetsky 28.07.94
  56. ;*****************************************************************************
  57. couDelay        PROC    NEAR
  58.                 assume  ds:@data, es:Nothing
  59.  
  60.                 pushx   <ax, bx, cx, dx>
  61.  
  62.                 mov     cx, ax                  ; Save Interval (mS) CX
  63.  
  64. DL1:            xor     al, al                  ; Zero AL
  65.                 out     TIM_CTL, al             ; Latch Timer Count
  66.                 in      al, TIMER0              ; Read LS Byte
  67.                 mov     ah, al
  68.                 in      al, TIMER0              ; Read MS Byte
  69.                 xchg    ah, al                  ; Put Bytes in order
  70.                 mov     dx, ax                  ; Save First Count in DX
  71.  
  72. @@:             mov     bx, dx                  ; Restore First Count in BX
  73.                 xor     al, al                  ; Zero AL
  74.                 out     TIM_CTL, al             ; Latch Timer Count
  75.                 in      al, TIMER0              ; Read LS Byte
  76.                 mov     ah, al
  77.                 in      al, TIMER0              ; Read MS Byte
  78.                 xchg    ah, al                  ; Put Bytes in Order
  79.                 sub     bx, ax                  ; Compute Interval (downcount)
  80.                 cmp     bx, 1193                ; > One Ms ?
  81.                 jb      @b                      ; No, go again.
  82.                 loop    DL1                     ; Yes, next interation
  83.  
  84.                 popx    <dx, cx, bx, ax>
  85.                 ret
  86. couDelay        ENDP
  87.  
  88. ;*****************************************************************************
  89. ;*                         --- couIsValidSpeed ---
  90. ;*
  91. ;*     Purpose: Return carry, if speed is invalid
  92. ;*       Input: AH - speed
  93. ;*      Output: CY, if speed isn't valid
  94. ;* Scratch reg: none
  95. ;*     Written: by Alexis A.Piatetsky 06.05.94
  96. ;*****************************************************************************
  97. couIsValidSpeed PROC    NEAR
  98.                 assume  ds:@data, es:Nothing
  99.  
  100.                 push    ax
  101.                 test    ah, EXT_BIT
  102.                 jnz     ivs_fail
  103.  
  104.                 test    ah, MANTISSA_BITS   ; Extended speed?
  105.                 jnz     @f                  ; Yes, continue
  106.  
  107.                 cmp     ah, DSPEED_100NS
  108.                 ja      ivs_fail
  109.                 jmp     short ivs_check0
  110.  
  111. @@:             shr     ah, 1               ; Get rid of exponents
  112.                 shr     ah, 1
  113.                 shr     ah, 1
  114.  
  115. ivs_check0:     cmp     ah, 1
  116.                 jae     ivs_done            ; Carry is cleared
  117.  
  118. ivs_fail:       stc
  119. ivs_done:       pop     ax
  120.                 ret
  121. couIsValidSpeed ENDP
  122.  
  123.  
  124. ;*****************************************************************************
  125. ;*                        --- couGetSpeedComp ---
  126. ;*
  127. ;*     Purpose: Convert speed to mantissa and exponenta
  128. ;*       Input: AL - Speed
  129. ;*      Output: AL - Mantissa
  130. ;*              AH - exponenta
  131. ;* Scratch reg: none
  132. ;*     Written: by Alexis A.Piatetsky 06.05.94
  133. ;*****************************************************************************
  134. couGetSpeedComp PROC    NEAR
  135.                 assume  ds:@data, es:Nothing
  136.  
  137.                 push    bx
  138.  
  139.                 mov     ah, 2               ; Assume hundreds of ns
  140.                 mov     bx, offset DevSpeed
  141.  
  142.                 test    al, EXPONENT_BITS
  143.                 jz      @f
  144.  
  145.                 mov     ah, al
  146.                 and     ah, EXPONENT_BITS
  147.                 mov     bx, offset DevExtSpeed
  148.                 shr     al, 1               ; Get rid of exponent
  149.                 shr     al, 1
  150.                 shr     al, 1
  151.  
  152. @@:             dec     al                  ; 0 is reserved value
  153.                 push    ax
  154.                 xor     ah, ah
  155.                 add     bx, ax
  156.                 pop     ax
  157.                 mov     al, [bx]
  158.  
  159.                 pop     bx
  160.  
  161.                 ret
  162. couGetSpeedComp ENDP
  163.  
  164. ;*****************************************************************************
  165. ;*                          --- couCompSpeed ---
  166. ;*
  167. ;*     Purpose: Compare two speed in device speed form
  168. ;*       Input: AH - Speed 1, AL - Speed 2
  169. ;*      Output: ZR, if AH = AL
  170. ;*              CY, if AH < AL
  171. ;* Scratch reg: none
  172. ;*     Written: by Alexis A.Piatetsky 06.05.94
  173. ;*        Note: Speed have to be valid and w/o EXT bit
  174. ;*****************************************************************************
  175. couCompSpeed    PROC    NEAR
  176.                 assume  ds:@data, es:Nothing
  177.  
  178.                 pushx   <ax, bx>
  179.  
  180.                 push    ax
  181.                 call    couGetSpeedComp
  182.  
  183.                 mov     bx, ax              ; bx - speed 2
  184.  
  185.                 pop     ax
  186.                 mov     al, ah
  187.                 call    couGetSpeedComp     ; ax - speed 1
  188.  
  189.                 cmp     ah, bh              ; Compare exponents
  190.                 jne     @f
  191.  
  192.                 cmp     al, bl              ; Compare mantissa
  193.  
  194. @@:             popx    <bx, ax>
  195.                 ret
  196. couCompSpeed    ENDP
  197.  
  198. ;*****************************************************************************
  199. ;*                           --- couCopyInfo ---
  200. ;*
  201. ;*     Purpose: Copy info to client buffer
  202. ;*       Input: CX    - size of info to copy
  203. ;*              DS:SI - source of information
  204. ;*              ES:DI - client buffer with lengths
  205. ;*      Output: none
  206. ;* Scratch reg: none
  207. ;*****************************************************************************
  208. couCopyInfo     PROC    NEAR
  209.                 assume  ds:@data, es:Nothing
  210.  
  211.                 pushx   <cx, si, di>
  212.  
  213.                 mov     es:[di + 2], cx     ; Save in client's data buffer
  214.                 cmp     cx, es:[di]         ; Room in buffer for data
  215.                 jbe     @f                  ; Yes, continue
  216.                 mov     cx, es:[di]         ; No, use length from buffer
  217.  
  218. @@:             jcxz    @f                  ; If no room in buffer, skip move
  219.                 add     di, 4               ; Point past length information
  220.         rep     movsb                       ; Copy to client's buffer
  221.  
  222. @@:             popx    <di, si, cx>
  223.                 ret
  224. couCopyInfo     ENDP
  225. sEnd            ResCode
  226.  
  227. ;*****************************************************************************
  228. ;*                         --- Segment InitCode ---
  229. ;*****************************************************************************
  230. sBegin          InitCode
  231.  
  232. ;*****************************************************************************
  233. ;*                            --- couGetHex ---
  234. ;*
  235. ;*     Purpose: Return Hex number from command line parameter to AX
  236. ;*       Input: ES:BX - Pointer to the command line string with Hex
  237. ;*              CX    - String length
  238. ;*      Output: CY, if error occurs (es:bx unchanged in this case)
  239. ;*              CX    - modified
  240. ;*              AL    - Number
  241. ;*        Note: We expect parameter Hex as XXXX
  242. ;* Scratch reg: CX, BX
  243. ;*     Written: by Alexis A.Piatetsky 28.07.94
  244. ;*****************************************************************************
  245. couGetHex       PROC    NEAR
  246.                 assume  ds:@data, es:Nothing
  247.  
  248.                 push    dx
  249.                 push    bx
  250.                 push    cx
  251.  
  252.                 jcxz    GetHexFail
  253.  
  254. ;------------------- Parameter should start from '/' or '-' -------------------
  255.  
  256.                 xor     ax, ax
  257. NextDigit:      mov     dl, es:[bx]
  258.  
  259.                 cmp     dl, ' '
  260.                 jbe     GetHexSuccess
  261.  
  262.                 cmp     dl, ';'
  263.                 je      GetHexSuccess
  264.  
  265.                 sub     dl, '0'
  266.                 jc      GetHexFail
  267.  
  268.                 cmp     dl, 9
  269.                 jbe     AddDigit
  270.  
  271.                 cmp     dl, 'a' - '0'
  272.                 jb      @f
  273.                 sub     dl, 'a' - 'A'
  274.  
  275. @@:             sub     dl, 'A' - '0'
  276.                 jc      GetHexFail
  277.  
  278.                 add     dl, 10
  279.                 cmp     dl, 15
  280.                 ja      GetHexFail
  281.  
  282. AddDigit:       xor     dh, dh
  283.                 shl     ax, 1
  284.                 shl     ax, 1
  285.                 shl     ax, 1
  286.                 shl     ax, 1
  287.                 or      ax, dx
  288.  
  289.                 inc     bx
  290.                 dec     cx
  291.                 jcxz    GetHexSuccess
  292.                 jmp     short NextDigit
  293.  
  294.  
  295. GetHexSuccess:  add     sp, 4                   ; Kill bx and cx in the stack
  296.                 clc
  297. @@:             pop     dx
  298.                 ret
  299.  
  300. GetHexFail:     pop     bx
  301.                 pop     cx
  302.                 stc
  303.                 jmp     short @b
  304.  
  305. couGetHex       ENDP
  306.  
  307. ;*****************************************************************************
  308. ;*                           --- couGetToken ---
  309. ;*
  310. ;*     Purpose: Separate command line token
  311. ;*       Input: ES:BX - Pointer to the command line string with Hex
  312. ;*              CX    - String length
  313. ;*      Output: CY, if error occurs (es:bx unchanged in this case)
  314. ;*              CX    - modified
  315. ;*              AL    - Parameter uppercase letter
  316. ;*        Note: We expect parameter Token as '/c:xxxx', where c is parameter
  317. ;* Scratch reg: cx, bx
  318. ;*     Written: by Alexis A.Piatetsky 28.07.94
  319. ;*****************************************************************************
  320. couGetToken     PROC    NEAR
  321.                 assume  ds:@data, es:Nothing
  322.  
  323.                 push    bx
  324.                 push    cx
  325.  
  326.                 xor     al, al
  327.                 jcxz    GetTokenSuccess
  328.  
  329. ;-------------------------- Kill leading white spaces -------------------------
  330.  
  331. @@:             mov     al, es:[bx]
  332.                 cmp     al, ';'
  333.                 je      break_l
  334.                 cmp     al, ' '
  335.                 ja      @f
  336.                 inc     bx
  337.                 loop    @b
  338.  
  339. break_l:        xor     ax, ax                  ; Only white spaces in Token
  340.                 jmp     short GetTokenSuccess
  341.  
  342. ;------------------- Parameter should start from '/' or '-' -------------------
  343.  
  344. @@:             cmp     al, '-'
  345.                 je      @f
  346.                 cmp     al, '/'
  347.                 jne     GetTokenFail
  348.  
  349. ;----------------------------- Load command letter ----------------------------
  350.  
  351. @@:             inc     bx
  352.                 dec     cx
  353.                 jcxz    GetTokenFail
  354.  
  355.                 mov     al, es:[bx]
  356.                 cmp     al, 'a'
  357.                 jb      @f
  358.                 cmp     al, 'z'
  359.                 jz      @f
  360.  
  361.                 and     al, 05Fh                ; Uppercase it if required
  362.  
  363. ;----------------- Letter after command have to be ':' or '=' -----------------
  364.  
  365. @@:             inc     bx
  366.                 dec     cx
  367.                 jcxz    GetTokenSuccess         ; Just switch w/o parameter
  368.  
  369.                 cmp     byte ptr es:[bx], ':'
  370.                 je      @f
  371.                 cmp     byte ptr es:[bx], '='
  372.                 je      @f
  373.  
  374.                 cmp     byte ptr es:[bx], ';'   ; Just switch w/o parameter ?
  375.                 je      GetTokenSuccess         ; Yes report it
  376.                 cmp     byte ptr es:[bx], ' '   ; Just switch w/o parameter ?
  377.                 ja      GetTokenFail            ; No, something wrong
  378.                 jmp     short GetTokenSuccess   ; Yes report it
  379.  
  380. ;----------- We will return es:bx as pointer to first char in params ----------
  381.  
  382. @@:             inc     bx
  383.                 dec     cx
  384.  
  385. GetTokenSuccess:
  386.                 add     sp, 4                   ; Kill bx and cx in the stack
  387.                 clc
  388.                 ret
  389.  
  390. GetTokenFail:   pop     bx
  391.                 pop     cx
  392.                 stc
  393.                 ret
  394.  
  395. couGetToken     ENDP
  396.  
  397. ;*****************************************************************************
  398. ;*                            --- couStrLen ---
  399. ;*
  400. ;*     Purpose: Calculate string length
  401. ;*       Input: es:di - String address
  402. ;*      Output: cx    - String length
  403. ;* Scratch reg: none
  404. ;*     Written: by Alexis A.Piatetsky 11.08.94
  405. ;*****************************************************************************
  406. couStrLen       PROC    NEAR
  407.                 pushx   <ax, di>
  408.  
  409.                 push    di
  410.                 mov     al, 0
  411.                 mov     cx, -1
  412.          repne  scasb
  413.                 xchg    cx, di
  414.                 dec     cx
  415.                 pop     di
  416.                 sub     cx, di
  417.  
  418.                 popx    <di, ax>
  419.                 ret
  420. couStrLen       ENDP
  421.  
  422. sEnd            InitCode
  423.                 end
  424.