📄 9346cf.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 + -