File Archive

 
Output of file : PKTALL.ASM contained in archive : PKTD11B.ZIP

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 [-v] [-p] [-a ]",'$'
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