Category : Network Files
Archive   : TCP_SRC.ZIP
Filename : PKTSEND.ASM
; Russell Nelson, Clarkson University. December 24, 1989
; Copyright, 1989, Russell Nelson
; 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
org 2h
phd_memsize label word
org 80h
phd_dioa label byte
org 100h
start:
jmp start_1
copyleft_msg label byte
db "Packet sender version ",'0'+majver,".",'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,'$'
int_pkt macro
pushf
cli
call their_isr
endm
their_isr dd ?
packet_int_no db ?,?,?,?
handle dw ?
packet_flag dw 0
repeat_switch db ?
quiet_switch db ?
async_switch db ?
send_count dw ?,?
pkt_count dd ?
async_iocb1 iocb <0, 0, DONE> ;Two iocbs
async_iocb2 iocb <0, 0, DONE>
signature db 'PKT DRVR',0
signature_len equ $-signature
no_signature_msg db "No packet driver at that address",'$'
usage_msg db "usage: pktsend
sending_msg label byte
db "Press space to re-send packet(s). Any other key exits.",CR,LF,'$'
repeat_msg label byte
db "Sending repeat packets. Any key exits.",CR,LF,'$'
file_not_found db "File not found",'$'
read_trouble db "Trouble reading the file",'$'
non_number_msg db "Non-numeric input found",'$'
mem_trashed_msg db CR,LF,"Found trashed memory at ",'$'
line_buffer db 128 dup(?)
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 packet_int_no
call get_number
mov word ptr pkt_count,1
mov word ptr pkt_count+2,0
another_switch:
call skip_blanks
mov al,[si] ;did the give the packet inline?
cmp al,'-' ;did they specify a switch?
jne not_switch
cmp byte ptr [si+1],'r' ;did they specify '-r'?
je got_repeat_switch
cmp byte ptr [si+1],'q' ;did they specify '-q'?
je got_quiet_switch
cmp byte ptr [si+1],'n' ;did they specify '-n'?
je got_number_switch
cmp byte ptr [si+1],'l' ;did they specify '-l'?
je got_length_switch
cmp byte ptr [si+1],'f' ;did they specify '-f'?
je start_file
cmp byte ptr [si+1],'a' ;did they specify '-a'?
je got_async_switch
jmp usage_error ;no, must be an error.
got_repeat_switch:
mov repeat_switch,1
add si,2
jmp another_switch
got_quiet_switch:
mov quiet_switch,1
add si,2
jmp another_switch
got_number_switch:
add si,2
mov di,offset pkt_count
call get_number
jmp another_switch
got_length_switch:
add si,2
mov di,offset send_count
call get_number
mov di,offset our_buffer
add di,send_count
jmp start_gotit
got_async_switch:
mov async_switch,1
add si,2
jmp another_switch
not_switch:
jmp start_inline ;yes.
start_file:
add si,2
call skip_blanks
mov dx,si ;remember where the filename starts.
start_3:
lodsb
cmp al,' '
je start_4
cmp al,CR
jne start_3
start_4:
dec si
mov byte ptr [si],0
;read the packet bytes from the named file.
mov ax,3d00h ;open for reading.
int 21h
jnc file_found
mov dx,offset file_not_found
jmp error
file_found:
mov handle,ax
mov di,offset our_buffer
start_line:
mov si,offset line_buffer
again_line:
mov ah,3fh ;read a single character.
mov bx,handle
mov cx,1
mov dx,si
int 21h
jnc no_trouble
mov dx,offset read_trouble
jmp error
no_trouble:
cmp ax,1 ;did we actually read one?
je not_eof
cmp si,offset line_buffer ;did we read anything this time?
je start_file_eof ;no, it's really eof this time.
mov [si],byte ptr CR ;add an extra CR, just in case.
jmp short done_reading
not_eof:
lodsb ;get the character we just read.
cmp al,LF ;got the LF?
jne again_line ;no, read again.
done_reading:
mov si,offset line_buffer
again_chars:
call get_number
jnc got_a_number
mov dx,offset non_number_msg
jmp error
got_a_number:
inc di
call skip_blanks
cmp al,CR
jne again_chars ;keep going to the end.
jmp start_line
start_file_eof:
mov ah,3eh ;close the file.
mov bx,handle
int 21h
jmp short start_gotit
start_inline:
;read the packet bytes off the command line.
mov di,offset our_buffer-1
start_2:
inc di ;pre-increment
call get_number ;get a byte.
jnc start_2 ;keep going to the end.
start_gotit:
sub di,offset our_buffer
mov send_count,di
mov sp,offset start ;now that we're finished with
;the parameters, put our stack there.
mov di,offset our_buffer + GIANT * 2
inc di
and di,not 1
push cs
pop es
init_memory:
mov ax,055aah ;initialize a segment to 055aah.
mov cx,di
neg cx
shr cx,1
stosw
sub cx,2
rep stosw
mov ax,es
add ax,1000h
mov es,ax
add ax,1000h
cmp ax,phd_memsize ;don't go past the end of memory.
jbe init_memory
mov ah,35h ;get their packet interrupt.
mov al,packet_int_no
int 21h
mov their_isr.offs,bx
mov their_isr.segm,es
lea di,3[bx]
mov si,offset signature
mov cx,signature_len
repe cmpsb
je signature_ok
jmp no_signature_err
signature_ok:
push ds
mov ax,1ffh ;driver_info
int_pkt
pop ds
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.
push cs ;es:di -> our receiver.
pop es
mov di,offset our_recv
int_pkt
call fatal_error
mov handle,ax
cmp repeat_switch,0
je load_count
mov dx,offset repeat_msg
mov ah,9
int 21h
load_count:
mov ax,word ptr pkt_count
mov dx,word ptr pkt_count+2
send_again:
push ax
push dx
mov ah,4 ;send_pkt
mov si,offset our_buffer ;ds:si -> buffer.
mov cx,send_count
cmp async_switch,0 ;async?
je send_pkt ;no
mov ah,12 ;as_send_pkt
find_iocb: ;find a free iocb
mov di,offset async_iocb1 ;try first
test [di].flags,DONE ;free?
jnz got_iocb ;yes
mov di,offset async_iocb2 ;no, try second
test [di].flags,DONE ;free?
jz find_iocb ;no, try first again
got_iocb: ;set up iocb
mov word ptr [di].buffer,si
mov word ptr [di].buffer+2,ds
mov es,word ptr [di].buffer+2
mov [di].len,cx
mov [di].flags,0 ;clear flags (i.e. DONE bit)
send_pkt:
int_pkt
jnc pkt_sent_ok
jmp pkt_sent_bad
pkt_sent_ok:
pop dx
pop ax
sub ax,1 ;decrement low word
sbb dx,0 ;decrement high word
mov bx,ax ;check if we reached zero
or bx,dx
jne send_again ;we didn't
check_repeat:
cmp repeat_switch,0 ;did they ask for repeat sending?
jne send_repeat
mov dx,offset sending_msg
mov ah,9
int 21h
mov ah,0 ;read a key.
int 16h
cmp al,' '
je load_count ;a space -- send again.
jmp short send_done
send_repeat:
cmp quiet_switch,0
jne chrout_done
mov al,'T'
call chrout
chrout_done:
cmp packet_flag,0
je no_packet
mov al,'R'
call chrout
mov packet_flag,0
no_packet:
mov ah,1 ;check for any key.
int 16h
jne got_key
jmp load_count ;no key -- keep waiting.
got_key:
mov ah,0 ;read a key.
int 16h
send_done:
mov ah,3 ;release the handle.
mov bx,handle
int_pkt
call fatal_error
mov di,offset our_buffer + GIANT * 2
inc di
and di,not 1
push cs
pop es
compare_memory:
mov ax,055aah ;compare a segment against 055aah.
mov cx,di
neg cx
shr cx,1
scasw
jne memory_bad
sub cx,2
repe scasw
jne memory_bad
mov ax,es
add ax,1000h
mov es,ax
add ax,1000h
cmp ax,phd_memsize ;don't go past the end of memory.
jbe compare_memory
int 20h
pkt_sent_bad:
call print_error
mov ah,3 ;release the handle.
mov bx,handle
int_pkt
call fatal_error
int 20h
memory_bad:
mov dx,offset mem_trashed_msg
mov ah,9
int 21h
mov ax,es
call wordout
mov al,':'
call chrout
mov ax,di
dec ax
call wordout
mov dx,offset crlf_msg
mov ah,9
int 21h
int 20h
no_signature_err:
mov dx,offset no_signature_msg
mov ah,9
int 21h
int 20h
our_recv:
or ax,ax ;first or second call?
jne our_recv_1 ;second -- we ignore the packet
cmp cs:packet_flag,0 ;Do we already have one?
jne our_recv_2 ;yes - return zero.
push cs
pop es
mov di,offset our_buffer + GIANT
db 0cbh ;masm 4.0 doesn't grok "retf"
our_recv_2:
xor di,di
mov es,ax
mov cx,0
loop $
db 0cbh ;masm 4.0 doesn't grok "retf"
our_recv_1:
inc cs:packet_flag
db 0cbh ;masm 4.0 doesn't grok "retf"
include pkterr.asm
include getnum.asm
include getdig.asm
include skipblk.asm
include chrout.asm
include digout.asm
our_buffer label byte
code ends
end start
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
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/