.globl	fpsim, fpsr, m.ext, m.lngi
ldfps = 170100^tst
stfps = 170200^tst
/
.globl sin, _sin
.globl cos, _cos
/
/	floating point sin/cos
/	replaces the value in fr0 by its sin/cos
/	there are no error exits
/	coefficients are #3370 from Hart & Cheney
/
_sin:
	mov	r5,-(sp)
	mov	sp,r5
jsr	pc, fpsim
	movf	4(r5),fr0
	jsr	pc,sin
	br	1f

_cos:
	mov	r5,-(sp)
	mov	sp,r5
jsr	pc, fpsim
	movf	4(r5),fr0
	jsr	pc,cos
1:
	mov	(sp)+,r5
	rts	pc

cos:
jsr	pc, fpsim
	absf	fr0
	mov	$1,-(sp)
	br	1f
sin:
	clr	-(sp)
1:
jsr	pc, fpsim
	stfps	-(sp)
	ldfps	$200
	movf	fr1,-(sp)
	movf	fr2,-(sp)
	mov	r0,-(sp)
/
/	quadrant reduction -  arg = (2/J)x
/	-1 < arg < 1
/
jsr	pc, fpsim
	movf	fr0,-(sp)
	absf	fr0
	modf	frpi2,fr0
	modf	$fourth,fr1
	mulf	$four,fr1
	movfi	fr1,r0
	add	34(sp),r0
jsr	pc, fpsim
	movf	$one,fr1
	inc	r0
	ror	r0
	bcs	1f
jsr	pc, fpsim
	subf	$one,fr0
1:
	ror	r0
	bcc	1f
jsr	pc, fpsim
	negf	fr0
1:
jsr	pc, fpsim
	tstf	(sp)+
	cfcc
	bpl	1f
jsr	pc, fpsim
	negf	fr0
1:
jsr	pc, fpsim
	movf	fr0,fr1
	mulf	fr0,fr1		/arg^2
/
	movf	p4,fr2
	mulf	fr1,fr2
	addf	p3,fr2
	mulf	fr1,fr2
	addf	p2,fr2
	mulf	fr1,fr2
	addf	p1,fr2
	mulf	fr1,fr2
	addf	p0,fr2
	mulf	fr2,fr0		/ zP(z^2)
/
	movf	fr1,fr2
	addf	q3,fr2
	mulf	fr1,fr2
	addf	q2,fr2
	mulf	fr1,fr2
	addf	q1,fr2
	mulf	fr1,fr2
	addf	q0,fr2		/ Q(z^2)
/
	divf	fr2,fr0		/ zP(z^2)/Q(z^2)
/
	mov	(sp)+,r0
jsr	pc, fpsim
	movf	(sp)+,fr2
	movf	(sp)+,fr1
	ldfps	(sp)+
	tst	(sp)+
/	clc		/tst clears carry
	rts	pc
/
fourth	= 37600
one	= 40200
four	= 40600
/
.data
frpi2:	40042;174603; 67116; 42025
/
p0:	046117;031130;175220;165273
p1:	145626;154170;031651;104637
p2:	044726;162341;133224;052302
p3:	143530;056427;005061;125021
p4:	042021;174005;170441;175607
q0:	046003;163716;123445;167144
q1:	044707;047147;032436;120046
q2:	043423;156142;064161;007314
q3:	042004;123513;026637;160477
/
/p0 =  .13578 84097 87737 56690 92680 d8
/p1 = -.49429 08100 90284 41611 58627 d7
/p2 =  .44010 30535 37526 65019 44918 d6
/p3 = -.13847 27249 98245 28730 54457 d5
/p4 =  .14596 88406 66576 87222 26959 d3
/q0 =  .86445 58652 92253 44299 15149 d7
/q1 =  .40817 92252 34329 97493 95779 d6
/q2 =  .94630 96101 53820 81805 71257 d4
/q3 =  .13265 34908 78613 63589 11494 d3
/q4 =  .1                             d1
