PAGE 01 DAI FIRMWARE 1E7D2-1EA0D V1.0 Rev.1 002 ORG :E7D2 003 * 004 * 005 * 006 ******* 007 * SIN * 008 ******* 009 * 010 * MACC = SIN (MACC) (Angle expressed in radians). 011 * 012 * See XCOS for explanation. 013 * 014 E7D2 F5 XSIN PUSH PSW 015 E7D3 C5 PUSH B 016 E7D4 D5 PUSH D 017 E7D5 E5 PUSH H 018 E7D6 C3E3E7 JMP :E7E3 To common part XSIN/XCOS 019 * 020 ******* 021 * COS * 022 ******* 023 * 024 * MACC = COS (MACC) (Angle expressed in radians). 025 * 026 * Method: Polynomial approximation. 027 * 028 * Cos(X) is converted: cos(X) = sin(X+PI/2). 029 * 030 * Given X, N and Y are defined for: 031 * X/(2*PI) = N + Y; N is integer part. 032 * 033 * All arguments are converted to a range -PI/2 to 034 * +PI/2: 035 * sin(N*2*PI+K) = sin(K) 036 * sin(PI/2+K) = sin(PI/2-K) 037 * sin(PI*3/2+K) = sin(PI*3/2-K) 038 * sin(-PI/2+K) = sin(-PI/2-K). 039 * 040 * Polynomial approx. F(Y) for sin(2*PI*Y) is: 041 * F(Y) = a1*Y + a2*Y^3 + ... + a5*Y^9. 042 * 043 E7D9 F5 XCOS PUSH PSW 044 E7DA C5 PUSH B 045 E7DB D5 PUSH D 046 E7DC E5 PUSH H 047 E7DD 2133E8 LXI H,:E833 Addr PI/2 048 E7E0 CD72EA CALL :EA72 X = X + PI/2 049 050 * Entry from XSIN: 051 052 E7E3 213FE8 L1E132 LXI H,:E83F Addr PI*2 053 E7E6 CD20EA CALL :EA20 MACC = X/(2*PI) = N+Y 054 E7E9 CD54E1 CALL :E154 Get FRAC(MACC) = Y 055 E7EC 21D500 LXI H,:00D5 Addr MACC 056 E7EF 7E MOV A,M Get exp.byte 057 E7F0 E67F ANI :7F Exp only 058 E7F2 CAFAE7 JZ :E7FA Jump if exp is 0 059 E7F5 FE7E CPI :7E 060 E7F7 DA18E8 JC :E818 Jump if exp < 7E 061 E7FA BE L1E133 CMP M Comp masked/non-masked exp 062 E7FB 2162C4 LXI H,:C462 Addr FPT (1) 063 E7FE C472EA CNZ :EA72 Add 1 to Y if X negative PAGE 02 DAI FIRMWARE 1E7D2-1EA0D V1.0 Rev.1 064 E801 2137E8 LXI H,:E837 Addr FPT (0.25) 065 E804 E5 PUSH H Save pntr 066 E805 CD6DEA CALL :EA6D MACC = MACC - 0.25 067 E808 CDEEE9 CALL :E9EE Take abs. value 068 E80B 213BE8 LXI H,:E83B Addr FPT (0.5) 069 E80E CD6DEA CALL :EA6D MACC = MACC - 0.5 070 E811 CDEEE9 CALL :E9EE Take abs. value 071 E814 E1 POP H Get addr FPT (0.25) 072 E815 CD6DEA CALL :EA6D MACC = MACC - 0.25 073 E818 21E300 L1E134 LXI H,:00E3 074 E81B E5 PUSH H 075 E81C CDD6E9 CALL :E9D6 Copy MACC into 00E3-E6 076 E81F E3 XTHL HL=00E3; stack: 00E7 077 E820 CD59EA CALL :EA59 MACC = 2 * MACC 078 E823 E1 POP H HL=00E7 079 E824 CDDBE9 CALL :E9DB Copy 2*MACC into 00E7-EA 080 E827 CD16EA CALL :EA16 Clear MACC + reg ABCD 081 E82A 213FE8 LXI H,:E83F Addr Taylor sum constants 082 E82D CDAAE5 CALL :E5AA Calc Taylor sum 083 E830 C34DC1 JMP :C14D Popall, ret 084 085 * CONSTANTS FOR 'XSIN' AND 'XCOS': 086 087 E833 01 FPHPI DATA :01 FPT (PI/2) 088 E834 C9 DATA :C9 089 E835 0F DATA :0F 090 E836 DB DATA :DB 091 * 092 E837 7F L1E304 DATA :7F FPT (0.25) 093 E838 80 DATA :80 094 E839 00 DATA :00 095 E83A 00 DATA :00 096 * 097 E83B 00 L1E305 DATA :00 FPT (0.5) 098 E83C 80 DATA :80 099 E83D 00 DATA :00 100 E83E 00 DATA :00 101 * 102 E83F 03 L1E306 DATA :03 a1: about PI*2 103 E840 C9 DATA :C9 6.2831853 104 E841 0F DATA :0F 105 E842 DB DATA :DB 106 * 107 E843 86 DATA :86 a2: about -(PI*2)^3/3! 108 E844 A5 DATA :A5 -41.341681 109 E845 5D DATA :5D 110 E846 E2 DATA :E2 111 * 112 E847 07 DATA :07 a3: about (PI*2)^5/5! 113 E848 A3 DATA :A3 81.602481 114 E849 34 DATA :34 115 E84A 78 DATA :78 116 * 117 E84B 87 DATA :87 a4: about -(PI*2)^7/7! 118 E84C 99 DATA :99 -76.581285 119 E84D 29 DATA :29 120 E84E 9E DATA :9E 121 * 122 E84F 06 DATA :06 a5: about (PI*2)^9/9! 123 E850 9F DATA :9F 39.760722 124 E851 0A DATA :0A 125 E852 FB DATA :FB PAGE 03 DAI FIRMWARE 1E7D2-1EA0D V1.0 Rev.1 126 * 127 E853 00 DATA :00 End of table 128 E854 00 DATA :00 129 * 130 ********* 131 * POWER * 132 ********* 133 * 134 * MACC = MACC ^ MEM. 135 * 136 * Entry: HL points to power in memory. 137 * Exit: All registers preserved. 138 * 139 * Conditions for a^X: 140 * a > 0. 141 * ABS (x*ln(a)) in valid range. 142 * 143 * Method: a^X = e^(X*ln(a)). 144 * 145 E855 F5 XPWR PUSH PSW 146 E856 C5 PUSH B 147 E857 D5 PUSH D 148 E858 E5 PUSH H 149 E859 E5 PUSH H Save addr X 150 E85A CDF8E9 CALL :E9F8 Get a in reg ABCD 151 E85D E1 POP H Restore addr X 152 E85E CA6DE8 JZ :E86D Abort if a = 0 153 E861 FAD0E9 JM :E9D0 Argument error if nr < 0 154 E864 CD45E7 CALL :E745 MACC = ln(a) 155 E867 CD59EA CALL :EA59 MACC = X*ln(a) 156 E86A CD67E6 CALL :E667 MACC = e^(X*ln(a)) 157 E86D C34DC1 XPW10 JMP :C14D Popall, ret 158 * 159 ******** 160 * LOGT * 161 ******** 162 * 163 * MACC = LOG (MACC). 164 * 165 * Method: log(X) = ln(x) / ln(10). 166 * 167 * Exit: All registers preserved. 168 * 169 E870 F5 XLOG PUSH PSW 170 E871 C5 PUSH B 171 E872 D5 PUSH D 172 E873 E5 PUSH H 173 E874 CD45E7 CALL :E745 MACC = ln(ABS(X)) 174 E877 2190E8 LXI H,:E890 Addr 1/ln(10) 175 E87A CD59EA CALL :EA59 MACC = ln(x)/ln(10) 176 E87D C34DC1 JMP :C14D Popall, ret 177 * 178 ******** 179 * ALOG * 180 ******** 181 * 182 * MACC = ALOG (MACC). 183 * 184 * Method: 10^X = e^(X*ln(10)). 185 * 186 * Exit: All registers preserved. 187 * PAGE 04 DAI FIRMWARE 1E7D2-1EA0D V1.0 Rev.1 188 E880 F5 XALOG PUSH PSW 189 E881 C5 PUSH B 190 E882 D5 PUSH D 191 E883 E5 PUSH H 192 E884 2190E8 LXI H,:E890 Addr 1/ln(10) 193 E887 CD20EA CALL :EA20 MACC = X*ln(10) 194 E88A CD67E6 CALL :E667 MACC = e^(X*ln(10)) 195 E88D C34DC1 JMP :C14D Popall, ret 196 197 * CONSTANT FOR 'XLOG' AND 'XALOG': 198 199 E890 7F FLGTI DATA :7F 1/ln(10) 200 E891 DE DATA :DE 201 E892 5B DATA :5B 202 E893 D9 DATA :D9 203 * 204 ******* 205 * TAN * 206 ******* 207 * 208 * MACC = TAN (MACC) (Angle in radians). 209 * 210 * Method: tan(X) = sin(X)/cos(X). 211 * In-accurate for X close to 0 or close 212 * to n*PI/2. 213 * 214 * Exit: All registers preserved. 215 * 216 E894 E5 XTAN PUSH H 217 E895 CD1EC2 CALL :C21E Save X on stack 218 E898 CDD9E7 CALL :E7D9 MACC = cos(X) 219 E89B 21EF00 LXI H,:00EF 220 E89E CD1CE1 CALL :E11C Store cos(X) in 00EF-F2 221 E8A1 CD34C2 CALL :C234 Get X from stack 222 E8A4 CDD2E7 CALL :E7D2 MACC = sin(X) 223 E8A7 CD08E1 CALL :E108 MACC = sin(X)/cos(X) 224 E8AA E1 POP H 225 E8AB C9 RET 226 * 227 ******** 228 * ATAN * 229 ******** 230 * 231 * MACC = ATAN (MACC) (Angle expressed in radians). 232 * 233 * Method: Polynomial approximation. 234 * 235 * ATAN(Z) for -0.25 <= Z <= 0.25 approximated by: 236 * F(X) = X*(1 - Q1*X^2 + Q2*X^4 - Q3*X^6). 237 * 238 * To cope with range: 239 * ATAN(-Z) = - ATAN(Z). 240 * ATAN(Z) = a(k) + ATAN((Z-b(k))/(Z*b(k)+1)), 241 * with k = 1, 2 or 3, 242 * a(k) = k*PI/7, 243 * b(k) = TAN(a(k)) 244 * 245 * Values for k: 246 * k=0 if ABS(Z) < 0.25 247 * k=1 if 0.25 < ABS(Z) < 0.75 248 * k=2 if 0.75 < ABS(Z) < 2 249 * k=3 if ABS(Z) > 2. PAGE 05 DAI FIRMWARE 1E7D2-1EA0D V1.0 Rev.1 250 * 251 * Then X = (Z-b(k))/(Z*b(k)+1), and 252 * ATAN(Z) = a(k) + F(X), if Z >= 0 253 * ATAN(Z) = -a(k) - F(X), if Z < 0. 254 * 255 E8AC F5 XATAN PUSH PSW 256 E8AD C5 PUSH B 257 E8AE D5 PUSH D 258 E8AF E5 PUSH H 259 E8B0 CDF1EB CALL :EBF1 Check if Z=0 260 E8B3 CA43E9 JZ :E943 Then abort 261 E8B6 F5 PUSH PSW Save exp byte 262 E8B7 CDEEE9 CALL :E9EE reg ABCD = ABS(Z) 263 E8BA 21EF00 LXI H,:00EF 264 E8BD CDDBE9 CALL :E9DB Copy ABS(Z) into 00EF-F2 265 266 * Calculate k: 267 268 E8C0 FE40 CPI :40 269 E8C2 DAD3E8 JC :E8D3 Jump if exp < #40 270 E8C5 FE7F CPI :7F 271 E8C7 3E01 MVI A,:01 272 E8C9 CAE6E8 JZ :E8E6 k=1 if exp=#7F 273 E8CC 215EC4 LXI H,:C45E Addr FPT(0) 274 E8CF E5 PUSH H 275 E8D0 C315E9 JMP :E915 Cont with k=1, a(k)=0 276 E8D3 FE01 L1E141 CPI :01 277 E8D5 3E02 MVI A,:02 278 E8D7 CAE6E8 JZ :E8E6 k=2 if exp=1 279 E8DA D2E3E8 JNC :E8E3 k=3 if exp >1 280 E8DD 78 MOV A,B Get hibyte mantissa 281 E8DE 07 RLC 282 E8DF 07 RLC 283 E8E0 3E01 MVI A,:01 k=1 if (B)= 10... 284 k=2 if (B)= 11... 285 E8E2 3F CMC 286 E8E3 3F L1E142 CMC 287 E8E4 CE00 ACI :00 288 * 289 E8E6 87 L1E143 ADD A Final k in A 290 E8E7 87 ADD A 291 E8E8 87 ADD A *8 292 E8E9 213EE9 LXI H,:E93E Startaddr for a,b table 293 E8EC 5F MOV E,A ) 294 E8ED 1600 MVI D,:00 ) offset in DE 295 E8EF 19 DAD D 296 E8F0 E5 PUSH H Addr a(k) 297 E8F1 110400 LXI D,:0004 298 E8F4 19 DAD D 299 E8F5 E5 PUSH H Addr b(k) 300 E8F6 CD59EA CALL :EA59 MACC = Z*b(k) 301 E8F9 2162C4 LXI H,:C462 Addr FPT(1) 302 E8FC CD72EA CALL :EA72 MACC = Z*b(k)+1 303 E8FF 21DF00 LXI H,:00DF 304 E902 CDDBE9 CALL :E9DB (Z*b(k)+1) into 00DF-E2 305 E905 21EF00 LXI H,:00EF 306 E908 CDFBE9 CALL :E9FB ABS(Z) in MACC 307 E90B E1 POP H Addr b(k) 308 E90C CD6DEA CALL :EA6D MACC = Z-b(k) 309 E90F 21DF00 LXI H,:00DF 310 E912 CD20EA CALL :EA20 MACC = X = 311 = (Z-b(k))/(Z*b(k)+1) PAGE 06 DAI FIRMWARE 1E7D2-1EA0D V1.0 Rev.1 312 E915 21EF00 L1E144 LXI H,:00EF 313 E918 E5 PUSH H 314 E919 E5 PUSH H 315 E91A CDD6E9 CALL :E9D6 Copy X into 00EF-F2 316 E91D E1 POP H 317 E91E CD59EA CALL :EA59 MACC = X^2 318 E921 21E300 LXI H,:00E3 319 E924 CDDBE9 CALL :E9DB Copy X^2 into 00E3-E6 320 E927 CDDBE9 CALL :E9DB Copy X^2 into 00E7-EA 321 E92A 2162C4 LXI H,:C462 Addr FPT(1) 322 E92D CDFBE9 CALL :E9FB Copy FPT(1) into MACC 323 E930 215EE9 LXI H,:E95E Start table Taylor constants 324 E933 CDAAE5 CALL :E5AA Calc Taylor sum 325 E936 E1 POP H 326 E937 CD59EA CALL :EA59 Taylor sum * X (=F(X)) 327 E93A E1 POP H 328 E93B CD72EA CALL :EA72 Add a(k) (= ATAN(Z)) 329 E93E F1 POP PSW Get orig. exp byte 330 E93F B7 ORA A Was Z negative ? 331 E940 FCE4E9 CM :E9E4 Then MACC = - ATAN(Z) 332 E943 C34DC1 L1E145 JMP :C14D Popall, ret 333 334 * CONSTANTS FOR 'XATN': 335 336 E946 7F FATC1 DATA :7F a(1): PI/7 337 E947 E5 DATA :E5 0.4487989506 338 E948 C8 DATA :C8 339 E949 FA DATA :FA 340 * 341 E94A 7F DATA :7F b(1): TAN(a(1)) 342 E94B F6 DATA :F6 0.4815746188 343 E94C 90 DATA :90 344 E94D F3 DATA :F3 345 * 346 E94E 00 DATA :00 a(2): 2*PI/7 347 E94F E5 DATA :E5 0.8975979011 348 E950 C8 DATA :C8 349 E951 FA DATA :FA 350 * 351 E952 01 DATA :01 b(2): TAN(a(1)) 352 E953 A0 DATA :A0 1.253960337 353 E954 81 DATA :81 354 E955 C6 DATA :C6 355 * 356 E956 01 DATA :01 a(3): 3*PI/7 357 E957 AC DATA :AC 1.346396852 358 E958 56 DATA :56 359 E959 BB DATA :BB 360 * 361 E95A 03 DATA :03 b(3): TAN(a(3)) 362 E95B 8C DATA :8C 4.381286272 363 E95C 33 DATA :33 364 E95D 7F DATA :7F 365 * 366 E95E FF FATPL DATA :FF Q1: about -1/3 367 E95F AA DATA :AA -0.333329573 368 E960 AA DATA :AA 369 E961 2D DATA :2D 370 * 371 E962 7E DATA :7E Q2: about 1/5 372 E963 CC DATA :CC 0.199641035 373 E964 6E DATA :6E PAGE 07 DAI FIRMWARE 1E7D2-1EA0D V1.0 Rev.1 374 E965 B3 DATA :B3 375 * 376 E966 FE DATA :FE Q3: about -1/7 377 E967 86 DATA :86 -0.131779888 378 E968 F1 DATA :F1 379 E969 4F DATA :4F 380 * 381 E96A 00 DATA :00 End of table 382 E96B 00 DATA :00 383 * 384 ******** 385 * ASIN * 386 ******** 387 * 388 * MACC = ASIN (MACC). Result in radians. 389 * 390 * Range: -PI/2 < X < PI/2. 391 * 392 * Method: ASIN(X) = ATAN(X/SQR(1-x^2)). 393 * 394 * Exit: All registers preserved. 395 * 396 E96C F5 XASIN PUSH PSW 397 E96D C5 PUSH B 398 E96E D5 PUSH D 399 E96F E5 PUSH H 400 E970 CDF8E9 CALL :E9F8 Get X in reg ABCD 401 E973 5F MOV E,A Exp byte in E 402 E974 E67F ANI :7F Mask sign 403 E976 FE01 CPI :01 404 E978 DA99E9 JC :E999 Jump if in range 405 E97B C294E9 JNZ :E994 If >2 or <1 406 E97E 78 MOV A,B ) 407 E97F E67F ANI :7F ) Check if mantissa 408 E981 B1 ORA C ) = 80 00 00 (= +/- 1) 409 E982 B2 ORA D ) 410 E983 C2D0E9 JNZ :E9D0 Error if not 411 E986 7B MOV A,E Get exp 412 E987 B7 ORA A Set flags on it 413 E988 2133E8 LXI H,:E833 Addr PI/2 414 E98B CD12E1 CALL :E112 Copy PI/2 into MACC 415 E98E FCE4E9 CM :E9E4 If nr <0: MACC = -PI/2 416 E991 C34DC1 FASRET JMP :C14D Popall, ret 417 * 418 E994 FE40 FAS10 CPI :40 419 E996 DAD0E9 JC :E9D0 Error if exp <#40 420 E999 CD1EC2 FAS20 CALL :C21E Save X on stack 421 E99C 210000 LXI H,:0000 422 E99F 39 DAD SP HL=SP 423 E9A0 CD59EA CALL :EA59 MACC = X^2 424 E9A3 CDE4E9 CALL :E9E4 MACC = -X^2 425 E9A6 2162C4 LXI H,:C462 Addr FPT(1) 426 E9A9 CD72EA CALL :EA72 MACC = 1-X^2 427 E9AC CDF8E5 CALL :E5F8 MACC = SQR(1-X^2) 428 E9AF 21EF00 LXI H,:00EF 429 E9B2 CD1CE1 CALL :E11C SQR(1-X^2) in 00EF-F2 430 E9B5 CD34C2 CALL :C234 Get X from stack in MACC 431 E9B8 CD08E1 CALL :E108 MACC = X/(SQR(1-X^2)) 432 E9BB CDACE8 CALL :E8AC MACC = ATAN (MACC) 433 E9BE C391E9 JMP :E991 Ready 434 * 435 * PAGE 08 DAI FIRMWARE 1E7D2-1EA0D V1.0 Rev.1 436 ******** 437 * ACOS * 438 ******** 439 * 440 * MACC = ACOS (MACC). Result in radians. 441 * 442 * Range: 0 < X < PI. 443 * 444 * Method: ACOS(X) = PI/2 - ASIN(X). 445 * 446 * Exit: All registers preserved. 447 * 448 E9C1 CD6CE9 XACOS CALL :E96C MACC = ASIN(X) 449 E9C4 CD4AE1 CALL :E14A MACC = -ASIN(X) 450 E9C7 E5 PUSH H 451 E9C8 2133E8 LXI H,:E833 Addr PI/2 452 E9CB CDAAED CALL :EDAA MACC = PI/2-ASIN(X) 453 E9CE E1 POP H 454 E9CF C9 RET 455 456 * Error exit: 457 458 E9D0 CD5EC0 FASER CALL :C05E Run argument error 459 E9D3 C391E9 JMP :E991 Abort 460 * 461 ******************************************* 462 * COPY MACC INTO OPERAND AND INTO A,B,C,D * 463 ******************************************* 464 * 465 * Entry: HL points to operand. 466 * Exit: HL points past operand. 467 * AFBCD set as for ATEST. 468 * 469 * From ASTORE used to store reg A,B,C,D into 470 * an operand, pointed at by HL. 471 * 472 E9D6 E5 ASAVE PUSH H 473 E9D7 CDF8E9 CALL :E9F8 Copy MEM into MACC and ABCD 474 E9DA E1 POP H 475 E9DB 77 ASTORE MOV M,A ) 476 E9DC 23 INX H ) 477 E9DD 70 MOV M,B ) Copy reg A,B,C,D into MEM 478 E9DE 23 INX H ) 479 E9DF 71 MOV M,C ) 480 E9E0 23 INX H ) 481 E9E1 72 MOV M,D ) 482 E9E2 23 INX H 483 E9E3 C9 RET 484 * 485 ******************************* 486 * SUBROUTINE CHANGE SIGN MACC * 487 ******************************* 488 * 489 E9E4 CDF1EB ACHGS CALL :EBF1 Check if MACC empty 490 E9E7 C8 RZ Then ready 491 E9E8 0180FF LXI B,:FF80 Set mask 492 E9EB C3F1E9 JMP :E9F1 Change sign bit 493 * 494 ***************************** 495 * SUBROUTINE FPT ABS (MACC) * 496 ***************************** 497 * PAGE 09 DAI FIRMWARE 1E7D2-1EA0D V1.0 Rev.1 498 * From ATEST also used to copy MACC into ABCD. 499 * From L1E158 used to copy operand (pointed at 500 * by HL) into ABCD and into MACC. 501 * 502 E9EE 01007F L1E155 LXI B,:7F00 Set mask 503 E9F1 21D500 L1E156 LXI H,:00D5 Addr MACC 504 E9F4 78 MOV A,B Mask in A 505 E9F5 A6 ANA M AND exp byte with mask 506 E9F6 A9 XRA C Set sign bit = 0 507 E9F7 77 MOV M,A Update exp byte MACC 508 * 509 E9F8 21D500 ATEST LXI H,:00D5 Addr MACC 510 E9FB CDF4EB L1E158 CALL :EBF4 Check if MEM = 0, get 511 exp byte in A 512 E9FE CA16EA JZ :EA16 Then clear MACC + ABCD 513 EA01 5F MOV E,A exp byte in E 514 EA02 23 INX H ) 515 EA03 46 MOV B,M ) 516 EA04 23 INX H ) Mantissa from MEM 517 EA05 4E MOV C,M ) into BCD 518 EA06 23 INX H ) 519 EA07 56 MOV D,M ) 520 EA08 21D500 LXI H,:00D5 Addr MACC 521 EA0B C317EB JMP :EB17 Copy ABCD into MACC; 522 exp from E in A, flags 523 set on exp ORI 01 524 * 525 * 526 * 527 EA0E END *************************** * S Y M B O L T A B L E * *************************** ACHGS E9E4 ASAVE E9D6 ASTORE E9DB ATEST E9F8 FAS10 E994 FAS20 E999 FASER E9D0 FASRET E991 FATC1 E946 FATPL E95E FLGTI E890 FPHPI E833 L1E132 E7E3 L1E133 E7FA L1E134 E818 L1E141 E8D3 L1E142 E8E3 L1E143 E8E6 L1E144 E915 L1E145 E943 L1E155 E9EE L1E156 E9F1 L1E158 E9FB L1E304 E837 L1E305 E83B L1E306 E83F XACOS E9C1 XALOG E880 XASIN E96C XATAN E8AC XCOS E7D9 XLOG E870 XPW10 E86D XPWR E855 XSIN E7D2 XTAN E894