; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
                INCDIR  "INCLUDE:"
		INCLUDE	"exec/types.i"

		INCLUDE	"/Shared/EE_view.i"
		INCLUDE	"EM_structures.i"

; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

CHUNKY_WIDTH	EQU	320
CHUNKY_HEIGHT	EQU	200
CHUNKY_WIDTH2	EQU	CHUNKY_WIDTH>>1
CHUNKY_HEIGHT2	EQU	CHUNKY_HEIGHT>>1

VALUES_NUMBER	EQU	1024
ANGLES_NUMBER	EQU	180
COSINE_OFFSET	EQU	VALUES_NUMBER*(ANGLES_NUMBER>>2)*2

; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

		XREF	_ChunkyAdr
		XREF	_RotateTable
		XREF	_PerspectiveTable
		XREF	_ArcSineTable
		XREF	_EM_TextureAdr
                
; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

		XDEF	_EM_RenderFace
		XDEF	_EM_RenderClipFace
		XDEF	_EM_TransformObject
		XDEF	_EM_CreateDepthBuffer
;		XDEF	_EM_SortDepthBuffer
                XDEF    _EM_ClearBack
                XDEF    _CalculateUV
                XDEF    _WaitMouse
                XDEF    _InsertText
; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

		SECTION	EM_render,CODE

; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
; a0.l	pointer to FACE

_EM_RenderFace
		movem.l	d2-d7/a2-a6,-(sp)

; sort vertices

		movem.l	(a0),a2/a3/a4

		move.l	(a3,vt_yp),d0
		cmp.l	(a2,vt_yp),d0
		bge.b	EM_rf0
		exg	a2,a3
		move.l	(a3,vt_yp),d0
EM_rf0
		cmp.l	(a4,vt_yp),d0
		ble.b	EM_rf1
		exg	a3,a4
		move.l	(a3,vt_yp),d0
		cmp.l	(a2,vt_yp),d0
		bge.b	EM_rf1
		exg	a2,a3
EM_rf1

; ignore if one scanline (face height == 1)

		move.l	(a2,vt_yp),d0
		cmp.l	(a4,vt_yp),d0
		beq.w	EM_rf_end

; calculate shading parameters

; -----------------
; d0.l	y1
; d1.l	FREE
; d2.l	FREE
; d3.l	FREE
; d4.l	FREE
; d5.l	FREE
; d6.l	FREE
; d7.l	FREE
; a0.l	ptr to FACE
; a1.l	FREE
; a2.l	ptr to V1
; a3.l	ptr to V2
; a4.l	ptr to V3
; a5.l	FREE
; a6.l	FREE

		move.l	(a3,vt_yp),d6
		move.l	(a4,vt_yp),d1
		sub.l	d0,d6
		sub.l	d0,d1

		mulu	#CHUNKY_WIDTH,d0
		add.l	_ChunkyAdr,d0
		move.l	d0,a5

		move.l	d6,d2
		swap	d2
		divu.l	d1,d2

; d6.l	y2-y1
; d1.l	y3-y1
; d2.l	tmp
; a5.l	cadr
; d0.l	FREE

		move.l	(a2,vt_xp),d0
		move.l	(a3,vt_xp),d3
		move.l	d3,d4
		swap	d4
		move.l	d4,M2
		move.l	(a4,vt_xp),d4
		sub.l	d0,d3
		sub.l	d0,d4
		swap	d0
		move.l	d0,a0

; a0.l	x1<<16
; d3.l	x2-x1
; d4.l	x3-x1
; M2.l	x2

		tst.l	d6
		beq.b	EM_rf2
		move.l	d3,d5
		swap	d5
		clr.w	d5
		divs.l	d6,d5
		move.l	d5,M1
EM_rf2
		move.l	d4,d5
		swap	d5
		clr.w	d5
		divs.l	d1,d5
		move.l	d5,M0

		move.l	d1,d7
		sub.l	d6,d7
		move.l	d7,M4
		beq.b	EM_rf3
		move.l	d4,d5
		sub.l	d3,d5
		swap	d5
		clr.w	d5
		divs.l	d7,d5
		move.l	d5,M3
EM_rf3

; M0.l	dx1
; M1.l	dx2
; M3.l	dx3
; M4.l	size2

		move.l	d2,d0
		muls.l	d4,d0
		swap	d3
		clr.w	d3
		sub.l	d3,d0
		asr.l	#8,d0
		beq.w	EM_rf_end

; d0.l	width
; d1.l	y3-y1
; d2.l	tmp
; d3.l	FREE
; d4.l	FREE
; d6.l	size

		move.l	(a2,vt_u),d5
		move.l	(a4,vt_u),d3
		sub.l	d5,d3

; d5.l	u1
; d3.l	u3-u1

		move.l	d3,d7
		lsl.l	#8,d7
		divs.l	d1,d7

		muls.l	d2,d3
		movea.l	d3,a1

