home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddkx86v5.zip / DDKX86 / SRC / DEV / PCMCIA / SOCKET / SSPCICIN.ASM < prev    next >
Assembly Source File  |  1995-04-14  |  25KB  |  724 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    SSPCICIN
  13.                 page    60, 132
  14.                 title   'SSPCICIN'
  15. ;******************************************************************************
  16. ;*
  17. ;*                            File SSPCICIN.ASM
  18. ;*
  19. ;*                        Socket Services PCIC File
  20. ;*
  21. ;*                              Initialisation
  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.                 include ssmsg.inc           ; Messages
  32.  
  33.  
  34. ;*****************************************************************************
  35. ;*                         --- Segment InitData ---
  36. ;*****************************************************************************
  37. sBegin          InitData
  38.  
  39. ;-------------------------------- Adapter Info --------------------------------
  40.  
  41. PCIC_Bases      dw      3E0h, 3E2h, 0
  42. sEnd            InitData
  43.  
  44. ;*****************************************************************************
  45. ;*                  --- Segment InitCode ---
  46. ;*****************************************************************************
  47. sBegin          InitCode
  48.                 nop                         ; Just for avoid warning info
  49.  
  50. COMMENT ~*********************************************************************
  51.         Procedure:      coiInitAdapter
  52.         Revision:       1
  53.         Date:           05/25/1993
  54.         Purpose:        Initialize Adapter Hardware
  55.         Entry:          [AL] = Adapter Number (Absolute)
  56.         Exit:           none
  57.         Side Effects:   All Registers Preserved
  58. *****************************************************************************~
  59. coiInitAdapter  PROC    NEAR
  60.                 assumes ds, Nothing
  61.                 assumes es, Nothing
  62.                 assumes ss, Nothing
  63.  
  64.                 pushx   <ax, bx, dx, di>
  65.  
  66.                 mov     ah, SET_ADAPTER
  67.                 mov     dh, 0               ; Nothing special
  68.                 mov     di, PCIC_DEF_SCIRQ
  69.                 call    codCommon16
  70.  
  71.                 popx    <di, dx, bx, ax>
  72.                 ret
  73. coiInitAdapter  ENDP
  74.  
  75. COMMENT ~*********************************************************************
  76.         Procedure:      coiInitSocket
  77.         Revision:       1
  78.         Date:           05/25/1993
  79.         Purpose:        Initialize Socket Hardware and Data Structures
  80.         Entry:          [AL] = Adapter
  81.                         [BL] = Socket Number (0 based)
  82.         Exit:           none
  83.         Side Effects:   All Registers Preserved
  84. *****************************************************************************~
  85. coiInitSocket   PROC    NEAR
  86.                 assumes ds, Nothing
  87.                 assumes es, Nothing
  88.                 assumes ss, Nothing
  89.  
  90.                 pushx   <ax, bx, cx, dx, di>
  91.  
  92.                 mov     ch, IF_MEMORY
  93.                 mov     cl, PCIC_DEF_IRQ    ; Note, this value will be ignored.
  94.                 mov     di, cx
  95.                 mov     ah, SET_SOCKET
  96.                 mov     bh, 0               ; Disable all SC reports
  97.  
  98.                 xor     cx, cx              ; Vcc = Vpp1 = Vpp2 = 0V
  99.  
  100.                 mov     dh, 0FFh            ; Clear all saved states
  101.                 mov     dl, PCIC_DEF_CTLIND
  102.                 call    codCommon16
  103.                 popx    <di, dx, cx, bx, ax>
  104.                 ret
  105. coiInitSocket   ENDP
  106.  
  107. COMMENT ~*********************************************************************
  108.         Procedure:      coiInitWindow
  109.         Revision:       2
  110.         Date:           09/21/1993
  111.         Purpose:        Initialize Window Hardware and Data Structures
  112.         Entry:          [AL] = Adapter Number (Absolute)
  113.                         [BH] = Window Number  (0 based)
  114.         Exit:           All Registers Preserved
  115. *****************************************************************************~
  116. coiInitWindow   PROC    NEAR
  117.                 assumes ds, Nothing
  118.                 assumes es, Nothing
  119.                 assumes ss, Nothing
  120.  
  121.                 pushx   <ax, bx, cx, dx, di>
  122.  
  123. ;----------------------------- Get type of window -----------------------------
  124.  
  125.                 MOV     ah, GET_WINDOW
  126.                 call    codCommon16
  127.  
  128.                 test    dh, WS_IO           ; Memory Window?
  129.                 jnz     iwIOWnd             ; No, do I/O setup
  130.  
  131. ;------------------------ Set memory window parameters ------------------------
  132.  
  133.                 mov     cx, 1               ; Default size:  4KB
  134.                 mov     di, 10H             ; Default Base:  10000h = 64K
  135.                 mov     dl, DSPEED_250NS    ; Default Speed: 250 ns
  136.                 jmp     short iwSet
  137.  
  138. ;-------------------------- Set I/O window parameters -------------------------
  139.  
  140. iwIOWnd:        mov     cx, 1               ; Default Size: 1
  141.                 mov     di, 100H            ; Default Base: 100h
  142.  
  143. ;-------------------------------- Set-up window -------------------------------
  144.  
  145. iwSet:          and     dh, NOT WS_ENABLED  ; Common Default State
  146.                 mov     ah, SET_WINDOW
  147.                 call    codCommon16
  148.  
  149.                 test    dh, WS_IO           ; if MemWindow Set Page Too.
  150.                 jnz     iwExit
  151.  
  152. ;------------------------ For memory window set-up page -----------------------
  153.  
  154.                 mov     bl, 0               ; Default Page: 0
  155.                 mov     dx, 0               ; Default State (common memory,
  156.                                             ; disabled, not write-protected)
  157.                 mov     di, 0               ; Default Card Offset: 0
  158.                 mov     ah, SET_PAGE        ; Function Code
  159.                 call    codCommon16
  160.  
  161.  
  162. iwExit:         popx    <di, dx, cx, bx, ax>
  163.                 ret
  164.  
  165. coiInitWindow   ENDP
  166.  
  167. COMMENT ~*********************************************************************
  168.         Procedure:      coiInitAll
  169.         Revision:       1
  170.         Date:           05/25/1993
  171.         Purpose:        Initialize all Adapters, Sockets, and Windows
  172.         Entry:          none
  173.         Exit:           All Registers Preserved
  174. *****************************************************************************~
  175. coiInitAll      PROC    FAR
  176.                 assumes ds, ResData
  177.                 assumes es, InitData
  178.                 assumes ss, Nothing
  179.  
  180.                 pushx   <ax, bx, cx>
  181.  
  182.                 mov     al, bFirstAdapter
  183.                 mov     cl, bNumAdapters
  184.                 xor     ch, ch
  185.                 mov     bx, offset Adapters
  186.  
  187. ;-------------------------------- Adapter loop --------------------------------
  188.  
  189. ia_NextAdapter: call    coiInitAdapter
  190.                 push    cx                  ; Save adapter count
  191.  
  192.                 ; Initialise all sockets
  193.  
  194.  
  195.                 mov     cl, (ADP_DATA PTR [bx]).bNumSockets
  196.                 xor     ch, ch
  197.                 push    bx                  ; Save adapter data pointer
  198.                 xor     bl, bl              ; Start from socket 0
  199.  
  200. @@:             call    coiInitSocket
  201.                 inc     bl
  202.                 loop    @b
  203.  
  204.                 pop     bx                  ; Restore pointer to adapter data
  205.  
  206.                 ; Window loop
  207.  
  208.                 mov     cl, (ADP_DATA PTR [bx]).bNumWindows
  209.                 xor     ch, ch
  210.                 push    bx                  ; Save adapter data pointer
  211.                 xor     bh, bh              ; Start from window 0
  212.  
  213. @@:             call    coiInitWindow
  214.                 inc     bh
  215.                 loop    @b
  216.  
  217.                 pop     bx                  ; Restore pointer to adapter data
  218.                 add     bx, SIZEOF ADP_DATA
  219.                 pop     cx
  220.                 loop    ia_NextAdapter
  221.  
  222. GIExit:         popx    <cx, bx, ax>
  223.                 ret
  224.  
  225. coiInitAll      ENDP
  226.  
  227. sEnd            InitCode
  228.  
  229. ;*****************************************************************************
  230. ;*                         --- Segment InitCode ---
  231. ;*****************************************************************************
  232. sBegin          InitCode
  233.  
  234. ;*****************************************************************************
  235. ;*                        --- coiScanCommand ---
  236. ;*
  237. ;*     Purpose: Scan command line
  238. ;*       Input: ES:BX - point the command line string
  239. ;*      Output: In case of error: CY and DX - offset of message to print
  240. ;*              else NC.
  241. ;* Scratch reg: AX
  242. ;*     Written: by Alexis A.Piatetsky 23.07.94
  243. ;*****************************************************************************
  244. coiScanCommand  PROC    NEAR
  245.                 assumes ds, ResData
  246.                 assumes es, Nothing
  247.                 assumes ss, Nothing
  248.                 assume  ds:@data, es:Nothing
  249.  
  250.                 push    dx
  251.  
  252. ;------------------------- Get lenth of command string ------------------------
  253.  
  254.                 push    bx
  255.  
  256. scan_end:       mov     al, es:[bx]
  257.                 cmp     al, ' '
  258.                 jb      @f
  259.                 cmp     al, ';'
  260.                 je      @f
  261.                 inc     bx
  262.                 jmp     short scan_end
  263.  
  264. @@:             mov     cx, bx
  265.                 pop     bx
  266.                 sub     cx, bx
  267.  
  268. ;--------------------- Now cx - length of parameter string --------------------
  269.  
  270.  
  271. GetNext:        push    bx
  272.                 push    cx
  273.                 call    couGetToken
  274.                 jc      ScanFail
  275.  
  276.                 cmp     al, 0
  277.                 je      ScanDone
  278.  
  279.  
  280. ; Give the help --------------------------------------
  281.  
  282.                 cmp     al, 'H'
  283.                 je      @f
  284.                 cmp     al, '?'
  285.                 jne     @f
  286.  
  287. sc_givehelp:    mov     dx, offset HelpMsg
  288.                 add     sp, 6               ; Kill everything in stack
  289.  
  290.                 jmp     short sc_error
  291.  
  292. ; Screen Output
  293.  
  294. @@:             cmp     al, 'E'             ; Enable messages?
  295.                 jne     @f
  296.  
  297.                 push    es
  298.                 push    ax
  299.                 mov     ax, InitDataBASE
  300.                 mov     es, ax
  301.         assumes es, InitData
  302.                 pop     ax
  303.  
  304.                 mov     es:osMsgFlag, MSG_ON
  305.                 pop     es
  306.                 jmp     short ScanNext
  307.  
  308. @@:             cmp     al, 'A'             ; Adapter address?
  309.                 jne     @f
  310.  
  311.                 call    couGetHex           ; Get Adapter address
  312.                 jc      ScanFail
  313.  
  314.                 push    es
  315.                 push    ax
  316.                 mov     ax, InitDataBASE
  317.                 mov     es, ax
  318.         assumes es, InitData
  319.                 pop     ax
  320.  
  321.                 mov     PCIC_Bases,   ax
  322.                 mov     PCIC_Bases+2, 0
  323.                 pop     es
  324.  
  325. ScanNext:       add     sp, 4               ; Kill bx, cx in the stack
  326.                 jmp     short GetNext
  327.  
  328. ScanDone:       clc
  329.                 add     sp, 4               ; Kill bx, cx in the stack
  330.                 pop     dx
  331.                 ret
  332.  
  333. ;----------------------------- Report Syntax error ----------------------------
  334.  
  335. ScanFail:       mov     dx, offset SyntaxMsg
  336. @@:             pop     cx                  ; Restore address of Token
  337.                 pop     bx                  ; that causes problems
  338.  
  339.                 push    es                  ; Address of Tocken
  340.                 mov     ax, InitDataBASE
  341.                 mov     es, ax
  342.         assumes es, InitData
  343.                 cCall   _osPrintString, <dx>
  344.  
  345.                 jcxz    @f
  346.  
  347.                 mov     dx, 39              ; Quote
  348.                 cCall   _osPrintChar, <dx>
  349.  
  350.                 pop     es
  351.         assumes es, Nothing
  352.  
  353.                 push    ds                  ; Print rest of command line
  354.                 push    es
  355.                 pop     ds
  356.         assumes ds, Nothing
  357.                 cCall   _osPrintString, <bx>
  358.                 pop     ds
  359.         assumes ds, @data
  360.                 push    es
  361.                 mov     ax, InitDataBASE
  362.                 mov     es, ax
  363.         assumes es, InitData
  364.  
  365. @@:             mov     dx, offset EndOfMsg
  366.                 cCall   _osPrintString, <dx>
  367.  
  368.                 pop     es
  369.         assumes es, Nothing
  370.  
  371.                 mov     dx, offset SyntaxHelpMsg
  372.                 add     sp, 2               ; Kill dx in the stack
  373. sc_error:       stc
  374.                 ret
  375. coiScanCommand  ENDP
  376.  
  377. ;*****************************************************************************
  378. ;*                          --- DetectAdapter ---
  379. ;*
  380. ;*     Purpose: Perform detection of installed adapters
  381. ;*       Input: none
  382. ;*      Output: bNumAdapters, ADP_DATA wBasePort, bNumWindows, bNumSockets are set.
  383. ;* Scratch reg: none
  384. ;*     Written: by Alexis A.Piatetsky 02.08.94
  385. ;*        Note: If base address is specified on command line, use this address
  386. ;*              only. Otherwise, start at 3e0 and scan for adapters.
  387. ;*              If command line specifies number of sockets less than actual,
  388. ;*              use only those sockets.
  389. ;*****************************************************************************
  390. asDetectAdapter PROC    NEAR
  391.                 assumes ds, ResData
  392.                 assumes es, InitData
  393.                 assumes ss, Nothing
  394.  
  395.                 pushx   <ax, dx, si>
  396.  
  397. ;----------------- Establish pointer to the adapter structure -----------------
  398.  
  399.                 mov     al, bFirstAdapter   ; previous SS?
  400.                 xor     ah, ah
  401.                 mov     cl, SIZEOF ADP_DATA ; if so, we adjust pointer
  402.                                             ; to next adapter structure,
  403.                 mul     cl                  ; since adapter number indexes
  404.                                             ; into the array
  405.                 mov     bx, offset Adapters
  406.                 add     bx, ax
  407.  
  408.                 mov     si, offset PCIC_Bases
  409.  
  410. ;----------------------------- Adapter search loop ----------------------------
  411.  
  412.  
  413. adCheckAddr:    mov     dx, es:[si]         ; Get next address
  414.                 add     si, 2               ; Advance pointer
  415.                 or      dx, dx              ; end of list?
  416.                 je      adDone              ; Yes, terminate
  417.  
  418.                 xor     al, al              ; Ident register
  419.                 out     dx, al
  420.                 jmp     $+2
  421.  
  422.                 inc     dx
  423.                 in      al, dx
  424.                 jmp     $+2
  425.                 dec     dx
  426.  
  427.                 cmp     al, 83h             ; Intel PCIC step B?
  428.                 jne     adCheckAddr
  429.  
  430. ; Load Adapter parameters to the data structure
  431.  
  432.                 mov     (ADP_DATA PTR [bx]).wBasePort, dx ; Save adapter
  433.                                                           ; address
  434.                 mov     (ADP_DATA PTR [bx]).bNumSockets, 1
  435.  
  436.                 inc     bNumAdapters        ; number of adapters on this SS
  437.  
  438. ; Get number of sockets
  439.  
  440.                 mov     ah, PCIC_SOCKET1
  441.  
  442. gns_getsock:    mov     al, ah
  443.                 out     dx, al
  444.                 jmp     $+2
  445.  
  446.                 inc     dx
  447.                 in      al, dx
  448.                 jmp     $+2
  449.                 dec     dx
  450.  
  451.                 cmp     al, 83h             ; Socket present?
  452.                 jne     gns_done
  453.  
  454. ; On some adapters sockets 0, 1 are mirrored to 2 and 3
  455.  
  456.                 cmp     ah, PCIC_SOCKET2
  457.                 jne     gns_con
  458.  
  459.                 ; Set power register of socket 0 to 0
  460.  
  461.                 mov     al, PCIC_SOCKET0 + PCIC_POWER
  462.                 out     dx, al                  ; Output to index register
  463.                 jmp     $+2
  464.  
  465.                 inc     dx                      ; Point to data register
  466.  
  467.                 xor     al, al
  468.                 out     dx, al
  469.                 jmp     $+2
  470.  
  471.                 dec     dx
  472.  
  473.                 ; Check power register of socket 2
  474.  
  475.                 mov     al, PCIC_SOCKET2 + PCIC_POWER
  476.  
  477.                 out     dx, al                  ; Output to index register
  478.                 jmp     $+2
  479.  
  480.                 inc     dx                      ; Point to data register
  481.  
  482.                 ; If we have mirror, this register contains 0, because we
  483.                 ; init this value for socket 0
  484.  
  485.                 in      al, dx
  486.                 jmp     $+2
  487.                 dec     dx                      ; Back to Index register
  488.                 or      al, al
  489.                 jnz     gns_con
  490.  
  491.                 ; Try to increase power register value for socket 2
  492.  
  493.                 inc     dx                      ; Point to data register
  494.                 inc     al                      ; Vpp(1)=5V, but Card Power
  495.                                                 ; Disabled
  496.                 out     dx, al                  ; Output to data register
  497.                 jmp     $+2
  498.  
  499.                 dec     dx                      ; Back to Index register
  500.  
  501.                 ; Check, if value changed also for socket 0
  502.  
  503.                 mov     al, PCIC_SOCKET0 + PCIC_POWER
  504.                 out     dx, al                  ; Output to index register
  505.                 jmp     $+2
  506.  
  507.                 inc     dx                      ; Point to data register
  508.                 in      al, dx
  509.                 dec     dx                      ; Back to Index register
  510.                 or      al, al
  511.                 jnz     gns_done
  512.  
  513. gns_con:        inc     (ADP_DATA PTR [bx]).bNumSockets
  514.                 add     ah, PCIC_SKTINC
  515.                 jnz     gns_getsock
  516.  
  517. gns_done:       mov     al, (ADP_DATA PTR [bx]).bNumSockets
  518.                 mov     cl, PCIC_WIN_PER_SKT
  519.                 mul     cl
  520.                 mov     (ADP_DATA PTR [bx]).bNumWindows, al
  521.  
  522.                 add     bx, SIZEOF ADP_DATA ; Point the next entry
  523.                 jmp     adCheckAddr
  524.  
  525. adDone:
  526.                 popx    <si, dx, ax>
  527.                 ret
  528. asDetectAdapter ENDP
  529.  
  530. ;*****************************************************************************
  531. ;*                             --- ResetHardware ---
  532. ;*
  533. ;*     Purpose: Initialize all sockets (registers zeroed)
  534. ;*       Input: none (uses ADP_DATA data)
  535. ;*      Output: none
  536. ;* Scratch reg: none
  537. ;*     Written: by Alexis A.Piatetsky 29.07.94
  538. ;*       Notes: any device-specific init should go here
  539. ;*****************************************************************************
  540. asResetHardware PROC    NEAR
  541.                 assumes ds, ResData
  542.                 assumes es, Nothing
  543.                 assumes ss, Nothing
  544.  
  545. ; ----- Insure socket is initialized to zero
  546.  
  547.                 pushx   <ax, bx, cx, dx>
  548.  
  549. ;----------------- Establish pointer to the adapter structure ----------------
  550.  
  551.  
  552.                 mov     bx, offset Adapters
  553.                 mov     cl, bNumAdapters
  554.                 xor     ch, ch
  555.  
  556. rh_NextAdp:     push    cx
  557.                 mov     ah, PCIC_SOCKET0    ; start at 0
  558.                 mov     dx, (ADP_DATA PTR [bx]).wBasePort
  559.                 xor     ch, ch
  560.                 mov     cl, (ADP_DATA PTR [bx]).bNumSockets
  561.  
  562. rh_NextSock:    push    cx                  ; Save socket counter
  563.                 mov     cl, PCIC_POWER      ; Set starting register to zero
  564.  
  565. rh_NextReg:     mov     al, ah              ; Create proper index for register
  566.                 add     al, cl              ; by adding socket offset
  567.  
  568.                 out     dx, al              ; Output to index register
  569.                 jmp     $+2
  570.                 inc     dx                  ; Point to data register
  571.  
  572.                 xor     al, al              ; Output zero to data register
  573.                 cmp     cl, PCIC_WINDOW     ; Window enable is a special case
  574.                 jne     @f
  575.  
  576.                 mov     al, PCIC_WINDOW_A23A12  ; enable full addr decode
  577. @@:             out     dx, al              ; of MEMCS16
  578.  
  579.                 dec     dx                  ; Point back to index register
  580.  
  581.                 inc     cl                  ; Point to next PCIC register
  582.                 cmp     cl, PCIC_IOWIN_CTRL ; Have we done last one ?
  583.                 jbe     short rh_NextReg    ; No, go do another
  584.  
  585.                 mov     al, PCIC_CDGCR
  586.                 out     dx, al
  587.                 jmp     $+2
  588.                 inc     dx
  589.  
  590.                 mov     al, PCIC_CDGCR_16BITMDI
  591.  
  592.                 out     dx, al
  593.                 jmp     $+2
  594.                 dec     dx
  595.  
  596.                 mov     al, PCIC_GLOBL
  597.                 out     dx, al
  598.                 jmp     $+2
  599.                 inc     dx
  600.  
  601.                 mov     al, 0
  602.  
  603.                 out     dx, al
  604.                 jmp     $+2
  605.                 dec     dx
  606.  
  607.                 add     ah, PCIC_SKTINC     ; Point to next socket
  608.                 pop     cx
  609.                 loop    rh_NextSock
  610.  
  611.                 pop     cx
  612.                 add     bx, sizeof ADP_DATA
  613.                 loop    rh_NextAdp
  614.  
  615.                 popx    <dx, cx, bx, ax>
  616.                 ret
  617. asResetHardware ENDP
  618.  
  619. ;*****************************************************************************
  620. ;*                            --- coiInitSS ---
  621. ;*
  622. ;*     Purpose: Initialise Socket Services
  623. ;*       Input: ES:BX - Pointer to the command line string
  624. ;*      Output: NC, if successful, CY otherwise
  625. ;* Scratch reg: all
  626. ;*     Written: by Alexis A.Piatetsky 28.07.94
  627. ;*****************************************************************************
  628. coiInitSS       PROC    FAR
  629.                 assumes ds, ResData
  630.                 assumes es, Nothing
  631.                 assumes ss, Nothing
  632.  
  633. ; ----- Display signon message
  634.  
  635.                 push    es                  ; es:bx Pointer to command line
  636.                 mov     ax, InitDataBASE
  637.                 mov     es, ax
  638.         assumes es, InitData
  639.  
  640.                 lea     dx, SignonMsg
  641.                 cCall   _osPrintString, <dx>
  642.  
  643.                 pop     es
  644.         assumes es, Nothing
  645.  
  646. ; ----- Check command line for arguments
  647.  
  648.                 call    coiScanCommand
  649.                 mov     ax, InitDataBASE
  650.                 mov     es, ax
  651.         assumes es, InitData
  652.                 jnc     @f
  653.                 jmp     initSSExit          ; Exit with error message
  654.  
  655. @@:             push    ds                  ; Establish [ES] register
  656.                 pop     es
  657.         assume  es:@data
  658.  
  659. ; ----- Initialize adapter structures
  660.  
  661.                 mov     ax, SIZEOF ADP_DATA
  662.                 mov     cx, MAX_ADAPTERS
  663.                 mul     cl
  664.                 mov     cx, ax
  665.                 xor     ax, ax
  666.                 cld
  667.  
  668.                 mov     di, OFFSET Adapters
  669.         rep     stosb
  670.  
  671.                 mov     ax, InitDataBASE
  672.                 mov     es, ax
  673.         assumes es, InitData
  674.  
  675.                 call    osOKtoLoad
  676.                 jc      initSSExit
  677.  
  678. ; ----- Detect Adapter(s)
  679.  
  680. ISSInstall:     mov     al, bFirstAdapter
  681.                 push    ax                  ; bFirstAdapter in al
  682.                 mov     bFirstAdapter, 0
  683.  
  684.                 call    asDetectAdapter
  685.  
  686.                 pop     ax                  ; Restore bFirstAdapter in al
  687.  
  688.                 cmp     bNumAdapters, 0     ; Any adapters found ?
  689.                 jne     short @f            ; Yes, continue
  690.  
  691.                 mov     dx, offset NoAdapterMsg ; No, indicate error
  692.                 jmp     short initSSExit        ;  and exit
  693.  
  694. ; ----- Adjust adapter values for adapter(s) located
  695.  
  696. @@:             mov     bFirstAdapter, al   ; Restore bFirstAdapter
  697.                 add     al, bNumAdapters
  698.                 mov     bTotAdapters, AL
  699.                 dec     al
  700.                 mov     bLastAdapter, AL
  701.  
  702. ; ----- Perform hardware initialization
  703.  
  704.                 call    asResetHardware
  705.                 call    coiInitAll
  706.  
  707. ; ----- Create and display completion message
  708.  
  709.                 mov     AL, bNumAdapters
  710.                 add     AL, '0'
  711.                 mov     es:chAdapters, AL
  712.  
  713.                 mov     dx, offset SuccessMsg
  714.  
  715. initSSExit:     cCall   _osPrintString, <dx>
  716.  
  717.                 cmp     bNumAdapters, 1         ; Set [CF] if bNumAdapters EQ zero (0)
  718.                 ret
  719.  
  720. coiInitSS       ENDP
  721.  
  722. sEnd            InitCode
  723.                 end
  724.