;*******************-*- Mode: Assembler -*-****************************
;*  Title:	FP functions for BCPL				      *
;*  Author:	Harry Meekings					      *
;*  Lastedit:	11 Sep 87 15:23:47 by Harry Meekings		      *
;*		Copyright (c) 1986 by Acorn Computers Ltd	      *
;**********************************************************************

	GET	$.Alib.BCPLMacs

	Module FPMath, "11 Sep 87 15:23:43"

MajorVersion * 1
MinorVersion * 1

LocalDataP
	Address localData
	&	-1
	=	7, "Initial"

f0	FN	0
f1	FN	1

	MACRO
	RToF	$f, $r
	STR	$r, [rts, #0]
	LDFS	$f, [rts, #0]
	MEND

	MACRO
	FToR	$r, $f
	STFS	$f, [rts, #0]
	LDR	$r, [rts, #0]
	MEND

	GlobDef 120,SSin
; a1 := Sin(a1)
	RToF	f0, a1
	SINS	f0, f0
	FToR	a1, f0
	MOVS	pc, r14

	GlobDef 121,SCos
; a1 := Cos(a1)
	RToF	f0, a1
	COSS	f0, f0
	FToR	a1, f0
	MOVS	pc, r14

	GlobDef 122,STan
; a1 := Tan(a1)
	RToF	f0, a1
	TANS	f0, f0
	FToR	a1, f0
	MOVS	pc, r14

	GlobDef 123,SASin
; a1 := ASin(a1)
	RToF	f0, a1
	ASNS	f0, f0
	FToR	a1, f0
	MOVS	pc, r14

	GlobDef 124,SACos
; a1 := ACos(a1)
	RToF	f0, a1
	ACSS	f0, f0
	FToR	a1, f0
	MOVS	pc, r14

	GlobDef 125,SATan
; a1 := Atan(a1)
	RToF	f0, a1
	ATNS	f0, f0
	FToR	a1, f0
	MOVS	pc, r14

	GlobDef 126,SLogE
; a1 := Log(a1) (base e)
	RToF	f0, a1
	LGNS	f0, f0
	FToR	a1, f0
	MOVS	pc, r14

	GlobDef 127,SLog10
; a1 := Log(a1) (base 10)
	RToF	f0, a1
	LOGS	f0, f0
	FToR	a1, f0
	MOVS	pc, r14

	GlobDef 128,SExp
; a1 := Exp(a1)
	RToF	f0, a1
	EXPS	f0, f0
	FToR	a1, f0
	MOVS	pc, r14

	GlobDef 129,SPower
; a1 := a1**a2
	RToF	f0, a1
	RToF	f1, a2
	POWS	f0, f0, f1
	FToR	a1, f0
	MOVS	pc, r14

	GlobDef 130,SSqrt
; a1 := Sqrt(a1)
	RToF	f0, a1
	SQTS	f0, f0
	FToR	a1, f0
	MOVS	pc, r14

	GlobDef 131, SATan2
; a1 := ATan2(a1, a2)
	RToF	f0, a1
	RToF	f1, a2
	POLS	f0, f0, f1
	FToR	a1, f0
	MOVS	pc, r14

	GlobDef 132, SRound
; a1 := Round(a, type)
;    type = 0 -> round to nearest
;	    1 -> round to +infinity
;	    2 -> round to -infinity
;	    3 -> round to zero
	RToF	f0, a1
	CMP	a2, #0
	RNDEQS	f0, f0
	CMP	a2, #1
	RNDEQSP f0, f0
	CMP	a2, #2
	RNDEQSM f0, f0
	CMP	a2, #3
	RNDEQSZ f0, f0
	FToR	a1, f0
	MOVS	pc, r14

	GlobDef 133, SToP
; SToP(f, v)
;    returns a packed decimal version of the floating point value  f  in
;    the three-word array v
	RToF	f0, a1
	MOV	a2, a2, ASL #2
	STFP	f0, [a2, #0]
	MOVS	pc, r14

localData
	= "VERN"
	= MinorVersion
	= MajorVersion
	ALIGN 4

	EndModule

	END