; d7.l	dtxt	..Uu
; a1.l	tmp*(u3-u1)
; d3.l	FREE

		move.l	(a2,vt_v),d4
		move.l	(a4,vt_v),d3
		sub.l	d4,d3

; d4.l	v1
; d3.l	v3-v1

		muls.l	d3,d2

; d2.l	tmp*(v3-v1)

		lsl.l	#8,d3
		divs.l	d1,d3

; d3.l	dtxt	..Vv
; d1.l	FREE

		ror.l	#8,d7
		move.l	d7,d1
		move.w	d3,d1
		movea.l	d1,a6

; d7.l	dtxt2
; a6.l	dtxt1
; d3.l	FREE

		move.l	(a3,vt_u),d1
		sub.l	d5,d1
		swap	d1
		clr.w	d1

		move.l	a1,d3
		sub.l	d1,d3
		divs.l	d0,d3

; d5.l	txt2	...U
; d3.l	dt	..Uu

		move.l	(a3,vt_v),d1
		sub.l	d4,d1
		swap	d1
		clr.w	d1

		sub.l	d1,d2
		divs.l	d0,d2

		lsl.l	#8,d4

; d4.l	txt1	u.Vv
; d2.l	dt	..Vv

		ror.l	#8,d3
		move.l	d3,d1
		move.w	d2,d1
		movea.l	d1,a2

; d3.l	dt2	...U
; a2.l	dt1	u.Vv

		movea.l	a0,a1
		move.l	_EM_TextureAdr,a3
		clr.l	d2

; D0.l	width
; D1.l	FREE
; D2.l	FREE
; D3.l	dt2	...U
; D4.l	txt1	u.Vv
; D5.l	txt2	...U
; D6.l	size	..VV
; D7.l	dtxt2	...U
; A0.l	x1	XXxx
; A1.l	x2	XXxx
; A2.l	dt1	u.Vv
; A3.l	tadr
; A4.l	FREE
; A5.l	cadr
; A6.l	dtxt1	u.Vv
; M0.l	dx1	XXxx
; M1.l	dx2	XXxx
; M2.l	x3	XXxx
; M3.l	dx3	XXxx
; M4.l	size2	..VV


		tst.l	d0
		bpl.w	EM_rf10

		tst.w	d6
		beq.b	EM_rf01

EM_rf_Loop01
		move.l	a0,d0
		move.l	a1,d1

		swap	d0
		swap	d1

		lea	(a5,d0.w),a4

		sub.w	d0,d1
		swap	d6
		move.w	d1,d6

		move.l	d4,d0
		move.l	d5,d1
EM_rf_Loop00
		move.w	d0,d2
		move.b	d1,d2

		move.b	(a3,d2.l),(a4)+

		add.l	a2,d0
		addx.l	d3,d1

		dbra	d6,EM_rf_Loop00

		add.l	a6,d4
		addx.l	d7,d5

		adda.l	(pc,M0),a0
		adda.l	(pc,M1),a1

		lea	(a5,CHUNKY_WIDTH),a5

		swap	d6
		dbra	d6,EM_rf_Loop01
EM_rf01
		move.l	(pc,M2),a1
		move.l	(pc,M4),d6

		bra.b	EM_rf02
EM_rf_Loop03
		move.l	a0,d0
		move.l	a1,d1

		swap	d0
		swap	d1

		lea	(a5,d0.w),a4

		sub.w	d0,d1
		bmi.b	EM_rf_end
		swap	d6
		move.w	d1,d6

		move.l	d4,d0
		move.l	d5,d1
EM_rf_Loop02
		move.w	d0,d2
		move.b	d1,d2

		move.b	(a3,d2.l),(a4)+

		add.l	a2,d0
		addx.l	d3,d1

		dbra	d6,EM_rf_Loop02

		add.l	a6,d4
		addx.l	d7,d5

		adda.l	(pc,M0),a0
		adda.l	(pc,M3),a1

		lea	(a5,CHUNKY_WIDTH),a5

		swap	d6
EM_rf02
		dbra	d6,EM_rf_Loop03
EM_rf_end
		movem.l	(sp)+,d2-d7/a2-a6
		rts

		CNOP	0,4
M0		DC.L	0
M1		DC.L	0
M2		DC.L	0
M3		DC.L	0
M4		DC.L	0

EM_rf10
		tst.w	d6
		beq.b	EM_rf11

EM_rf_Loop11
		move.l	a0,d0
		move.l	a1,d1

		swap	d0
		swap	d1

		lea	(a5,d0.w,1.w),a4

		sub.w	d1,d0
		swap	d6
		move.w	d0,d6

		move.l	d4,d0
		move.l	d5,d1
EM_rf_Loop10
		move.w	d0,d2
		move.b	d1,d2

		move.b	(a3,d2.l),-(a4)

		sub.l	a2,d0
		subx.l	d3,d1

		dbra	d6,EM_rf_Loop10

		add.l	a6,d4
		addx.l	d7,d5

		adda.l	(pc,M0),a0
		adda.l	(pc,M1),a1

		lea	(a5,CHUNKY_WIDTH),a5

		swap	d6
		dbra	d6,EM_rf_Loop11
