;Copyright (c) 1994, 1995, 1996 Takayuki Hosoda. All rights reserved.
;fnxcrypt version 1.3.9
;for Borland C(tm)
HACK equ 0
.186
DGROUP	group	_DATA
	assume	cs:_TEXT,ds:DGROUP
_TEXT	segment byte public 'CODE'
	assume	cs:_TEXT
_fealnx		proc	near
	push		bp
	mov		bp, sp
		mov	al, byte ptr [bp+8]
	cmp		al, 0
		jg	short encrypt
	jmp		decrypt
encrypt:
	push		cx
		push	si
	mov		si, word ptr [bp+4]
		push	di
	mov		di, word ptr k_n
		mov	bx, word ptr [si]
	mov		cx, word ptr [si+2]
		mov	ax, word ptr [si+4]
	mov		dx, word ptr [si+6]
		xor	bx, word ptr [di]
	xor		cx, word ptr [di+2]
		xor	ax, word ptr [di+4]
	xor		dx, word ptr [di+6]
		xor	ax, bx
	xor		dx, cx
		push	di
	push		bp
		mov	bp, offset k
	mov		si, ax
		mov	di, dx
enloop:
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp]
		xor	dl, byte ptr [bp+1]
	add		ah, dl
		inc	dh
	inc		ah
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
	add		dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, bx
		xor	dx, cx
	mov		bx, ax
		mov	cx, dx
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp+2]
		xor	dl, byte ptr [bp+3]
	add		ah, dl
		inc	dh
	inc		ah
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, si
		xor	dx, di
	mov		si, ax
		mov	di, dx
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp+4]
		xor	dl, byte ptr [bp+5]
	add		ah, dl
		inc	dh
	inc		ah
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, bx
		xor	dx, cx
	mov		bx, ax
		mov	cx, dx
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp+6]
		xor	dl, byte ptr [bp+7]
	add		ah, dl
		inc	dh
	inc		ah
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, si
		xor	dx, di
	mov		si, ax
		mov	di, dx
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp+8]
		xor	dl, byte ptr [bp+9]
	add		ah, dl
		inc	dh
	inc		ah
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, bx
		xor	dx, cx
	mov		bx, ax
		mov	cx, dx
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp+10]
		xor	dl, byte ptr [bp+11]
	add		ah, dl
		inc	dh
	inc		ah
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, si
		xor	dx, di
	mov		si, ax
		mov	di, dx
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp+12]
		xor	dl, byte ptr [bp+13]
	add		ah, dl
		inc	dh
	inc		ah
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, bx
		xor	dx, cx
	mov		bx, ax
		mov	cx, dx
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp+14]
		xor	dl, byte ptr [bp+15]
	add		ah, dl
		inc	dh
	inc		ah
		add	bp, 16
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, si
		xor	dx, di
if	HACK
	db		81h, 0fdh
kn	dw	offset k+62
else
	cmp		bp, word ptr k_n
endif
		mov	si, ax
	jz		short here
		mov	di, dx
	jmp		enloop
here:
	pop		bp
		pop	si
	mov		di, word ptr [bp+6]
		xor	bx, ax
	xor		cx, dx
		xor	ax, word ptr [si+8]
	xor		dx, word ptr [si+10]
		xor	bx, word ptr [si+12]
	xor		cx, word ptr [si+14]
		mov	word ptr [di], ax
	mov		word ptr [di+2], dx
		mov	word ptr [di+4], bx
	mov		word ptr [di+6], cx
		mov	ax, di
	pop		di
		pop	si
	pop		cx
		pop	bp
	ret
decrypt:
	push		cx
		push	si
	mov		si, word ptr [bp+4]
		push	di
	mov		di, word ptr k_n
		mov	bx, word ptr [si]
	mov		cx, word ptr [si+2]
		mov	ax, word ptr [si+4]
	mov		dx, word ptr [si+6]
		xor	bx, word ptr [di+8]
	xor		cx, word ptr [di+10]
		xor	ax, word ptr [di+12]
	xor		dx, word ptr [di+14]
		xor	ax, bx
	xor		dx, cx
		push	di
	push		bp
		mov	bp, di
	mov		si, ax
		mov	di, dx
