
PAGE 01    DAI FIRMWARE 1E5F8-1E7D1  V1.0  Rev.1

002                         ORG   :E5F8
003                 *
004                 *
005                 *
006                 ************
007                 * FPT SQRT *
008                 ************
009                 *
010                 * MACC = SQRT (MACC).
011                 *
012                 * Method: approximation followed by Newton
013                 * iterations.
014                 *
015                 * Let X= 2^(2K)*F. Then 2^(2K) is exponent and F
016                 * is mantissa.
017                 *
018                 * Then SQRT(X)=2^K*SQRT(F). 2^K is exp/2.
019                 *      SQRT(F)=P(i):
020                 *          1st approx: P(1)=a*F+b.
021                 *                      0.5<=F<1: values a1 and b1.
022                 *                        1<=F<2: values a2 and b2.
023                 *          Iterations: P(i+1)=(P(i)+F/P(i))/2.
024                 *      Final SQRT(F): P(3).
025                 *
026                 * Exit: All registers preserved.
027                 *
028 E5F8 F5         XSQRT   PUSH  PSW
029 E5F9 C5                 PUSH  B
030 E5FA D5                 PUSH  D
031 E5FB E5                 PUSH  H
032 E5FC CDF1EB             CALL  :EBF1     Exp.byte MACC in A (2K)
033 E5FF CA3AE6             JZ    :E63A     Abort if MACC=0
034 E602 07                 RLC 
035 E603 DAD0E9             JC    :E9D0     Run argument error if nr
036                                         in MACC is negative
037 E606 07                 RLC 
038 E607 0F                 RRC 
039 E608 1F                 RAR 
040 E609 B7                 ORA   A
041 E60A 1F                 RAR             A is exp/2 (K)
042 E60B F5                 PUSH  PSW       Save it
043 E60C 3E00               MVI   A,:00     Set A=0 if lsb exp =0
044 E60E 115FE6             LXI   D,:E65F   Addr a1,b1 for 0.5<=F<1
045 E611 D218E6             JNC   :E618
046 E614 3C                 INR   A         Set A=1 if lsb exp =1
047 E615 1157E6             LXI   D,:E657   Addr a2,b2 for 1<=F<2
048 E618 77         L1E117  MOV   M,A       Init exp byte MACC
049 E619 E5                 PUSH  H         Save addr MACC
050 E61A 21E300             LXI   H,:00E3
051 E61D CD1CE1             CALL  :E11C     Copy MACC (F) into 00E3-E6
052 E620 EB                 XCHG
053 E621 E5                 PUSH  H         Save addr a/b
054 E622 CD59EA             CALL  :EA59     Calc a*F
055 E625 E1                 POP   H
056 E626 23                 INX   H
057 E627 23                 INX   H
058 E628 23                 INX   H
059 E629 23                 INX   H         Pnts to b
060 E62A CD72EA             CALL  :EA72     Calc P(1)=a*F+b
061 E62D CD3DE6             CALL  :E63D     Calc P(2)
062 E630 CD3DE6             CALL  :E63D     Calc P(3); result in MACC
063                                         and reg ABCD

PAGE 02    DAI FIRMWARE 1E5F8-1E7D1  V1.0  Rev.1