EM_rf11
		move.l	(pc,M2),a1
		move.l	(pc,M4),d6

		bra.b	EM_rf12
EM_rf_Loop13
		move.l	a0,d0
		move.l	a1,d1

		swap	d0
		swap	d1

		lea	(a5,d0.w,1.w),a4

		sub.w	d1,d0
		bmi.b	EM_rf_end
		swap	d6
		move.w	d0,d6

		move.l	d4,d0
		move.l	d5,d1
EM_rf_Loop12
		move.w	d0,d2
		move.b	d1,d2

		move.b	(a3,d2.l),-(a4)

		sub.l	a2,d0
		subx.l	d3,d1

		dbra	d6,EM_rf_Loop12

		add.l	a6,d4
		addx.l	d7,d5

		adda.l	(pc,M0),a0
		adda.l	(pc,M3),a1

		lea	(a5,CHUNKY_WIDTH),a5

		swap	d6
EM_rf12
		dbra	d6,EM_rf_Loop13

		movem.l	(sp)+,d2-d7/a2-a6
		rts


; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
; a0.l	pointer to FACE

_EM_RenderClipFace
		movem.l	d2-d7/a2-a6,-(sp)

		lea	(pc,EM_tmpVertices),a3
		moveq	#-2,d7

		move.l	(a0,fc_V1),a1
		move.l	(a0,fc_V2),a2
		bsr.w	EM_rcf_VClipEdge

		move.l	(a0,fc_V2),a1
		move.l	(a0,fc_V3),a2
		bsr.b	EM_rcf_VClipEdge

		move.l	(a0,fc_V3),a1
		move.l	(a0,fc_V1),a2
		bsr.b	EM_rcf_VClipEdge

		tst.w	d7
		bmi.b	EM_rcf0

		lea	(pc,EM_tmpVertices),a3
		lea	(pc,EM_tmpcVertices),a4
		moveq	#-3,d6

EM_rcf_Loop0	move.l	a3,a1
		lea	(a3,vt_SIZEOF),a3
		move.l	a3,a2
		bsr.w	EM_rcf_HClipEdge

		dbra	d7,EM_rcf_Loop0

		move.l	a3,a1
		lea	(pc,EM_tmpVertices),a2
		bsr.w	EM_rcf_HClipEdge

		tst.w	d6
		bmi.b	EM_rcf0

		lea	(pc,EM_cFaces),a2

EM_rcf_Loop1	move.l	a2,a0
		bsr.w	_EM_RenderFace
		lea	(a2,fc_SIZEOF),a2

		dbra	d6,EM_rcf_Loop1
EM_rcf0
		movem.l	(sp)+,d2-d7/a2-a6
		rts

; d7.w	vertices counter (updates)
; a0.l	-=- SAVED -=-
; a1.l	pointer to V1
; a2.l	pointer to V2
; a3.l	pointer to current temporary VERTEX (updates)

EM_rcf_VClipEdge

		move.l	(a1,vt_ClipBits),d0
		and.l	(a2,vt_ClipBits),d0
		andi.w	#LEFT_CLIP_FLAG|RIGHT_CLIP_FLAG,d0
		beq.b	EM_rcf_vce4

		rts

EM_rcf_vce4

; clip V1
		move.l	(a1,vt_ClipBits),d0
		move.l	(a1,vt_xp),d3
		move.l	(a1,vt_yp),d4
		btst	#LEFT_CLIP_BIT,d0
		beq.b	EM_rcf_vce0

; V1 left clipped

		move.l	(a2,vt_xp),d6
		sub.l	d3,d6

		move.l	(a2,vt_yp),d5
		sub.l	d4,d5
		muls.w	d3,d5
		divs.w	d6,d5
		ext.l	d5
		sub.l	d5,d4
		
		move.l	(a1,vt_u),d1
		move.l	(a2,vt_u),d5
		sub.l	d1,d5
		muls.w	d3,d5
		divs.w	d6,d5
		ext.l	d5
		sub.l	d5,d1
		move.l	d1,(a3,vt_u)

		move.l	(a1,vt_v),d1
		move.l	(a2,vt_v),d5
		sub.l	d1,d5
		muls.w	d3,d5
		divs.w	d6,d5
		ext.l	d5
		sub.l	d5,d1
		move.l	d1,(a3,vt_v)

		moveq	#0,d3

		andi.w	#LEFT_CLIP_FLAG|RIGHT_CLIP_FLAG,d0
		tst.l	d4
		bpl.b	EM_rcf_vce10
		bset	#TOP_CLIP_BIT,d0
		bra.w	EM_rcf_vce1a
