Category : Network Files
Archive   : PKTD11A.ZIP
Filename : HPPCLANP.ASM

 
Output of file : HPPCLANP.ASM contained in archive : PKTD11A.ZIP
PAGE ,132
version equ 2
;History:83,1

; Russell Nelson, Clarkson University.
; Copyright, 1988-1991, Russell Nelson
; The following people have contributed to this code: David Horne, Eric
; Henderson, and Bob Clements.

; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, version 1.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

include defs.asm

.286

code segment word public
assume cs:code, ds:code

;*****************************************************************************
;
; hppclan controller board offsets
; IO port definition (BASE in io_addr)
;*****************************************************************************
HP_ID equ 00h
PAGING equ 02h
OPTION equ 04h
PAGE_0 equ 08h
PAGE_2 equ 0ah
PAGE_4 equ 0ch
PAGE_6 equ 0eh
;the following is needed for 8390.
EN_OFF equ 10h

;OPTION bit definitions from the ERS:
MMap_Dis equ 1000h
Zero_Wait_En equ 0080h
Mem_En equ 0040h
IO_En equ 0020h
Boot_Rom_En equ 0010h
Fake_Int equ 0008h
En_Int equ 0004h
HW_Rst equ 0002h
NIC_Rst equ 0001h

;PAGING definitions from the ERS:
Perf_page equ 0
MAC_Page equ 1
HW_page equ 2
Lan_Page equ 4
ID_Page equ 6

include 8390.inc

; Shared memory management parameters

SM_TSTART_PG EQU 0h ; First page of TX buffer
SM_RSTART_PG EQU 6h ; start at page 6
ifndef debugxx
SM_RSTOP_PG EQU 080h
else
;Make problems occur sooner and faster by having a smaller ring
;- gft - 910618
SM_RSTOP_PG EQU 1fh
endif

pause_ macro
; The reason for the pause_ macro is to establish a minimum time between
; accesses to the card hardware. However, the Starfighter hardware inserts
; its own delays, which is much more reliable than any software hack.
endm

reset_8390 macro
loadport
setport OPTION ;hard reset 8390.
in ax,dx
and ax,not (NIC_Rst or HW_Rst) ;reset the 8390
out dx,ax
longpause
or al,En_Int or NIC_Rst or HW_Rst ;unreset it.
out dx,al
endm

terminate_board macro
loadport
setport OPTION
in ax,dx
or ax,MMap_Dis or NIC_Rst or HW_Rst
and ax,not En_Int
out dx,ax
endm

extrn set_recv_isr: near

;enter with si -> argument string, di -> word to store.
;if there is no number, don't change the number.
extrn get_number: near

;enter with dx -> name of word, di -> dword to print.
extrn print_number: near

;enter with al = single character
extrn chrout: near

extrn is_386: byte ;=0 if 80[12]8[68], =1 if 80[34]86.

public int_no, io_addr
int_no db ?,0,0,0 ;must be four bytes long for print_number.
io_addr dw -1,-1 ; I/O address for card (jumpers)
mem_addr dw ?,0
memory_mapped db 0

