Home » Archimedes archive » Zipped Apps » BCPL » BCPL/armlib/a/FPMath

BCPL/armlib/a/FPMath

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Archimedes archive » Zipped Apps » BCPL
Filename: BCPL/armlib/a/FPMath
Read OK:
File size: 093B bytes
Load address: 0000
Exec address: 0000
File contents
;*******************-*- 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
00000000  3b 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |;***************|
00000010  2a 2a 2a 2a 2d 2a 2d 20  4d 6f 64 65 3a 20 41 73  |****-*- Mode: As|
00000020  73 65 6d 62 6c 65 72 20  2d 2a 2d 2a 2a 2a 2a 2a  |sembler -*-*****|
00000030  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
00000040  2a 2a 2a 2a 2a 2a 2a 0a  3b 2a 20 20 54 69 74 6c  |*******.;*  Titl|
00000050  65 3a 09 46 50 20 66 75  6e 63 74 69 6f 6e 73 20  |e:.FP functions |
00000060  66 6f 72 20 42 43 50 4c  09 09 09 09 20 20 20 20  |for BCPL....    |
00000070  20 20 2a 0a 3b 2a 20 20  41 75 74 68 6f 72 3a 09  |  *.;*  Author:.|
00000080  48 61 72 72 79 20 4d 65  65 6b 69 6e 67 73 09 09  |Harry Meekings..|
00000090  09 09 09 20 20 20 20 20  20 2a 0a 3b 2a 20 20 4c  |...      *.;*  L|
000000a0  61 73 74 65 64 69 74 3a  09 31 31 20 53 65 70 20  |astedit:.11 Sep |
000000b0  38 37 20 31 35 3a 32 33  3a 34 37 20 62 79 20 48  |87 15:23:47 by H|
000000c0  61 72 72 79 20 4d 65 65  6b 69 6e 67 73 09 09 20  |arry Meekings.. |
000000d0  20 20 20 20 20 2a 0a 3b  2a 09 09 43 6f 70 79 72  |     *.;*..Copyr|
000000e0  69 67 68 74 20 28 63 29  20 31 39 38 36 20 62 79  |ight (c) 1986 by|
000000f0  20 41 63 6f 72 6e 20 43  6f 6d 70 75 74 65 72 73  | Acorn Computers|
00000100  20 4c 74 64 09 20 20 20  20 20 20 2a 0a 3b 2a 2a  | Ltd.      *.;**|
00000110  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00000150  2a 2a 2a 2a 0a 0a 09 47  45 54 09 24 2e 41 6c 69  |****...GET.$.Ali|
00000160  62 2e 42 43 50 4c 4d 61  63 73 0a 0a 09 4d 6f 64  |b.BCPLMacs...Mod|
00000170  75 6c 65 20 46 50 4d 61  74 68 2c 20 22 31 31 20  |ule FPMath, "11 |
00000180  53 65 70 20 38 37 20 31  35 3a 32 33 3a 34 33 22  |Sep 87 15:23:43"|
00000190  0a 0a 4d 61 6a 6f 72 56  65 72 73 69 6f 6e 20 2a  |..MajorVersion *|
000001a0  20 31 0a 4d 69 6e 6f 72  56 65 72 73 69 6f 6e 20  | 1.MinorVersion |
000001b0  2a 20 31 0a 0a 4c 6f 63  61 6c 44 61 74 61 50 0a  |* 1..LocalDataP.|
000001c0  09 41 64 64 72 65 73 73  20 6c 6f 63 61 6c 44 61  |.Address localDa|
000001d0  74 61 0a 09 26 09 2d 31  0a 09 3d 09 37 2c 20 22  |ta..&.-1..=.7, "|
000001e0  49 6e 69 74 69 61 6c 22  0a 0a 66 30 09 46 4e 09  |Initial"..f0.FN.|
000001f0  30 0a 66 31 09 46 4e 09  31 0a 0a 09 4d 41 43 52  |0.f1.FN.1...MACR|
00000200  4f 0a 09 52 54 6f 46 09  24 66 2c 20 24 72 0a 09  |O..RToF.$f, $r..|
00000210  53 54 52 09 24 72 2c 20  5b 72 74 73 2c 20 23 30  |STR.$r, [rts, #0|
00000220  5d 0a 09 4c 44 46 53 09  24 66 2c 20 5b 72 74 73  |]..LDFS.$f, [rts|
00000230  2c 20 23 30 5d 0a 09 4d  45 4e 44 0a 0a 09 4d 41  |, #0]..MEND...MA|
00000240  43 52 4f 0a 09 46 54 6f  52 09 24 72 2c 20 24 66  |CRO..FToR.$r, $f|
00000250  0a 09 53 54 46 53 09 24  66 2c 20 5b 72 74 73 2c  |..STFS.$f, [rts,|
00000260  20 23 30 5d 0a 09 4c 44  52 09 24 72 2c 20 5b 72  | #0]..LDR.$r, [r|
00000270  74 73 2c 20 23 30 5d 0a  09 4d 45 4e 44 0a 0a 09  |ts, #0]..MEND...|
00000280  47 6c 6f 62 44 65 66 20  31 32 30 2c 53 53 69 6e  |GlobDef 120,SSin|
00000290  0a 3b 20 61 31 20 3a 3d  20 53 69 6e 28 61 31 29  |.; a1 := Sin(a1)|
000002a0  0a 09 52 54 6f 46 09 66  30 2c 20 61 31 0a 09 53  |..RToF.f0, a1..S|
000002b0  49 4e 53 09 66 30 2c 20  66 30 0a 09 46 54 6f 52  |INS.f0, f0..FToR|
000002c0  09 61 31 2c 20 66 30 0a  09 4d 4f 56 53 09 70 63  |.a1, f0..MOVS.pc|
000002d0  2c 20 72 31 34 0a 0a 09  47 6c 6f 62 44 65 66 20  |, r14...GlobDef |
000002e0  31 32 31 2c 53 43 6f 73  0a 3b 20 61 31 20 3a 3d  |121,SCos.; a1 :=|
000002f0  20 43 6f 73 28 61 31 29  0a 09 52 54 6f 46 09 66  | Cos(a1)..RToF.f|
00000300  30 2c 20 61 31 0a 09 43  4f 53 53 09 66 30 2c 20  |0, a1..COSS.f0, |
00000310  66 30 0a 09 46 54 6f 52  09 61 31 2c 20 66 30 0a  |f0..FToR.a1, f0.|
00000320  09 4d 4f 56 53 09 70 63  2c 20 72 31 34 0a 0a 09  |.MOVS.pc, r14...|
00000330  47 6c 6f 62 44 65 66 20  31 32 32 2c 53 54 61 6e  |GlobDef 122,STan|
00000340  0a 3b 20 61 31 20 3a 3d  20 54 61 6e 28 61 31 29  |.; a1 := Tan(a1)|
00000350  0a 09 52 54 6f 46 09 66  30 2c 20 61 31 0a 09 54  |..RToF.f0, a1..T|
00000360  41 4e 53 09 66 30 2c 20  66 30 0a 09 46 54 6f 52  |ANS.f0, f0..FToR|
00000370  09 61 31 2c 20 66 30 0a  09 4d 4f 56 53 09 70 63  |.a1, f0..MOVS.pc|
00000380  2c 20 72 31 34 0a 0a 09  47 6c 6f 62 44 65 66 20  |, r14...GlobDef |
00000390  31 32 33 2c 53 41 53 69  6e 0a 3b 20 61 31 20 3a  |123,SASin.; a1 :|
000003a0  3d 20 41 53 69 6e 28 61  31 29 0a 09 52 54 6f 46  |= ASin(a1)..RToF|
000003b0  09 66 30 2c 20 61 31 0a  09 41 53 4e 53 09 66 30  |.f0, a1..ASNS.f0|
000003c0  2c 20 66 30 0a 09 46 54  6f 52 09 61 31 2c 20 66  |, f0..FToR.a1, f|
000003d0  30 0a 09 4d 4f 56 53 09  70 63 2c 20 72 31 34 0a  |0..MOVS.pc, r14.|
000003e0  0a 09 47 6c 6f 62 44 65  66 20 31 32 34 2c 53 41  |..GlobDef 124,SA|
000003f0  43 6f 73 0a 3b 20 61 31  20 3a 3d 20 41 43 6f 73  |Cos.; a1 := ACos|
00000400  28 61 31 29 0a 09 52 54  6f 46 09 66 30 2c 20 61  |(a1)..RToF.f0, a|
00000410  31 0a 09 41 43 53 53 09  66 30 2c 20 66 30 0a 09  |1..ACSS.f0, f0..|
00000420  46 54 6f 52 09 61 31 2c  20 66 30 0a 09 4d 4f 56  |FToR.a1, f0..MOV|
00000430  53 09 70 63 2c 20 72 31  34 0a 0a 09 47 6c 6f 62  |S.pc, r14...Glob|
00000440  44 65 66 20 31 32 35 2c  53 41 54 61 6e 0a 3b 20  |Def 125,SATan.; |
00000450  61 31 20 3a 3d 20 41 74  61 6e 28 61 31 29 0a 09  |a1 := Atan(a1)..|
00000460  52 54 6f 46 09 66 30 2c  20 61 31 0a 09 41 54 4e  |RToF.f0, a1..ATN|
00000470  53 09 66 30 2c 20 66 30  0a 09 46 54 6f 52 09 61  |S.f0, f0..FToR.a|
00000480  31 2c 20 66 30 0a 09 4d  4f 56 53 09 70 63 2c 20  |1, f0..MOVS.pc, |
00000490  72 31 34 0a 0a 09 47 6c  6f 62 44 65 66 20 31 32  |r14...GlobDef 12|
000004a0  36 2c 53 4c 6f 67 45 0a  3b 20 61 31 20 3a 3d 20  |6,SLogE.; a1 := |
000004b0  4c 6f 67 28 61 31 29 20  28 62 61 73 65 20 65 29  |Log(a1) (base e)|
000004c0  0a 09 52 54 6f 46 09 66  30 2c 20 61 31 0a 09 4c  |..RToF.f0, a1..L|
000004d0  47 4e 53 09 66 30 2c 20  66 30 0a 09 46 54 6f 52  |GNS.f0, f0..FToR|
000004e0  09 61 31 2c 20 66 30 0a  09 4d 4f 56 53 09 70 63  |.a1, f0..MOVS.pc|
000004f0  2c 20 72 31 34 0a 0a 09  47 6c 6f 62 44 65 66 20  |, r14...GlobDef |
00000500  31 32 37 2c 53 4c 6f 67  31 30 0a 3b 20 61 31 20  |127,SLog10.; a1 |
00000510  3a 3d 20 4c 6f 67 28 61  31 29 20 28 62 61 73 65  |:= Log(a1) (base|
00000520  20 31 30 29 0a 09 52 54  6f 46 09 66 30 2c 20 61  | 10)..RToF.f0, a|
00000530  31 0a 09 4c 4f 47 53 09  66 30 2c 20 66 30 0a 09  |1..LOGS.f0, f0..|
00000540  46 54 6f 52 09 61 31 2c  20 66 30 0a 09 4d 4f 56  |FToR.a1, f0..MOV|
00000550  53 09 70 63 2c 20 72 31  34 0a 0a 09 47 6c 6f 62  |S.pc, r14...Glob|
00000560  44 65 66 20 31 32 38 2c  53 45 78 70 0a 3b 20 61  |Def 128,SExp.; a|
00000570  31 20 3a 3d 20 45 78 70  28 61 31 29 0a 09 52 54  |1 := Exp(a1)..RT|
00000580  6f 46 09 66 30 2c 20 61  31 0a 09 45 58 50 53 09  |oF.f0, a1..EXPS.|
00000590  66 30 2c 20 66 30 0a 09  46 54 6f 52 09 61 31 2c  |f0, f0..FToR.a1,|
000005a0  20 66 30 0a 09 4d 4f 56  53 09 70 63 2c 20 72 31  | f0..MOVS.pc, r1|
000005b0  34 0a 0a 09 47 6c 6f 62  44 65 66 20 31 32 39 2c  |4...GlobDef 129,|
000005c0  53 50 6f 77 65 72 0a 3b  20 61 31 20 3a 3d 20 61  |SPower.; a1 := a|
000005d0  31 2a 2a 61 32 0a 09 52  54 6f 46 09 66 30 2c 20  |1**a2..RToF.f0, |
000005e0  61 31 0a 09 52 54 6f 46  09 66 31 2c 20 61 32 0a  |a1..RToF.f1, a2.|
000005f0  09 50 4f 57 53 09 66 30  2c 20 66 30 2c 20 66 31  |.POWS.f0, f0, f1|
00000600  0a 09 46 54 6f 52 09 61  31 2c 20 66 30 0a 09 4d  |..FToR.a1, f0..M|
00000610  4f 56 53 09 70 63 2c 20  72 31 34 0a 0a 09 47 6c  |OVS.pc, r14...Gl|
00000620  6f 62 44 65 66 20 31 33  30 2c 53 53 71 72 74 0a  |obDef 130,SSqrt.|
00000630  3b 20 61 31 20 3a 3d 20  53 71 72 74 28 61 31 29  |; a1 := Sqrt(a1)|
00000640  0a 09 52 54 6f 46 09 66  30 2c 20 61 31 0a 09 53  |..RToF.f0, a1..S|
00000650  51 54 53 09 66 30 2c 20  66 30 0a 09 46 54 6f 52  |QTS.f0, f0..FToR|
00000660  09 61 31 2c 20 66 30 0a  09 4d 4f 56 53 09 70 63  |.a1, f0..MOVS.pc|
00000670  2c 20 72 31 34 0a 0a 09  47 6c 6f 62 44 65 66 20  |, r14...GlobDef |
00000680  31 33 31 2c 20 53 41 54  61 6e 32 0a 3b 20 61 31  |131, SATan2.; a1|
00000690  20 3a 3d 20 41 54 61 6e  32 28 61 31 2c 20 61 32  | := ATan2(a1, a2|
000006a0  29 0a 09 52 54 6f 46 09  66 30 2c 20 61 31 0a 09  |)..RToF.f0, a1..|
000006b0  52 54 6f 46 09 66 31 2c  20 61 32 0a 09 50 4f 4c  |RToF.f1, a2..POL|
000006c0  53 09 66 30 2c 20 66 30  2c 20 66 31 0a 09 46 54  |S.f0, f0, f1..FT|
000006d0  6f 52 09 61 31 2c 20 66  30 0a 09 4d 4f 56 53 09  |oR.a1, f0..MOVS.|
000006e0  70 63 2c 20 72 31 34 0a  0a 09 47 6c 6f 62 44 65  |pc, r14...GlobDe|
000006f0  66 20 31 33 32 2c 20 53  52 6f 75 6e 64 0a 3b 20  |f 132, SRound.; |
00000700  61 31 20 3a 3d 20 52 6f  75 6e 64 28 61 2c 20 74  |a1 := Round(a, t|
00000710  79 70 65 29 0a 3b 20 20  20 20 74 79 70 65 20 3d  |ype).;    type =|
00000720  20 30 20 2d 3e 20 72 6f  75 6e 64 20 74 6f 20 6e  | 0 -> round to n|
00000730  65 61 72 65 73 74 0a 3b  09 20 20 20 20 31 20 2d  |earest.;.    1 -|
00000740  3e 20 72 6f 75 6e 64 20  74 6f 20 2b 69 6e 66 69  |> round to +infi|
00000750  6e 69 74 79 0a 3b 09 20  20 20 20 32 20 2d 3e 20  |nity.;.    2 -> |
00000760  72 6f 75 6e 64 20 74 6f  20 2d 69 6e 66 69 6e 69  |round to -infini|
00000770  74 79 0a 3b 09 20 20 20  20 33 20 2d 3e 20 72 6f  |ty.;.    3 -> ro|
00000780  75 6e 64 20 74 6f 20 7a  65 72 6f 0a 09 52 54 6f  |und to zero..RTo|
00000790  46 09 66 30 2c 20 61 31  0a 09 43 4d 50 09 61 32  |F.f0, a1..CMP.a2|
000007a0  2c 20 23 30 0a 09 52 4e  44 45 51 53 09 66 30 2c  |, #0..RNDEQS.f0,|
000007b0  20 66 30 0a 09 43 4d 50  09 61 32 2c 20 23 31 0a  | f0..CMP.a2, #1.|
000007c0  09 52 4e 44 45 51 53 50  20 66 30 2c 20 66 30 0a  |.RNDEQSP f0, f0.|
000007d0  09 43 4d 50 09 61 32 2c  20 23 32 0a 09 52 4e 44  |.CMP.a2, #2..RND|
000007e0  45 51 53 4d 20 66 30 2c  20 66 30 0a 09 43 4d 50  |EQSM f0, f0..CMP|
000007f0  09 61 32 2c 20 23 33 0a  09 52 4e 44 45 51 53 5a  |.a2, #3..RNDEQSZ|
00000800  20 66 30 2c 20 66 30 0a  09 46 54 6f 52 09 61 31  | f0, f0..FToR.a1|
00000810  2c 20 66 30 0a 09 4d 4f  56 53 09 70 63 2c 20 72  |, f0..MOVS.pc, r|
00000820  31 34 0a 0a 09 47 6c 6f  62 44 65 66 20 31 33 33  |14...GlobDef 133|
00000830  2c 20 53 54 6f 50 0a 3b  20 53 54 6f 50 28 66 2c  |, SToP.; SToP(f,|
00000840  20 76 29 0a 3b 20 20 20  20 72 65 74 75 72 6e 73  | v).;    returns|
00000850  20 61 20 70 61 63 6b 65  64 20 64 65 63 69 6d 61  | a packed decima|
00000860  6c 20 76 65 72 73 69 6f  6e 20 6f 66 20 74 68 65  |l version of the|
00000870  20 66 6c 6f 61 74 69 6e  67 20 70 6f 69 6e 74 20  | floating point |
00000880  76 61 6c 75 65 20 20 66  20 20 69 6e 0a 3b 20 20  |value  f  in.;  |
00000890  20 20 74 68 65 20 74 68  72 65 65 2d 77 6f 72 64  |  the three-word|
000008a0  20 61 72 72 61 79 20 76  0a 09 52 54 6f 46 09 66  | array v..RToF.f|
000008b0  30 2c 20 61 31 0a 09 4d  4f 56 09 61 32 2c 20 61  |0, a1..MOV.a2, a|
000008c0  32 2c 20 41 53 4c 20 23  32 0a 09 53 54 46 50 09  |2, ASL #2..STFP.|
000008d0  66 30 2c 20 5b 61 32 2c  20 23 30 5d 0a 09 4d 4f  |f0, [a2, #0]..MO|
000008e0  56 53 09 70 63 2c 20 72  31 34 0a 0a 6c 6f 63 61  |VS.pc, r14..loca|
000008f0  6c 44 61 74 61 0a 09 3d  20 22 56 45 52 4e 22 0a  |lData..= "VERN".|
00000900  09 3d 20 4d 69 6e 6f 72  56 65 72 73 69 6f 6e 0a  |.= MinorVersion.|
00000910  09 3d 20 4d 61 6a 6f 72  56 65 72 73 69 6f 6e 0a  |.= MajorVersion.|
00000920  09 41 4c 49 47 4e 20 34  0a 0a 09 45 6e 64 4d 6f  |.ALIGN 4...EndMo|
00000930  64 75 6c 65 0a 0a 09 45  4e 44 0a                 |dule...END.|
0000093b