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