EM_rcf_vce10
		cmpi.l	#CHUNKY_HEIGHT,d4
		blt.w	EM_rcf_vce1a
		bset	#BOTTOM_CLIP_BIT,d0
		bra.b	EM_rcf_vce1a

EM_rcf_vce0	btst	#RIGHT_CLIP_BIT,d0
		beq.b	EM_rcf_vce1

; V1 right clipped

		move.l	(a2,vt_xp),d6
		sub.l	d3,d6

		subi.l	#CHUNKY_WIDTH-1,d3

		move.l	(a2,vt_yp),d5
		sub.l	d4,d5
		muls.w	d3,d5
		divs.w	d6,d5
		ext.l	d5
		sub.l	d5,d4

		move.l	(a1,vt_u),d1
		move.l	(a2,vt_u),d5
		sub.l	d1,d5
		muls.w	d3,d5
		divs.w	d6,d5
		ext.l	d5
		sub.l	d5,d1
		move.l	d1,(a3,vt_u)

		move.l	(a1,vt_v),d1
		move.l	(a2,vt_v),d5
		sub.l	d1,d5
		muls.w	d3,d5
		divs.w	d6,d5
		ext.l	d5
		sub.l	d5,d1
		move.l	d1,(a3,vt_v)

		move.l	#CHUNKY_WIDTH-1,d3

		andi.w	#LEFT_CLIP_FLAG|RIGHT_CLIP_FLAG,d0
		tst.l	d4
		bpl.b	EM_rcf_vce5
		bset	#TOP_CLIP_BIT,d0
		bra.b	EM_rcf_vce1a
EM_rcf_vce5
		cmpi.l	#CHUNKY_HEIGHT,d4
		blt.b	EM_rcf_vce1a
		bset	#BOTTOM_CLIP_BIT,d0
		bra.b	EM_rcf_vce1a

EM_rcf_vce1

; V1 not clipped (only save vertex)

		move.l	(a1,vt_u),(a3,vt_u)
		move.l	(a1,vt_v),(a3,vt_v)
EM_rcf_vce1a
		move.l	d3,(a3,vt_xp)
		move.l	d4,(a3,vt_yp)
		move.l	d0,(a3,vt_ClipBits)
		lea	(a3,vt_SIZEOF),a3
		addq.w	#1,d7

; clip V2
		move.l	(a2,vt_ClipBits),d0
		btst	#LEFT_CLIP_BIT,d0
		beq.b	EM_rcf_vce2

; V2 left clipped

		move.l	(a2,vt_xp),d3
		move.l	(a2,vt_yp),d4

		move.l	(a1,vt_xp),d6
		sub.l	d3,d6

		move.l	(a1,vt_yp),d5
		sub.l	d4,d5
		muls.w	d3,d5
		divs.w	d6,d5
		ext.l	d5
		sub.l	d5,d4

		move.l	(a1,vt_u),d5
		move.l	(a2,vt_u),d2
		sub.l	d2,d5
		muls.w	d3,d5
		divs.w	d6,d5
		ext.l	d5
		sub.l	d5,d2
		move.l	d2,(a3,vt_u)

		move.l	(a1,vt_v),d5
		move.l	(a2,vt_v),d2
		sub.l	d2,d5
		muls.w	d3,d5
		divs.w	d6,d5
		ext.l	d5
		sub.l	d5,d2
		move.l	d2,(a3,vt_v)

		moveq	#0,d3

		andi.w	#LEFT_CLIP_FLAG|RIGHT_CLIP_FLAG,d0
		tst.l	d4
		bpl.b	EM_rcf_vce6
		bset	#TOP_CLIP_BIT,d0
		bra.b	EM_rcf_vce7
EM_rcf_vce6
		cmpi.l	#CHUNKY_HEIGHT,d4
		blt.b	EM_rcf_vce7
		bset	#BOTTOM_CLIP_BIT,d0
EM_rcf_vce7
		move.l	d3,(a3,vt_xp)
		move.l	d4,(a3,vt_yp)
		move.l	d0,(a3,vt_ClipBits)
		lea	(a3,vt_SIZEOF),a3
		addq.w	#1,d7

		rts

EM_rcf_vce2	btst	#RIGHT_CLIP_BIT,d0
		beq.b	EM_rcf_vce3

; V2 right clipped

		move.l	(a2,vt_xp),d3
		move.l	(a2,vt_yp),d4

		move.l	(a1,vt_xp),d6
		sub.l	d3,d6

		subi.l	#CHUNKY_WIDTH-1,d3

		move.l	(a1,vt_yp),d5
		sub.l	d4,d5
		muls.w	d3,d5
		divs.w	d6,d5
		ext.l	d5
		sub.l	d5,d4

		move.l	(a1,vt_u),d5
		move.l	(a2,vt_u),d2
		sub.l	d2,d5
		muls.w	d3,d5
		divs.w	d6,d5
		ext.l	d5
		sub.l	d5,d2
		move.l	d2,(a3,vt_u)

		move.l	(a1,vt_v),d5
		move.l	(a2,vt_v),d2
		sub.l	d2,d5
		muls.w	d3,d5
		divs.w	d6,d5
		ext.l	d5
		sub.l	d5,d2
		move.l	d2,(a3,vt_v)

		andi.w	#LEFT_CLIP_FLAG|RIGHT_CLIP_FLAG,d0
		tst.l	d4
		bpl.b	EM_rcf_vce8
		bset	#TOP_CLIP_BIT,d0
		bra.b	EM_rcf_vce9
