PAGE 01 DAI FIRMWARE 1E000-1E22A V1.1 002 ORG :E000 003 * 004 * 005 * 006 * =================== 007 *** MATH./SOUND PACKAGE *** 008 * =================== 009 * 010 * The sound package starts at 1EE6E. 011 * 012 * ============= 013 *** MATH. PACKAGE *** 014 * ============= 015 * 016 * Called by RST 4: DATA XX. XX indicates the 017 * offset from #E000 for the different entrypoints. 018 * 019 * The routines jumped to by RST 4: DATA 7B-F3 are 020 * identical to RST 4; DATA 00-78, but for use with 021 * the AMD9511A Math.chip. 022 * Which routines are used, depends on the offset 023 * in RAM address #00D4. 024 * 025 * The accumulator is the MACC (00D5-00D8) or the 026 * math.chip accu MTOS. 027 * 028 ************************ 029 * SOFTWARE ENTRYPOINTS * 030 ************************ 031 * 032 * #00D4 contains offset 00. 033 * 034 *SVECA 035 E000 C3AAED MFADD JMP :EDAA FPT addition 036 E003 C3B4ED MFSUB JMP :EDB4 FPT subtraction 037 E006 C3FEE0 MFMUL JMP :E0FE FPT multiplication 038 E009 C308E1 MFDIV JMP :E108 FPT division 039 E00C C312E1 MLOAD JMP :E112 Copy operand to accu 040 E00F C31CE1 MSAVE JMP :E11C Copy accu to operand 041 E012 C326E1 MPUT JMP :E126 Copy reg A,B,C,D to accu 042 E015 C333E1 MGET JMP :E133 Copy accu to reg A,B,C,D 043 E018 C340E1 MFABS JMP :E140 FPT ABS 044 E01B C34AE1 MFCHS JMP :E14A FPT change sign accu 045 E01E C343E4 MFINT JMP :E443 FPT INT(X) 046 E021 C354E1 MFRAC JMP :E154 FPT FRAC 047 E024 C355E8 MPWR JMP :E855 FPT power 048 E027 C345E7 MLN JMP :E745 LOG 049 E02A C367E6 MEXP JMP :E667 EXP 050 E02D C370E8 MLOG JMP :E870 LOGT 051 E030 C380E8 MALOG JMP :E880 ALOG 052 E033 C3F8E5 MSQRT JMP :E5F8 SQR 053 E036 C3D2E7 MSIN JMP :E7D2 SIN 054 E039 C3D9E7 MCOS JMP :E7D9 COS 055 E03C C394E8 MTAN JMP :E894 TAN 056 E03F C36CE9 MASIN JMP :E96C ASIN 057 E042 C3C1E9 MACOS JMP :E9C1 ACOS 058 E045 C3ACE8 MATAN JMP :E8AC ATN 059 E048 C314E4 MFIX JMP :E414 Change accu to INT 060 E04B C3DEE3 MFLT JMP :E3DE Change accu to FPT 061 E04E C36DE1 MIADD JMP :E16D INT addition 062 E051 C38DE1 MISUB JMP :E18D INT subtraction 063 E054 C3ACE1 MIMUL JMP :E1AC INT multiplication PAGE 02 DAI FIRMWARE 1E000-1E22A V1.1 064 E057 C32BE2 MIDIV JMP :E22B INT division 065 E05A C338E2 MIREM JMP :E238 INT divide remainder 066 E05D C30BE3 MIABS JMP :E30B INT ABS 067 E060 C315E3 MICHS JMP :E315 INT change sign accu 068 E063 C32EE3 MIAND JMP :E32E IAND 069 E066 C345E3 MIOR JMP :E345 IOR 070 E069 C35CE3 MIXOR JMP :E35C IXOR 071 E06C C373E3 MINOT JMP :E373 INOT 072 E06F C3A5E3 MSHL JMP :E3A5 SHL 073 E072 C398E3 MSHR JMP :E398 SHR 074 E075 C3C0ED MSA00 JMP :EDC0 Part of SAVEA 075 E078 C3A6EF L1E274 JMP :EFA6 Bank return 076 * 077 ************************ 078 * HARDWARE ENTRYPOINTS * 079 ************************ 080 * 081 * #00D4 contains offset #7B from #E000 as base 082 * for HVECA. 083 * 084 E07B C374E4 HVECA JMP :E474 FPT addition 085 E07E C379E4 JMP :E479 FPT subtraction 086 E081 C37EE4 JMP :E47E FPT multiplication 087 E084 C383E4 JMP :E483 FPT division 088 E087 C388E5 JMP :E588 Copy operand to accu 089 E08A C399E5 JMP :E599 Copy accu to operand 090 E08D C35FE5 JMP :E55F Copy reg A,B,C,D to accu 091 E090 C36FE5 JMP :E56F Copy accu to reg A,B,C,D 092 E093 C388E4 JMP :E488 FPT ABS 093 E096 C393E4 JMP :E493 FPT change sign accu 094 E099 C398E4 JMP :E498 FPT INT(X) 095 E09C C3A0E4 JMP :E4A0 FPT FRAC 096 E09F C3A1ED JMP :EDA1 FPT power 097 E0A2 C3B1E4 JMP :E4B1 LOG 098 E0A5 C3B6E4 JMP :E4B6 EXP 099 E0A8 C3BBE4 JMP :E4BB LOGT 100 E0AB C3C0E4 JMP :E4C0 ALOG 101 E0AE C3CCE4 JMP :E4CC SQR 102 E0B1 C3D1E4 JMP :E4D1 SIN 103 E0B4 C3D6E4 JMP :E4D6 COS 104 E0B7 C3DBE4 JMP :E4DB TAN 105 E0BA C3E0E4 JMP :E4E0 ASIN 106 E0BD C3E5E4 JMP :E4E5 ACOS 107 E0C0 C3EAE4 JMP :E4EA ATN 108 E0C3 C3EFE4 JMP :E4EF Change accu to INT 109 E0C6 C39BE4 JMP :E49B Change accu to FPT 110 E0C9 C3F4E4 JMP :E4F4 INT addition 111 E0CC C3F9E4 JMP :E4F9 INT subtraction 112 E0CF C3FEE4 JMP :E4FE INT multiplication 113 E0D2 C303E5 JMP :E503 INT division 114 E0D5 C308E5 JMP :E508 INT divide remainder 115 E0D8 C317E5 JMP :E517 INT ABS 116 E0DB C322E5 JMP :E522 INT change sign accu 117 E0DE C319ED JMP :ED19 IAND 118 E0E1 C326ED JMP :ED26 IOR 119 E0E4 C333ED JMP :ED33 IXOR 120 E0E7 C343ED JMP :ED43 INOT 121 E0EA C36CED JMP :ED6C SHL 122 E0ED C355ED JMP :ED55 SHR 123 E0F0 C3C0ED JMP :EDC0 Part of SAVEA ) Not via 124 E0F3 C3A6EF JMP :EFA6 Bank return ) AMD9511 125 * PAGE 03 DAI FIRMWARE 1E000-1E22A V1.1 126 E0F6 FF DATA :FF 127 E0F7 FF DATA :FF 128 E0F8 FF DATA :FF 129 E0F9 FF DATA :FF 130 E0FA FF DATA :FF 131 E0FB FF DATA :FF 132 E0FC FF DATA :FF 133 E0FD FF DATA :FF 134 * 135 ********************** 136 * FPT MULTIPLICATION * 137 ********************** 138 * 139 * MACC = MACC * MEM. 140 * 141 * Entry: HL: Points to multiplier. 142 * Exit: All registers preserved. 143 * 144 E0FE F5 XFMUL PUSH PSW 145 E0FF C5 PUSH B 146 E100 D5 PUSH D 147 E101 E5 PUSH H 148 E102 CD59EA CALL :EA59 FPT multiplication 149 E105 C34DC1 JMP :C14D Popall, ret 150 * 151 **************** 152 * FPT DIVISION * 153 **************** 154 * 155 * MACC = MACC / MEM. 156 * 157 * Entry: HL: Points to divisor. 158 * Exit: All registers preserved. 159 * 160 E108 F5 XFDIV PUSH PSW 161 E109 C5 PUSH B 162 E10A D5 PUSH D 163 E10B E5 PUSH H 164 E10C CD20EA CALL :EA20 FPT division 165 E10F C34DC1 JMP :C14D Popall, ret 166 * 167 ************************** 168 * COPY OPERAND INTO MACC * 169 ************************** 170 * 171 * Entry: HL: Points to operand. 172 * Exit: All registers preserved. 173 * 174 E112 F5 XLOAD PUSH PSW 175 E113 C5 PUSH B 176 E114 D5 PUSH D 177 E115 E5 PUSH H 178 E116 CDFBE9 CALL :E9FB Copy operand in MACC 179 E119 C34DC1 JMP :C14D Popall, ret 180 * 181 ************************ 182 * COPY MACC TO OPERAND * 183 ************************ 184 * 185 * Entry: HL: Points to operand. 186 * Exit: All registers preserved. 187 * PAGE 04 DAI FIRMWARE 1E000-1E22A V1.1 188 E11C F5 XSAVE PUSH PSW 189 E11D C5 PUSH B 190 E11E D5 PUSH D 191 E11F E5 PUSH H 192 E120 CDD6E9 CALL :E9D6 Copy MACC to operand 193 E123 C34DC1 JMP :C14D Popall, ret 194 * 195 ************************************ 196 * COPY REGISTERS A,B,C,D INTO MACC * 197 ************************************ 198 * 199 * Entry: None. 200 * Exit: All registers preserved. 201 * 202 E126 E5 XPUT PUSH H 203 E127 62 MOV H,D ) 204 E128 69 MOV L,C ) DC in HL 205 E129 22D700 SHLD :00D7 Copy D,C into 00D8/7 206 E12C 60 MOV H,B ) 207 E12D 6F MOV L,A ) BA in HL 208 E12E 22D500 SHLD :00D5 Copy B,A into 00D6/5 209 E131 E1 POP H 210 E132 C9 RET 211 * 212 ************************************ 213 * COPY MACC INTO REGISTERS A,B,C,D * 214 ************************************ 215 * 216 * Entry: None. 217 * Exit: EHLF preserved. 218 * 219 E133 E5 XGET PUSH H 220 E134 2AD700 LHLD :00D7 Get lobytes MACC 221 E137 4D MOV C,L ) 222 E138 54 MOV D,H ) Into registers C,D 223 E139 2AD500 LHLD :00D5 Get hibytes MACC 224 E13C 7D MOV A,L ) 225 E13D 44 MOV B,H ) Into registers A,B 226 E13E E1 POP H 227 E13F C9 RET 228 * 229 *********** 230 * FPT ABS * 231 *********** 232 * 233 * For FPT values: MACC = Absolute value 234 * of MACC. 235 * 236 * Entry: None. 237 * Exit: All registers preserved. 238 * 239 E140 F5 XFABS PUSH PSW 240 E141 C5 PUSH B 241 E142 D5 PUSH D 242 E143 E5 PUSH H 243 E144 CDEEE9 CALL :E9EE Take abs.value of MACC 244 E147 C34DC1 JMP :C14D Popall, ret 245 * 246 ************************* 247 * FPT: CHANGE SIGN MACC * 248 ************************* 249 * PAGE 05 DAI FIRMWARE 1E000-1E22A V1.1 250 * For FPT values: MACC = - MACC 251 * 252 * Entry: None. 253 * Exit: All registers preserved. 254 * 255 E14A F5 XFCHS PUSH PSW 256 E14B C5 PUSH B 257 E14C D5 PUSH D 258 E14D E5 PUSH H 259 E14E CDE4E9 CALL :E9E4 Change sign MACC 260 E151 C34DC1 JMP :C14D Popall, ret 261 * 262 ************ 263 * FPT FRAC * 264 ************ 265 * 266 * The FPT number in the MACC is replaced by its 267 * fractional part. 268 * 269 * Entry: None. 270 * Exit: All registers preserved. 271 * 272 E154 F5 XFRAC PUSH PSW 273 E155 E5 PUSH H 274 E156 CD1EC2 CALL :C21E Save MACC on stack 275 E159 CD43E4 CALL :E443 Take INT value of MACC 276 E15C 210000 LXI H,:0000 277 E15F 39 DAD SP Pnts to orig MACC on stack 278 E160 CDB4ED CALL :EDB4 Subtract INT(MACC)-MACC 279 E163 CD4AE1 CALL :E14A Make result positive again 280 E166 33 INX SP 281 E167 33 INX SP 282 E168 33 INX SP 283 E169 33 INX SP Correct SP 284 E16A E1 POP H 285 E16B F1 POP PSW 286 E16C C9 RET 287 * 288 ******************** 289 * INTEGER ADDITION * 290 ******************** 291 * 292 * Signed 32-bit addition: MACC = MACC + MEM. 293 * Evt. overflow handling via CO4B. 294 * 295 * Entry: HL: Points to 1st byte of operand. 296 * Exit: All registers preserved. 297 * 298 E16D F5 XIADD PUSH PSW 299 E16E C5 PUSH B 300 E16F D5 PUSH D 301 E170 E5 PUSH H 302 E171 CD8CE3 CALL :E38C MACC into reg E,B,C,A 303 D = compl 00D5 EXOR M 304 E174 D5 PUSH D 305 E175 86 ADD M ) 306 E176 57 MOV D,A ) 307 E177 2B DCX H ) 308 E178 79 MOV A,C ) 309 E179 8E ADC M ) Add contents MEM to EBCA 310 E17A 4F MOV C,A ) Result in EBCD 311 E17B 2B DCX H ) PAGE 06 DAI FIRMWARE 1E000-1E22A V1.1 312 E17C 78 MOV A,B ) 313 E17D 8E ADC M ) 314 E17E 47 MOV B,A ) 315 E17F 2B DCX H ) 316 E180 7B MOV A,E ) 317 E181 8E ADC M ) 318 E182 5F MOV E,A ) 319 E183 1F RAR Evt carry in msb 320 E184 AB XRA E Msb=1 if overflow 321 E185 E1 POP H Get compl 00D5 EXOR M 322 (0 if different signbits) 323 E186 A4 ANA H Overflow only if different 324 signbits 325 E187 FC4BC0 L1E11 CM :C04B Then run overflow error 326 E18A C384E3 JMP :E384 Copy E into A; Then reg 327 ABCD into MACC 328 * 329 *********************** 330 * INTEGER SUBTRACTION * 331 *********************** 332 * 333 * Signed 32-bit subtraction: MACC = MACC - MEM. 334 * Evt. overflow handling via CO4B. 335 * 336 * Entry: HL: Points to 1st byte of operand. 337 * Exit: All registers preserved. 338 * 339 E18D F5 XISUB PUSH PSW 340 E18E C5 PUSH B 341 E18F D5 PUSH D 342 E190 E5 PUSH H 343 E191 CD8CE3 CALL :E38C Copy MACC into reg EBCA 344 D = compl 00D5 EXOR M 345 E194 D5 PUSH D 346 E195 96 SUB M ) 347 E196 57 MOV D,A ) 348 E197 2B DCX H ) 349 E198 79 MOV A,C ) 350 E199 9E SBB M ) 351 E19A 4F MOV C,A ) Subtract EBCA - MEM 352 E19B 2B DCX H ) Result in EBCD 353 E19C 78 MOV A,B ) 354 E19D 9E SBB M ) 355 E19E 47 MOV B,A ) 356 E19F 2B DCX H ) 357 E1A0 7B MOV A,E ) 358 E1A1 9E SBB M ) 359 E1A2 5F MOV E,A ) 360 E1A3 1F RAR Evt carry in msb 361 E1A4 AB XRA E Msb=1 if overflow 362 E1A5 E1 POP H Get compl 00D5 EXOR M 363 E1A6 B4 ORA H 364 E1A7 2F CMA 365 E1A8 B7 ORA A Msb=1 ? 366 E1A9 C387E1 JMP :E187 Evt run overflow error; 367 Copy result into MACC 368 * 369 ************************** 370 * INTEGER MULTIPLICATION * 371 ************************** 372 * 373 * Signed 32-bit multiplication: MACC = MACC * MEM. PAGE 07 DAI FIRMWARE 1E000-1E22A V1.1 374 * The overflow exit is taken if both factors are 375 * more than 2 bytes or the product is longer than 376 * the signbit of the 4th byte. 377 * If MEM > 2 bytes, than MACC into DE and MEM into 378 * MACC, assuming that MACC is max. 2 bytes. 379 * 380 * Entry: HL: Points to multiplier. 381 * Exit: All registers preserved. 382 * 383 E1AC F5 XIMUL PUSH PSW 384 E1AD C5 PUSH B 385 E1AE D5 PUSH D 386 E1AF E5 PUSH H 387 E1B0 3AD500 LDA :00D5 Get sign byte 388 E1B3 B7 ORA A 389 E1B4 FC15E3 CM :E315 If nr <0: change sign 390 E1B7 DA25E2 JC :E225 (Don't work: E315 preserves 391 flags; ORA A clears CY) 392 E1BA AE XRA M Final sign bit in S-flag 393 E1BB F5 PUSH PSW Save it 394 E1BC 7E MOV A,M ) 395 E1BD 23 INX H ) 396 E1BE B7 ORA A ) Get MEM into BCDE 397 E1BF 47 MOV B,A ) Set flags on sign byte 398 E1C0 4E MOV C,M ) 399 E1C1 23 INX H ) 400 E1C2 56 MOV D,M ) 401 E1C3 23 INX H ) 402 E1C4 5E MOV E,M ) 403 E1C5 FCC9E3 CM :E3C9 If MEM <0: negate BCDE 404 E1C8 DA25E2 JC :E225 Error exit if overflow 405 E1CB B1 ORA C 406 E1CC CADFE1 JZ :E1DF Jump if MEM <= 2 bytes 407 408 * MEM > 2 bytes: exchange MACC with BCDE: 409 410 E1CF 2AD500 LHLD :00D5 Get hibytes MACC 411 E1D2 7C MOV A,H 412 E1D3 B5 ORA L 413 E1D4 C225E2 JNZ :E225 Overflow exit if MACC > 414 2 bytes 415 E1D7 2AD700 LHLD :00D7 Get lobytes MACC in HL 416 E1DA CDCFE3 CALL :E3CF Copy reg BCDE (=MEM) into 417 MACC 418 E1DD 55 MOV D,L ) 419 E1DE 5C MOV E,H ) Orig. MACC into DE 420 421 * Now 4-byte nr in MACC and 2 byte nr in DE: 422 423 E1DF 210000 L1E14 LXI H,:0000 424 E1E2 E5 PUSH H 0000 on stack 425 E1E3 21D800 LXI H,:00D8 Addr lobyte MACC 426 E1E6 4E MOV C,M lobyte in C 427 E1E7 E3 L1E15 XTHL On stack: addr current MACC 428 byte 429 E1E8 79 MOV A,C Current byte in A 430 E1E9 B7 ORA A 431 E1EA CA1EE2 JZ :E21E Jump if byte=0 432 E1ED 0680 MVI B,:80 433 E1EF 79 L1E16 MOV A,C ) Current MACC byte in A 434 E1F0 1F RAR ) 435 E1F1 4F MOV C,A ) PAGE 08 DAI FIRMWARE 1E000-1E22A V1.1 436 E1F2 D2F6E1 JNC :E1F6 ) SHR reg H,L and B as long 437 ) no carry from C 438 E1F5 19 DAD D ) Else: Add other nr to HL 439 E1F6 7C L1E17 MOV A,H ) 440 E1F7 1F RAR ) 441 E1F8 67 MOV H,A ) 442 E1F9 7D MOV A,L )-- Effect: Multiply MACC by 443 E1FA 1F RAR ) DE, result in B 444 E1FB 6F MOV L,A ) 445 E1FC 78 MOV A,B ) 446 E1FD 1F RAR ) 447 E1FE 47 MOV B,A ) 448 E1FF D2EFE1 JNC :E1EF ) Do L1E16 max 8 times 449 E202 E3 XTHL HL pnts to current MACC byte 450 E203 70 MOV M,B Result in MACC byte 451 E204 2B DCX H Pnts to next lower MACC byte 452 E205 7D MOV A,L Get lobyte of addr 453 E206 FED4 CPI :D4 Ready? 454 E208 4E MOV C,M Get next lower byte in C 455 E209 C2E7E1 JNZ :E1E7 Not ready: mult. next byte 456 457 * Multiplication done: 458 459 E20C E1 POP H 460 E20D 78 MOV A,B Get last result 461 E20E B7 ORA A 462 E20F FA25E2 JM :E225 Error exit if overflow 463 E212 7C MOV A,H ) 464 E213 B5 ORA L ) Check if HL<>0 465 E214 C225E2 JNZ :E225 Then overflow exit 466 E217 F1 L1E19 POP PSW Get final sign in S-flag 467 E218 FC15E3 CM :E315 Change sign MACC if nr must 468 be negative 469 E21B C34DC1 JMP :C14D Popall, ret 470 471 * If MACC byte = 0: 472 473 E21E 45 L1E20 MOV B,L ) Move bytes in HLB one byte 474 E21F 6C MOV L,H ) down 475 E220 2600 MVI H,:00 ) 476 E222 C302E2 JMP :E202 Go to next MACC byte 477 478 * If overflow error: 479 480 E225 CD4BC0 L1E21 CALL :C04B Run overflow error 481 E228 C317E2 JMP :E217 Quit 482 * 483 * 484 * 488 E22B END *************************** * S Y M B O L T A B L E * *************************** HVECA E07B L1E11 E187 L1E14 E1DF L1E15 E1E7 L1E16 E1EF L1E17 E1F6 L1E19 E217 L1E20 E21E L1E21 E225 L1E274 E078 MACOS E042 MALOG E030 MASIN E03F MATAN E045 MCOS E039 MEXP E02A MFABS E018 MFADD E000 MFCHS E01B MFDIV E009 MFINT E01E MFIX E048 MFLT E04B MFMUL E006 MFRAC E021 MFSUB E003 MGET E015 MIABS E05D PAGE 09 DAI FIRMWARE 1E000-1E22A V1.1 MIADD E04E MIAND E063 MICHS E060 MIDIV E057 MIMUL E054 MINOT E06C MIOR E066 MIREM E05A MISUB E051 MIXOR E069 MLN E027 MLOAD E00C MLOG E02D MPUT E012 MPWR E024 MSA00 E075 MSAVE E00F MSHL E06F MSHR E072 MSIN E036 MSQRT E033 MTAN E03C SVECA E000 XFABS E140 XFCHS E14A XFDIV E108 XFMUL E0FE XFRAC E154 XGET E133 XIADD E16D XIMUL E1AC XISUB E18D XLOAD E112 XPUT E126 XSAVE E11C