deloop:
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp-2]
		xor	dl, byte ptr [bp-1]
	add		ah, dl
		inc	dh
	inc		ah
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, bx
		xor	dx, cx
	mov		bx, ax
		mov	cx, dx
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp-4]
		xor	dl, byte ptr [bp-3]
	add		ah, dl
		inc	dh
	inc		ah
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, si
		xor	dx, di
	mov		si, ax
		mov	di, dx
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp-6]
		xor	dl, byte ptr [bp-5]
	add		ah, dl
		inc	dh
	inc		ah
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, bx
		xor	dx, cx
	mov		bx, ax
		mov	cx, dx
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp-8]
		xor	dl, byte ptr [bp-7]
	add		ah, dl
		inc	dh
	inc		ah
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, si
		xor	dx, di
	mov		si, ax
		mov	di, dx
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp-10]
		xor	dl, byte ptr [bp-9]
	add		ah, dl
		inc	dh
	inc		ah
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, bx
		xor	dx, cx
	mov		bx, ax
		mov	cx, dx
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp-12]
		xor	dl, byte ptr [bp-11]
	add		ah, dl
		inc	dh
	inc		ah
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, si
		xor	dx, di
	mov		si, ax
		mov	di, dx
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp-14]
		xor	dl, byte ptr [bp-13]
	add		ah, dl
		inc	dh
	inc		ah
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, bx
		xor	dx, cx
	mov		bx, ax
		mov	cx, dx
	xor		ah, al
		xor	dl, dh
	xor		ah, byte ptr [bp-16]
		xor	dl, byte ptr [bp-15]
	add		ah, dl
		inc	dh
	inc		ah
		sub	bp, 16
	rol		ah, 2
	add		dl, ah
	rol		dl, 2
	add		al, ah
		add	dh, dl
	rol		al, 2
	rol		dh, 2
	xor		ax, si
		xor	dx, di
	cmp		bp, offset k
		mov	si, ax
	jz		short there
		mov	di, dx
	jmp		deloop
there:
	pop		bp
		pop	si
	mov		di, word ptr [bp+6]
		xor	bx, ax
	xor		cx, dx
		xor	ax, word ptr [si]
	xor		dx, word ptr [si+2]
		xor	bx, word ptr [si+4]
	xor		cx, word ptr [si+6]
		mov	word ptr [di], ax
	mov		word ptr [di+2], dx
		mov	word ptr [di+4], bx
	mov		word ptr [di+6], cx
		mov	ax, di
	pop		di
		pop	si
	pop		cx
		pop	bp
	ret
_fealnx	endp
_fealskey	proc	near
	push		bp
		mov	bp, sp
	push		cx
		push	si
	push		di
		mov	al, byte ptr [bp+6]
	cmp		al, 0
		jg	short pos
	jmp		skend
pos:
	cmp		al, 8
		mov	ah, 3
	je		short validn
		cmp	al, 16
	mov		ah, 4
		je	short validn
	cmp		al, 32
		mov	ah, 7
	je		short validn
		cmp	al, 64
	mov		ah, 12
		je	short validn
	mov		ax, -1
		pop	di
	pop		si
		pop	cx
	pop		bp
		ret
validn:
	mov		si, [bp+4]
		mov	byte ptr counter, ah
	shl		al, 1
		xor	ah, ah
	mov		dx, offset k
		add	dx, ax
	mov		di, offset q0
		mov	word ptr k_n, dx
if	HACK
	mov		word ptr cs:kn, dx
