1: .globl exp, _exp 2: / 3: ldfps = 170100^tst 4: stfps = 170200^tst 5: ldexp = 176400^movif 6: stexp = 175000^movfi 7: / 8: / exp accepts its argument and returns its result 9: / in fr0. The carry bit is set if the result overflows. 10: / The coefficients are #1067 from Hart & Cheney. 11: / 12: / movf arg,fr0 13: / jsr pc,exp 14: / movf fr0,result 15: / 16: _exp: 17: mov r5,-(sp) 18: mov sp,r5 19: mov 4(r5),fr0 20: jsr pc,exp 21: mov (sp)+,r5 22: rts pc 23: 24: exp: 25: stfps -(sp) 26: ldfps $200 /di mode 27: movf fr2,-(sp) 28: movf fr1,-(sp) 29: tstf fr0 30: cfcc 31: bne 1f 32: movf $one,fr0 /exp(0) 33: clc 34: br out 35: 1: 36: modf log2e,fr0 /exp(x) = 2^(x*log2(e)) 37: cfcc 38: bmi 2f 39: movfi fr1,-(sp) /save integer part 40: subf $half,fr0 41: br 3f 42: 2: 43: movfi fr1,-(sp) 44: dec (sp) 45: addf $half,fr0 46: 3: 47: movf fr0,fr1 / -.5 < x < +.5 48: mulf fr1,fr1 /arg**2 49: / 50: movf P2,fr2 51: mulf fr1,fr2 52: addf P1,fr2 53: mulf fr1,fr2 54: addf P0,fr2 55: mulf fr2,fr0 /xP(x**2) 56: / 57: movf fr1,fr2 58: addf Q1,fr2 59: mulf fr1,fr2 60: addf Q0,fr2 /Q(x**2) 61: / 62: movf fr2,fr1 63: subf fr0,fr1 64: addf fr2,fr0 65: divf fr1,fr0 /(Q+xP)/(Q-xP) 66: mulf sqrt2,fr0 67: / 68: stexp fr0,-(sp) 69: add (sp)+,(sp) 70: / 71: cmp (sp),$177 72: ble 2f 73: tst (sp)+ 74: movf big,fr0 /overflow 75: sec 76: br 1f 77: 2: 78: cmp (sp),$-177 79: bge 2f 80: tst (sp)+ 81: clrf fr0 /underflow 82: clc 83: br 1f 84: 2: 85: ldexp (sp)+,fr0 86: clc 87: 1: 88: out: 89: movf (sp)+,fr1 90: movf (sp)+,fr2 91: ldfps (sp)+ 92: rts pc 93: / 94: / 95: .data 96: P0: 42675; 36404; 77563; 46675 97: P1: 41241; 116724; 114237; 60333 98: P2: 36675; 27102; 125560; 136652 99: Q0: 43210; 100661; 76072; 62453 100: Q1: 42151; 27450; 75350; 112503 101: log2e: 40270; 125073; 24534; 13761 102: sqrt2: 40265; 02363; 31771; 157144 103: half = 40000 104: one = 40200 105: / 106: big: 77777; 177777; 177777; 177777 107: / 108: / P0 = .15139 06799 05433 89158 94328 d4 109: / P1 = .20202 06565 12869 27227 886 d2 110: / P2 = .23093 34775 37502 33624 d-1 111: / 112: / Q0 = .43682 11662 72755 84984 96814 d4 113: / Q1 = .23318 42114 27481 62379 0295 d3 114: / Q2 = .1 d1 115: / 116: / log2e = 1.44269 50408 88963 40735 99246 117: / sqrt2 = 1.41421 35623 73095 04880 16887