1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
; Zilog eZ80 ANSI C Compiler Release 3.4
; -optsize -nomodsect -peephole -globalopt -localcse
; -const=ROM
FILE "..\TANH.C"
.assume ADL=1
SEGMENT CODE
; 1 /************************************************************************/
; 2 /* */
; 3 /* Copyright (C)1987-2008 by */
; 4 /* Zilog, Inc. */
; 5 /* */
; 6 /* San Jose, California */
; 7 /* */
; 8 /************************************************************************/
; 9 /*
; 10 tanh(arg) computes the hyperbolic tangent of its floating
; 11 point argument.
; 12
; 13 sinh and cosh are called except for large arguments, which
; 14 would cause overflow improperly.
; 15 */
; 16
; 17 #include <math.h>
; 18
; 19 double tanh(double arg)
; 20 {
_tanh:
LD HL,-10
CALL __frameset
; 21 double sign;
; 22
; 23 sign = 1.;
LD BC,8388608
LD (IX+-4),BC
LD A,63
LD (IX+-1),A
; 24 if(arg < 0.){
LD HL,(IX+6)
LD E,(IX+9)
LD BC,0
XOR A,A
CALL __fcmp
JP P,L_2
; 25 arg = -arg;
LD BC,(IX+6)
LD A,(IX+9)
CALL __fneg
LD (IX+6),BC
LD (IX+9),A
; 26 sign = -1.;
LD BC,8388608
LD (IX+-4),BC
LD A,191
LD (IX+-1),A
; 27 }
L_2:
; 28
; 29 if(arg > 21.)
LD HL,11010048
LD E,65
LD BC,(IX+6)
LD A,(IX+9)
CALL __fcmp
JP P,L_3
; 30 return(sign);
LD HL,(IX+-4)
LD E,(IX+-1)
JR L_4
L_3:
; 31
; 32 return(sign*sinh(arg)/cosh(arg));
LD C,(IX+9)
LD B,0
PUSH BC
LD BC,(IX+6)
PUSH BC
CALL _sinh
POP BC
POP BC
LD A,E
LD BC,HL
LD HL,(IX+-4)
LD E,(IX+-1)
CALL __fmul
LD (IX+-7),BC
LD C,(IX+9)
LD B,0
PUSH BC
LD BC,(IX+6)
PUSH BC
LD B,A
LD (IX+-10),BC
CALL _cosh
LD BC,(IX+-10)
POP IY
POP IY
LD A,B
LD BC,(IX+-7)
CALL __fdiv
LD E,A
LD HL,BC
; 33 }
L_4:
LD SP,IX
POP IX
RET
;**************************** _tanh ***************************
;Name Addr/Register Size Type
;_cosh IMPORT ----- function
;_sinh IMPORT ----- function
;sign IX-4 4 variable
;arg IX+6 4 parameter
; Stack Frame Size: 22 (bytes)
; Spill Code: 0 (instruction)
XREF _sinh:ROM
XREF _cosh:ROM
XREF __fmul:ROM
XREF __fdiv:ROM
XREF __fneg:ROM
XREF __fcmp:ROM
XREF __frameset:ROM
XDEF _tanh
END
|