home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
packetdrivers.tar.gz
/
pd.tar
/
src
/
pktall.asm
< prev
next >
Wrap
Assembly Source File
|
1995-06-25
|
5KB
|
271 lines
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