064 E633 E1                 POP   H         Get addr MACC
065 E634 C1                 POP   B         Get exp/2 (K) in B
066 E635 80                 ADD   B         Add it to exp SQRT(F)
067 E636 E67F               ANI   :7F       Result must be positive
068 E638 77                 MOV   M,A       Final exp.byte into MACC
069 E639 00                 NOP 
070 E63A C34DC1     L1E118  JMP   :C14D     Popall, ret
071                             
072                 * Calculate P(i+1):
073                             
074 E63D 21E700     L1E119  LXI   H,:00E7
075 E640 E5                 PUSH  H
076 E641 CDDBE9             CALL  :E9DB     Copy P(i) into 00E7-EA
077 E644 21E300             LXI   H,:00E3
078 E647 CDFBE9             CALL  :E9FB     Copy F from 00E3-E6 into
079                                         MACC
080 E64A E1                 POP   H
081 E64B E5                 PUSH  H
082 E64C CD20EA             CALL  :EA20     Calc F/P(i)
083 E64F E1                 POP   H
084 E650 CD72EA             CALL  :EA72     Calc P(i)+F/P(i)
085 E653 3D                 DCR   A         exp minus 1: divide by 2
086 E654 E67F               ANI   :7F       Skip sign bit
087 E656 C9                 RET 
088                             
089                 * CONSTANTS FOR 'XSQRT':
090                             
091 E657 7F         L1E275  DATA  :7F       a1: 0.578125
092 E658 D2                 DATA  :D2
093 E659 D0                 DATA  :D0
094 E65A 1C                 DATA  :1C
095                 *
096 E65B 00                 DATA  :00       b1: 0.421875
097 E65C 99                 DATA  :99
098 E65D EE                 DATA  :EE
099 E65E 14                 DATA  :14
100                 *
101 E65F 00         L1E277  DATA  :00       a2: 0.411744
102 E660 94                 DATA  :94
103 E661 00                 DATA  :00
104 E662 00                 DATA  :00
105                 *
106 E663 7F                 DATA  :7F       b2: 0.601289
107 E664 D8                 DATA  :D8
108 E665 00                 DATA  :00
109 E666 00                 DATA  :00
110                 *
111                 ***********
112                 * FPT EXP *
113                 ***********
114                 *
115                 * MACC = E ^ MACC.
116                 *
117                 * Method: Polynomial approximation.
118                 *
119                 * Let E^X = 2^n * 2^d * 2^z:
120                 *     Then X/ln2 = n + d + z.
121                 *        n: integral portion of the real number.
122                 *        d: a discrete fraction (1/8, 3/8, 5/8
123                 *           or 7/8) of the fractional part.
124                 *        z: remainder: -1/8 <= z <= 1/8.
125                 * Approximation for 2^z:

PAGE 03    DAI FIRMWARE 1E5F8-1E7D1  V1.0  Rev.1

126                 *     2^z = a0 + a1*z + a2*z^2 + .... + a5*z^5.
127                 *
128 E667 F5         XEXP    PUSH  PSW
129 E668 C5                 PUSH  B
130 E669 D5                 PUSH  D
131 E66A E5                 PUSH  H
132 E66B 3AD500             LDA   :00D5     Get exp.byte
133 E66E 32EF00             STA   :00EF     Save it
134 E671 CDEEE9             CALL  :E9EE     MACC= ABS(MACC)
135 E674 212BE7             LXI   H,:E72B   Addr 1/ln2
136 E677 CD59EA             CALL  :EA59     Calc X/ln2
137 E67A CD1EC2             CALL  :C21E     Result (n+d+z) on stack
138 E67D CD14E4             CALL  :E414     Convert MACC to INT (n)
139 E680 CD33E1             CALL  :E133     n in ABCD
140 E683 CD34C2             CALL  :C234     Get (n+d+z) from stack
141 E686 B0                 ORA   B
142 E687 B1                 ORA   C
143 E688 CA94E6             JZ    :E694     Jump if n <= 255
144                             
145                 * If X too big:
146                             
147 E68B 3AEF00             LDA   :00EF     Get exp.byte
148 E68E 2F                 CMA             Take complement
149 E68F B7                 ORA   A         Set flags for error
150 E690 37                 STC             Init error exit
151 E691 C3F5E6             JMP   :E6F5     Run error, abort
152                             
153                 * Find d:
154                             
155 E694 D5         L1E121  PUSH  D         Save n
156 E695 CD54E1             CALL  :E154     MACC = FRAC (MACC)
157 E698 11FBE6             LXI   D,:E6FB   Addr FPT(1/8)
158 E69B 2AD500             LHLD  :00D5
159 E69E B5                 ORA   L
160 E69F CAF9EF             JZ    :EFF9
161 E6A2 FE7F               CPI   :7F
162 E6A4 DAB8E6             JC    :E6B8
163 E6A7 11FFE6             LXI   D,:E6FF   Addr FPT(3/8)
164 E6AA C3B8E6             JMP   :E6B8
165 E6AD 07         L1E122  RLC 
166 E6AE 07                 RLC 
167 E6AF 1103E7             LXI   D,:E703   Addr FPT(5/8)
168 E6B2 D2B8E6             JNC   :E6B8
169 E6B5 1107E7             LXI   D,:E707   Addr FPT(7/8)
170                 *
171 E6B8 EB         L1E123  XCHG            Addr d in HL
172 E6B9 E5                 PUSH  H         Save it
173 E6BA CD6DEA             CALL  :EA6D     MACC= MACC-d (z)
174 E6BD 5F                 MOV   E,A       Exp. z in E
175 E6BE 3AEF00             LDA   :00EF     Get exp. X
176 E6C1 07                 RLC             Sign into carry
177 E6C2 F5                 PUSH  PSW       Save sign
178 E6C3 7B                 MOV   A,E       Get exp. z
179 E6C4 DCE4E9             CC    :E9E4     Evt. change sign
180 E6C7 21E300             LXI   H,:00E3
181 E6CA CDDBE9             CALL  :E9DB     Copy z into 00E3-E6
182 E6CD CDDBE9             CALL  :E9DB     and in 00E7-EA
183 E6D0 2162C4             LXI   H,:C462   Addr a0 (FPT(1))
184 E6D3 CDFBE9             CALL  :E9FB     Copy a0 into MACC
185 E6D6 212FE7             LXI   H,:E72F   Addr table a1-a5
186 E6D9 CDAAE5             CALL  :E5AA     Calc Taylor sum 2^z
187 E6DC F1                 POP   PSW       Get exp.byte X SHL 1,

