	INCLUDE	AINCLUDE:IncDirs.i *sets all includedirs, needed for my ASM
	INCLUDE	FEAL/xpkLibFEAL.i

	XDEF	_FEAL_asm
	XDEF	_f_asm

;;;  S0 a, b	a :=  ROL(a+b,2) 
S0	MACRO
	add.b	\2,\1
	rol.b	#2,\1
	ENDM

;;;  S1 a, b	a :=  ROL(a+b+1,2) 
S1	MACRO
	add.b	\2,\1
	addq.b	#1,\1
	rol.b	#2,\1
	ENDM

;;; f(a1a2,a0a3,b0b1)
f	MACRO
	eor.w	\3,\1	; a1a2 ^= b0b1
	eor.w	\2,\1	; a1a2 ^= a0a3

	move.b	\1,\3	; \3=a2
	lsr.w	#8,\1	; \1=a1
	ror.w	#8,\2	; \2=a3a0

	S1	\1,\3	; S1(a1,a2)
	S0	\3,\1	; S0(a2,a1)
	S0	\2,\1	; S0(a0,a1)
	rol.w	#8,\2	; \2=a0a3
	S1	\2,\3	; S1(a3,a2)

	asl.w	#8,\1	; \1=a1..
	move.b	\3,\1	; \1=a1a2

	ENDM

;;   f(d0,d1)
_f_asm:	move.l	d2,-(a7); d0=a0a1a2a3  d1=b0b1
	move.l	d0,d2	; d2=a0a1a2a3
	swap	d2	; d2=a0..
	move.b	d0,d2	; d2=a0a3
	lsr.l	#8,d0	; d0=a1a2
	f	d0,d2,d1
	swap	d0	; d0=a1a2....
	ror.w	#8,d2	; d2=a3a0
	move.w	d2,d0	; d0=a1a2a3a0
	ror.l	#8,d0	; d0=a0a1a2a3
	move.l	(a7)+,d2
	rts

;;; FEAL_asm ( a0, a1, a2, d0)
;;; a0 -> Text,  a1 -> Code,  a2 -> partKeys,  d0=N

_FEAL_asm:
	movem.l	D1-D7,-(a7)
	move.l	(a0),d1		; d1=l0l1l2l3
	move.l	4(a0),d3	; d3=r0r1r2r3

	lea	0(a2,d0),a0
	add.l	d0,a0		; a0 = &K[N]

	move.l	(a0)+,d2
	eor.l	d2,d1		; L ^= (  K[N],K[N+1])

	move.l	(a0)+,d4
	eor.l	d4,d3		; R ^= (K[N+2],K[N+3])

	eor.l	d1,d3		; R ^= L

	move.l	d1,d2		; d2=l0l1l2l3
	swap	d2		; d2=l0..
	move.b	d1,d2		; d2=l0l3
	lsr.l	#8,d1		; d1=l1l2

	move.l	d3,d4		; d4=r0r1r2r3
	swap	d4		; d4=r0..
	move.b	d3,d4		; d4=r0r3
	lsr.l	#8,d3		; d3=r1r2

	asr.l	#1,d0		; d0=N/2
	subq.l	#1,d0

FealLoop:
	move.w	d3,d5		; T=R
	move.w	d4,d6
	move.w	(a2)+,d7	; load next key
	f d5,d6,d7
	eor.w	d5,d1		; L^=f(T,*K++)
	eor.w	d6,d2

	move.w	d1,d5
	move.w	d2,d6
	move.w	(a2)+,d7	; load next key
	f d5,d6,d7
	eor.w	d5,d3		; R^=f(T,*K++)
	eor.w	d6,d4

	dbra	d0,FealLoop

	swap	d3		; d3=r1r2....
	rol.w	#8,d4		; d4=r3r0
	move.w	d4,d3		; d3=r1r2r3r0
	ror.l	#8,d3		; d3=r0r1r2r3

	swap	d1		; d1=l1l2....
	rol.w	#8,d2		; d2=l3l0
	move.w	d2,d1		; d1=l1l2l3l0
	ror.l	#8,d1		; d1=l0l1l2l3

	eor.l	d3,d1		; L^=R

	move.l	(a0)+,d4
	eor.l	d4,d3		; R^=(K[N+4],K[N+5])
	move.l	d3,(a1)+	; Code.lft := R

	move.l	(a0)+,d2
	eor.l	d2,d1		; L^=(K[N+6],K[N+7])
	move.l	d1,(a1)		; Code.rgt := L

	movem.l	(a7)+,D1-D7
	rts
	END