endif
		mov	ax, word ptr [si]
	mov		dx, word ptr [si+2]
		mov	bx, word ptr [si+4]
	mov		cx, word ptr [si+6]
		mov	word ptr [di+16], ax
	mov		word ptr [di+18], dx
		mov	word ptr [di+20], bx
	mov		word ptr [di+22], cx
		mov	ax, word ptr [si+8]
	mov		dx, word ptr [si+10]
		mov	bx, word ptr [si+12]
	mov		cx, word ptr [si+14]
		mov	word ptr [di+4], ax
	mov		word ptr [di+6], dx
		mov	word ptr [di+8], bx
	mov		word ptr [di+10], cx
		xor	ax, bx
	xor		dx, cx
		mov	word ptr [di], ax
	xor		ax, ax
		mov	word ptr [di+2], dx
	mov		word ptr [di+12], ax
		mov	word ptr [di+14], ax
	mov		si, di
		mov	ax, word ptr [di+20]
	mov		dx, word ptr [di+22]
skey_lp:
	xor		ax, word ptr [si+12]
		xor	dx, word ptr [si+14]
	xor		ax, word ptr [di]
		xor	dx, word ptr [di+2]
	mov		bx, ax
		mov	cx, dx
	mov		ax, word ptr [si+16]
		mov	dx, word ptr [si+18]
	xor		ah, al
		xor	dl, dh
	xor		bl, dl
	add		ah, bl
	inc		ah
	rol		ah, 2
	xor		bh, ah
	add		dl, bh
	rol		dl, 2
	xor		ch, dl
		xor	cl, ah
	add		dh, ch
		add	al, cl
	inc		dh
	rol		al, 2
	rol		dh, 2
	mov		word ptr [si+24], ax
		mov	word ptr [si+26], dx
	xor		ax, word ptr [si+16]
		xor	dx, word ptr [si+18]
	xor		ax, word ptr [di+4]
		xor	dx, word ptr [di+6]
	mov		bx, ax
		mov	cx, dx
	mov		ax, word ptr [si+20]
		mov	dx, word ptr [si+22]
	xor		ah, al
		xor	dl, dh
	xor		bl, dl
	add		ah, bl
	inc		ah
	rol		ah, 2
	xor		bh, ah
	add		dl, bh
	rol		dl, 2
	xor		ch, dl
		xor	cl, ah
	add		dh, ch
		add	al, cl
	inc		dh
	rol		al, 2
	rol		dh, 2
	mov		word ptr [si+28], ax
		mov	word ptr [si+30], dx
	xor		ax, word ptr [si+20]
		xor	dx, word ptr [si+22]
	xor		ax, word ptr [di+8]
		xor	dx, word ptr [di+10]
	mov		bx, ax
		mov	cx, dx
	mov		ax, word ptr [si+24]
		mov	dx, word ptr [si+26]
	xor		ah, al
		xor	dl, dh
	xor		bl, dl
	add		ah, bl
	inc		ah
	rol		ah, 2
	xor		bh, ah
	add		dl, bh
	rol		dl, 2
	add		si, 12
		xor	ch, dl
	xor		cl, ah
		add	dh, ch
	add		al, cl
		inc	dh
	rol		al, 2
	rol		dh, 2
	mov		word ptr [si+20], ax
		dec	byte ptr counter
	mov		word ptr [si+22], dx
		jz	short skend
	jmp		skey_lp
skend:
	mov		ax, ds
		mov	bx, es
	mov		es, ax
		mov	cx, 12
	xor		ax, ax
	cld
	rep		stosw
	mov		es, bx
		pop	di
	pop		si
		pop	cx
	pop		bp
		ret
_fealskey	endp
_TEXT	ends
_DATA	segment word public 'DATA'
q0	dw	0, 0
q1	dw	0, 0
q2	dw	0, 0
a	dw	0, 0
b	dw	0, 0
c	dw	0, 0
k	dw	72 dup (0)
k_n	dw	offset k+62
counter	dw	0
_DATA	ends
	public	_fealnx
	public	_fealskey
	end