home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddkx86v5.zip / DDKX86 / SRC / DEV / PCMCIA / SOCKET / SSPCICWM.ASM < prev   
Assembly Source File  |  1995-04-14  |  45KB  |  1,141 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    SSPCICWM
  13.                 page    60, 132
  14.                 title   'SSPCICWM'
  15. ;******************************************************************************
  16. ;*
  17. ;*                            File SSPCICWM.ASM
  18. ;*
  19. ;*                        Socket Services PCIC File
  20. ;*
  21. ;*                           Window management
  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. ifndef SUPPORT_0WS
  33. SUPPORT_0WS     equ     0                   ; 1 - enable  0WS support
  34.                                             ; 0 - disable 0WS support
  35. endif
  36.  
  37.  
  38. ;*****************************************************************************
  39. ;*                         --- Segment ResData ---
  40. ;*****************************************************************************
  41. sBegin          ResData
  42.  
  43. ;----------------------------- Window capabilities ----------------------------
  44.  
  45. MemWndInfo      MEMWINTBL {PCIC_MWCAP, PCIC_MADDR_F, PCIC_MADDR_L, PCIC_MSIZE_MIN, \
  46.                            PCIC_MSIZE_MAX, PCIC_MREQGRAN, PCIC_MBASE, PCIC_MOFFSET,\
  47.                            SPEED_0250_NS, SPEED_1200_NS                    \
  48.                 }
  49.  
  50. MemWndInfoLen   =       SIZEOF  MemWndInfo
  51.  
  52. IOWndInfo       IOWINTBL  {PCIC_IWCAP, PCIC_IADDR_F, PCIC_IADDR_L, PCIC_ISIZE_MIN,  \
  53.                            PCIC_ISIZE_MAX, PCIC_IREQGRAN, PCIC_IADDLINES,         \
  54.                            PCIC_IEISA                                         \
  55.                 }
  56.  
  57. IOWndInfoLen    =       SIZEOF  IOWndInfo
  58.  
  59. ;----------------------------- Memory Window Speed ----------------------------
  60.  
  61. Mem16Speed0     label   BYTE                ; Memory 16 bit access, 0WS
  62.                 db      SPEED_0250_NS       ;  0 WS - 250 ns
  63. Num16MemSpeeds0 =       $ - OFFSET Mem16Speed0
  64.  
  65. Mem16Speed      label   BYTE                ; Memory 16 bit access
  66.                 db      SPEED_0400_NS       ;  0 WS - 375 ns
  67.                 db      SPEED_0500_NS       ;  1 WS - 500 ns
  68.                 db      SPEED_0600_NS       ;  2 WS - 625 ns
  69.                 db      SPEED_0800_NS       ;  3 WS - 750 ns
  70. Num16MemSpeeds  =       $ - OFFSET Mem16Speed
  71.  
  72. Mem08Speed0     label   BYTE                ; Memory 8 bit access, 0WS
  73.                 db      SPEED_0500_NS       ;  0 WS - 500 ns
  74. Num08MemSpeeds0 =       $ - OFFSET Mem08Speed0
  75.  
  76. Mem08Speed      label   BYTE                ; Memory 8 bit access
  77.                 db      SPEED_0800_NS       ;  0 WS - 750 ns
  78.                 db      SPEED_1000_NS       ;  1 WS - 875 ns
  79.                 db      SPEED_1000_NS       ;  2 WS - 1.0 µs
  80.                 db      SPEED_1200_NS       ;  3 WS - 1.125 µs
  81. Num08MemSpeeds  =       $ - OFFSET Mem08Speed
  82.  
  83. IO16Speed0      label   BYTE                ; I/O 16 bit access, 0WS
  84. Num16IOSpeeds0  =       $ - OFFSET IO16Speed0
  85.  
  86. IO16Speed       label   BYTE                ; I/O 16 bit access
  87.                 db      SPEED_0400_NS       ;  0 WS - 375 ns
  88.                 db      SPEED_0500_NS       ;  1 WS - 500 ns
  89. Num16IOSpeeds   =       $ - OFFSET IO16Speed
  90.  
  91. IO08Speed0      label   BYTE                ; I/O 8 bit access, 0WS
  92.                 db      SPEED_0500_NS       ;  0 WS - 500 ns
  93. Num08IOSpeeds0  =       $ - OFFSET IO08Speed0
  94.  
  95. IO08Speed       label   BYTE                ; I/O 8 bit access
  96.                 db      SPEED_0800_NS       ;  0 WS - 750 ns
  97. Num08IOSpeeds   =       $ - OFFSET IO08Speed
  98.  
  99. SpeedTable      label   WORD
  100. MemSpeedTable   label   WORD
  101.                 dw      Mem08Speed
  102.                 dw      Num08MemSpeeds
  103.                 dw      Mem08Speed0
  104.                 dw      Num08MemSpeeds0
  105.                 dw      Mem16Speed
  106.                 dw      Num16MemSpeeds
  107.                 dw      Mem16Speed0
  108.                 dw      Num16MemSpeeds0
  109. IOSpeedTable    label   WORD
  110.                 dw      IO08Speed
  111.                 dw      Num08IOSpeeds
  112.                 dw      IO08Speed0
  113.                 dw      Num08IOSpeeds0
  114.                 dw      IO16Speed
  115.                 dw      Num16IOSpeeds
  116.                 dw      IO16Speed0
  117.                 dw      Num16IOSpeeds0
  118.  
  119. sEnd            ResData
  120.  
  121. ;*****************************************************************************
  122. ;*                         --- Segment ResCode ---
  123. ;*****************************************************************************
  124. sBegin          ResCode
  125.  
  126.  
  127. ;*****************************************************************************
  128. ;*                          --- cowDisableWindow ---
  129. ;*
  130. ;*     Purpose: Disable window
  131. ;*       Input: [BP] = Ptr to ARGS structure
  132. ;*      Output: none
  133. ;* Scratch reg: none
  134. ;*     Written: by Alexis A.Piatetsky 03.05.94
  135. ;*****************************************************************************
  136. cowDisableWindow PROC    NEAR
  137.  
  138.                 pushx   <ax, cx>
  139.  
  140.                 call    asGetWindowCtrl     ; al - register index
  141.                 not     ah                  ; ah - disable mask
  142.  
  143.                 mov     cx, ax              ; Save it
  144.                 call    GetReg              ; al - register contents
  145.  
  146.                 and     al, ch              ; Mask out enable bit
  147.                 mov     ah, al              ; ah - new contents
  148.                 mov     al, cl              ; al - register index
  149.                 call    SetReg              ; Write out
  150.  
  151.                 popx    <cx, ax>
  152.                 ret
  153. cowDisableWindow ENDP
  154.  
  155. ;*****************************************************************************
  156. ;*                          --- cowEnableWindow ---
  157. ;*
  158. ;*     Purpose: Enable window
  159. ;*       Input: [BP] = Ptr to ARGS structure
  160. ;*      Output: none
  161. ;* Scratch reg: none
  162. ;*     Written: by Alexis A.Piatetsky 03.05.94
  163. ;*****************************************************************************
  164. cowEnableWindow PROC    NEAR
  165.  
  166.                 pushx   <ax, cx>
  167.  
  168.                 call    asGetWindowCtrl     ; al - register index
  169.                                             ; ah - enable mask
  170.  
  171.                 mov     cx, ax              ; Save it
  172.                 call    GetReg              ; al - register contents
  173.  
  174.                 or      al, ch              ; Set enable bit
  175.                 mov     ah, al              ; ah - new contents
  176.                 mov     al, cl              ; al - register index
  177.                 call    SetReg              ; Write out
  178.  
  179.                 popx    <cx, ax>
  180.                 ret
  181. cowEnableWindow ENDP
  182.  
  183. ;*****************************************************************************
  184. ;*                         --- cowIsWinEnabled ---
  185. ;*
  186. ;*     Purpose: Check, if Window is enabled
  187. ;*       Input: [BP] = Ptr to ARGS structure
  188. ;*      Output: NZ - if enabled, ZR - if disabled
  189. ;* Scratch reg: none
  190. ;*     Written: by Alexis A.Piatetsky 03.05.94
  191. ;*****************************************************************************
  192. cowIsWinEnabled PROC    NEAR
  193.  
  194.                 pushx   <ax, cx>
  195.  
  196.                 call    asGetWindowCtrl     ; al - register index
  197.                                             ; ah - enable mask
  198.                 mov     cx, ax              ; Save it
  199.                 call    GetReg              ; al - register contents
  200.  
  201.                 and     al, ch              ; Check enable bit
  202.  
  203.                 popx    <cx, ax>
  204.                 ret
  205.  
  206. cowIsWinEnabled ENDP
  207.  
  208.  
  209. ;*****************************************************************************
  210. ;*                            --- cowValWinPars ---
  211. ;*
  212. ;*     Purpose: Validate Window parameters
  213. ;*       Input: [BP] = Pointer to entry args on stack
  214. ;*              [BX] = Pointer to adapter entry in Adapters array
  215. ;*      Output: If success: NC and:
  216. ;*                      ah - Speed
  217. ;*                      al - Requested Attributtes
  218. ;*                      dx - Window Start address
  219. ;*                      cx - Window End address
  220. ;*              If fail: CY and AH - RETCODE
  221. ;* Scratch reg: none
  222. ;*     Written: by Alexis A.Piatetsky 29.07.94
  223. ;*****************************************************************************
  224. cowValWinPars   PROC    NEAR
  225.  
  226.                 mov     al, (ARGS PTR [BP]).DHReg ; Window state
  227.                 cmp     (ARGS PTR [BP]).bWindowType, WIN_IO
  228.                 je      vwp_check_io
  229.  
  230. ; Validate memory window ----------
  231.  
  232.                 test    al, WS_IO
  233.                 jnz     vwp_bad_type
  234.  
  235.                 mov     si, offset MemWndInfo ; Establish pointer to WIN_INFO
  236.  
  237.                 jmp     short val_args
  238.  
  239. ; Validate I/O window ----------
  240.  
  241. vwp_check_io:   test    al, WS_IO
  242.                 jz      vwp_bad_type
  243.  
  244.                 mov     si, offset IOWndInfo ; Establish pointer to
  245.                                             ; WIN_INFO structure
  246.  
  247. ;--------- We profite the match of beginning of MEMWINTBL and IOWINTBL --------
  248.  
  249. val_args:       mov     ah, byte ptr (WIN_INFO PTR [si]).m.MemWndCaps
  250.                 not     ah                  ; ah - mask of unsupported bits
  251.                 push    ax
  252.                 and     al, ah
  253.                 pop     ax
  254.                 jnz     vwp_bad_attr
  255.  
  256. ;--------------------------- Validate base and size ---------------------------
  257.  
  258.                 mov     cx, (ARGS PTR [BP]).CXReg ; Get requested size
  259.                 cmp     cx, (WIN_INFO PTR [SI]).m.MinSize ; Below minimum ?
  260.                 jb      vwp_bad_size        ; No, continue
  261.  
  262.                 cmp     cx, (WIN_INFO PTR [SI]).m.MaxSize ; Above maximum ?
  263.                 ja      vwp_bad_size        ; Yes, error out
  264.  
  265.                 mov     dx, (ARGS PTR [BP]).DIReg ; Get requested base
  266.                 cmp     dx, (WIN_INFO PTR [SI]).m.FirstByte ; Below first address ?
  267.                 jb      vwp_bad_base
  268.  
  269.                 add     cx, dx              ; Add base to size
  270.                 dec     cx                  ; Less one for last address
  271.                 cmp     cx, (WIN_INFO PTR [SI]).m.LastByte ;     base ?
  272.                 ja      vwp_bad_base        ; Yes, error out
  273.  
  274. ;-------------------------- Validate requested speed --------------------------
  275.  
  276.                 mov     ah, (ARGS PTR [BP]).DLReg
  277.                 test    al, WS_IO           ; No meaning for I/O window
  278.                 jnz     @f
  279.  
  280.                 call    couIsValidSpeed     ; Check speed value
  281.                 jc      vwp_bad_speed
  282.  
  283. @@:             clc
  284.                 jmp     short vwp_done
  285.  
  286. vwp_bad_speed:  mov     ah, BAD_SPEED
  287.                 jmp     vwp_fail
  288.  
  289. vwp_bad_type:   mov     ah, BAD_TYPE
  290.                 jmp     vwp_fail
  291.  
  292. vwp_bad_size:   mov     ah, BAD_SIZE
  293.                 jmp     short vwp_fail
  294.  
  295. vwp_bad_base:   mov     ah, BAD_BASE
  296.                 jmp     short vwp_fail
  297.  
  298. vwp_bad_attr:   mov     ah, BAD_ATTRIBUTE
  299. ;               jmp     short vwp_fail
  300.  
  301. vwp_fail:       stc
  302. vwp_done:       ret
  303. cowValWinPars   ENDP
  304.  
  305. COMMENT ~*********************************************************************
  306.         Procedure:      GetWndReg
  307.         Revision:       1
  308.         Date:           05/25/1993
  309.         Purpose:        Read a TI window register
  310.         Entry:          [AL] = Offset of register to read
  311.         Exit:           [AL] = Data read
  312. *****************************************************************************~
  313. GetWndReg       PROC    NEAR
  314.  
  315.                 add     al, (ARGS PTR [BP]).bWindowIdx
  316.                 call    GetReg
  317.                 ret
  318. GetWndReg       ENDP
  319.  
  320. COMMENT ~*********************************************************************
  321.         Procedure:      SetWndReg
  322.         Revision:       1
  323.         Date:           05/25/1993
  324.         Purpose:        Write a TI window register
  325.         Entry:          [AL] = Offset of register to write
  326.                         [AH] = Data to write
  327.         Exit:           [AL] = Data written
  328. *****************************************************************************~
  329. SetWndReg       PROC    NEAR
  330.  
  331.                 add     al, (ARGS PTR [BP]).bWindowIdx
  332.                 call    SetReg
  333.                 ret
  334.  
  335. SetWndReg       ENDP
  336.  
  337. COMMENT ~*********************************************************************
  338.         Procedure:      CalcWndIndex
  339.         Revision:       4
  340.         Date:           05/25/1993
  341.         Purpose:        Calculate window arguments
  342.         Entry:          [AL] = Window number (base zero on adapter)
  343.                         [BP] = Ptr to ARGS structure
  344.                         [BX] = Ptr to adapter data structure
  345.         Exit:           No significant registers
  346.         Note:           Sets bWindowIdx, bWindowNum and bSocketNum
  347.                          in ARGS structure as appropriate
  348.                         Window number MUST be valid!
  349. *****************************************************************************~
  350. CalcWndIndex    PROC    NEAR
  351.  
  352.                 pushx   <ax, cx, si>
  353.  
  354. ;------------------------ Get Socket and window number ------------------------
  355.  
  356.                 xor     ah, ah
  357.                 mov     cx, PCIC_WIN_PER_SKT
  358.                 div     cl                  ; ah - Window number on socket
  359.                                             ; al - Socket number
  360.                 mov     (ARGS PTR [BP]).bSocketNum, al
  361.                 mov     al, ah
  362.                 xor     ah, ah
  363.  
  364. ;------------------------------ Get Window Index ------------------------------
  365.  
  366.                 cmp     al, PCIC_MEMWIN_PER_SKT ; Memory Window?
  367.                 jb      @f                  ; Yes, setup memory window
  368.  
  369. ; I/O WIndow ----------
  370.  
  371.                 sub     al, PCIC_MEMWIN_PER_SKT
  372.                 mov     (ARGS PTR [BP]).bWindowType, WIN_IO
  373.                 mov     cx, PCIC_IOWININC
  374.                 mov     si, PCIC_IOWIN0
  375.                 jmp     short cwi_calc
  376.  
  377. ; Mem Window ----------
  378.  
  379. @@:
  380.                 mov     (ARGS PTR [BP]).bWindowType, WIN_MEM
  381.                 mov     cx, PCIC_MEMWININC
  382.                 mov     si, PCIC_MEMWIN0
  383.  
  384. ; Actually al - Window number, cx - window increment, si - window base
  385.  
  386. cwi_calc:       mov     (ARGS PTR [BP]).bWindowNum, al  ; Save window number
  387.                 mul     cl
  388.                 add     ax, si
  389.                 mov     (ARGS PTR [BP]).bWindowIdx, al
  390.                 popx    <si, cx, ax>
  391.                 ret
  392. CalcWndIndex    ENDP
  393.  
  394. ;*****************************************************************************
  395. ;*                          --- asGetWindowCtrl ---
  396. ;*
  397. ;*     Purpose: Return number of window control register
  398. ;*       Input: [BP] = Ptr to ARGS structure
  399. ;*      Output: al   - index of window control
  400. ;*              ah   - Window enable mask
  401. ;* Scratch reg: AX
  402. ;*     Written: by Alexis A.Piatetsky 03.05.94
  403. ;*****************************************************************************
  404. asGetWindowCtrl PROC    NEAR
  405.  
  406.                 mov     ah, 00000001b
  407.                 cmp     (ARGS PTR [BP]).bWindowType, WIN_MEM
  408.                 je      @f                  ; I/O window
  409.  
  410.  
  411.                 mov     ah, 01000000b
  412.  
  413. @@:             mov     cl, (ARGS PTR [BP]).bWindowNum
  414.                 shl     ah, cl
  415.  
  416.                 mov     al, PCIC_WINDOW
  417.                 ret
  418. asGetWindowCtrl ENDP
  419.  
  420. COMMENT ~*********************************************************************
  421.         Procedure:      InquireWindow
  422.         Revision:       2
  423.         Date:           05/25/1993
  424.         Purpose:        Return window capabilities
  425.         Entry:          [BP] = Pointer to entry args on stack
  426.                         [BX] = Pointer to adapter entry in Adapters array
  427.                         [ES]:[DI] = Client-supplied buffer for characteristics
  428.         Exit:           Args.BLReg = Window Capabilities (set = true)
  429.                           WC_COMMON     (Bit 0)    = Common memory
  430.                           WC_ATTRIBUTE  (Bit 1)    = Attribute memory
  431.                           WC_IO         (Bit 2)    = I/O
  432.                           WC_WAIT       (Bit 7)    = WAIT supported
  433.                           All other bits are reserved and are reset to zero (0)
  434.                         Args.CXReg = Bit-map of assignable sockets
  435.                         Client-supplied buffer filled with window characteristics
  436. *****************************************************************************~
  437. InquireWindow   PROC    NEAR
  438.  
  439. ;----------------------- Copy WIndow Info to the buffer -----------------------
  440.  
  441.                 mov     cx, MemWndInfoLen       ; Get length of memory window data
  442.                 mov     si, OFFSET MemWndInfo   ; Point to source of data
  443.                 mov     al, PCIC_MEMWINCAPS     ; Indicate Mem Window
  444.                 cmp     (ARGS PTR [BP]).bWindowType, WIN_IO
  445.                 jne     @f
  446.  
  447.  
  448.                 mov     al, PCIC_IOWINCAPS      ; Indicate I/O window and wait
  449.                 mov     cx, IOWndInfoLen        ; Get length of I/O window data
  450.                 mov     si, offset IOWndInfo    ; Point to source of data
  451.  
  452. @@:             MOV     (ARGS PTR [BP]).BLReg, al ; Return capabilities
  453.                 call    couCopyInfo
  454.  
  455. ;--------------------- Create assignable sockets bit-mask ---------------------
  456.  
  457.                 xor     ah, ah
  458.                 mov     al, 1
  459.                 mov     cl, (ARGS PTR [BP]).bSocketNum
  460.                 jcxz    @f
  461.                 shl     ax, CL
  462.  
  463. @@:             mov     (ARGS PTR [BP]).CXReg, ax
  464.                 mov     ah, SUCCESS
  465.                 ret
  466.  
  467. InquireWindow   ENDP
  468.  
  469. COMMENT ~*********************************************************************
  470.         Procedure:      GetWindow
  471.         Revision:       3
  472.         Date:           05/25/1993
  473.         Purpose:        Return current window configuration
  474.         Entry:          [BP] = Pointer to entry args on stack
  475.                         [BX] = Pointer to adapter entry in Adapters array
  476.         Exit:           Args.BLReg = Socket (0 .. 16)
  477.                         Args.CXReg = Window Size (Bytes for I/O, 4K units for memory)
  478.                         Args.DHReg = Window State (set to one = true, unless noted)
  479.                           Bit 0    = Window type (reset = memory, set = I/O)
  480.                           If Bit 0 reset to zero (0) - memory window
  481.                             Bit 1  = Memory type (reset = common, set = attribute)
  482.                           If Bit 0 set to one (1) - I/O window
  483.                             Bit 1  = EISA Mapped
  484.                           Bit 2    = Enabled
  485.                           Bit 3    = Data Width (reset = 8-bit, set = 16-bit)
  486.                           If Bit 0 reset to zero (0) - memory window
  487.                             Bit 4  = Subdivided into 16K pages (memory-only)
  488.                             Bit 5  = Reserved (reset to zero)
  489.                             Bit 6  = Software Write-Protected
  490.                           If Bit 0 set to one (1) - I/O window
  491.                             Bit 4  = Reserved (reset to zero)
  492.                             Bit 5  = EISA Non-specific access slot enabled
  493.                           All other bits are reserved and are reset to zero (0)
  494.                         Args.DLReg = Actual Access Speed
  495.                         Args.DIReg = Base Address (Bytes for I/O, 4K units for memory)
  496. *****************************************************************************~
  497. GetWindow       PROC    NEAR
  498.  
  499. ;--------------------------- Return assigned socket ---------------------------
  500.  
  501.                 mov     al, (ARGS PTR [BP]).bSocketNum
  502.                 mov     (ARGS PTR [BP]).BLReg, al
  503.  
  504. ;------------------------- Start building Window state ------------------------
  505.  
  506.                 xor     ah, ah              ; Set default state
  507.                 call    cowIsWinEnabled
  508.                 jz      @f
  509.  
  510.                 or      ah, WS_ENABLED      ; Yes, indicate enabled
  511.  
  512. @@:             cmp     (ARGS PTR [BP]).bWindowType, WIN_IO
  513.                 je      gw_GetIO            ; Get I/O window
  514.  
  515. ;------------------------------ Get Memory Window -----------------------------
  516.  
  517.                 push    ax
  518.                 mov     al, PCIC_MEMWIN_STR_L
  519.                 call    GetWndReg
  520.                 mov     dl, al              ; DL holds PCIC_MEMWIN_STR_L
  521.                 mov     al, PCIC_MEMWIN_STR_H
  522.                 call    GetWndReg
  523.                 mov     dh, al              ; DH holds PCIC_MEMWIN_STR_H
  524.  
  525.                 mov     al, PCIC_MEMWIN_END_L
  526.                 call    GetWndReg
  527.                 mov     cl, al              ; CL holds PCIC_MEMWIN_END_L
  528.                 mov     al, PCIC_MEMWIN_END_H
  529.                 call    GetWndReg
  530.                 mov     ch, al              ; CH holds PCIC_MEMWIN_END_H
  531.                 pop     ax
  532.  
  533. ; Determine data path width and access size ----------
  534.  
  535.                 mov     si, offset MemSpeedTable
  536.                 test    dh, PCIC_MEMWIN_M16 ; 16-bit?
  537.                 jz      @f                  ; No, skip next
  538.  
  539.                 or      ah, WS_16BIT        ; Yes, indicate 16-bit data size
  540.                 add     si, 8               ; Skip 8-bit tables
  541.  
  542. @@:             test    dh, PCIC_MEMWIN_0WS ; 0WS?
  543.                 jz      @f
  544.  
  545.                 add     si, 4               ; Go to 0 WS table
  546.                 mov     si, [si]            ; Load the table offset
  547.                 mov     al, [si]            ; Only one value is possible
  548.                 jmp     short gw_gb
  549.  
  550. @@:             mov     si, [si]            ; Load the table offset
  551.                 push    ax
  552.                 push    cx
  553.                 mov     al, ch              ; al - PCIC_MEMWIN_END_H
  554.                 and     ax, PCIC_MEMWIN_WS  ; Mask in wait state bits, ah = 0
  555.                 mov     cl, 6
  556.                 shr     al, cl
  557.                 pop     cx
  558.                 add     si, ax              ; Create pointer to the speed table
  559.                 pop     ax
  560.                 mov     al, [si]            ; Get speed from the table
  561.  
  562. ; Determine window base and size ----------
  563.  
  564. gw_gb:          and     cx, PCIC_MEMWIN_MSK
  565.                 and     dx, PCIC_MEMWIN_MSK
  566.  
  567.                 sub     cx, dx              ; AdressEnd - AddressBegin
  568.                 inc     cx                  ; + 1
  569.  
  570. ; Now: ah - Window attr, al - Speed, dx - base, cx - size
  571.  
  572.                 jmp     short gw_save
  573.  
  574. ;--------------------------------- I/O WIndow ---------------------------------
  575.  
  576. gw_GetIO:       or      ah, WS_IO           ; No, indicate I/O window
  577.                 mov     si, ax              ; Save state
  578.                 mov     al, PCIC_IOWIN_STR_H
  579.                 call    GetWndReg
  580.                 mov     dh, al              ; dh holds PCIC_IOWIN_STR_H
  581.                 mov     al, PCIC_IOWIN_STR_L
  582.                 call    GetWndReg
  583.                 mov     dl, al              ; dl holds PCIC_IOWIN_STR_L
  584.  
  585.                 mov     al, PCIC_IOWIN_END_H
  586.                 call    GetWndReg
  587.                 mov     ch, al              ; ch holds PCIC_IOWIN_END_H
  588.                 mov     al, PCIC_IOWIN_END_L
  589.                 call    GetWndReg
  590.                 mov     cl, al              ; cl holds PCIC_IOWIN_END_L
  591.  
  592. ; Determine data path width and access size ----------
  593.  
  594.                 mov     al, PCIC_IOWIN_CTRL
  595.                 call    GetReg              ; al - hold I/O Window control
  596.  
  597.                 cmp     (ARGS PTR [BP]).bWindowNum, 1
  598.                 jb      @f
  599.  
  600.                 push    cx
  601.                 mov     cl, 4
  602.                 shr     al, cl
  603.                 pop     cx
  604.  
  605. @@:             xchg    dx, si              ; Return window state to ah
  606.                 mov     ah, dh
  607.                 xchg    dx, si              ; al - still hold window control
  608.  
  609.                 mov     si, offset IOSpeedTable
  610.                 test    al, PCIC_IOWIN_IO16 ; 16-bit data path ?
  611.                 jz      @f
  612.  
  613.                 or      ah, WS_16BIT        ; Yes, indicate 16-bit data size
  614.                 add     si, 8               ; Skip 8-bit tables
  615.                 mov     si, [si]            ; Load table offset
  616.                 test    al, PCIC_IOWIN_WS   ; Mask in wait state bits
  617.                 jz      short gw_getiosp    ; Jump, if no wait
  618.  
  619.                 inc     si                  ; Only one wait state is possible
  620.                 jmp     short gw_getiosp
  621.  
  622. @@:             test    al, PCIC_IOWIN_0WS  ; 8-bit 0WS ?
  623.                 jz      @f                  ; No, skip next
  624.  
  625.                 add     si, 4               ; Move to 0WS table
  626.  
  627. @@:             mov     si, [si]            ; Load table offset, only one value
  628.                                             ; is possible
  629. gw_getiosp:     mov     al, [si]
  630.  
  631. ; Determine window base and size ----------
  632.  
  633.                 sub     cx, dx              ; AdressEnd - AddressBegin
  634.                 inc     cx                  ; + 1
  635.  
  636. ; Now: ah - Window attr, al - Speed, dx - base, cx - size
  637.  
  638. ;--------------------- Save window parameters in user regs --------------------
  639.  
  640.  
  641. gw_save:        mov     (ARGS PTR [BP]).CXReg, cx
  642.                 mov     (ARGS PTR [BP]).DIReg, dx
  643.                 mov     (ARGS PTR [BP]).DLReg, al
  644.                 mov     (ARGS PTR [BP]).DHReg, ah
  645.                 mov     ah, SUCCESS
  646.                 ret
  647. GetWindow       ENDP
  648.  
  649. ;*****************************************************************************
  650. ;*                           --- SetupMemWin ---
  651. ;*
  652. ;*     Purpose: Setup Memory window
  653. ;*       Input: dx - Window Start, cx - Window end
  654. ;*              [BP] = Pointer to entry args on stack
  655. ;*              [BX] = Pointer to adapter entry in Adapters array
  656. ;*      Output: none
  657. ;* Scratch reg: none
  658. ;*     Written: by Alexis A.Piatetsky 09.05.94
  659. ;*****************************************************************************
  660. SetupMemWin     PROC    NEAR
  661.  
  662.                 pushx   <si, dx, ax>
  663.                 call    cowDisableWindow
  664.  
  665. ;----------- Read Old Base to establish change required for offset  -----------
  666.  
  667.                 mov     al, PCIC_MEMWIN_STR_H
  668.                 call    GetWndReg
  669.                 mov     ah, al
  670.                 mov     al, PCIC_MEMWIN_STR_L
  671.                 call    GetWndReg               ; AX = old START address
  672.                 and     ax, PCIC_MEMWIN_MSK
  673.                 mov     si, ax                  ; SI = old START address
  674.  
  675.                 mov     ax, dx                  ; AX = new START address
  676.                 and     ax, PCIC_MEMWIN_MSK
  677.                 sub     si, ax                  ; SI = (old - new)
  678.  
  679. ;------------------ Establish window start and stop addresses -----------------
  680.  
  681.                 mov     ah, dl
  682.                 mov     al, PCIC_MEMWIN_STR_L
  683.                 CALL    SetWndReg
  684.  
  685.                 mov     ah, dh
  686.                 mov     al, PCIC_MEMWIN_STR_H
  687.                 call    SetWndReg
  688.  
  689.                 mov     ah, cl
  690.                 mov     al, PCIC_MEMWIN_END_L
  691.                 call    SetWndReg
  692.  
  693.                 mov     ah, ch
  694.                 mov     al, PCIC_MEMWIN_END_H
  695.                 call    SetWndReg
  696.  
  697. ;-------------------------- Finish Adjusting Offset  --------------------------
  698.  
  699.                 mov     al, PCIC_MEMWIN_OFF_H
  700.                 CALL    GetWndReg
  701.                 mov     ah, al
  702.  
  703.                 mov     al, PCIC_MEMWIN_OFF_L
  704.                 call    GetWndReg
  705.  
  706.                 mov     dx, ax
  707.  
  708.                 add     ax, si                  ; add changes
  709.                 and     ax, PCIC_MEMWIN_OMSK
  710.  
  711.                 and     dh, PCIC_MEMWIN_ATTR    ; Map to correct type of memory
  712.                 xor     dl, dl
  713.                 or      ax, dx
  714.  
  715.                 mov     dx, ax
  716.  
  717.                 mov     al, PCIC_MEMWIN_OFF_H
  718.                 call    SetWndReg
  719.  
  720.                 mov     ah, dl
  721.                 mov     al, PCIC_MEMWIN_OFF_L
  722.                 call    SetWndReg
  723.  
  724.                 popx    <ax, dx, si>
  725.                 ret
  726. SetupMemWin     ENDP
  727.  
  728. ;*****************************************************************************
  729. ;*                            --- SetupIOWin ---
  730. ;*
  731. ;*     Purpose: Setup I/O window
  732. ;*       Input: dx - Window Start, cx - Window end, ah - Window attributtes
  733. ;*              [BP] = Pointer to entry args on stack
  734. ;*              [BX] = Pointer to adapter entry in Adapters array
  735. ;*      Output: none
  736. ;* Scratch reg: none
  737. ;*     Written: by Alexis A.Piatetsky 09.05.94
  738. ;*****************************************************************************
  739. SetupIOWin      PROC    NEAR
  740.  
  741.                 push    dx
  742.  
  743.                 push    ax                  ; Save attributes
  744.                 call    cowDisableWindow
  745.  
  746.                 mov     al, PCIC_IOWIN_STR_L
  747.                 mov     ah, dl
  748.                 call    SetWndReg
  749.  
  750.                 mov     al, PCIC_IOWIN_STR_H
  751.                 mov     ah, dh
  752.                 call    SetWndReg
  753.  
  754.                 mov     al, PCIC_IOWIN_END_L
  755.                 mov     ah, cl
  756.                 call    SetWndReg
  757.  
  758.                 mov     al, PCIC_IOWIN_END_H
  759.                 mov     ah, ch
  760.                 call    SetWndReg
  761.  
  762.                 mov     al, PCIC_IOWIN_CTRL
  763.                 call    GetReg
  764.                 mov     ah, 0F0h            ; Assume Window 0
  765.                 cmp     (ARGS PTR [BP]).bWindowNum, 1
  766.                 jne     @f                  ; If Window 0
  767.  
  768.                 mov     ah, 0Fh             ; Mask out Window 1
  769.  
  770. @@:             and     ah, al              ; Mask out our Window bits
  771.                 pop     dx                  ; dh - Window attributes
  772.                 or      ah, dh              ; Combine with other window
  773.                 mov     al, PCIC_IOWIN_CTRL
  774.                 call    SetReg
  775.                 mov     ax, dx
  776.                 pop     dx
  777.                 ret
  778. SetupIOWin      ENDP
  779.  
  780. COMMENT ~*********************************************************************
  781.         Procedure:      SetWindow
  782.         Revision:       9
  783.         Date:           09/22/1993
  784.         Purpose:        Configure window
  785.         Entry:          [BP] = Pointer to entry args on stack
  786.                         [BX] = Pointer to adapter entry in Adapters array
  787.                         Args.BLReg = Socket (0 .. 3)
  788.                         Args.CXReg = Window Size (Bytes for I/O, 4K units for memory)
  789.                         Args.DHReg = Window State (set to one = true, unless noted)
  790.                           Bit 0    = Window type (reset = memory, set = I/O)
  791.                           Bit 1    = Enabled
  792.                           Bit 2    = Data Width (reset = 8-bit, set = 16-bit)
  793.                           If Bit 0 reset to zero (0) - memory window
  794.                             Bit 3  = Subdivided into 16K pages (memory-only)
  795.                           If Bit 0 set to one (1) - I/O window
  796.                             Bit 3  = EISA Mapped
  797.                             Bit 4  = EISA Non-specific access slot enabled
  798.                           All other bits are reserved and are reset to zero (0)
  799.                         Args.DLReg = Requested Access Speed (memory windows only)
  800.                         Args.DIReg = Base Address (Bytes for I/O, 4K units for memory)
  801.         Exit:           Args.AHReg = Return Code
  802.                         If BAD_ATTRIBUTE, Window State invalid
  803.                         If BAD_BASE, starting address is invalid
  804.                         If BAD_SIZE, window size is invalid
  805.                         If BAD_SPEED, requested speed is too slow
  806.                         If BAD_TYPE, window does not support requested type
  807. *****************************************************************************~
  808. SetWindow       PROC    NEAR
  809.  
  810. ;------------------------- Always force full decoding -------------------------
  811.  
  812.                 mov     al, PCIC_WINDOW
  813.                 call    GetReg
  814.                 or      al, PCIC_WINDOW_A23A12
  815.                 mov     ah, al
  816.                 mov     al, PCIC_WINDOW
  817.                 call    SetReg
  818.  
  819. ;---------------------- Force 16 bit memory delay inhibit ---------------------
  820.  
  821.                 mov     al, PCIC_CDGCR
  822.                 call    GetReg
  823.                 or      al, PCIC_CDGCR_16BITMDI
  824.                 mov     ah, al
  825.                 mov     al, PCIC_CDGCR
  826.                 call    SetReg
  827.  
  828. ;-------------------- Validate window is mappable to socket -------------------
  829.  
  830.                 mov     al, (ARGS PTR [BP]).bSocketNum
  831.                 cmp     (ARGS PTR [BP]).BLReg, al
  832.                 jne     sw_bad_socket
  833.  
  834.                 call    cowValWinPars
  835.                 jc      sw_done
  836.  
  837. ; Now ah - Speed, al - Requested Attributtes,
  838. ; dx - Window Start address, cx - Window End address
  839.  
  840.                 mov     si, offset SpeedTable
  841.                 test    al, WS_IO           ; I/O window ?
  842.                 jz      @f                  ; No, continue
  843.  
  844.                 mov     ah, 1               ; Use default 1 WS only
  845.                 jmp     short sw_at         ; Skip speed calculation
  846.  
  847. @@:             test    al, WS_16BIT        ; 16 bit?
  848.                 jz      sw_getws            ; No, continue
  849.  
  850.                 add     si, 8
  851.  
  852. sw_getws:       push    cx                  ; Window end
  853.                 push    si                  ; Save table offset
  854.  
  855.                 mov     cx, [si + 2]        ; Table length
  856.                 mov     si, [si]            ; Table offset
  857.  
  858.                 push    ax                  ; Save Attributes
  859.                 push    cx                  ; Save table size
  860.  
  861. @@:             lodsb                       ; Get first table speed
  862.                 call    couCompSpeed        ; Compare
  863.                 jbe     sw_speed_ok
  864.                 loop    @b
  865.  
  866.                 add     sp, 8               ; Discard pars in stack
  867. ;               jmp     short sw_bad_speed
  868.  
  869. ;------------------------------ Error Dispatcher ------------------------------
  870.  
  871. sw_bad_speed:   mov     ah, BAD_SPEED
  872.                 jmp     sw_done
  873.  
  874. sw_bad_socket:  mov     ah, BAD_SOCKET
  875.                 jmp     sw_done
  876.  
  877. sw_speed_ok:    mov     si, cx
  878.                 pop     cx
  879.                 sub     cx, si              ; cx - number of table entry
  880.  
  881.                 pop     ax                  ; Restore attributes in al
  882.                 mov     ah, cl              ; AH - number of WS
  883.                 pop     si
  884.                 pop     cx
  885.  
  886. ; If we received 0 WS here, we probably can have better speed by forcing
  887. ; 0 WS signal. This method is not recomended for 16-bit memory window
  888.  
  889.                 or      ah, ah              ; 0 WS?
  890. if SUPPORT_0WS
  891.                 jnz     sw_at               ; No, we are ok
  892. else
  893.                 jmp     short sw_at         ; Ignore 0WS tables
  894. endif
  895.                 add     si, 4               ; Point to corresponding 0WS table
  896.  
  897.                 test    al, WS_IO           ; I/O window?
  898.                 jz      @f                  ; No, use short cycle
  899.  
  900.                 test    al, WS_16BIT        ; 16-bit IO?
  901.                 jnz     sw_at               ; Yes, don't use short cycle
  902.  
  903. @@:             mov     si, [si]
  904.                 push    ax                  ; Save value
  905.                 mov     ah, (ARGS PTR [BP]).DLReg
  906.                 lodsb
  907.                 call    couCompSpeed        ; Compare
  908.                 pop     ax                  ; Restore what we have w/o 0WS
  909.                 ja      sw_at               ; 0WS could not be used
  910.  
  911.                 mov     ah, 0FFh            ; Used as flag
  912.  
  913.  
  914. ;-------------------------- Create Window attributes --------------------------
  915.  
  916. sw_at:          test    al, WS_IO           ; I/O window ?
  917.                 jnz     sw_set_io           ; Yes, continue
  918.  
  919.                 test    al, WS_16BIT        ; 16-bit request ?
  920.                 jz      @f                  ; No, continue
  921.  
  922.                 or      dh, PCIC_MEMWIN_M16 ; Yes, set 16-bit data width
  923.  
  924. @@:             cmp     ah, 0FFh            ; 0WS?
  925.                 jne     @f                  ; No continue
  926.  
  927.                 or      dh, PCIC_MEMWIN_0WS ; Force 0WS and go ahead
  928.  
  929. @@:             or      ah, ah              ; Any WS?
  930.                 jz      @f                  ; No, continue
  931.  
  932.                 push    cx
  933.                 mov     cl, 6
  934.                 shl     ah, cl              ; Create WS mask
  935.                 pop     cx
  936.                 or      ch, ah
  937.  
  938. @@:             call    SetupMemWin
  939.                 jmp     short sw_success
  940.  
  941.  
  942. sw_set_io:      cmp     ah, 0FFh            ; 0WS?
  943.                 jne     @f                  ; No, continue
  944.  
  945.                 mov     ah, PCIC_IOWIN_0WS
  946.                 jmp     short sw_io_wsok
  947.  
  948. @@:             or      ah, ah              ; Any WS?
  949.                 jz      short sw_io_wsok    ; No, continue
  950.  
  951.                 mov     ah, PCIC_IOWIN_WS
  952.  
  953. sw_io_wsok:     test    al, WS_16BIT        ; 16-bit request ?
  954.                 jz      @f
  955.  
  956.                 or      ah, PCIC_IOWIN_IO16 OR PCIC_IOWIN_IO16SR
  957.  
  958. @@:             cmp     (ARGS PTR [BP]).bWindowNum, 1
  959.                 jne     @f
  960.  
  961.                 push    cx
  962.                 mov     cl, 4
  963.                 shl     ah, cl
  964.                 pop     cx
  965.  
  966. @@:             call    SetupIOWin
  967.  
  968. ;---------------------------- Terminate operations ----------------------------
  969.  
  970. sw_success:     test    al, WS_ENABLED      ; Need to enable window?
  971.                 jz      @f                  ; Yes, continue
  972.                 call    cowEnableWindow     ;  and enable window
  973.  
  974. @@:             mov     ah, SUCCESS
  975. ;               jmp     short sw_done
  976.  
  977. sw_done:        ret
  978.  
  979. SetWindow       ENDP
  980.  
  981. COMMENT ~*********************************************************************
  982.         Procedure:      GetPage
  983.         Revision:       2
  984.         Date:           08/04/1993
  985.         Purpose:        Return PC Card offset and window state
  986.         Entry:          [BP] = Pointer to entry args on stack
  987.                         [BX] = Pointer to adapter entry in Adapters array
  988.         Exit:           Args.DXReg = Page State (set to one = true)
  989.                           Bit 0    = Memory type (reset = common, set = attribute)
  990.                           Bit 1    = Page enabled
  991.                           Bit 2    = Software Write-Protected
  992.                           All other bits are reserved and are reset to zero (0)
  993.                         Args.BLReg = Page number
  994.                         Args.DIReg = Memory Card Offset (4 KByte units)
  995. *****************************************************************************~
  996. GetPage         PROC    NEAR
  997.  
  998. ;----------------------------- Get current offset  ----------------------------
  999.  
  1000.                 mov     al, PCIC_MEMWIN_OFF_H
  1001.                 CALL    GetWndReg
  1002.                 mov     ah, al
  1003.  
  1004.                 mov     al, PCIC_MEMWIN_OFF_L
  1005.                 call    GetWndReg
  1006.                 push    ax                  ; Save for later
  1007.  
  1008.                 and     ax, PCIC_MEMWIN_OMSK
  1009.  
  1010.                 mov     cx, ax
  1011.  
  1012. ;--- Change to adjust offset from hardware requirements to user requirements --
  1013.  
  1014.                 mov     al, PCIC_MEMWIN_STR_H
  1015.                 call    GetWndReg
  1016.                 mov     ah, al
  1017.                 mov     al, PCIC_MEMWIN_STR_L
  1018.                 call    GetWndReg           ; AX: START address
  1019.  
  1020.                 and     ax, PCIC_MEMWIN_MSK
  1021.  
  1022.                 add     ax, cx
  1023.                 and     ax, PCIC_MEMWIN_MSK ; Mask address bytes
  1024.  
  1025.                 mov     (ARGS PTR [BP]).DIReg, ax
  1026.  
  1027. ;------------------------------Return page state ------------------------------
  1028.  
  1029.                 pop     ax                  ; Card OFFSET
  1030.                 xor     dx, dx
  1031.                 test    ah, PCIC_MEMWIN_ATTR
  1032.                 jz      @f
  1033.  
  1034.                 or      dl, PS_ATTRIBUTE    ; Save memory type
  1035.  
  1036. @@:             call    cowIsWinEnabled
  1037.                 jz      @f
  1038.  
  1039.                 or      dl, PS_ENABLED
  1040.  
  1041. @@:             test    ah, PCIC_MEMWIN_WP
  1042.                 jz      @f
  1043.  
  1044.                 or      dl, PS_WP
  1045.  
  1046. @@:             mov     (ARGS PTR [BP]).DXReg, dx ; Return page attributes
  1047.                 mov     (ARGS PTR [BP]).BLReg, 0  ; Cannot page window
  1048.                 mov     ah, SUCCESS
  1049.                 ret
  1050.  
  1051. GetPage         ENDP
  1052.  
  1053. COMMENT ~*********************************************************************
  1054.         Procedure:      SetPage
  1055.         Revision:       4
  1056.         Date:           09/23/1993
  1057.         Purpose:        Set PC Card offset and set window state
  1058.         Entry:          [BP] = Pointer to entry args on stack
  1059.                         [BX] = Pointer to adapter entry in Adapters array
  1060.                         Args.DXReg = Page Control (set to one = true)
  1061.                           Bit 0    = Memory type (reset = common, set = attribute)
  1062.                           Bit 1    = Enable page
  1063.                           Bit 2    = Software Write-Protect
  1064.                           All other bits are reserved.
  1065.                         Args.DIReg = Desired Memory Card Offset (4 KByte units)
  1066.                         Args.BLReg = Page number
  1067.         Exit:           If offset >= 64 MB
  1068.                           Args.AH = BAD_OFFSET
  1069. *****************************************************************************~
  1070. SetPage         PROC    NEAR
  1071.  
  1072. ;--------- Set current offset, software write-protect and memory type  --------
  1073.  
  1074.                 mov     cx, (ARGS PTR [BP]).DIReg ; Card Offset
  1075.                 mov     dl, (ARGS PTR [BP]).DLReg ; Page Attributes
  1076.                 test    cx, NOT PCIC_MEMWIN_OMSK
  1077.                 jnz     sp_bad_offset
  1078.  
  1079. ;-------------- Change to adjust offset to hardware requirements --------------
  1080.  
  1081.                 mov     al, PCIC_MEMWIN_STR_H
  1082.                 call    GetWndReg
  1083.                 mov     ah, al
  1084.                 mov     al, PCIC_MEMWIN_STR_L
  1085.                 call    GetWndReg               ; AX: START address
  1086.                 and     ax, PCIC_MEMWIN_MSK
  1087.  
  1088.                 sub     cx, ax                  ; Get Offset
  1089.                 and     cx, PCIC_MEMWIN_OMSK    ; Mask valid bits
  1090.  
  1091. ;------------------------------- Set memory type ------------------------------
  1092.  
  1093.                 test    dl, PS_ATTRIBUTE
  1094.                 jz      @f
  1095.  
  1096.                 or      ch, PCIC_MEMWIN_ATTR
  1097.  
  1098. @@:             test    dl, PS_WP
  1099.                 jz      @f
  1100.  
  1101.                 or      ch, PCIC_MEMWIN_WP
  1102.  
  1103. ;-------------------------- Write changes to hardware -------------------------
  1104.  
  1105. @@:             mov     ah, cl
  1106.                 mov     al, PCIC_MEMWIN_OFF_L
  1107.                 call    SetWndReg
  1108.  
  1109.                 mov     ah, ch
  1110.                 mov     al, PCIC_MEMWIN_OFF_H
  1111.                 call    SetWndReg
  1112.  
  1113. ; Because our hardware doesn't allow paging inside window, we should ignore
  1114. ; PS_ENABLED. PCMCIA Socket Services Specification, page 5-58. Therefore,
  1115. ; IBM Card Services for OS/2 do not disable window. IBM consider, that seting
  1116. ; of page with disabled attribute will do it!
  1117.  
  1118.                 call    cowDisableWindow
  1119.  
  1120.                 test    dl, PS_ENABLED
  1121.                 jz      @f
  1122.  
  1123.                 call    cowEnableWindow
  1124. @@:
  1125.                 mov     ah, SUCCESS
  1126.                 jmp     short sp_done
  1127.  
  1128. sp_bad_offset:  mov     ah, BAD_OFFSET
  1129.                 jmp     short sp_done
  1130.  
  1131. sp_bad_attr:    mov     ah, BAD_ATTRIBUTE
  1132.                 jmp     short sp_done
  1133.  
  1134. sp_done:        ret
  1135.  
  1136. SetPage         ENDP
  1137.  
  1138.  
  1139. sEnd            ResCode
  1140.                 end
  1141.