EM_rcf_vce8
		cmpi.l	#CHUNKY_HEIGHT,d4
		blt.b	EM_rcf_vce9
		bset	#BOTTOM_CLIP_BIT,d0
EM_rcf_vce9
		move.l	#CHUNKY_WIDTH-1,(a3,vt_xp)
		move.l	d4,(a3,vt_yp)
		move.l	d0,(a3,vt_ClipBits)
		lea	(a3,vt_SIZEOF),a3
		addq.w	#1,d7

EM_rcf_vce3

; V2 not clipped

		rts

; d6.w	vertices counter (updates)
; d7.w	-=- SAVED -=-
; a0.l	-=- SAVED -=-
; a1.l	pointer to V1
; a2.l	pointer to V2
; a3.l	-=- SAVED -=-
; a4.l	pointer to current temporary VERTEX (updates)

EM_rcf_HClipEdge

		move.l	(a1,vt_ClipBits),d0
		and.l	(a2,vt_ClipBits),d0
		andi.w	#TOP_CLIP_FLAG|BOTTOM_CLIP_FLAG,d0
		beq.b	EM_rcf_hce4

		rts

EM_rcf_hce4

; clip V1
		move.l	(a1,vt_ClipBits),d0
		move.l	(a1,vt_xp),d3
		move.l	(a1,vt_yp),d4
		btst	#TOP_CLIP_BIT,d0
		beq.b	EM_rcf_hce0

; V1 top clipped

		move.l	(a2,vt_yp),d2
		sub.l	d4,d2

		move.l	(a2,vt_xp),d5
		sub.l	d3,d5
		muls.w	d4,d5
		divs.w	d2,d5
		ext.l	d5
		sub.l	d5,d3

		move.l	(a1,vt_u),d1
		move.l	(a2,vt_u),d5
		sub.l	d1,d5
		muls.w	d4,d5
		divs.w	d2,d5
		ext.l	d5
		sub.l	d5,d1
		move.l	d1,(a4,vt_u)

		move.l	(a1,vt_v),d1
		move.l	(a2,vt_v),d5
		sub.l	d1,d5
		muls.w	d4,d5
		divs.w	d2,d5
		ext.l	d5
		sub.l	d5,d1
		move.l	d1,(a4,vt_v)

		moveq	#0,d4

		bra.b	EM_rcf_hce1a

EM_rcf_hce0	btst	#BOTTOM_CLIP_BIT,d0
		beq.b	EM_rcf_hce1

; V1 bottom clipped

		move.l	(a2,vt_yp),d2
		sub.l	d4,d2

		subi.l	#CHUNKY_HEIGHT-1,d4

		move.l	(a2,vt_xp),d5
		sub.l	d3,d5
		muls.w	d4,d5
		divs.w	d2,d5
		ext.l	d5
		sub.l	d5,d3

		move.l	(a1,vt_u),d1
		move.l	(a2,vt_u),d5
		sub.l	d1,d5
		muls.w	d4,d5
		divs.w	d2,d5
		ext.l	d5
		sub.l	d5,d1
		move.l	d1,(a4,vt_u)

		move.l	(a1,vt_v),d1
		move.l	(a2,vt_v),d5
		sub.l	d1,d5
		muls.w	d4,d5
		divs.w	d2,d5
		ext.l	d5
		sub.l	d5,d1
		move.l	d1,(a4,vt_v)

		move.l	#CHUNKY_HEIGHT-1,d4
		bra.b	EM_rcf_hce1a

EM_rcf_hce1

; V1 not clipped (only save vertex)

		move.l	(a1,vt_u),(a4,vt_u)
		move.l	(a1,vt_v),(a4,vt_v)
EM_rcf_hce1a
		move.l	d3,(a4,vt_xp)
		move.l	d4,(a4,vt_yp)
		lea	(a4,vt_SIZEOF),a4
		addq.w	#1,d6

; clip V2
		move.l	(a2,vt_ClipBits),d0
		btst	#TOP_CLIP_BIT,d0
		beq.b	EM_rcf_hce2