PAGE 04    DAI FIRMWARE 1E5F8-1E7D1  V1.0  Rev.1

188                                         sign in CY
189 E6DD D1                 POP   D         Get addr FPT(n/8)
190 E6DE F5                 PUSH  PSW
191 E6DF 211000             LXI   H,:0010   Init offset for table L1E283
192 E6E2 D2E6E6             JNC   :E6E6     Jump if X was positive
193 E6E5 29                 DAD   H         Offset is #0020 for neg.nr.
194 E6E6 19         L1E124  DAD   D         Calc addr in L1E283
195 E6E7 CD59EA             CALL  :EA59     Calc 2^z * 2^d
196 E6EA F1                 POP   PSW       Get CY on sign of X
197 E6EB E1                 POP   H         Get n in H
198 E6EC 7C                 MOV   A,H
199 E6ED D2F2E6             JNC   :E6F2     Jump if X was positive
200 E6F0 2F                 CMA             ) Else: complement n
201 E6F1 3C                 INR   A         )
202 E6F2 CDB7C1     L1E125  CALL  :C1B7     Add exponents (n+d+z)
203 E6F5 DC4BEA     L1E126  CC    :EA4B     Evt error handling
204 E6F8 C34DC1     L1E127  JMP   :C14D     Popall, ret
205                             
206                 * CONSTANTS FOR 'XEXP':
207                             
208 E6FB 7E         L1E279  DATA  :7E       FPT(1/8)
209 E6FC 80                 DATA  :80
210 E6FD 00                 DATA  :00
211 E6FE 00                 DATA  :00
212                 *
213 E6FF 7F         L1E280  DATA  :7F       FPT(3/8)
214 E700 C0                 DATA  :C0
215 E701 00                 DATA  :00
216 E702 00                 DATA  :00
217                 *
218 E703 00         L1E281  DATA  :00       FPT(5/8)
219 E704 A0                 DATA  :A0
220 E705 00                 DATA  :00
221 E706 00                 DATA  :00
222                 *
223 E707 00         L1E282  DATA  :00       FPT(7/8)
224 E708 E0                 DATA  :E0
225 E709 00                 DATA  :00
226 E70A 00                 DATA  :00
227                 *
228                 *
229 E70B 01         L1E283  DATA  :01       2^(1/8)
230 E70C 8B                 DATA  :8B
231 E70D 95                 DATA  :95
232 E70E C2                 DATA  :C2
233                 *
234 E70F 01                 DATA  :01       2^(3/8)
235 E710 A5                 DATA  :A5
236 E711 FE                 DATA  :FE
237 E712 D7                 DATA  :D7
238                 *
239 E713 01                 DATA  :01       2^(5/8)
240 E714 C5                 DATA  :C5
241 E715 67                 DATA  :67
242 E716 2A                 DATA  :2A
243                 *
244 E717 01                 DATA  :01       2^(7/8)
245 E718 EA                 DATA  :EA
246 E719 C0                 DATA  :C0
247 E71A C7                 DATA  :C7
248                 *
249 E71B 00         L1E287  DATA  :00       2^(-1/8)

PAGE 05    DAI FIRMWARE 1E5F8-1E7D1  V1.0  Rev.1

