PAGE 01 DAI FIRMWARE 1E5F8-1E7D1 V1.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.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.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 * 144 *********** 145 * FPT EXP * 146 *********** 147 * 148 * Test for overflow is modified. Overflow occurs 149 * for e^X when -45 < X < 43.6. 150 * This is checked now before exponent routine is 151 * entered. 152 * 153 E688 CAC9EF JZ :EFC9 Jump if n <= 255 154 155 * If X too big: 156 157 E68B 3AEF00 LDA :00EF Get exp.byte 158 E68E 2F CMA Take complement 159 E68F B7 ORA A Set flags for error 160 E690 37 STC Init error exit 161 E691 C3F5E6 JMP :E6F5 Run error, abort 162 163 * Find d: 164 165 E694 D5 L1E121 PUSH D Save n 166 E695 CD54E1 CALL :E154 MACC = FRAC (MACC) 167 E698 11FBE6 LXI D,:E6FB Addr FPT(1/8) 168 E69B 2AD500 LHLD :00D5 169 E69E B5 ORA L 170 E69F CAF9EF JZ :EFF9 171 E6A2 FE7F CPI :7F 172 E6A4 DAB8E6 JC :E6B8 173 E6A7 11FFE6 LXI D,:E6FF Addr FPT(3/8) 174 E6AA C3B8E6 JMP :E6B8 175 E6AD 07 L1E122 RLC 176 E6AE 07 RLC 177 E6AF 1103E7 LXI D,:E703 Addr FPT(5/8) 178 E6B2 D2B8E6 JNC :E6B8 179 E6B5 1107E7 LXI D,:E707 Addr FPT(7/8) 180 * 181 E6B8 EB L1E123 XCHG Addr d in HL 182 E6B9 E5 PUSH H Save it 183 E6BA CD6DEA CALL :EA6D MACC= MACC-d (z) 184 E6BD 5F MOV E,A Exp. z in E 185 E6BE 3AEF00 LDA :00EF Get exp. X 186 E6C1 07 RLC Sign into carry 187 E6C2 F5 PUSH PSW Save sign PAGE 04 DAI FIRMWARE 1E5F8-1E7D1 V1.1 188 E6C3 7B MOV A,E Get exp. z 189 E6C4 DCE4E9 CC :E9E4 Evt. change sign 190 E6C7 21E300 LXI H,:00E3 191 E6CA CDDBE9 CALL :E9DB Copy z into 00E3-E6 192 E6CD CDDBE9 CALL :E9DB and in 00E7-EA 193 E6D0 2162C4 LXI H,:C462 Addr a0 (FPT(1)) 194 E6D3 CDFBE9 CALL :E9FB Copy a0 into MACC 195 E6D6 212FE7 LXI H,:E72F Addr table a1-a5 196 E6D9 CDAAE5 CALL :E5AA Calc Taylor sum 2^z 197 E6DC F1 POP PSW Get exp.byte X SHL 1, 198 sign in CY 199 E6DD D1 POP D Get addr FPT(n/8) 200 E6DE F5 PUSH PSW 201 E6DF 211000 LXI H,:0010 Init offset for table L1E283 202 E6E2 D2E6E6 JNC :E6E6 Jump if X was positive 203 E6E5 29 DAD H Offset is #0020 for neg.nr. 204 E6E6 19 L1E124 DAD D Calc addr in L1E283 205 E6E7 CD59EA CALL :EA59 Calc 2^z * 2^d 206 E6EA F1 POP PSW Get CY on sign of X 207 E6EB E1 POP H Get n in H 208 E6EC 7C MOV A,H 209 E6ED D2F2E6 JNC :E6F2 Jump if X was positive 210 E6F0 2F CMA ) Else: complement n 211 E6F1 3C INR A ) 212 E6F2 CDB7C1 L1E125 CALL :C1B7 Add exponents (n+d+z) 213 E6F5 DC4BEA L1E126 CC :EA4B Evt error handling 214 E6F8 C34DC1 L1E127 JMP :C14D Popall, ret 215 216 * CONSTANTS FOR 'XEXP': 217 218 E6FB 7E L1E279 DATA :7E FPT(1/8) 219 E6FC 80 DATA :80 220 E6FD 00 DATA :00 221 E6FE 00 DATA :00 222 * 223 E6FF 7F L1E280 DATA :7F FPT(3/8) 224 E700 C0 DATA :C0 225 E701 00 DATA :00 226 E702 00 DATA :00 227 * 228 E703 00 L1E281 DATA :00 FPT(5/8) 229 E704 A0 DATA :A0 230 E705 00 DATA :00 231 E706 00 DATA :00 232 * 233 E707 00 L1E282 DATA :00 FPT(7/8) 234 E708 E0 DATA :E0 235 E709 00 DATA :00 236 E70A 00 DATA :00 237 * 238 * 239 E70B 01 L1E283 DATA :01 2^(1/8) 240 E70C 8B DATA :8B 241 E70D 95 DATA :95 242 E70E C2 DATA :C2 243 * 244 E70F 01 DATA :01 2^(3/8) 245 E710 A5 DATA :A5 246 E711 FE DATA :FE 247 E712 D7 DATA :D7 248 * 249 E713 01 DATA :01 2^(5/8) PAGE 05 DAI FIRMWARE 1E5F8-1E7D1 V1.1 250 E714 C5 DATA :C5 251 E715 67 DATA :67 252 E716 2A DATA :2A 253 * 254 E717 01 DATA :01 2^(7/8) 255 E718 EA DATA :EA 256 E719 C0 DATA :C0 257 E71A C7 DATA :C7 258 * 259 E71B 00 L1E287 DATA :00 2^(-1/8) 260 E71C EA DATA :EA 261 E71D C0 DATA :C0 262 E71E C7 DATA :C7 263 * 264 E71F 00 DATA :00 2^(-3/8) 265 E720 C5 DATA :C5 266 E721 67 DATA :67 267 E722 2A DATA :2A 268 * 269 E723 00 DATA :00 2^(-5/8) 270 E724 A5 DATA :A5 271 E725 FE DATA :FE 272 E726 D7 DATA :D7 273 * 274 E727 00 DATA :00 2^(-7/8) 275 E728 8B DATA :8B 276 E729 95 DATA :95 277 E72A C2 DATA :C2 278 * 279 * 280 E72B 01 L1E291 DATA :01 1/LN2 281 E72C B8 DATA :B8 282 E72D AA DATA :AA 283 E72E 3B DATA :3B 284 * 285 * 286 E72F 00 L1E292 DATA :00 a1: LN2 287 E730 B1 DATA :B1 0.69314718057 288 E731 72 DATA :72 289 E732 18 DATA :18 290 * 291 E733 7E DATA :7E a2: ((LN2)^2)/2! 292 E734 F5 DATA :F5 0.24022648580 293 E735 FD DATA :FD 294 E736 EF DATA :EF 295 * 296 E737 7C DATA :7C a3: ((LN2)^3)/3! 297 E738 E3 DATA :E3 0.055504105406 298 E739 58 DATA :58 299 E73A 46 DATA :46 300 * 301 E73B 7A DATA :7A a4: ((LN2)^4)/4! 302 E73C 9D DATA :9D 0.0096217389747 303 E73D A4 DATA :A4 304 E73E 81 DATA :81 305 * 306 E73F 77 DATA :77 a5: ((LN2)^5)/5! 307 E740 AE DATA :AE 0.0013337729375 308 E741 D1 DATA :D1 309 E742 FE DATA :FE 310 * 311 E743 00 DATA :00 End of table PAGE 06 DAI FIRMWARE 1E5F8-1E7D1 V1.1 312 E744 00 DATA :00 313 * 314 ******* 315 * LOG * 316 ******* 317 * 318 * MACC = LN (MACC). 319 * 320 * Method: Polynomial approximation. 321 * 322 * Write X = 2^K * F (normalized written), with 323 * 0.5<= F <1. 324 * If F < SQR(2)/2: J=K-1, G=2*F. 325 * If F > SQR(2)/2: J=K, G=F. 326 * Now X = 2^J * G. 327 * 328 * Assume G=(1+v)/(1-v), then: 329 * ln(X) = J*ln(2) + ln((1+v)/(1-v)). 330 * 331 * ln((1+v)/(1-v))=2(v+v^3/3+v^5/5+...+v^9/9). 332 * Only terms up to v^9 are used. The term constants 333 * are adjusted for minimum error. 334 * 335 * Exit: 00E3-E6: Last significant summand. 336 * 00E7-EA: v^2. 337 * 00EB-EE: Entry MACC (X). 338 * MACC: Result. 339 * All registers preserved. 340 * 341 E745 F5 XLN PUSH PSW 342 E746 C5 PUSH B 343 E747 D5 PUSH D 344 E748 E5 PUSH H 345 E749 CDF1EB CALL :EBF1 Check contents MACC 346 E74C CAD0E9 JZ :E9D0 Run argument error if 347 MACC = 0 348 E74F B7 ORA A 349 E750 FAD0E9 JM :E9D0 Error if nr is negative 350 E753 CDE9C1 CALL :C1E9 Sign extend exp (=K) 351 E756 F5 PUSH PSW Save sign extended exp 352 E757 3600 MVI M,:00 Frig exponent 353 E759 3AD600 LDA :00D6 Get hibyte mantissa 354 E75C FEB5 CPI :B5 Compare with SQR(2)/2 355 E75E D26AE7 JNC :E76A if F < SQR(2)/2 356 357 * If F > SQR(2)/2: 358 359 E761 2166C4 LXI H,:C466 Addr FPT(2) 360 E764 CD59EA CALL :EA59 Calc MACC = 2*F (=G) 361 E767 F1 POP PSW Get K 362 E768 3D DCR A J=K-1 363 E769 F5 PUSH PSW Save J 364 * 365 E76A 2162C4 FLNA LXI H,:C462 Addr FPT(1) 366 E76D CD72EA CALL :EA72 MACC = G+1 367 E770 CD1EC2 CALL :C21E save G+1 on stack 368 E773 2166C4 LXI H,:C466 Addr FPT(2) 369 E776 CD6DEA CALL :EA6D MACC = G-1 370 E779 210000 LXI H,:0000 371 E77C 39 DAD SP HL=SP 372 E77D CD20EA CALL :EA20 MACC = (G-1)/(G+1) (=v) 373 E780 33 INX SP ) PAGE 07 DAI FIRMWARE 1E5F8-1E7D1 V1.1 374 E781 33 INX SP ) Suppress 4 bytes 375 E782 33 INX SP ) on stack 376 E783 33 INX SP ) 377 E784 21E300 LXI H,:00E3 378 E787 CDDBE9 CALL :E9DB Copy v into 00E3-E6 379 E78A E5 PUSH H Pnts to 00E7 380 E78B CD1EC2 CALL :C21E Save v on stack 381 E78E 210000 LXI H,:0000 382 E791 39 L1E273 DAD SP HL=SP 383 E792 CD59EA CALL :EA59 MACC = v^2 384 E795 33 INX SP ) 385 E796 33 INX SP ) Suppress 4 bytes 386 E797 33 INX SP ) on stack 387 E798 33 INX SP ) 388 E799 E1 POP H HL=00E7 389 E79A CDDBE9 CALL :E9DB Copy v^2 into 00E7-EA 390 E79D D1 POP D Get J in D 391 E79E 7A MOV A,D ) 392 E79F 17 RAL ) 393 E7A0 9F SBB A ) Convert J from 1 byte 394 E7A1 47 MOV B,A ) into 4 byte into ABCD 395 E7A2 4F MOV C,A ) 396 E7A3 CD26E1 CALL :E126 Copy ABCD into MACC 397 E7A6 CDDEE3 CALL :E3DE MACC = INT(MACC) 398 E7A9 21B8E7 LXI H,:E7B8 Addr ln(2) 399 E7AC CD59EA CALL :EA59 MACC=MACC*ln(2) (=J*ln(2)) 400 E7AF 21BCE7 LXI H,:E7BC Addr Taylor sum constants 401 E7B2 CDAAE5 CALL :E5AA Calc Taylor sum (= ln(X)) 402 E7B5 C34DC1 JMP :C14D Popall, ret 403 404 * CONSTANTS FOR 'XLN': 405 406 E7B8 00 L1E298 DATA :00 LN(2) 407 E7B9 B1 DATA :B1 408 E7BA 72 DATA :72 409 E7BB 18 DATA :18 410 * 411 E7BC 02 L1E299 DATA :02 b1: FPT (2) 412 E7BD 80 DATA :80 413 E7BE 00 DATA :00 414 E7BF 00 DATA :00 415 * 416 E7C0 00 DATA :00 b3: about 2/3 417 E7C1 AA DATA :AA 0.666666564181 418 E7C2 AA DATA :AA 419 E7C3 A9 DATA :A9 420 * 421 E7C4 7F DATA :7F b5: about 2/5 422 E7C5 CC DATA :CC 0.400018840613 423 E7C6 CF DATA :CF 424 E7C7 45 DATA :45 425 * 426 E7C8 7F DATA :7F b7: about 2/7 427 E7C9 91 DATA :91 0.2845357266 428 E7CA AE DATA :AE 429 E7CB AB DATA :AB 430 * 431 E7CC 7E DATA :7E b9: about 2/9 432 E7CD 80 DATA :80 0.125 433 E7CE 00 DATA :00 434 E7CF 00 DATA :00 435 * PAGE 08 DAI FIRMWARE 1E5F8-1E7D1 V1.1 436 E7D0 00 DATA :00 End of table 437 E7D1 00 DATA :00 438 * 439 * 440 * 441 E7D2 END *************************** * S Y M B O L T A B L E * *************************** 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