; V2 top clipped

		move.l	(a2,vt_xp),d3
		move.l	(a2,vt_yp),d4

		move.l	(a1,vt_yp),d1
		sub.l	d4,d1

		move.l	(a1,vt_xp),d5
		sub.l	d3,d5
		muls.w	d4,d5
		divs.w	d1,d5
		ext.l	d5
		sub.l	d5,d3

		move.l	(a1,vt_u),d5
		move.l	(a2,vt_u),d2
		sub.l	d2,d5
		muls.w	d4,d5
		divs.w	d1,d5
		ext.l	d5
		sub.l	d5,d2
		move.l	d2,(a4,vt_u)

		move.l	(a1,vt_v),d5
		move.l	(a2,vt_v),d2
		sub.l	d2,d5
		muls.w	d4,d5
		divs.w	d1,d5
		ext.l	d5
		sub.l	d5,d2
		move.l	d2,(a4,vt_v)

		moveq	#0,d4

		move.l	d3,(a4,vt_xp)
		move.l	d4,(a4,vt_yp)
		lea	(a4,vt_SIZEOF),a4
		addq.w	#1,d6
EM_rcf_hce3a
		rts

EM_rcf_hce2	btst	#BOTTOM_CLIP_BIT,d0
		beq.b	EM_rcf_hce3

; V2 bottom clipped

		move.l	(a2,vt_xp),d3
		move.l	(a2,vt_yp),d4

		move.l	(a1,vt_yp),d1
		sub.l	d4,d1

		subi.l	#CHUNKY_HEIGHT-1,d4

		move.l	(a1,vt_xp),d5
		sub.l	d3,d5
		muls.w	d4,d5
		divs.w	d1,d5
		ext.l	d5
		sub.l	d5,d3

		move.l	(a1,vt_u),d5
		move.l	(a2,vt_u),d2
		sub.l	d2,d5
		muls.w	d4,d5
		divs.w	d1,d5
		ext.l	d5
		sub.l	d5,d2
		move.l	d2,(a4,vt_u)

		move.l	(a1,vt_v),d5
		move.l	(a2,vt_v),d2
		sub.l	d2,d5
		muls.w	d4,d5
		divs.w	d1,d5
		ext.l	d5
		sub.l	d5,d2
		move.l	d2,(a4,vt_v)

		move.l	d3,(a4,vt_xp)
		move.l	#CHUNKY_HEIGHT-1,(a4,vt_yp)
		lea	(a4,vt_SIZEOF),a4
		addq.w	#1,d6

EM_rcf_hce3

; V2 not clipped

		rts

		CNOP	0,4

EM_tmpVertices	DCB.B	7*vt_SIZEOF

EM_tmpcVertices
EM_cVertex1	DCB.B	vt_SIZEOF
EM_cVertex2	DCB.B	vt_SIZEOF
EM_cVertex3	DCB.B	vt_SIZEOF
EM_cVertex4	DCB.B	vt_SIZEOF
EM_cVertex5	DCB.B	vt_SIZEOF
EM_cVertex6	DCB.B	vt_SIZEOF
EM_cVertex7	DCB.B	vt_SIZEOF

EM_cFaces
EM_cFace1	DC.L	EM_cVertex1,EM_cVertex2,EM_cVertex3
		DCB.B	fc_SIZEOF-3*4
EM_cFace2	DC.L	EM_cVertex1,EM_cVertex3,EM_cVertex4
		DCB.B	fc_SIZEOF-3*4
EM_cFace3	DC.L	EM_cVertex1,EM_cVertex4,EM_cVertex5
		DCB.B	fc_SIZEOF-3*4
EM_cFace4	DC.L	EM_cVertex1,EM_cVertex5,EM_cVertex6
		DCB.B	fc_SIZEOF-3*4
EM_cFace5	DC.L	EM_cVertex1,EM_cVertex6,EM_cVertex7
		DCB.B	fc_SIZEOF-3*4


; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
; a0.l	pointer to OBJECT

_EM_TransformObject
		movem.l	d2-d7/a2-a6,-(sp)

		movem.l	(a0),d0-d5

		move.l	#VALUES_NUMBER,d6
		move.l	d6,d7
		add.l	d6,d6

		mulu	d6,d3
		add.l	d7,d3
		mulu	d6,d4
		add.l	d7,d4
		mulu	d6,d5
		add.l	d7,d5

		move.l	_RotateTable,a1
		lea	(a1,d5.l),a3
		lea	(a1,d4.l),a2
		adda.l	d3,a1

		move.l	(a0,obj_VNumber),d7
		subq.w	#1,d7
		move.l	(a0,obj_Vertices),a0

		move.l	_PerspectiveTable,a4
		move.l	_ArcSineTable,a5
		lea	(a5,128*4.w),a5

; ---------------------------------------
; d0.l	PosX
; d1.l	PosY
; d2.l	PosZ
; d3.l	FREE
; d4.l	FREE
; d5.l	FREE
; d6.l	FREE
; d7.l	vertices number (-1)
; a0.l	pointer to vertices
; a1.l	pointer to sin(RotX) lookup table
; a2.l	pointer to sin(RotY) lookup table
; a3.l	pointer to sin(RotZ) lookup table
; a4.l	pointer to perspective table
; a5.l	pointer to arcus sine table (0 value position)
; a6.l	FREE