250 E71C EA                 DATA  :EA
251 E71D C0                 DATA  :C0
252 E71E C7                 DATA  :C7
253                 *
254 E71F 00                 DATA  :00       2^(-3/8)
255 E720 C5                 DATA  :C5
256 E721 67                 DATA  :67
257 E722 2A                 DATA  :2A
258                 *
259 E723 00                 DATA  :00       2^(-5/8)
260 E724 A5                 DATA  :A5
261 E725 FE                 DATA  :FE
262 E726 D7                 DATA  :D7
263                 *
264 E727 00                 DATA  :00       2^(-7/8)
265 E728 8B                 DATA  :8B
266 E729 95                 DATA  :95
267 E72A C2                 DATA  :C2
268                 *
269                 *
270 E72B 01         L1E291  DATA  :01       1/LN2
271 E72C B8                 DATA  :B8
272 E72D AA                 DATA  :AA
273 E72E 3B                 DATA  :3B
274                 *
275                 *
276 E72F 00         L1E292  DATA  :00       a1: LN2
277 E730 B1                 DATA  :B1       0.69314718057
278 E731 72                 DATA  :72
279 E732 18                 DATA  :18
280                 *
281 E733 7E                 DATA  :7E       a2: ((LN2)^2)/2!
282 E734 F5                 DATA  :F5       0.24022648580
283 E735 FD                 DATA  :FD
284 E736 EF                 DATA  :EF
285                 *
286 E737 7C                 DATA  :7C       a3: ((LN2)^3)/3!
287 E738 E3                 DATA  :E3       0.055504105406
288 E739 58                 DATA  :58
289 E73A 46                 DATA  :46
290                 *
291 E73B 7A                 DATA  :7A       a4: ((LN2)^4)/4!
292 E73C 9D                 DATA  :9D       0.0096217389747
293 E73D A4                 DATA  :A4
294 E73E 81                 DATA  :81
295                 *
296 E73F 77                 DATA  :77       a5: ((LN2)^5)/5!
297 E740 AE                 DATA  :AE       0.0013337729375
298 E741 D1                 DATA  :D1
299 E742 FE                 DATA  :FE
300                 *
301 E743 00                 DATA  :00       End of table
302 E744 00                 DATA  :00
303                 *
304                 *******
305                 * LOG *
306                 *******
307                 *
308                 * MACC = LN (MACC).
309                 *
310                 * Method: Polynomial approximation.
311                 *

PAGE 06    DAI FIRMWARE 1E5F8-1E7D1  V1.0  Rev.1

312                 * Write X = 2^K * F (normalized written), with
313                 * 0.5<= F <1.
314                 *   If F < SQR(2)/2: J=K-1, G=2*F.
315                 *   If F > SQR(2)/2: J=K,   G=F.
316                 * Now X = 2^J * G.
317                 *
318                 * Assume G=(1+v)/(1-v), then:
319                 *       ln(X) = J*ln(2) + ln((1+v)/(1-v)).
320                 *
321                 * ln((1+v)/(1-v))=2(v+v^3/3+v^5/5+...+v^9/9).
322                 * Only terms up to v^9 are used. The term constants
323                 * are adjusted for minimum error.
324                 *
325                 * Exit: 00E3-E6: Last significant summand.
326                 *       00E7-EA: v^2.
327                 *       00EB-EE: Entry MACC (X).
328                 *       MACC:    Result.
329                 *       All registers preserved.
330                 *
331 E745 F5         XLN     PUSH  PSW
332 E746 C5                 PUSH  B
333 E747 D5                 PUSH  D
334 E748 E5                 PUSH  H
335 E749 CDF1EB             CALL  :EBF1     Check contents MACC
336 E74C CAD0E9             JZ    :E9D0     Run argument error if
337                                         MACC = 0
338 E74F B7                 ORA   A
339 E750 FAD0E9             JM    :E9D0     Error if nr is negative
340 E753 CDE9C1             CALL  :C1E9     Sign extend exp (=K)
341 E756 F5                 PUSH  PSW       Save sign extended exp
342 E757 3600               MVI   M,:00     Frig exponent
343 E759 3AD600             LDA   :00D6     Get hibyte mantissa
344 E75C FEB5               CPI   :B5       Compare with SQR(2)/2
345 E75E D26AE7             JNC   :E76A     if F < SQR(2)/2
346                             
347                 * If F > SQR(2)/2:
348                             
349 E761 2166C4             LXI   H,:C466   Addr FPT(2)
350 E764 CD59EA             CALL  :EA59     Calc MACC = 2*F (=G)
351 E767 F1                 POP   PSW       Get K
352 E768 3D                 DCR   A         J=K-1
353 E769 F5                 PUSH  PSW       Save J
354                 *
355 E76A 2162C4     FLNA    LXI   H,:C462   Addr FPT(1)
356 E76D CD72EA             CALL  :EA72     MACC = G+1
357 E770 CD1EC2             CALL  :C21E     save G+1 on stack
358 E773 2166C4             LXI   H,:C466   Addr FPT(2)
359 E776 CD6DEA             CALL  :EA6D     MACC = G-1
360 E779 210000             LXI   H,:0000
361 E77C 39                 DAD   SP        HL=SP
362 E77D CD20EA             CALL  :EA20     MACC = (G-1)/(G+1) (=v)
363 E780 33                 INX   SP        )
364 E781 33                 INX   SP        ) Suppress 4 bytes
365 E782 33                 INX   SP        ) on stack
366 E783 33                 INX   SP        )
367 E784 21E300             LXI   H,:00E3
368 E787 CDDBE9             CALL  :E9DB     Copy v into 00E3-E6
369 E78A E5                 PUSH  H         Pnts to 00E7
370 E78B CD1EC2             CALL  :C21E     Save v on stack
371 E78E 210000             LXI   H,:0000
372 E791 39         L1E273  DAD   SP        HL=SP
373 E792 CD59EA             CALL  :EA59     MACC = v^2

