⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9346cf.asm

📁 智邦网卡测试程序源码(2张网卡pingpong)
💻 ASM
字号:

        .MODEL  small, c
        .386
ReadCfg      PROTO C CfgData:WORD, IOBASE:WORD
WriteCfg     PROTO C CfgData:WORD, IOBASE:WORD
ResetCard    PROTO C WDFlag:WORD
AutoLoad     PROTO C IOBASE:WORD
FindEthernet PROTO C Index:WORD

        .DATA
;---------------------------------------------------------
;       Wait 200ns*Number
;---------------------------------------------------------
Slow    MACRO   Number
        LOCAL   Slow_lp
        push    cx
        push    ax
        mov     cx,Number
Slow_lp:
        in      al,61h
        loop    Slow_lp
        pop     ax
        pop     cx

        ENDM
;---------------------------------------------------------
;       Write data to 9346 (carry bit contains data)
;---------------------------------------------------------
WrBit   MACRO
        rcl     al,1
        rcl     al,1
        and     al,02h
        push    ax
        or      al,SerialClkLo
        out     dx,al
        Slow    SK

        pop     ax
        push    ax
        or      al,SerialClkHi
        out     dx,al
        slow    SK

        pop     ax
        or      al,SerialClkLo
        out     dx,al
        Slow    SK

        ENDM
;---------------------------------------------------------
;       Write data to 9346 (carry bit contains data)
;---------------------------------------------------------
WrBit1  MACRO
        rcl     al,1
        rcl     al,1
        and     al,02h
        push    ax
        or      al,SerialClkLo
        out     dx,al
        Slow    SK

        pop     ax
        or      al,SerialClkHi
        out     dx,al
        slow    SK

        ENDM
;---------------------------------------------------------
;       Read  data form 9346 (result in carry bit)
;---------------------------------------------------------
RdBit   MACRO
        push    ax
        mov     al,SerialClkHi
        out     dx,al
        Slow    SK

        mov     al,SerialClkLo
        out     dx,al
        slow    SK

        in      al,dx
        shr     al,1
        pop     ax

        ENDM
;---------------------------------------------------------
;       Check Live Port
;---------------------------------------------------------
ChkPort MACRO TestData
        mov     al,TestData
        out     dx,al
        slow    1
        in      al,dx
        cmp     al,TestData
        ENDM


IDR0               equ     00h
MAR0               equ     08h
TSD0               equ     10h
TSD1               equ     14h
TSD2               equ     18h
TSD3               equ     1Ch
TSAD0              equ     20h
TSAD1              equ     24h
TSAD2              equ     28h
TSAD3              equ     2Ch
RBSTART            equ     30h
ReceiveStatus      equ     34h
EReceiveStatus     equ     36h
Command            equ     1ch
CurrentAddress     equ     38h
InterruptMask      equ     3ch
InterruptStatus    equ     3eh
TransmitConfig     equ     40h
ReceiveConfig      equ     44h
TCTR               equ     48h
MissedPacket       equ     4ch
CR9346             equ     50h
Config0            equ     51h
Config1            equ     52h
Flash              equ     54h
GEP                equ     58h
GEPCTL             equ     59h
MIIR               equ     5ah
HLTCLK             equ     5bh
MULINT             equ     5ch
TSAD               equ     60h


SK                              equ     10
NormalMode                      equ     00h
ProgramMode                     equ     80h
ChipSelectHi                    equ     88h
ChipSelectLo                    equ     80h
SerialClkHi                     equ     8Ch
SerialClkLo                     equ     88h
ReadCmd                         equ     80h
WriteCmd                        equ     40h
EwenCmd                         equ     30h
EwdsCmd                         equ     00h
EraseCmd                        equ     0C0h

PCI_FUNCTION_ID     EQU        0B1h
PCI_BIOS_PRESENT    EQU        01h
FIND_PCI_DEVICE     EQU        02h
FIND_PCI_CLASS_CODE EQU        03h
READ_CONFIG_BYTE    EQU        08h
READ_CONFIG_WORD    EQU        09h
WRITE_CONFIG_BYTE   EQU        0Bh
Network_Class       EQU        20000h
        .CODE