EM_to_Loop
		movem.l	(a0),d3-d5

; rotate around Z axis

		move.w	d3,d6
		move.w	(a3,d3.w*2,COSINE_OFFSET.l),d3
		add.w	(a3,d4.w*2),d3
		move.w	(a3,d4.w*2,COSINE_OFFSET.l),d4
		sub.w	(a3,d6.w*2),d4

; rotate around Y axis

		move.w	d3,d6
		move.w	(a2,d3.w*2,COSINE_OFFSET.l),d3
		sub.w	(a2,d5.w*2),d3
		move.w	(a2,d5.w*2,COSINE_OFFSET.l),d5
		add.w	(a2,d6.w*2),d5

; rotate around X axis

		move.w	d4,d6
		move.w	(a1,d4.w*2,COSINE_OFFSET.l),d4
		add.w	(a1,d5.w*2),d4
		move.w	(a1,d5.w*2,COSINE_OFFSET.l),d5
		sub.w	(a1,d6.w*2),d5

; translate

		ext.l	d3
		ext.l	d4
		ext.l	d5

		add.l	d0,d3
		add.l	d1,d4
		add.l	d2,d5

		move.l	d5,(a0,vt_zt)
		ble.w	EM_to4

; perspective projection

		move.l	(a4,d5.l*4,-4.w),d6

		muls.l	d6,d3
		swap	d3
		ext.l	d3

		muls.l	d6,d4
		swap	d4
		ext.l	d4

		move.l	d3,d5
		asr.l	#2,d5
		sub.l	d3,d5
		move.l	d5,a6
		move.l	d4,d5
		asr.l	#2,d5
		sub.l	d4,d5
		move.l	d5,M0

		moveq	#0,d5

		add.l	#CHUNKY_WIDTH2,d3
		bpl.b	EM_to0
		bset	#LEFT_CLIP_BIT,d5
		bra.b	EM_to1
EM_to0
		cmpi.l	#CHUNKY_WIDTH,d3
		blt.b	EM_to1
		bset	#RIGHT_CLIP_BIT,d5
EM_to1
		add.l	#CHUNKY_HEIGHT2,d4
		bpl.b	EM_to2
		bset	#TOP_CLIP_BIT,d5
		bra.b	EM_to3
EM_to2
		cmpi.l	#CHUNKY_HEIGHT,d4
		blt.b	EM_to3
		bset	#BOTTOM_CLIP_BIT,d5
EM_to3
		move.l	d3,(a0,vt_xp)
		move.l	d4,(a0,vt_yp)
		move.l	d5,(a0,vt_ClipBits)

; translate vertices normals (for environment mapping)

		movem.l	(a0,vt_xn),d3-d5

; rotate around Z axis

		move.w	d3,d6
		move.w	(a3,d3.w*2,COSINE_OFFSET.l),d3
		add.w	(a3,d4.w*2),d3
		move.w	(a3,d4.w*2,COSINE_OFFSET.l),d4
		sub.w	(a3,d6.w*2),d4

; rotate around Y axis

		move.w	d3,d6
		move.w	(a2,d3.w*2,COSINE_OFFSET.l),d3
		sub.w	(a2,d5.w*2),d3
		move.w	(a2,d5.w*2,COSINE_OFFSET.l),d5
		add.w	(a2,d6.w*2),d5

; rotate around X axis

		move.w	d4,d6
		move.w	(a1,d4.w*2,COSINE_OFFSET.l),d4
		add.w	(a1,d5.w*2),d4

;		move.l	(a5,d3.w*4),d5
;		sub.l	a6,d5
;		move.l	d5,(a0,vt_u)
;		move.l	(a5,d4.w*4),d5
;		sub.l	(pc,M0),d5
;		move.l	d5,(a0,vt_v)

                ext.l   d3
		neg.l	d3
		sub.l	a6,d3
		add.l	#128,d3
		move.l	d3,(a0,vt_u)
                ext.l   d4
		neg.l	d4
		sub.l	(pc,M0),d4
		add.l	#128,d4
		move.l	d4,(a0,vt_v)

EM_to4
		lea	(a0,vt_SIZEOF),a0

		dbra	d7,EM_to_Loop

		movem.l	(sp)+,d2-d7/a2-a6
		rts


; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
; a0.l	pointer to SCENE
; a1.l	pointer to DepthBuffer
; return visible faces number

_EM_CreateDepthBuffer
		movem.l	d2-d7/a2-a6,-(sp)

		moveq	#0,d0

		move.l	(a0,sc_ONumber),d1
		subq.w	#1,d1
		move.l	(a0,sc_Objects),a0
EM_cdb_Loop2

		move.l	(a0,obj_FNumber),d7
		subq.w	#1,d7
		move.l	(a0,obj_Faces),a5
