.model small

.stack 256

.data
blocksize	=	32768
ack_char	=	055h

len_l	dw	?
len_h	dw	?
file_handle	dw	?
file_data	db	blocksize dup (?)
file_name	db	30 dup (?)
chksum	db	0
ctdn	dw	0

.code

init_ser:	mov	dx,3fbh
	mov	al,131
	out	dx,al
	mov	al,1		; 1=115.2K, 2=57.6K, 3=38.4 6=19.2
	mov	dx,3f8h
	out	dx,al
	inc	dx
	xor	al,al
	out	dx,al
	mov	dx,3fbh
	mov	al,3
	out	dx,al
	ret

send_al:	add	chksum,al
	push	ax
	mov	dx,3fdh
poll_loop:	in	al,dx
	and	al,32
	jz	poll_loop
	jmp	short $+2
	pop	ax
	mov	dx,3f8h
	out	dx,al
	ret

get_al:				; ret al=char, z if time out
	mov	ctdn,50
outer:	mov	cx,-1
get_al_loop:	mov	dx,3fdh
	in	al,dx
	test	al,1
	jnz	got_char
	loop	get_al_loop
	dec	ctdn
	jnz	outer
	xor	al,al
	ret
got_char:	mov	dx,3f8h
	in	al,dx
	or	dx,dx
	ret

	

start:	mov	ax,es
	mov	ds,ax
	mov	ax,@data
	mov	es,ax
	mov	si,82h
	mov	di,offset file_name
scan_loop:	lodsb
	cmp	al,0dh
	jz	eon
	stosb
	jmp	scan_loop
eon:	xor	al,al
	stosb
	mov	ax,ds
	push	es
	pop	ds
	mov	es,ax
	call	init_ser
	mov	dx,offset file_name
	mov	ah,4eh
	xor	cx,cx
	int	21h

	mov	ax,word ptr es:80h+26
	mov	len_l,ax
	mov	ax,word ptr es:80h+28
	mov	len_h,ax
	mov	ax,ds
	mov	es,ax

	mov	dx,offset file_name
	mov	ax,3d00h
	int	21h			; open for read
	jc	done_prog			; error not found
	mov	file_handle,ax

	mov	al,55h
	call	send_al
	mov	al,0aah
	call	send_al
	mov	al,byte ptr len_h+1
	call	send_al
	mov	al,byte ptr len_h
	call	send_al
	mov	al,byte ptr len_l+1
	call	send_al
	mov	al,byte ptr len_l
	call	send_al
	lea	si,file_name
send_name_loop:
	lodsb
	or	al,al
	jz	end_name
	call	send_al
	jmp	send_name_loop
end_name:	call	send_al
	mov	al,chksum
	call	send_al
	call	get_al
	cmp	al,ack_char
	jnz	done_prog
; send next blocksize bytes
next_block:	mov	cx,blocksize
	test	len_h,-1
	jnz	full_block
	cmp	cx,len_l
	jb	full_block
	mov	cx,len_l
full_block:	sub	len_l,cx
	sbb	len_h,0
	push	cx
	mov	ah,3fh
	mov	bx,file_handle
	mov	dx,offset file_data
	int	21h
	pop	cx
	mov	chksum,0
	mov	si,offset file_data
send_loop:	lodsb
	call	send_al
	loop	send_loop
	mov	al,chksum
	call	send_al
	call	get_al
	cmp	al,ack_char
	jnz	done_prog
	test	len_h,-1
	jnz	next_block
	test	len_l,-1
	jnz	next_block
done_prog:	mov	ax,4c00h
	int	21h

	end	start



	