public driver_class, driver_type, driver_name, driver_function, parameter_list
driver_class db BLUEBOOK, IEEE8023, 0 ;from the packet spec
driver_type db 60 ;Wild card matches any type
driver_name db "HPPCLANP",0 ;name of the driver.
driver_function db 2
parameter_list label byte
db 1 ;major rev of packet driver
db 9 ;minor rev of packet driver
db 14 ;length of parameter list
db EADDR_LEN ;length of MAC-layer address
dw GIANT ;MTU, including MAC headers
dw MAX_MULTICAST * EADDR_LEN ;buffer size of multicast addrs
dw 0 ;(# of back-to-back MTU rcvs) - 1
dw 0 ;(# of successive xmits) - 1
int_num dw 0 ;Interrupt # to hook for post-EOI
;processing, 0 == none,

block_input_ptr dw ?
block_output_ptr dw ?

; Block input routine
; CX = byte count, es:si = buffer location, ax = buffer address

public block_input
block_input:
loadport
setport PAGE_2 ;set the read address.
out dx,ax

setport PAGE_4
jmp block_input_ptr

io_input_286:
shr cx,1
rep insw
jnc read_done
insb
read_done:
ret

io_input_386:
.386
push eax
push cx ;first, get all the full words.
shr cx,2
rep insd
pop cx
in eax,dx ;then, get the partial word.
test cx,2
je block_input_386_one_word
stosw
shr eax,16
block_input_386_one_word:

test cx,1
je block_input_386_one_byte
stosb
block_input_386_one_byte:
pop eax
ret
.286

mem_input_286:
loadport
setport OPTION
in ax,dx
push ax ;save original contents.
and ax,not (MMap_Dis or Boot_Rom_En) ;turn off boot rom, memory on.
out dx,ax

push ds
mov ds,mem_addr
mov si,0
shr cx,1
rep movsw
jnc mem_input_286_1
movsb
mem_input_286_1:
pop ds
pop ax ;restore OPTION register.
out dx,ax
ret

mem_input_386:
;transfer all complete dwords.
.386
loadport
setport OPTION
in ax,dx
push eax ;save original contents.
and ax,not (MMap_Dis or Boot_Rom_En) ;turn off boot rom, memory on.
out dx,ax

push ds
mov ds,mem_addr
mov si,0
push cx
shr cx,2 ; convert byte count to dword count
rep movsd
pop cx

;now take take of any trailing words and/or bytes.
lodsd

test cx,2
je movemem_386_one_word
stosw
shr eax,16
movemem_386_one_word:

test cx,1
je movemem_386_one_byte
stosb
movemem_386_one_byte:
pop ds
pop eax ;restore OPTION register.
out dx,ax
ret
.286


;
; Block output routine
; CX = byte count, ds:si = buffer location, ax = buffer address


block_output:
assume ds:nothing
loadport
setport PAGE_0 ;set the write address.
out dx,ax

setport PAGE_4
jmp block_output_ptr

io_output_286:
inc cx ;round up.
shr cx,1
rep outsw
clc
ret

io_output_386:
.386
add cx,3 ;round up
shr cx,2
rep outsd
clc
ret
.286

mem_output_286:
loadport
setport OPTION
in ax,dx
push ax ;save original contents.
and ax,not (MMap_Dis or Boot_Rom_En) ;turn off boot rom, memory on.
out dx,ax


mov es,mem_addr
mov di,0
inc cx
shr cx,1
rep movsw
pop ax ;restore OPTION register.
out dx,ax
clc
ret

mem_output_386:
.386
loadport
setport OPTION
in ax,dx
push ax ;save original contents.
and ax,not (MMap_Dis or Boot_Rom_En) ;turn off boot rom, memory on.
out dx,ax

mov es,mem_addr
mov di,0
add cx,3
shr cx,2 ; convert byte count to dword count
rep movsd
pop ax ;restore OPTION register.
out dx,ax
clc
ret
.286

include 8390.asm

public usage_msg
usage_msg db "usage: hppclanp [options] ",CR,LF,'$'

public copyright_msg
copyright_msg db "Packet driver for HP 27247B/27252A cards, version "
db '0'+(majver / 10),'0'+(majver mod 10),".",'0'+version,".",'0'+dp8390_version,CR,LF,'$'

no_board_msg db "No HP PC LAN detected.",CR,LF,'$'
io_addr_funny_msg label byte
db "No HP PC LAN detected, continuing anyway.",CR,LF,'$'
no_network_msg db "Check network connector - no network connection detected.",CR,LF,'$'
int_no_name db "Interrupt number ",'$'
io_addr_name db "I/O port ",'$'
mem_addr_name db "Memory address ",'$'

config_flags db ?
config_aui_bit db ? ;=01h if TP, =40h if TL

public parse_args
parse_args:
;exit with nc if all went well, cy otherwise.

mov di,offset io_addr
call get_number

push si

cmp io_addr,-1 ;Did they ask for auto-detect?
je find_board

call detect_board ;no, just verify its existance.
je find_board_found

mov dx,offset io_addr_funny_msg
mov ah,9
int 21h

jmp find_board_found

find_board:
mov io_addr,100h ;Search for the Ethernet address.
mov io_addr+2,0
find_board_0:
call detect_board
je find_board_found
find_board_again:
add io_addr,20h ;not at this port, try another.
cmp io_addr,3ffh
jb find_board_0

mov dx,offset no_board_msg ;Tell them that we can't find it.
stc
ret
find_board_found:
mov config_flags,al ;remember the config flags for later.
and al,40h ;Twisted Pair or Thin Lan?
jne find_board_tl
mov al,1
find_board_tl:
mov config_aui_bit,al

loadport
setport PAGING ;select swap page 2 (hardware)
mov al,HW_page
out dx,al

setport 0dh ;get the IRQ Channel
in al,dx
and al,0fh
mov int_no,al

setport 09h ;get the low memory map location
in ax,dx
shl ax,4 ;make into a segment address
mov mem_addr,ax

mov ax,SM_RSTART_PG + (SM_RSTOP_PG-1) * 256
setport 0eh
out dx,ax

if 0
setport PAGING
mov al,Lan_Page ;select Lan_Page page.
out dx,al

setport PAGE_0
in ax,dx
or al,config_aui_bit ;start with AUI on.
out dx,ax
endif

setport PAGING
mov al,Perf_page ;select Performance page again.
out dx,al

setport OPTION ;see if we're memory or I/O mapped.
in ax,dx
mov bx,offset io_input_286
mov cx,offset io_input_386
mov si,offset io_output_286
mov di,offset io_output_386

test ax,Mem_En ;is memory enabled?
je io_mapped
; and ax,not MMap_Dis ;turn off the memory map disable.
; out dx,ax
inc memory_mapped
mov bx,offset mem_input_286
mov cx,offset mem_input_386
mov si,offset mem_output_286
mov di,offset mem_output_386
io_mapped:
mov block_input_ptr,bx ;by default, use 286 transfers.
mov block_output_ptr,si
cmp is_386,0 ;do we have a 386?
je use_286_code ;no, use 286 transfers
test config_flags,10h ;should we use 16-bit transfers anyway?
jne use_286_code ;yes, their motherboard has a problem.
mov block_input_ptr,cx
mov block_output_ptr,di
use_286_code:

mov sm_rstop_ptr,SM_RSTOP_PG

pop si
clc
ret

extrn etopen_diagn: byte

init_card:
;we have nothing left to do here.
clc
ret


test_packet label byte
db EADDR_LEN dup(?)
db EADDR_LEN dup(?)
db 00h,2eh ;A 46 in network order
db 0,0 ;DSAP=0 & SSAP=0 fields
db 0f3h,0 ;Control (Test Req + P bit set)

public print_parameters
print_parameters:
;echo our command-line parameters
assume ds:code

test config_flags,80h ;should we auto-sense?
jne do_auto_sense
jmp send_test_exit ;no.
do_auto_sense:

;but on *this* adapter, try sending a test packet.

mov si,offset rom_address ;set the destination address.
movseg es,cs
mov di,offset test_packet
repmov EADDR_LEN
mov si,offset rom_address ;set the source address.
repmov EADDR_LEN

loadport
setport PAGING
mov ax,Lan_Page
out dx,ax ;Point at LAN Control page

setport PAGE_0
in ax,dx ;Get current state of LAN register
or al,config_aui_bit ;Turn on AUI select bit
send_test:
out dx,ax

call delay_150ms

setport PAGING ;set back to the expected page
mov ax,Perf_page
out dx,ax

mov cx,6 ;try six times
send_test_again:
push bx
push cx
mov cx,60
mov si,offset test_packet
call send_pkt
pop cx
pop bx

mov ax,18
call set_timeout

loadport
setport EN0_ISR
send_test_wait:
in al,dx
test al,ENISR_TX or ENISR_TX_ERR ;did it finish?
jne send_test_done

call do_timeout
jnz send_test_wait
jmp short send_test_loop

send_test_done:
mov al,0ffh ;clear all interrupts.
out dx,al

setport EN0_TSR
in al,dx ;get the transmit status
test al,ENTSR_COLL16 or ENTSR_CRS or ENTSR_FU ;any problems?
je send_test_exit ;no, it worked.

send_test_loop:
loop send_test_again

;it failed all six times. Try again on a different interface.
setport PAGING
mov ax,Lan_Page
out dx,ax ;Point at LAN Control page

setport PAGE_0
in ax,dx ;Get current state of LAN register
test al,config_aui_bit ;did we already try internal xcvr?
je send_test_fail ;yes, we can't send any packets!

not al ;Turn off AUI select bit
or al,config_aui_bit
not al
jmp send_test

send_test_fail:
mov dx,offset no_network_msg
mov ah,9
int 21h

send_test_exit:
loadport
setport PAGING ;set back to the expected page
mov ax,Perf_page
out dx,ax

mov di,offset int_no
mov dx,offset int_no_name
call print_number
mov di,offset io_addr
mov dx,offset io_addr_name
call print_number
cmp memory_mapped,0
je print_parameters_1
mov di,offset mem_addr
mov dx,offset mem_addr_name
call print_number
print_parameters_1:
ret


delay_150ms:
mov ax,(3000+275)/275 ;delay 300 ms (27.5 ms per increment).
call set_timeout
delay_150ms_1:
call do_timeout
jnz delay_150ms_1
ret


detect_board:
;see if this adapter is the HP Adapter/16+.
;exit with zr if adapter is at io_addr,
; AL = Driver Configuration Flags (YOYO page 6 offset 0Ch)
; AH = Soft model byte (YOYO page 6 offset 0Dh)
;
; Check Hardware Family ID bytes
;
loadport
setport HP_ID
in al,dx
cmp al,50h
jne detect_board_1

setport HP_ID+1
in al,dx
cmp al,48h
jne detect_board_1
setport HP_ID+2
in al,dx
and al,0f0h ;AND off page select bits
cmp al,0
jne detect_board_1
setport HP_ID+3
in al,dx
cmp al,53h
jne detect_board_1
;
; Checksum the Station Address to verify this really is an Adapter/16+
;
setport PAGING ;Point back at PAGING register
mov ax,MAC_Page
out dx,ax ;Goto adapter ISA ID page
xor bl,bl
movseg es,cs
mov di,offset rom_address
mov cx,7 ;6 bytes of address + 1 checksum byte
setport PAGE_0 ;Point at 1st Station Address byte
detect_board_2:
in al,dx
add bl,al
stosb
inc dx
loop detect_board_2
cmp bl,0ffh ;Is checksum good??
jnz detect_board_1 ;NO, exit
;
; Check the Software Model number to verify this Adapter/16+ is NIC based.
;
loadport
setport PAGING ;Point back at PAGING register
mov ax,ID_Page
out dx,ax ;Point at Board ID and SW info page
setport PAGE_4 ;Point at Software Configuration Flags
in ax,dx
mov bh,ah
and bh,(NOT 3h) ;Mask off revision bits
cmp bh,0 ;Compare soft model number (0)?
detect_board_1:
ret


code ends

end


  3 Responses to “Category : Network Files
Archive   : PKTD11A.ZIP
Filename : HPPCLANP.ASM

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/