PAGE 07    DAI FIRMWARE 1E5F8-1E7D1  V1.0  Rev.1

374 E795 33                 INX   SP        )
375 E796 33                 INX   SP        ) Suppress 4 bytes
376 E797 33                 INX   SP        ) on stack
377 E798 33                 INX   SP        )
378 E799 E1                 POP   H         HL=00E7
379 E79A CDDBE9             CALL  :E9DB     Copy v^2 into 00E7-EA
380 E79D D1                 POP   D         Get J in D
381 E79E 7A                 MOV   A,D       )
382 E79F 17                 RAL             )
383 E7A0 9F                 SBB   A         ) Convert J from 1 byte
384 E7A1 47                 MOV   B,A       ) into 4 byte into ABCD
385 E7A2 4F                 MOV   C,A       )
386 E7A3 CD26E1             CALL  :E126     Copy ABCD into MACC
387 E7A6 CDDEE3             CALL  :E3DE     MACC = INT(MACC)
388 E7A9 21B8E7             LXI   H,:E7B8   Addr ln(2)
389 E7AC CD59EA             CALL  :EA59     MACC=MACC*ln(2) (=J*ln(2))
390 E7AF 21BCE7             LXI   H,:E7BC   Addr Taylor sum constants
391 E7B2 CDAAE5             CALL  :E5AA     Calc Taylor sum (= ln(X))
392 E7B5 C34DC1             JMP   :C14D     Popall, ret
393                             
394                 * CONSTANTS FOR 'XLN':
395                             
396 E7B8 00         L1E298  DATA  :00       LN(2)
397 E7B9 B1                 DATA  :B1
398 E7BA 72                 DATA  :72
399 E7BB 18                 DATA  :18
400                 *
401 E7BC 02         L1E299  DATA  :02       b1: FPT (2)
402 E7BD 80                 DATA  :80
403 E7BE 00                 DATA  :00
404 E7BF 00                 DATA  :00
405                 *
406 E7C0 00                 DATA  :00       b3: about 2/3
407 E7C1 AA                 DATA  :AA       0.666666564181
408 E7C2 AA                 DATA  :AA
409 E7C3 A9                 DATA  :A9
410                 *
411 E7C4 7F                 DATA  :7F       b5: about 2/5
412 E7C5 CC                 DATA  :CC       0.400018840613
413 E7C6 CF                 DATA  :CF
414 E7C7 45                 DATA  :45
415                 *
416 E7C8 7F                 DATA  :7F       b7: about 2/7
417 E7C9 91                 DATA  :91       0.2845357266
418 E7CA AE                 DATA  :AE
419 E7CB AB                 DATA  :AB
420                 *
421 E7CC 7E                 DATA  :7E       b9: about 2/9
422 E7CD 80                 DATA  :80       0.125
423 E7CE 00                 DATA  :00
424 E7CF 00                 DATA  :00
425                 *
426 E7D0 00                 DATA  :00       End of table
427 E7D1 00                 DATA  :00
428                 *
429                 *
430                 *
431 E7D2                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************

PAGE 08    DAI FIRMWARE 1E5F8-1E7D1  V1.0  Rev.1

 
FLNA   E76A   L1E117 E618   L1E118 E63A   L1E119 E63D   
L1E121 E694   L1E122 E6AD   L1E123 E6B8   L1E124 E6E6   
L1E125 E6F2   L1E126 E6F5   L1E127 E6F8   L1E273 E791   
L1E275 E657   L1E277 E65F   L1E279 E6FB   L1E280 E6FF   
L1E281 E703   L1E282 E707   L1E283 E70B   L1E287 E71B   
L1E291 E72B   L1E292 E72F   L1E298 E7B8   L1E299 E7BC   
XEXP   E667   XLN    E745   XSQRT  E5F8
