;64-bit math functions for vrastport.lib
;$VER math64.a 2.1 (25.10.98)

		INCLUDE	"utility/utility_lib.i"
		
		XDEF	_add64
		XDEF	_sub64
		XDEF	_cmp64
		XDEF	_mul64
		XDEF	_abs64
		XDEF	_tst64
		XDEF	_div64
		XDEF	_shr64

		XREF	_UtilityBase

		SECTION	code_p

_add64		LEA	8(a0),a0
		LEA	8(a1),a1
		MOVE.L	-(a0),d0
		ADD.L	d0,-(a1)
		ADDX.L	-(a0),-(a1)
		BVS.S	overflow_a
		CLR.L	d0
		BRA.S	no_ovr_a
overflow_a	MOVEQ	#-1,d0
no_ovr_a	RTS

;-----------------------------------------------------------------------------

_sub64		LEA	8(a0),a0
		LEA	8(a1),a1
		MOVE.L	-(a0),d0
		SUB.L	d0,-(a1)
		SUBX.L	-(a0),-(a1)
		BVS.S	overflow_s
		CLR.L	d0
		BRA.S	no_ovr_s
overflow_s	MOVEQ	#-1,d0
no_ovr_s	RTS

;-----------------------------------------------------------------------------

_cmp64		MOVE.L	(a0),d0
		CMP.L	(a1),d0
		BEQ.S	compare_low
		BGT.S	greater
lower		MOVEQ	#-1,d0
		RTS
greater		MOVEQ	#1,d0
		RTS
compare_low	MOVE.L	4(a0),d0
		CMP.L	4(a1),d0
		BHI.S	greater
		BLO.S	lower
		CLR.L	d0
		RTS
		
;-----------------------------------------------------------------------------

_mul64		MOVEA.L	_UtilityBase,a1
		JSR	_LVOSMult64(a1)
		MOVE.L	d1,(a0)+
		MOVE.L	d0,(a0)
		RTS

;-----------------------------------------------------------------------------

_abs64		TST.L	(a0)
		BPL.S	no_neg
		NEG.L	4(a0)
		NEGX.L	(a0)
no_neg		RTS

;-----------------------------------------------------------------------------

_tst64		TST.L	(a0)
		BEQ.S	test_low
		BMI.S	negative
positive	MOVEQ	#1,d0
		RTS
negative	MOVEQ	#-1,d0
		RTS
test_low	TST.L	4(a0)
		BMI.S	negative
		BNE.S	positive
		CLR.L	d0
		RTS

;-----------------------------------------------------------------------------

udiv64		MOVEM.L	d2-d5,-(sp)
		CLR.L	d3
		CLR.L	d4
		MOVEQ	#31,d5
divloop		LSR.L	#1,d2
		ROXR.L	#1,d3
		CMP.L	d1,d2
		BEQ.S	complow
		BHI.S	bit_zero
		BLO.S	bit_one
complow		CMP.L	d0,d3
		BHI.S	bit_zero
bit_one		BSET	d5,d4
		SUB.L	d3,d0
		SUBX.L	d2,d1
bit_zero	DBF	d5,divloop
		MOVE.L	d0,d1
		MOVE.L	d4,d0
		MOVEM.L	(sp)+,d2-d5
		RTS
		
;-----------------------------------------------------------------------------

_div64		MOVE.L	d3,-(sp)
		CLR.B	d3
		MOVE.L	(a0)+,d1
		MOVE.L	(a0),d0
		TST.L	d1
		BPL.S	plus1
		NEG.L	d0
		NEGX.L	d1
		ORI.B	#3,d3		;znak wyniku i reszty -
plus1		TST.L	d2
		BPL.S	plus2
		NEG.L	d2
		BCHG	#0,d3		;zmiana znaku wyniku
plus2		BSR.S	udiv64
		BTST	#0,d3
		BEQ.S	plus3
		NEG.L	d0
plus3		BTST	#1,d3
		BEQ.S	plus4
		NEG.L	d1
plus4		MOVE.L	(sp)+,d3
		RTS

;-----------------------------------------------------------------------------

_shr64		MOVE.L	d2,-(sp)
		MOVE.W	d0,d2
		SUBQ.W	#1,d2
		MOVE.L	(a0),d1
		MOVE.L	4(a0),d0
rshifting	ASR.L	#1,d1
		ROXR.L	#1,d0
		DBF	d2,rshifting
		MOVE.L	d1,(a0)
		MOVE.L	d0,4(a0)
		MOVE.L	(sp)+,d2
		RTS
