;******* ASSEMBLY ROUTINES for MAGELORE ********

;NOTE: most were first written in C and rewritten for speed *

	XREF	_timer			; needed for Show_Timer
	XREF	_bplanes
	XREF	_timer_start

	XREF	_obj_start		; Draw_Object
	XREF	_obj
	XREF	_top_x
	XREF	_top_y
	XREF	_old_scr

	XREF	_cr_start

; **** Show Timer ****
;
; use:	d0 = anim2 << 7
;	d1 = i
;	d2 = bplane offset (old_scr)
;	d3 = i << 5
;	d4 = y counter
;	d5 = x counter
;	d6 = i << 2
;
;	a0 = bplanes
;	a1 = scr_p
;	a2 = pic_p

_Show_Timer:
	movem.l	d0-d6/a0-a2,-(a7)
	move	_timer,d0
	andi.l	#31,d0
	asl.l	#7,d0

	moveq	#0,d2

tm_main_loop:
	moveq	#3,d1
	moveq	#0,d6

	move.l	_timer_start,a2
	add.l	d0,a2

	lea	_bplanes,a0

tm_bp_loop:
	lea	0(a0,d2),a1
	add.l	d6,a1
	move.l	(a1),a1
	add.l	#209,a1

	moveq	#7,d4
tm_loopy:
	moveq	#3,d5
tm_loopx:
	move.b	(a2)+,(a1)+
	dbra	d5,tm_loopx
	add.l	#36,a1
	dbra	d4,tm_loopy
	add.l	#4,d6
	dbra	d1,tm_bp_loop
	add.l	#20,d2
	cmp	#40,d2
	bne	tm_main_loop
	movem.l	(a7)+,d0-d6/a0-a2
	rts

;******** Draw Object routine **********

; use	a0 = #bplanes[][]
;	a1 = loc
;	a2 = p (bitplane pointer)
;	a3 = obj_p (object pointer)
;
;	d0 = i (counter)
;	d1 = y (counter)

_Draw_Object:
	movem.l	d0-d1/a0-a3,-(a7)
	bsr	calc_loc
	lea	_bplanes,a0
	moveq	#0,d0
	move.b	_old_scr,d0
	beq	do_calc_bplane
	move.b	#20,d0
do_calc_bplane:
	lea	0(a0,d0),a0

	move.l	_obj_start,a3
	moveq	#0,d0
	move	_obj,d0
	asl.l	#7,d0
	add.l	d0,a3

	moveq	#3,d0
do_mn_loop:
	move.l	(a0)+,a2
	add.l	a1,a2

	moveq	#15,d1
do_loopy:
	move	(a3)+,(a2)
	add.l	#40,a2
	dbra	d1,do_loopy
	dbra	d0,do_mn_loop
	movem.l	(a7)+,d0-d1/a0-a3
	rts

;******** Draw Creature routine **********

; use	a0 = #bplanes[][]
;	a1 = loc
;	a2 = p (bitplane pointer)
;	a3 = cr_p (object pointer)
;	a4 = mask (mask pointer)
;
;	d0 = i (counter)
;	d1 = y (counter)
;	d2 = initial mask

_Draw_Creature:
	movem.l	d0-d2/a0-a4,-(a7)
	bsr	calc_loc
	lea	_bplanes,a0
	moveq	#0,d0
	move.b	_old_scr,d0
	beq	dc_calc_bplane
	move.b	#20,d0
dc_calc_bplane:
	lea	0(a0,d0),a0

	move.l	_cr_start,a3
	moveq	#0,d0
	move	_obj,d0
	move	#160,d1
	mulu	d1,d0
	add.l	d0,a3
	move.l	#128,d2
	add.l	a3,d2

	moveq	#3,d0
dc_mn_loop:
	move.l	(a0)+,a2
	add.l	a1,a2
	move.l	d2,a4

	moveq	#15,d1
dc_loopy:
	move	(a4)+,d3
	and	(a2),d3
	or	(a3)+,d3
	move	d3,(a2)
	add.l	#40,a2
	dbra	d1,dc_loopy
	dbra	d0,dc_mn_loop
	movem.l	(a7)+,d0-d2/a0-a4
	rts

;***** Calculate Location routine *******
;
; uses	_top_x, _top_y
; ret	a1 = loc (offset from top of bitplane)
;
; affects registers d0-d1/a1

calc_loc:
	moveq	#0,d0
	move	_top_y,d0
	addq	#1,d0
	asl.l	#4,d0
	moveq	#40,d1
	mulu	d1,d0
	move.l	d0,a1

	moveq	#0,d0
	move	_top_x,d0
	addq	#1,d0
	asl.l	#1,d0
	add.l	d0,a1
	rts

	XDEF	_Show_Timer
	XDEF	_Draw_Object
	XDEF	_Draw_Creature

	end
