version equ 0 ;History:245,1 ; The following people have contributed to this code: David Horne, Eric ; Henderson, and Bob Clements. ; ; This packet driver for Nokia Data Ethernet IIe adapter is based ; on the NE2000 driver. Adaptation was made by Markku Toijala and ; Markku Viima, Nokia Data Systems Oy, Helsinki, Finland. ; Copyright, 1988-1992, Russell Nelson, Crynwr Software ; 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 code segment word public assume cs:code, ds:code ;***************************************************************************** ; ; Nokia Data Ethernet IIe controller board offsets ; IO port definition (BASE in io_addr) ;***************************************************************************** ND_DATAPORT EQU 400h ; ETHIIE Port Window. ND_INTF_REG EQU 402h ; ETHIIE Status Setup Register EN_OFF equ 0h ND_SOFT_RESET equ 20h ; bitmask for RESET bit ND_INTF_BNC equ 00h ; BNC (or TP) interface used ND_INTF_DIX equ 40h ; DIX interface used ND_INTF_ROM equ 80h ; ROM disable. include 8390.inc ;***************************************************************************** ; ; Nokia Data EtherNet IIe controller RAM (16 kbytes) is ; organized into Transmit and Receive areas as: ;***************************************************************************** SM_TSTART_PG equ 00h ; First page of TX buffer SM_RSTART_PG equ 06h ; Starting page of RX ring SM_RSTOP_PG equ 40h ; Last page +1 of RX ring ram_enable macro endm reset_8390 macro loadport setport ND_INTF_REG in al,dx ; read current value or al,ND_SOFT_RESET ; set RESET bit in reg. out dx,al ; And write register longpause xor al,ND_SOFT_RESET ; Reset RESET bit in reg. out dx,al ; Write back longpause ;----- ; Set IRQ Selection according to Interrupt Number. ;----- loadport setport ND_INTF_REG mov al,int_no mov ah,01h ; Suppose IRQ5. cmp al,05 ; But is really? je int_ok ; Yes, skip over. mov ah,02 ; Suppose IRQ2/9. cmp al,09 ; But is really? je int_ok ; Yes, skip over. mov ah,04 ; Suppose IRQ12. cmp al,12 ; But is really? je int_ok ; Yes, skip over. mov ah,08h ; Suppose IRQ15. int_ok: ;----- ; Add Transceiver Bit and write interface register. ;----- cmp byte ptr thin_not_thick,00 ; Now set the interface jz set_dix ; Jump if thick mov al,ND_INTF_BNC ; Select BNC interface. jmp short addxcv ; set_dix: mov al,ND_INTF_DIX ; Select DIX interface. addxcv: add al,ah ; combine with interrupt out dx,al ; and write to the card endm terminate_board macro endm public int_no, io_addr,thin_not_thick int_no db 2,0,0,0 ;must be four bytes long for get_number. io_addr dw 0300h,0 ; I/O address for card (jumpers) thin_not_thick dw 1,0 ; Non-zero means thin net public driver_class, driver_type, driver_name, driver_function, parameter_list driver_class db BLUEBOOK, IEEE8023, 0 ;from the packet spec driver_type dw 86 ;from the packet spec driver_name db 'ETHIIE',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, is_186 db 0 ; ; Block input routine ; CX = byte count, es:di = buffer location, ax = buffer address public block_input block_input: push ax ; save buffer address loadport setport EN_CCMD pause_ mov al,ENC_NODMA+ENC_PAGE0+ENC_START out dx,al setport EN0_RCNTLO ; remote byte count 0 pause_ mov al,cl out dx,al setport EN0_RCNTHI pause_ mov al,ch out dx,al pop ax ; get our page back setport EN0_RSARLO pause_ out dx,al ; set as hi address setport EN0_RSARHI pause_ mov al,ah out dx,al setport EN_CCMD pause_ mov al,ENC_RREAD+ENC_START ; read and start out dx,al setport ND_DATAPORT pause_ cmp is_186,0 jnz read_186 read_loop: in al,dx ; get a byte stosb ; save it loop read_loop ret read_186: inc cx ; make even shr cx,1 ; word count db 0f3h, 06dh ;masm 4.0 doesn't grok "rep insw" ret ; ; Block output routine ; CX = byte count, ds:si = buffer location, ax = buffer address block_output: assume ds:nothing push ax ; save buffer address inc cx ; make even and cx,0fffeh loadport setport EN_CCMD pause_ mov al,ENC_NODMA+ENC_START out dx,al ; stop & clear the chip setport EN0_RCNTLO ; remote byte count 0 pause_ mov al,cl out dx,al setport EN0_RCNTHI pause_ mov al,ch out dx,al pop ax ; get our page back setport EN0_RSARLO pause_ out dx,al ; set as lo address setport EN0_RSARHI pause_ mov al,ah out dx,al setport EN_CCMD pause_ mov al,ENC_RWRITE+ENC_START ; write and start out dx,al setport ND_DATAPORT pause_ cmp byte ptr is_186,0 jnz write_186 write_loop: lodsb ; get a byte out dx,al ; save it loop write_loop jmp short block_output_1 write_186: shr cx,1 ; word count db 0f3h, 06fh ;masm 4.0 doesn't grok "rep outsw" block_output_1: mov cx,0 setport EN0_ISR tx_check_rdc: in al,dx test al,ENISR_RDC ; dma done ??? jnz tx_start loop tx_check_rdc stc ret tx_start: clc ret include 8390.asm .LIST public usage_msg usage_msg db "usage: ETHIIE [-n] [-d] [-w] <packet_int_no> <int_level> <io_addr> <thin_net>",CR,LF,'$' public copyright_msg copyright_msg db "Packet driver for ICL EtherTeam16, version " db '0'+majver,".",'0'+version,".",'0'+dp8390_version,CR,LF,'$' int_no_name db "Interrupt number ",'$' io_addr_name db "I/O port ",'$' thin_msg db "Using the built-in transceiver (thinwire)",CR,LF,'$' thick_msg db "Using the external transceiver (thickwire)",CR,LF,'$' 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 public parse_args parse_args: ;exit with nc if all went well, cy otherwise. mov di,offset int_no call get_number mov di,offset io_addr call get_number mov di,offset thin_not_thick ; May override thick/thin cable flag call get_number clc ret extrn etopen_diagn: byte init_card: ;get the board data. This is (16) bytes starting at remote ;dma address 8000h. Put it in a buffer called board_data. assume ds:code or endcfg,ENDCFG_WTS loadport mov al,endcfg setport EN0_DCFG pause_ out dx,al mov cx,10h ; get 16 bytes, push ds pop es ; set es to ds mov di,offset board_data setport EN_CCMD pause_ mov al,ENC_NODMA+ENC_PAGE0+ENC_START out dx,al setport EN0_RCNTLO ; remote byte count 0 pause_ mov al,20h ; count is actually doubled. out dx,al setport EN0_RCNTHI pause_ xor al,al ; high byte of count is zero. out dx,al mov ax,8000h ; from address 0 setport EN0_RSARLO pause_ out dx,al ; set as hi address setport EN0_RSARHI pause_ mov al,ah out dx,al setport EN_CCMD pause_ mov al,ENC_RREAD+ENC_START ; read and start out dx,al loadport setport ND_DATAPORT pause_ sp_read_loop: in ax,dx ; get a byte stosb ; save it loop sp_read_loop push ds ; Copy from card's address to current address pop es mov si, offset board_data ; address is at start mov di, offset curr_hw_addr mov cx, EADDR_LEN ; Copy one address length rep movsb ; .. ret public print_parameters print_parameters: ;echo our command-line parameters 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 mov dx,offset thin_msg cmp thin_not_thick,0 ; May override thick/thin cable flag jne print_parameters_1 mov dx,offset thick_msg print_parameters_1: mov ah,9 int 21h ret code ends end