PAGE 01 DAI FIRMWARE C437-C613 V1.0 Rev.1 002 ORG :C437 003 * 004 * 005 * 006 ************************ 007 * FPT NUMBER CONSTANTS * 008 ************************ 009 * 010 * For the first 7 numbers, the 1st byte is the 011 * power of 10 for division. 012 * 013 C437 00 LC234 DATA :00 014 C438 02 DATA :02 FPT (2^1)/10^0 015 C439 80 DATA :80 016 C43A 00 DATA :00 017 C43B 00 DATA :00 018 * 019 C43C 00 DATA :00 020 C43D 03 DATA :03 FPT (2^2)/10^0 021 C43E 80 DATA :80 022 C43F 00 DATA :00 023 C440 00 DATA :00 024 * 025 C441 01 DATA :01 026 C442 01 DATA :01 FPT (2^4)/10^1 027 C443 CC DATA :CC 028 C444 CC DATA :CC 029 C445 CD DATA :CD 030 * 031 C446 02 DATA :02 032 C447 02 DATA :02 FPT (2^8)/10^2 033 C448 A3 DATA :A3 034 C449 D7 DATA :D7 035 C44A 0A DATA :0A 036 * 037 C44B 04 DATA :04 038 C44C 03 DATA :03 FPT (2^16)/10^4 039 C44D D1 DATA :D1 040 C44E B7 DATA :B7 041 C44F 17 DATA :17 042 * 043 C450 09 DATA :09 044 C451 03 DATA :03 FPT (2^32)/10^9 045 C452 89 DATA :89 046 C453 70 DATA :70 047 C454 5F DATA :5F 048 * 049 C455 13 DATA :13 050 C456 01 DATA :01 FPT (2^64)/10^19 051 C457 EC DATA :EC 052 C458 1E DATA :1E 053 C459 4A DATA :4A 054 * 055 C45A 7D LC238 DATA :7D FPT (0.1) 056 C45B CC DATA :CC 057 C45C CC DATA :CC 058 C45D CD DATA :CD 059 * 060 C45E 00 FP0 DATA :00 FPT (0) 061 C45F 00 DATA :00 062 C460 00 DATA :00 063 C461 00 DATA :00 PAGE 02 DAI FIRMWARE C437-C613 V1.0 Rev.1 064 * 065 C462 01 FP1 DATA :01 FPT (1) 066 C463 80 DATA :80 067 C464 00 DATA :00 068 C465 00 DATA :00 069 * 070 C466 02 FP2 DATA :02 FPT (2) 071 C467 80 DATA :80 072 C468 00 DATA :00 073 C469 00 DATA :00 074 * 075 C46A 02 FP3 DATA :02 FPT (3) 076 C46B C0 DATA :C0 077 C46C 00 DATA :00 078 C46D 00 DATA :00 079 * 080 C46E 03 FP4 DATA :03 FPT (4) 081 C46F 80 DATA :80 082 C470 00 DATA :00 083 C471 00 DATA :00 084 * 085 C472 03 FP5 DATA :03 FPT (5) 086 C473 A0 DATA :A0 087 C474 00 DATA :00 088 C475 00 DATA :00 089 * 090 C476 03 FP6 DATA :03 FPT (6) 091 C477 C0 DATA :C0 092 C478 00 DATA :00 093 C479 00 DATA :00 094 * 095 C47A 03 FP7 DATA :03 FPT (7) 096 C47B E0 DATA :E0 097 C47C 00 DATA :00 098 C47D 00 DATA :00 099 * 100 C47E 04 FP8 DATA :04 FPT (8) 101 C47F 80 DATA :80 102 C480 00 DATA :00 103 C481 00 DATA :00 104 * 105 C482 04 FP9 DATA :04 FPT (9) 106 C483 90 DATA :90 107 C484 00 DATA :00 108 C485 00 DATA :00 109 * 110 ********************************* 111 * PRETTIES UP FPT OR INT NUMBER * 112 ********************************* 113 * 114 * Entry: B: Fix/float flag: (0=fix, 1=float). 115 * A: Nr. of useable digits in string in 116 * 00E4-F0 (not counting additional 117 * digit for rounding). 118 * 00F1: Nr. of digits before '.' (exponent). 119 * 00E4: Sign '+' or '-'. 120 * 00E5: Decimal point. 121 * E6-F0: Digits. 122 * Exit: All registers preserved. 123 * 00E3: Length of string. 124 * E4-F0: Output string. 125 * PAGE 03 DAI FIRMWARE C437-C613 V1.0 Rev.1 126 * Format: Sign in 00E4 is blank or '-'. 127 * If exponent is 0: 128 * real case: '0.digits' 129 * int. case: no final '.' 130 * real case if INT: '.0' 131 * If exponent < -1: E-format 132 * If exponent too large: E-format 133 * In E-format no '.0' 134 * 135 C486 F5 PRTY PUSH PSW 136 C487 C5 PUSH B 137 C488 D5 PUSH D 138 C489 E5 PUSH H 139 C48A 21E600 LXI H,:00E6 Startaddr digits 140 C48D 4F MOV C,A Save nr. useable digits 141 C48E C5 PUSH B 142 C48F 0600 MVI B,:00 143 C491 09 DAD B HL pnt to last useable digit 144 C492 7E MOV A,M Get last digit 145 C493 FE35 CPI :35 Check for rounding 146 C495 DAAFC4 JC :C4AF If <5 147 C498 2B LC91 DCX H 148 C499 7E MOV A,M Get digit before 149 C49A FE39 CPI :39 150 C49C CAA3C4 JZ :C4A3 If it is 9 151 C49F 34 INR M Rounding upwards 152 C4A0 C3AFC4 JMP :C4AF Abort rounding 153 C4A3 3630 LC92 MVI M,:30 Make digit before 0 154 C4A5 0D DCR C Decr. nr of digits 155 C4A6 C298C4 JNZ :C498 Cont. check for rounding 156 C4A9 3631 MVI M,:31 Make nr=1 if all digits 9 157 C4AB 21F100 LXI H,:00F1 158 C4AE 34 INR M Incr nr of digits before '.' 159 C4AF C1 LC93 POP B 160 C4B0 0C INR C Incr. nr useable digits 161 C4B1 3AF100 LDA :00F1 Get nr of digits before '.' 162 C4B4 B7 ORA A 163 C4B5 CAD8C4 JZ :C4D8 If 0 164 C4B8 FAE1C4 JM :C4E1 If too many digits 165 C4BB 80 ADD B Add fix/float flag 166 C4BC B9 CMP C 167 C4BD D2E1C4 JNC :C4E1 If too many digits 168 C4C0 CD9CC6 CALL :C69C Restore A, insert '.' 169 after number string 170 C4C3 79 LC94 MOV A,C Length string in A 171 C4C4 CD4BC5 CALL :C54B Calc nr of digits for output 172 C4C7 3C LC95 INR A Add 1 173 C4C8 21E300 LXI H,:00E3 174 C4CB 77 MOV M,A String length in outbuf 175 C4CC 23 INX H 176 C4CD 7E MOV A,M Get sign 177 C4CE FE2B CPI :2B '+' ? 178 C4D0 C2D5C4 JNZ :C4D5 Then abort 179 C4D3 3620 MVI M,:20 Replace '+' by blank 180 C4D5 C34DC1 LC96 JMP :C14D Popall, ret 181 182 * If format '0.digits': 183 184 C4D8 CD1AC5 LC97 CALL :C51A Move string right 1 pos. 185 C4DB 3630 MVI M,:30 Insert 0 in 00E5 186 C4DD 0C INR C Update nr of digits 187 C4DE C3C3C4 JMP :C4C3 Update string PAGE 04 DAI FIRMWARE C437-C613 V1.0 Rev.1 188 189 * If too many digits: 190 191 C4E1 3E01 LC98 MVI A,:01 192 C4E3 CD31C5 CALL :C531 Move string left 1 pos, 193 insert '.' after string 194 C4E6 79 MOV A,C Get nr of digits 195 C4E7 0600 MVI B,:00 196 C4E9 CD4BC5 CALL :C54B Calc nr of digits for output 197 C4EC 47 MOV B,A in B 198 C4ED 3AF100 LDA :00F1 Get nr of digits before '.' 199 C4F0 3D DCR A Minus 1 200 C4F1 3645 MVI M,:45 'E' in buf after last digit 201 C4F3 23 INX H 202 C4F4 04 INR B Incr. nr of digits 203 C4F5 B7 ORA A Flags on exponent 204 C4F6 F2FFC4 JP :C4FF If exp. positive 205 206 * If exponent negative: 207 208 C4F9 362D MVI M,:2D Store '-' in buffer 209 C4FB 23 INX H 210 C4FC 04 INR B Incr nr of digits 211 C4FD 2F CMA 212 C4FE 3C INR A 2-compl of exponent 213 214 * Exponent to buffer: 215 216 C4FF 110A2F LC99 LXI D,:2F0A 217 C502 93 LC100 SUB E Exp.-10 (unit value) 218 C503 14 INR D ASCII-count 10's-value 219 C504 D202C5 JNC :C502 If rest exp. still >10 220 C507 C63A ADI :3A Convert rest to Ascii 221 C509 5F MOV E,A in E 222 C50A 7A MOV A,D Get 10's value 223 C50B FE30 CPI :30 224 C50D CA13C5 JZ :C513 If exp. <10 225 C510 77 MOV M,A 10's value exp. in buf 226 C511 23 INX H 227 C512 04 INR B Incr nr of digits 228 C513 73 LC101 MOV M,E Unit value exp. in buf 229 C514 23 INX H 230 C515 04 INR B Incr nr of digits 231 C516 78 MOV A,B into A 232 C517 C3C7C4 JMP :C4C7 Prepare string for output 233 * 234 * MOVE STRING IN OUTPUTBUFFER RIGHT 1 POS.: 235 * 236 * The contents of 00E5-EF is moved up one 237 * position to 00E6-F0. 238 * 239 * Entry: No conditions. 240 * Exit: ABCDEF preserved. 241 * HL points to 00E5. 242 * 243 C51A F5 LC102 PUSH PSW 244 C51B C5 PUSH B 245 C51C D5 PUSH D 246 C51D 21F000 LXI H,:00F0 Highest destination address. 247 C520 54 MOV D,H 248 C521 5D MOV E,L 249 C522 1B DCX D Highest source address. PAGE 05 DAI FIRMWARE C437-C613 V1.0 Rev.1 250 C523 060B MVI B,:0B Number of bytes. 251 C525 1A LC103 LDAX D Get byte 252 C526 77 MOV M,A and move it. 253 C527 1B DCX D 254 C528 2B DCX H 255 C529 05 DCR B 256 C52A C225C5 JNZ :C525 Next byte if not ready 257 C52D D1 POP D 258 C52E C1 POP B 259 C52F F1 POP PSW 260 C530 C9 RET 261 * 262 * MOVE STRING IN OUTPUTBUFFER LEFT 1 POS.: 263 * 264 * The string, beginning on 00E6, is moved one 265 * memory location downwards. A '.' is inserted 266 * after the string. 267 * 268 * Entry: A: number of bytes to be transferred. 269 * Exit: All registers preserved. 270 * 271 C531 F5 LC104 PUSH PSW 272 C532 C5 PUSH B 273 C533 D5 PUSH D 274 C534 E5 PUSH H 275 C535 47 MOV B,A Store number of bytes 276 C536 21E500 LXI H,:00E5 Lowest destination address 277 C539 11E600 LXI D,:00E6 Lowest source address 278 C53C 1A LC105 LDAX D Get byte 279 C53D 77 MOV M,A and move it 280 C53E 13 INX D 281 C53F 23 INX H 282 C540 05 DCR B 283 C541 C23CC5 JNZ :C53C Next byte if not ready 284 C544 362E MVI M,:2E Insert '.' after string 285 C546 E1 POP H 286 C547 D1 POP D 287 C548 C1 POP B 288 C549 F1 POP PSW 289 C54A C9 RET 290 * 291 * CALCULATE NUMBER OF DIGITS FOR OUTPUT: 292 * 293 * Entry: Total nr of string digits in A and C. 294 * B: Flag for INT (0) or FPT (1). 295 * Digits in 00E4 to 00E4 + A. 296 * Exit: A: Nr of bytes for output: 297 * INT: excl. trailing '.0' 298 * FPT: incl. trailing '.0' 299 * HL: If last non-zero byte is not '.': 300 * points after last byte. 301 * Else: INT: points to '.' 302 * FPT: after '.0' 303 * 304 C54B C5 LC106 PUSH B 305 C54C D5 PUSH D 306 C54D 21E400 LXI H,:00E4 Startaddr string 307 C550 5F MOV E,A Total nr of digits in E 308 C551 1600 MVI D,:00 309 C553 19 DAD D Calc end of string 310 C554 7E LC107 MOV A,M Get digit 311 C555 FE30 CPI :30 PAGE 06 DAI FIRMWARE C437-C613 V1.0 Rev.1 312 C557 C25FC5 JNZ :C55F If non-zero 313 C55A 2B DCX H Points to previous digit 314 C55B 0D DCR C Decr nr of digits 315 C55C C354C5 JMP :C554 Again till non-zero found 316 317 * If non-zero digit found: 318 319 C55F FE2E LC108 CPI :2E '.' ? 320 C561 23 INX H 321 C562 C26FC5 JNZ :C56F Abort if not 322 C565 2B DCX H Pnts after last non-zero, 323 non-'.' digit 324 C566 0D DCR C Excl. '.' 325 C567 05 DCR B 326 C568 C26FC5 JNZ :C56F If INT case 327 C56B 23 INX H ) If FPT case: pnts 328 C56C 23 INX H ) after '.0' 329 C56D 0C INR C 330 C56E 0C INR C Incl. '.0' 331 C56F 79 LC109 MOV A,C Nr of digits for output 332 C570 D1 POP D 333 C571 C1 POP B 334 C572 C9 RET 335 * 336 ******************************** 337 * INPUT INTEGER NUMBER TO MACC * 338 ******************************** 339 * 340 * Read string of digits from line and convert 341 * it to binary in MACC. 342 * 343 * Entry: BC points to input character. 344 * Exit: BC points after INT number. 345 * ADEHL preserved. 346 * CY=1: there were digits. 347 * CY=0: No digits. 348 * 349 C573 37 ICB STC 350 C574 F5 PUSH PSW 351 C575 D5 PUSH D 352 C576 E5 PUSH H 353 C577 CD98C5 CALL :C598 Clear MACC and 00E3-E6. 354 C57A CD73C0 LC110 CALL :C073 Get digit from line 355 C57D D630 SUI :30 Convert ASCII to binary 356 C57F DA90C5 JC :C590 ) 357 C582 FE0A CPI :0A ) Abort if no number 358 C584 D290C5 JNC :C590 ) 359 C587 2110C6 LXI H,:C610 Addr INT(10) 360 C58A CDA5C5 CALL :C5A5 MACC=MACC*10 + digit 361 C58D C37AC5 JMP :C57A Next digit 362 C590 15 LC111 DCR D 363 C591 14 INR D 364 C592 C2A2C2 JNZ :C2A2 If digits: Pop, ret 365 C595 C3A9C2 JMP :C2A9 If no digits: CY=0, Pop, ret 366 * 367 * CLEAR MACC AND 00E3-00E6: 368 * 369 * Both MACC and registers 00E3-E6 are loaded 370 * with the value of FPT (0). 371 * 372 * Exit: ABCE preserved. D=0. 373 * PAGE 07 DAI FIRMWARE C437-C613 V1.0 Rev.1 374 C598 215EC4 LC112 LXI H,:C45E Addr. FPT(0) 375 C59B E7 RST 4 Copy FPT(0) to MACC 376 C59C 0C DATA :0C 377 C59D 21E300 LXI H,:00E3 378 C5A0 E7 RST 4 Copy FPT(0) to 00E3-E6 379 C5A1 0F DATA :0F 380 C5A2 1600 MVI D,:00 Clear D 381 C5A4 C9 RET 382 * 383 * MACC = MACC*10 + DIGIT FROM LINE: 384 * 385 * Entry: HL: points to INT (10). 386 * A: digit to be added. 387 * 388 C5A5 E7 LC113 RST 4 MACC=MACC*10 (INT) 389 C5A6 54 DATA :54 390 C5A7 0C LC114 INR C 391 C5A8 15 DCR D 392 C5A9 32E600 STA :00E6 Digit in lobyte E3-E6 393 C5AC 21E300 LXI H,:00E3 394 C5AF E7 RST 4 Add (E3-E6) to MACC (INT) 395 C5B0 4E DATA :4E 396 C5B1 C9 RET 397 * 398 ************************************* 399 * CONVERT INTEGER NUMBER FOR OUTPUT * 400 ************************************* 401 * 402 * Places ASCII string from INT MACC contents in 403 * output buffer 00E4-F0. 404 * 00E4 is sign, 00E5 is '.', 00E6-F0 is value, 405 * 00F1 is nr of digits. 406 * 407 * Exit: A: Number of digits. 408 * BCDEHL preserved. 409 * 410 C5B2 C5 IBC PUSH B 411 C5B3 D5 PUSH D 412 C5B4 E5 PUSH H 413 C5B5 CD1EC2 CALL :C21E Save MACC to TOS 414 C5B8 CDE0C5 CALL :C5E0 Abs.value of MACC in reg 415 A,B,C,D; Prepare 00E4-E6 416 C5BB CD1EC2 LC115 CALL :C21E Save MACC to TOS 417 C5BE 2110C6 LXI H,:C610 Addr INT(10) 418 C5C1 E7 RST 4 MACC = remainder MACC/10 419 C5C2 5A DATA :5A 420 C5C3 E7 RST 4 Copy MACC to reg A,B,C,D 421 C5C4 15 DATA :15 422 C5C5 7A MOV A,D Lobyte in A 423 C5C6 CDFAC5 CALL :C5FA Digit into 00E5-F0 424 C5C9 CD34C2 CALL :C234 Retrieve MACC from TOS 425 C5CC E7 RST 4 MACC = MACC/10 (INT) 426 C5CD 57 DATA :57 427 C5CE E7 RST 4 Copy MACC to reg A,B,C,D 428 C5CF 15 DATA :15 429 C5D0 B0 ORA B 430 C5D1 B1 ORA C 431 C5D2 B2 ORA D 432 C5D3 C2BBC5 JNZ :C5BB Again if <>0 433 C5D6 CD06C6 CALL :C606 '.' in 00E5; length in 00F1 434 C5D9 CD34C2 CALL :C234 Retrieve MACC from TOS 435 C5DC E1 POP H PAGE 08 DAI FIRMWARE C437-C613 V1.0 Rev.1 436 C5DD D1 POP D 437 C5DE C1 POP B 438 C5DF C9 RET 439 * 440 * PREPARE 00E4-E6: 441 * 442 * 00E4-E6 is set to +00 or -00, depending on sign 443 * of contents MACC. In the MACC remains the absolute 444 * value. The registers A,B,C,D contain the original 445 * contents of the MACC. 446 * 447 * Exit: E=0. HL preserved. AFBCD corrupted. 448 * 449 C5E0 E5 LC116 PUSH H 450 C5E1 21E400 LXI H,:00E4 451 C5E4 E7 RST 4 Copy MACC to reg A,B,C,D 452 C5E5 15 DATA :15 453 C5E6 B7 ORA A Set flags on sign 454 C5E7 362B MVI M,:2B '+' in 00E4 455 C5E9 F2F0C5 JP :C5F0 Jump if nr is positive 456 C5EC 362D MVI M,:2D Else '-' in 00E4 457 C5EE E7 RST 4 and make contents MACC pos. 458 C5EF 60 DATA :60 459 C5F0 23 LC117 INX H 460 C5F1 3630 MVI M,:30 0 in 00E5 461 C5F3 23 INX H 462 C5F4 3630 MVI M,:30 0 in 00E6 463 C5F6 1E00 MVI E,:00 Digit count is 0 464 C5F8 E1 POP H 465 C5F9 C9 RET 466 * 467 * STORE DIGIT IN OUTPUT BUFFER 00E5-00F0: 468 * 469 * Entry: Digit in A. 470 * Exit: Digit in 00E5-F0 as most sign. digit. 471 * E: Count of digit in buffer. 472 * BCDHL preserved. AF corrupted. 473 * 474 C5FA E5 LC118 PUSH H 475 C5FB F5 PUSH PSW 476 C5FC CD1AC5 CALL :C51A Move contents buffer right 477 C5FF F1 POP PSW 478 C600 C630 ADI :30 Make digit ASCII 479 C602 77 MOV M,A Digit in 00E5 inserted. 480 C603 1C INR E Update digit count. 481 C604 E1 POP H 482 C605 C9 RET 483 * 484 * ADD A '.' TO A DIGIT STRING IN OUTPUTBUFFER: 485 * 486 * A '.' is placed at the beginning of a digit 487 * string in the output buffer. The length of the 488 * string is stored in 00F1. 489 * 490 * Entry: E: Digit count. 491 * HL: Points to 00E5. 492 * Exit: A: Count. 493 * BCDEHL preserved. 494 * 495 C606 CD1AC5 LC119 CALL :C51A Move contents outbuf right 496 one position 497 C609 362E MVI M,:2E '.' at begin of string PAGE 09 DAI FIRMWARE C437-C613 V1.0 Rev.1 498 C60B 7B MOV A,E Get digit count 499 C60C 32F100 STA :00F1 Store it in buffer 500 C60F C9 RET 501 * 502 * DATA: 503 * 504 C610 00 I10 DATA :00 INT (10) 505 C611 00 DATA :00 506 C612 00 DATA :00 507 C613 0A DATA :0A 508 * 509 * 510 * 511 C614 END *************************** * S Y M B O L T A B L E * *************************** FP0 C45E FP1 C462 FP2 C466 FP3 C46A FP4 C46E FP5 C472 FP6 C476 FP7 C47A FP8 C47E FP9 C482 I10 C610 IBC C5B2 ICB C573 LC100 C502 LC101 C513 LC102 C51A LC103 C525 LC104 C531 LC105 C53C LC106 C54B LC107 C554 LC108 C55F LC109 C56F LC110 C57A LC111 C590 LC112 C598 LC113 C5A5 LC114 C5A7 LC115 C5BB LC116 C5E0 LC117 C5F0 LC118 C5FA LC119 C606 LC234 C437 LC238 C45A LC91 C498 LC92 C4A3 LC93 C4AF LC94 C4C3 LC95 C4C7 LC96 C4D5 LC97 C4D8 LC98 C4E1 LC99 C4FF PRTY C486