home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddkx86v5.zip / DDKX86 / SRC / DEV / PCMCIA / SOCKET / SSPCICDP.ASM < prev    next >
Assembly Source File  |  1995-04-14  |  18KB  |  402 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    SSPCIC
  13.                 page    60, 132
  14.                 title   'SSPCIC'
  15. ;******************************************************************************
  16. ;*
  17. ;*                            File SSPCICDP.ASM
  18. ;*
  19. ;*                        Socket Services PCIC File
  20. ;*
  21. ;*                           Function Dispatcher
  22. ;*
  23. ;*
  24. ;*
  25. ;******************************************************************************
  26.  
  27.                 include ssmac.inc           ; Macros
  28.                 include ssdefs.inc          ; Sockets Services definitions
  29.                 include ss_segm.inc         ; Segment definitions
  30.                 include ssPCIC.inc          ; PCIC module defs
  31.  
  32.  
  33. ;*****************************************************************************
  34. ;*                         --- Segment ResData ---
  35. ;*****************************************************************************
  36. sBegin          ResData
  37. bEntryCnt       db      0                   ; Checks for recursion into
  38.                                             ; interface
  39.  
  40. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  41. ;                          Array of adapter structures
  42. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  43.  
  44. Adapters        ADP_DATA MAX_ADAPTERS DUP ({})
  45.  
  46. bTotAdapters    db      0                   ; Total adapters in system
  47. bNumAdapters    db      0                   ; Number adapters handled by this
  48.                                             ; SS module
  49. bFirstAdapter   db      0                   ; First adapter handled by this SS
  50.                                             ; module
  51. bLastAdapter    db      0                   ; Last adapter handled by this SS
  52.                                             ; module
  53.  
  54.  
  55. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  56. ;                             Function Jump Tables
  57. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  58.  
  59. ;       The three arrays defined below must be ordered in the same sequence.
  60. ;       Failure to align the three arrays breaks the interface
  61.  
  62. ; ----- This array contains the function codes supported by this implementation
  63.  
  64. bFunctions      db      GET_ADP_CNT
  65.                 db      GET_SS_INFO
  66.                 db      INQ_ADAPTER
  67.                 db      GET_ADAPTER
  68.                 db      SET_ADAPTER
  69.                 db      INQ_WINDOW
  70.                 db      GET_WINDOW
  71.                 db      SET_WINDOW
  72.                 db      GET_PAGE
  73.                 db      SET_PAGE
  74.                 db      INQ_SOCKET
  75.                 db      GET_SOCKET
  76.                 db      SET_SOCKET
  77.                 db      GET_STATUS
  78.                 db      RESET_SOCKET
  79.                 db      GET_VENDOR_INFO
  80.                 db      ACK_INTERRUPT
  81.                 db      SS_ADDR
  82. NUM_FUNCTIONS   =       $ - OFFSET bFunctions
  83.  
  84. ; ----- This array is the bit-mask identifying the arguments that need to be
  85. ;       validated before invoking a specific function.
  86.  
  87. ; Note: ValidateArgs function assumes the only function that does NOT validate
  88. ;       the adapter is the first one, GetAdapterCnt.  Other functions expect
  89. ;       the [BX] register to point to the appropriate entry in the Adapters
  90. ;       array.  Failure to set BM_ADAPTER for all other functions may cause
  91. ;       random data access (read and/or write) with undefined results.
  92.  
  93. bmArgs          db      0                                  ; GET_ADP_CNT
  94.                 db      BM_ADAPTER                         ; GET_SS_INFO
  95.                 db      BM_ADAPTER                         ; INQ_ADAPTER
  96.                 db      BM_ADAPTER                         ; GET_ADAPTER
  97.                 db      BM_ADAPTER                         ; SET_ADAPTER
  98.                 db      BM_ADAPTER OR BM_WINDOW            ; INQ_WINDOW
  99.                 db      BM_ADAPTER OR BM_WINDOW            ; GET_WINDOW
  100.                 db      BM_ADAPTER OR BM_WINDOW            ; SET_WINDOW
  101.                 db      BM_ADAPTER OR BM_WINDOW OR BM_PAGE ; GET_PAGE
  102.                 db      BM_ADAPTER OR BM_WINDOW OR BM_PAGE ; SET_PAGE
  103.                 db      BM_ADAPTER OR BM_SOCKET            ; INQ_SOCKET
  104.                 db      BM_ADAPTER OR BM_SOCKET            ; GET_SOCKET
  105.                 db      BM_ADAPTER OR BM_SOCKET            ; SET_SOCKET
  106.                 db      BM_ADAPTER OR BM_SOCKET            ; GET_STATUS
  107.                 db      BM_ADAPTER OR BM_SOCKET OR BM_CARD ; RESET_SOCKET
  108.                 db      BM_ADAPTER                         ; GET_VENDOR_INFO
  109.                 db      BM_ADAPTER                         ; ACK_INTERRUPT
  110.                 db      BM_ADAPTER                         ; SS_ADDR
  111.  
  112. ; This array is the pointers to the code implementing the various functions
  113.  
  114. pFunctions      dw      GetAdapterCnt                      ; GET_ADP_CNT
  115.                 dw      GetSSInfo                          ; GET_SS_INFO
  116.                 dw      InquireAdapter                     ; INQ_ADAPTER
  117.                 dw      GetAdapter                         ; GET_ADAPTER
  118.                 dw      SetAdapter                         ; SET_ADAPTER
  119.                 dw      InquireWindow                      ; INQ_WINDOW
  120.                 dw      GetWindow                          ; GET_WINDOW
  121.                 dw      SetWindow                          ; SET_WINDOW
  122.                 dw      GetPage                            ; GET_PAGE
  123.                 dw      SetPage                            ; SET_PAGE
  124.                 dw      InquireSocket                      ; INQ_SOCKET
  125.                 dw      GetSocket                          ; GET_SOCKET
  126.                 dw      SetSocket                          ; SET_SOCKET
  127.                 dw      GetStatus                          ; GET_STATUS
  128.                 dw      ResetSocket                        ; RESET_SOCKET
  129.                 dw      GetVendorInfo                      ; GET_VENDOR_INFO
  130.                 dw      AckInterrupt                       ; ACK_INTERRUPT
  131.                 dw      GetSetSSAddr                       ; SS_ADDR
  132. sEnd            ResData
  133.  
  134. ;*****************************************************************************
  135. ;*                         --- Segment ResCode ---
  136. ;*****************************************************************************
  137. sBegin          ResCode
  138.  
  139. ;*****************************************************************************
  140. ;*                             --- IsCardIn ---
  141. ;*
  142. ;*     Purpose: Check, if card is in socket
  143. ;*       Input: none
  144. ;*      Output: CY, if not
  145. ;* Scratch reg: none
  146. ;*     Written: by Alexis A.Piatetsky 23.07.94
  147. ;*****************************************************************************
  148. IsCardIn        PROC    NEAR
  149.                 push    ax
  150.                 call    GetInstSktState
  151.                 and     al, SBM_CD
  152.                 pop     ax
  153.                 clc
  154.                 jnz     @f
  155.                 stc
  156. @@:             ret
  157. IsCardIn        ENDP
  158.  
  159. ;*****************************************************************************
  160. ;*                           --- ValidateArgs ---
  161. ;*
  162. ;*     Purpose: Validate arguments according to function
  163. ;*       Input: [SI] = index into validation table
  164. ;*      Output: CY and Error code in Args.AH, if failed
  165. ;* Scratch reg: all
  166. ;*     Written: by Alexis A.Piatetsky 28.07.94
  167. ;*****************************************************************************
  168. ValidateArgs    PROC    NEAR
  169.                 assume  ds:@data, es:Nothing
  170.  
  171. ;--------------------- Initialize dynamic stack variables ---------------------
  172.  
  173.                 mov     (ARGS PTR [BP]).bSocketIdx, 0
  174.                 mov     (ARGS PTR [BP]).bWindowIdx, 0
  175.                 mov     (ARGS PTR [BP]).bSocketNum, 0
  176.                 mov     (ARGS PTR [BP]).bWindowNum, 0
  177.  
  178. ;------------ Validate adapter and create index into adapter array ------------
  179. ; Note: Adapter already confirmed in range by Dispatch code
  180.  
  181.                 test    bmArgs[si], BM_ADAPTER  ; Need to check adapter?
  182.                 jnz     short @f                ; Yes, continue
  183.  
  184.                 xor     ah, ah                  ; No, special case
  185.                                                 ; (GetAdapterCnt)
  186.                 jmp     short VAExit            ;  we're done, indicate success
  187. @@:
  188.                 mov     al, (ARGS PTR [BP]).ALReg
  189.                                                 ; Index into array of adapters
  190.                 sub     al, bFirstAdapter
  191.                 mov     bl, sizeof ADP_DATA
  192.                 mul     bl
  193.                 add     ax, offset Adapters
  194.                 mov     bx, ax                  ; bx - Point adapter structure
  195.  
  196. ;------------------------------- Validate Window ------------------------------
  197.  
  198.                 test    bmArgs[si], BM_WINDOW   ; Need to check window?
  199.                 jz      short CkSocket
  200.  
  201.                 mov     al, (ARGS PTR [bp]).BHReg ; Get window number
  202.  
  203.                 cmp     al, (ADP_DATA PTR [bx]).bNumWindows ; Valid window ?
  204.                 mov     ah, BAD_WINDOW          ; Default to no
  205.                 jae     short VAExit            ; No, exit now
  206.  
  207.                 call    CalcWndIndex
  208.                 mov     al, (ARGS PTR [bp]).bSocketNum
  209.                 jmp     short CreateSktIdx      ; If we are here, we already
  210.                                                 ; have socket number in
  211.                                                 ; bSocketNum
  212.  
  213. ;------------------------------- Validate Socket ------------------------------
  214.  
  215.  
  216. CkSocket:       test    bmArgs[si], BM_SOCKET
  217.                 jz      short CheckPage
  218.  
  219.                 mov     ah, BAD_SOCKET          ; Default to     socket
  220.                 mov     al, (ARGS PTR [bp]).BLReg ; Get socket number
  221.  
  222.                 cmp     al, (ADP_DATA PTR [bx]).bNumSockets ; Valid socket ?
  223.                 jae     short VAExit            ; No, exit now
  224.  
  225.                 mov     (ARGS PTR [bp]).bSocketNum, al
  226.  
  227. CreateSktIdx:   mov     cl, PCIC_SKTINC
  228.                 mul     cl
  229.                 mov     (ARGS PTR [BP]).bSocketIdx, al
  230.  
  231. ;-------------------------------- Validate page -------------------------------
  232.  
  233. CheckPage:      test    bmArgs[si], BM_PAGE
  234.                 jz      short CheckCard
  235.  
  236.                 mov     ah, BAD_PAGE
  237.                 cmp     (ARGS PTR [bp]).BLReg, 0
  238.                 jne     short VAExit
  239.  
  240.                 mov     ah, BAD_WINDOW
  241.                 cmp     (ARGS PTR [BP]).bWindowType, WIN_MEM
  242.                 je      CheckCard
  243.                 stc
  244.                 jmp     short VAExit
  245.  
  246. ;-------------------------- Check, if card is inside --------------------------
  247.  
  248. CheckCard:      xor     ah, ah                  ; Default to success
  249.  
  250.                 test    bmArgs[si], BM_CARD     ; Need to check for PC Card ?
  251.                 jz      short VAExit            ; No, we're done
  252.  
  253.                 call    IsCardIn                ; Return CY, if not
  254.                 jnc     short VAExit            ; Yes, we're done
  255.  
  256.                 mov     ah, NO_CARD             ; No, error out
  257.  
  258. VAExit:         mov     (ARGS PTR [BP]).AHReg, ah
  259.                 cmp     ah, 1
  260.                 cmc
  261.                 ret
  262.  
  263. ValidateArgs    ENDP
  264.  
  265. ;*****************************************************************************
  266. ;*                           --- codCommon16 ---
  267. ;*
  268. ;*     Purpose: Common 16 bit entry point
  269. ;*       Input: As specified by PCMCIA
  270. ;*      Output: As specified by PCMCIA
  271. ;* Scratch reg: As specified by PCMCIA
  272. ;*     Written: by Alexis A.Piatetsky 28.07.94
  273. ;*****************************************************************************
  274. codCommon16     PROC    FAR
  275.                 assume  ds:Nothing, es:Nothing
  276.  
  277.                 push    ds                  ; Establish data addressability
  278.                 push    ax
  279.                 mov     ax, @data
  280.                 mov     ds, ax
  281.         assume  ds:@data
  282.                 pop     ax
  283.  
  284. ;---------------------------- Check adapter number ----------------------------
  285.  
  286.                 cmp     ah, GET_ADP_CNT     ; Get adapter count ?
  287.                 je      adCheckOk           ; Yes, skip adapter check
  288.  
  289.                 cmp     al, bFirstAdapter   ; valid adapter specified ?
  290.                 jb      ssBadAdapter
  291.  
  292.                 cmp     al, bLastAdapter    ; maybe, adapter within range ?
  293.                 jbe     short adCheckOk     ; yes, continue
  294.  
  295. ssBadAdapter:   mov     ah, BAD_ADAPTER     ; no, indicate error
  296.                 jmp     short Common16Exit  ;  and exit
  297.  
  298. ;---------------------- Check, if Interface is available ----------------------
  299.  
  300. adCheckOk:      cmp     ah, ACK_INTERRUPT   ; AckInterrupt request ?
  301.                 je      short @f            ; Yes, skip recursion check
  302.                                             ; and interrupt enabling
  303.                 cmp     bEntryCnt, 0        ; Already in Socket Services ?
  304.                 je      short @f            ; No, attempt request
  305.  
  306.  
  307.                 mov     ah, BUSY            ; Yes, indicate error
  308.                 jmp     short Common16Exit  ;  and exit
  309.  
  310. ;----------------------------- Enter in interface -----------------------------
  311.  
  312. @@:             inc     bEntryCnt           ; Indicate we're in interface call    Dispatch
  313.                 pop     ds                  ; Restore original ds value
  314.                 push    ds                  ; Keep it again
  315.                 pushx   <ax, bx, cx, dx, si, di, ds, es, bp> ; Create pars
  316.                                                              ; structure in
  317.                 sub     sp, DYN_SIZE
  318.  
  319.                 mov     bp, sp              ; Establish pointer to arguments
  320.  
  321.                 push    es
  322.                 mov     ax, @data
  323.                 mov     ds, ax
  324.                 mov     es, ax
  325.         assume  ds:@data, es:@data
  326.  
  327.                 mov     al, (ARGS PTR [BP]).AHReg ; Get function to match
  328.                 mov     di, offset bFunctions     ; Point to list of valid
  329.                                                   ; functions
  330.                 mov     cx, NUM_FUNCTIONS   ; Init loop counter
  331.  
  332.         repne   scasb                       ; Is function supported ?
  333.                 pop     es                  ; Restore segment register
  334.         assume  es:Nothing
  335.  
  336.                 MOV     (ARGS PTR [BP]).AHReg, BAD_FUNCTION ; Default to bad
  337.                                                             ; function
  338.  
  339.                 jnz     short @f                ; No, exit now
  340.  
  341.                 sub     di, offset bFunctions   ; Yes, compute table index
  342.                 dec     di
  343.  
  344.                 mov     si, di                  ; Setup [SI] as index
  345.                 mov     di, (ARGS PTR [BP]).DIReg ; and restore [DI]
  346.  
  347.                 CALL    ValidateArgs            ; Are arguments valid ?
  348.                 jc      short @f                ; No, we're done
  349.  
  350.                 shl     si, 1                   ; Create word index
  351.                 call    pFunctions[SI]          ; Yes, go do requested function
  352.  
  353.                 mov     (ARGS PTR [BP]).AHReg, ah       ; Save return code
  354.  
  355. @@:             add     sp, DYN_SIZE
  356.  
  357. ;----------------------------- Exit from interface ----------------------------
  358.  
  359.                 dec     bEntryCnt
  360.                 popx    <bp, es, ds, di, si, dx, cx, bx, ax>
  361.         assume  es:Nothing
  362. Common16Exit:   pop     ds
  363.         assume  ds:Nothing
  364. Common16End:    ret
  365.  
  366. codCommon16     ENDP
  367.  
  368. ;*****************************************************************************
  369. ;*                           --- codRM_Entry ---
  370. ;*
  371. ;*     Purpose: 16:16 mode entry point
  372. ;*       Input: As specified by PCMCIA
  373. ;*      Output: As specified by PCMCIA
  374. ;* Scratch reg: As specified by PCMCIA
  375. ;*     Written: by Alexis A.Piatetsky 28.07.94
  376. ;*****************************************************************************
  377. codRM_Entry     PROC    FAR
  378.                 assumes ds, Nothing
  379.                 assumes es, Nothing
  380.                 assumes ss, Nothing
  381.  
  382.                 cmp     ah, GET_ADP_CNT         ; Socket Services function
  383.                                                 ; request?
  384.                 jb      short SSDBadFunction    ; No, return BadFunction Error
  385.  
  386.                 cmp     ah, CARD_SERVICES       ; Maybe, Function within range ?
  387.                 jb      short @f                ; Yes, go check adapter
  388.  
  389. SSDBadFunction: mov     ah, BAD_FUNCTION
  390.                 jmp     short RM_Exit           ; No, Indicate     Function,
  391.                                                 ; Exit
  392. @@:             call    codCommon16
  393.  
  394. RM_Exit:        cmp     ah,1
  395.                 cmc
  396.                 retf
  397. codRM_Entry     ENDP
  398.  
  399. sEnd            ResCode
  400.  
  401.                 END
  402.