;---------------------------------------------------------------
Second  PROC
        cmp     cx,0
        je      SecondExit

        push    cx
        mov     ah,0
        int     1ah
        mov     ax,dx
        mov     bx,cx
        clc
        pop     cx
        add     ax,cx
        adc     bx,0

Second_lp:
        push    ax
        mov     ah,0
        int     1ah
        pop     ax
        cmp     bx,cx
        jb      SecondExit
        cmp     ax,dx
        jb      SecondExit
        jmp     Second_lp
SecondExit:
        ret
Second  ENDP

ResetCard       PROC    C       IOBASE:WORD
        mov     bp, IOBASE

        lea     dx,[bp+Command]
        mov     al, 01h
        out     dx, al

;        in      al, dx                          ;Is the port alive?
;        and     al, 0Fh
;        cmp     al, 01h
;        jne     ResetBad
        mov     al,0
        ret
ResetBad:
        mov     al,0FFh
        ret
ResetCard       ENDP


;---------------------------------------------------------------
;       ReadCfg -- read configuration from EEPROM(9346)
;       input -- I/O base address in IOBASE
;       output -- Two words configuration data starts from
;                    address CfgData
;---------------------------------------------------------------
ReadCfg PROC    C CfgData:WORD, IOBASE:WORD
        jmp     ReadCfgStart
ReadCfgBase     dw      ?
ReadCfgStart:
        push    bp
        mov     ReadCfgBase,bp
        mov     bp,IOBASE

        lea     dx,[bp+CR9346]
        mov     al,ProgramMode
        out     dx,al

        Slow    SK

        mov     cx,0
ReadCfg_lp:
        push    cx
        mov     bx,cx

        call    R_9346
        pop     cx
        jc      RdFail
        push    bp
        mov     bp,ReadCfgBase
        mov     bx,cx
        shl     bx,1
        add     bx,CfgData
        mov     [bx],ax
        pop     bp

        inc     cx
        cmp     cx, 64
        jb      ReadCfg_lp

        clc

RdFail:
        lea     dx,[bp+CR9346]
        mov     al,NormalMode
        out     dx,al

        pop     bp
        ret
ReadCfg ENDP

FindEthernet  PROC   C  Index:WORD
      push     bp
      mov      si,  0
EthernetLoop:
      mov      ah,  PCI_FUNCTION_ID
      mov      al,  FIND_PCI_ClASS_CODE
      mov      ecx, Network_Class
      int      1Ah
      jnc      EthernetFound
      inc      si
      cmp      si, 0ffh
      jbe      EthernetLoop
      mov      ax, 0
      pop      dx
      pop      cx
      pop      ax
      pop      bp
      ret
EthernetFOUND:
      mov     ah, PCI_FUNCTION_ID;
      mov     al, READ_CONFIG_WORD;
      mov     di, 10h
      int     1Ah
      and     cx, 0fffeh
      mov     bp, cx
      lea     dx, [bp+TCTR]
      in      al, dx
      mov     ah, al
      slow    1000
      in      al, dx
      cmp     al, ah
      je      EthernetBad
      lea     dx, [bp+TCTR]
      in      al, dx
      mov     ah, al
      slow    1000
      in      al, dx
      cmp     al, ah
      je      EthernetBad
      lea     dx, [bp+06h]
      in      al, dx
      cmp     al, 0
      jne     EthernetBad
      inc     dx
      in      al, dx
      cmp     al, 0
      jne     EthernetBad
      lea     dx, [bp+53h]
      in      al, dx
      cmp     al, 0
      jne     EthernetBad
      mov     ax, bx
      pop     bp
      ret

EthernetBad:
      inc      si
      jmp     EthernetLoop  ;; Not EN5038, find Next
;;      mov     ax, 0
;;      pop     bp
;;      ret
FindEthernet ENDP
R_9346  PROC
        push    cx
        push    bx
        mov     al,ChipSelectHi
        out     dx,al

        Slow    SK

        or      bl,ReadCmd
        call    WrCmd1

         RdBit
         jc      RdError

        mov     al,0
        mov     cx,16
R_9346_lp:
        RdBit
        rcl      ax,1
        loop    R_9346_lp

        push    ax

        mov     al,ChipSelectLo
        out     dx,al

        Slow    SK

        pop     ax
        pop     bx
        pop     cx
        clc
        ret

