home *** CD-ROM | disk | FTP | other *** search
- version equ 0
-
- ; 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 para public
- assume cs:code, ds:code
-
- org 80h
- phd_dioa label byte
-
- org 100h
- start:
- jmp start_1
-
- copyleft_msg label byte
- db "Packet receiver version ",'0'+(majver / 10),'0'+(majver mod 10),".",'0'+version," copyright 1990, Russell Nelson.",CR,LF
- db "This program is free software; see the file COPYING for details.",CR,LF
- db "NO WARRANTY; see the file COPYING for details.",CR,LF
- crlf_msg db CR,LF,'$'
-
- their_isr dd ?
- their_mode dw ?
- entry_point db ?,?,?,?
- handle dw ?
-
- no_signature_msg db "No packet driver at that address",'$'
- usage_msg db "usage: pktall <packet_int_no> [-v] [-p] [-a <enet_addr>]",'$'
- waiting_msg label byte
- db "Now waiting for packets to be received. Press any key to exit.",CR,LF,'$'
-
- verbose_switch db 0
- pro_switch db 0
- address_switch db 0
- ether_addr db EADDR_LEN dup(-1)
-
- queue_overflow dw 0
-
- usage_error:
- mov dx,offset usage_msg
- error:
- mov ah,9
- int 21h
- int 20h
-
- start_1:
- mov dx,offset copyleft_msg
- mov ah,9
- int 21h
-
- mov si,offset phd_dioa+1
- cmp byte ptr [si],CR ;end of line?
- je usage_error
-
- mov di,offset entry_point
- call get_number
-
- another_switch:
- call skip_blanks
- cmp al,'-' ;did they specify a switch?
- je have_switch
- jmp not_switch
- have_switch:
- cmp byte ptr [si+1],'v' ;did they specify '-v'?
- je got_verbose_switch
- cmp byte ptr [si+1],'p' ;did they specify '-p'?
- je got_pro_switch
- cmp byte ptr [si+1],'a' ;did they specify '-a'?
- je got_addr_switch
- jmp usage_error ;no, must be an error.
- got_pro_switch:
- add si,2
- mov pro_switch,1
- jmp another_switch
- got_verbose_switch:
- add si,2
- mov verbose_switch,1
- jmp another_switch
- got_addr_switch:
-
- add si,2
-
- mov di,offset ether_addr
- movseg es,ds
- call get_eaddr
-
- mov address_switch,1
- mov pro_switch,1 ;-a implies -p.
- jmp another_switch
- not_switch:
- call skip_blanks
- cmp al,CR
- jne usage_error
-
- call queue_init
-
- call verify_packet_int
- jc error
- mov dx,offset no_signature_msg
- jne error
-
- mov their_isr.offs,bx
- mov their_isr.segm,es
-
- mov ax,1ffh ;driver_info
- call int_pkt
- call fatal_error
-
- mov ah,2 ;access all packets.
- mov al,ch ;their class from driver_info().
- mov bx,dx ;their type from driver_info().
- mov dl,cl ;their number from driver_info().
- mov cx,0 ;type length of zero.
- movseg es,cs
- mov di,offset our_recv
- call int_pkt
- call fatal_error
- mov handle,ax
-
- mov ah,21 ;get the receive mode.
- mov bx,handle
- call int_pkt
- call fatal_error
- mov their_mode,ax
-
- cmp pro_switch,0
- je not_pro
-
- mov ah,20 ;set it to promiscuous mode.
- mov bx,handle
- mov cx,6
- call int_pkt
- call fatal_error
- not_pro:
-
- mov dx,offset waiting_msg
- mov ah,9
- int 21h
-
- wait_for_key:
- cmp queue_overflow,0 ;did we drop a packet?
- je not_overflow
- mov queue_overflow,0
- mov al,'O'
- call chrout
- not_overflow:
-
- call queue_pull
- jc no_packet
-
- cmp verbose_switch,0
- je not_verbose
- call dump_hex
- call crlf
- jmp short no_packet
- not_verbose:
- mov al,'R'
- call chrout
-
- no_packet:
- mov ah,1 ;check for any key.
- int 16h
- je wait_for_key ;no key -- keep waiting.
-
- mov ah,0 ;fetch the key.
- int 16h
-
- mov ah,20 ;reset the receive mode.
- mov bx,handle
- mov cx,their_mode
- call int_pkt
-
- mov ah,3
- mov bx,handle
- call int_pkt
- call fatal_error
-
- int 20h
-
- assume ds:nothing
-
- our_recv:
- push ds
- push cs
- pop ds
- or ax,ax ;first or second call?
- jne our_recv_1 ;second -- bump the packet flag.
- movseg es,cs
- call queue_push
- jnc our_recv_exit
- inc queue_overflow
- xor di,di
- mov es,di
- jmp short our_recv_exit
- our_recv_1:
- cmp address_switch,0 ;are we looking for an address?
- je our_recv_exit ;no.
- push es
- push di
- push si
- mov ax,cs
- mov es,ax
- mov di,offset ether_addr ;is the destination our address?
- mov cx,EADDR_LEN/2
- repe cmpsw
- je our_recv_2
- add si,cx ;move to source address.
- mov di,offset ether_addr ;is the source our address?
- mov cx,EADDR_LEN/2
- rep cmpsw
- our_recv_2:
- pop si
- pop di
- pop es
- je our_recv_exit ;yes.
-
- cmp word ptr [si][0],-1 ;always receive broadcasts.
- jne our_recv_drop
- cmp word ptr [si][2],-1
- jne our_recv_drop
- cmp word ptr [si][4],-1
- je our_recv_exit
- our_recv_drop:
- call queue_unpush
- our_recv_exit:
- pop ds
- retf
-
- int_pkt:
- push ds
- push es
- pushf
- cli
- call their_isr
- pop es
- pop ds
- ret
-
- include queue.asm
- include pkterr.asm
- include getnum.asm
- include getdig.asm
- include skipblk.asm
- include digout.asm
- include chrout.asm
- include verifypi.asm
- include getea.asm
- include dumphex.asm
- include crlf.asm
-
- align 4
- queue_begin label byte
-
- code ends
-
- end start
-