EM_cdb_Loop1
		move.l	(a5,fc_V1),a2
		move.l	(a2,vt_zt),d2
		ble.b	EM_cdb0
		move.l	(a5,fc_V2),a3
		move.l	(a3,vt_zt),d3
		ble.b	EM_cdb0
		move.l	(a5,fc_V3),a4
		move.l	(a4,vt_zt),d4
		ble.b	EM_cdb0

		add.l	d3,d2
		add.l	d4,d2
		move.l	d2,(a5,fc_AvgZ)

; a2.l	pointer to V1
; a3.l	pointer to V2
; a4.l	pointer to V3

		move.l	(a2,vt_ClipBits),d2
		bne.b	EM_cdb1
		move.l	(a3,vt_ClipBits),d3
		bne.b	EM_cdb2
		move.l	(a4,vt_ClipBits),d4
		bne.b	EM_cdb3

		move.l	#0,(a5,fc_Flags)
EM_cdb4

;	backface culling

		move.l	(a3,vt_xp),d2
		move.l	(a2,vt_xp),d3
		sub.l	d2,d3
		move.l	(a4,vt_xp),d4
		sub.l	d2,d4
		move.l	(a3,vt_yp),d2
		move.l	(a4,vt_yp),d5
		sub.l	d2,d5
		move.l	(a2,vt_yp),d6
		sub.l	d2,d6
		muls	d5,d3
		muls	d6,d4
		cmp.l	d4,d3
		bge.b	EM_cdb0

		move.l	a5,(a1)+
		addq.l	#1,d0
EM_cdb0
		lea	(a5,fc_SIZEOF),a5

		dbra	d7,EM_cdb_Loop1
EM_cdb5
		lea	(a0,obj_SIZEOF),a0

		dbra	d1,EM_cdb_Loop2

		move.l	#0,(a1)

		movem.l	(sp)+,d2-d7/a2-a6
		rts

EM_cdb1
		move.l	(a3,vt_ClipBits),d3
EM_cdb2
		move.l	(a4,vt_ClipBits),d4
EM_cdb3
		and.l	d3,d2
		and.l	d4,d2
		bne.b	EM_cdb0
		move.l	#FF_CLIP,(a5,fc_Flags)
		bra.b	EM_cdb4


; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
; d0.w	number of faces
; a0.l	pointer to DepthBuffer

_EM_SortDepthBuffer
		movem.l	d2-d7/a2-a6,-(sp)

		move.w	d0,d1
		bra.b	EM_sdb0
EM_sdb_Loop0
		move.w	d1,d2
EM_sdb_Loop1
		move.w	d2,d3
		sub.w	d1,d3
		move.w	d2,d4
EM_sdb_Loop2
		move.l	([a0,d3.w*4],fc_AvgZ.w),d5
		cmp.l	([a0,d4.w*4],fc_AvgZ.w),d5
		bge.b	EM_sdb1

		move.l	(a0,d3.w*4),d5
		move.l	(a0,d4.w*4),(a0,d3.w*4)
		move.l	d5,(a0,d4.w*4)

		sub.w	d1,d4
		sub.w	d1,d3
		bpl.b	EM_sdb_Loop2
EM_sdb1
		addq.w	#1,d2
		cmp.w	d0,d2
		blt.b	EM_sdb_Loop1
EM_sdb0
		lsr.w	#1,d1
		bne.b	EM_sdb_Loop0

		movem.l	(sp)+,d2-d7/a2-a6
                rts
;============================================================================
UNROLL  =       8
_EM_ClearBack
                move.l  d7,-(sp)
                move.l  #((CHUNKY_WIDTH*CHUNKY_HEIGHT)/(UNROLL*4))-1,d7
emlo
                REPT    UNROLL
                move.l  (a0)+,(a1)+
                ENDR
                dbf     d7,emlo
                move.l  (sp)+,d7
                Rts

;============================================================================
_CalculateUV
                movem.l d3/d4,-(sp)
                subq.l  #1,d0

CUVLoop
                move.l (a0,vt_xn),d3
                move.l (a0,vt_yn),d4
                
                ext.l   d3
		neg.l	d3
		add.l	#128,d3
		move.l	d3,(a0,vt_u)
                ext.l   d4
		neg.l	d4
		add.l	#128,d4
		move.l	d4,(a0,vt_v)

                lea     (a0,vt_SIZEOF),a0
                dbf     d0,CUVLoop

                movem.l (sp)+,d3/d4
                rts

;============
_WaitMouse
                btst    #6,$bfe001
                beq.b   OK
                moveq.l #1,d0
                rts
OK
                moveq.l #0,d0
                rts

_InsertText
;a0.l text
;a1.l chunky
                movem.l d7,-(sp)
		adda.l	#320*142,a1
		move.l	#(320*48)-1,d7
PCLoop
		move.b	(a0)+,d0
		beq.b	Next
		move.b	d0,(a1)
Next
		adda.l	#1,a1
		dbf	d7,PCLoop
                movem.l (sp)+,d7

                rts
                END