RdError:
        push    ax

        mov     al,ChipSelectLo
        out     dx,al

        Slow    SK

        pop     ax
        pop     bx
        pop     cx
        stc
        ret

R_9346  ENDP


;---------------------------------------------------------------
;       WriteCfg -- write configuration to EEPROM(9346)
;       input -- I/O base address in IOBASE
;                Two words configuration data starts from
;                    address CfgData
;---------------------------------------------------------------
WriteCfg        PROC  C CfgData:WORD, IOBASE:WORD
        jmp     WriteCfgStart
WriteCfgBase    dw      ?
WriteCfgStart:

        push    bp
        mov     WriteCfgBase,bp
        mov     bp,IOBASE

        lea     dx,[bp+CR9346]
        mov     al,ProgramMode
        out     dx,al
        push    dx

        Slow    SK

        mov     cx,0
WriteCfg_lp:

        push    bp
        mov     bp,WriteCfgBase
        mov     bx,cx
        shl     bx,1
        add     bx,CfgData
        mov     ax,[bx]
        pop     bp
        mov     bx,cx
        push    cx
        call    W_9346
        pop     cx

        inc     cx
        cmp     cx,64
        jb     WriteCfg_lp

        pop     dx
        mov     al,0h
        out     dx,al


        pop bp
        ret
WriteCfg ENDP

W_9346  PROC
        push    cx
        push    bx
        push    ax
        mov     al,ChipSelectHi
        out     dx,al

        Slow    SK

        push    bx
        mov     bl,EwenCmd
        call    WrCmd

        Slow    SK

        mov     al,SerialClkLo
        out     dx,al
        Slow    SK

        mov     al,ChipSelectLo
        out     dx,al

        Slow    SK

        mov     al,ChipSelectHi
        out     dx,al

        Slow    SK

        pop     bx
        push    bx
        or      bl,EraseCmd
        call    WrCmd

        mov     al,SerialClkLo
        out     dx,al
        Slow    SK

        mov     al,ChipSelectLo
        out     dx,al

        Slow    SK

        mov     al,ChipSelectHi
        out     dx,al

        Slow    SK

WaitForErase:

        in      al,dx
        test    al,01
        jne     EraseOK

        jmp     WaitForErase

EraseOK:
        mov     al,ChipSelectLo
        out     dx,al

        Slow    SK

        pop     bx
        or      bl,WriteCmd
        call    WrCmd

        pop     ax
        push    ax
        mov     cx,16
W_9346_lp:
        rcl     ax,1
        push    ax
        WrBit
        pop     ax
        loop    W_9346_lp

        mov     al,SerialClkLo
        out     dx,al
        Slow    SK

        mov     al,ChipSelectLo
        out     dx,al

        Slow    SK

        mov     al,ChipSelectHi
        out     dx,al

        Slow    SK

WaitForReady:

        in      al,dx
        test    al,01
        jne     WriteOK

        jmp     WaitForReady

WriteOK:

        mov     al,ChipSelectLo
        out     dx,al

        Slow    SK

        mov     bl,EwdsCmd
        call    WrCmd

        Slow    SK

        mov     al,SerialClkLo
        out     dx,al
        Slow    SK

        mov     al,ChipSelectLo
        out     dx,al

        Slow    SK


        pop     ax
        pop     bx
        pop     cx
        ret
W_9346  ENDP


WrCmd1  PROC
        clc
        WrBit1

        stc
        WrBit1

        mov     cx,8
WrCmd1_lp:

        shl     bl,1

        WrBit1
        loop    WrCmd1_lp

        ret
WrCmd1  ENDP

WrCmd   PROC
        clc
        WrBit

        stc
        WrBit

        mov     cx,8
WrCmd_lp:

        shl     bl,1

        WrBit
        loop    WrCmd_lp

        ret
WrCmd   ENDP

AutoLoad    PROC    C   IOBASE:WORD
        push    bp
        mov     bp,IOBASE


        lea     dx,[bp+CR9346]
        in      al,dx
        and     al,3fh
        or      al,40h
        out     dx,al

        mov     cx,2
        call    Second

        lea     dx,[bp+CR9346]
        in      al,dx
        and     al,3fh
        out     dx,al

        pop     bp
        ret

AutoLoad    ENDP


        END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -