PAGE 01 DAI FIRMWARE C1FB-C436 V1.1 002 ORG :C1FB 003 * 004 * 005 * 006 ********************************************* 007 * DECREMENT FLOATING POINT NUMBER IN MEMORY * 008 ********************************************* 009 * 010 * Routine is not used. 011 * 012 * If the number is 0, or the exponent < 0, -1 is 013 * added to the mantissa. Else, a -1 is added/ 014 * subtracted to/from the least significant '1' of 015 * the mantissa. 016 * If the lsb of the mantissa is already a rounded 017 * value, no decrement occurs. 018 * 019 * Entry: HL points to FPT number in M. 020 * Exit: All registers preserved. 021 * 022 C1FB F5 FDCM PUSH PSW 023 C1FC C5 PUSH B 024 C1FD D5 PUSH D 025 C1FE E5 PUSH H 026 C1FF 111AC2 LXI D,:C21A Addr. FPT(-1) 027 C202 7E MOV A,M Get exp.byte 028 C203 E67F ANI :7F Mask sign bit 029 C205 CAACC1 JZ :C1AC If nr=0: add -1, abort 030 C208 FE40 CPI :40 Is exp. negative ? 031 C20A D2ACC1 JNC :C1AC Then add -1, abort 032 C20D FE18 CPI :18 Max. nr of mantissa bits 033 C20F D24DC1 JNC :C14D Abort if lsb mantissa is 034 not lsb of number 035 C212 BE CMP M Check if nr. is negative 036 C213 23 INX H 037 C214 CA52C1 JZ :C152 Into FINM for neg. nr 038 C217 C30FC1 JMP :C10F Idem for pos. nr. 039 * 040 * DATA - (not used): 041 * 042 C21A 81 FPM1 DATA :81 FPT (-1) 043 C21B 80 DATA :80 044 C21C 00 DATA :00 045 C21D 00 DATA :00 046 * 047 ********************** 048 * SAVE MACC ON STACK * 049 ********************** 050 * 051 * Contents MACC is placed on TOS. Returnaddress 052 * is saved. 053 * 054 * Entry: None. 055 * Exit: All registers preserved. 056 * On stack: HL; returnaddress; MACC. 057 * 058 C21E 22E100 PUSH SHLD :00E1 Save HL 059 C221 E3 XTHL Get returnaddress 060 C222 22DF00 SHLD :00DF Save it 061 C225 E5 PUSH H and put it on stack again 062 C226 210000 LXI H,:0000 063 C229 39 DAD SP SP in HL PAGE 02 DAI FIRMWARE C1FB-C436 V1.1 064 C22A E7 RST 4 Copy MACC to TOS 065 C22B 0F DATA :0F 066 C22C 2ADF00 LHLD :00DF Get returnaddr. 067 C22F E5 PUSH H on stack 068 C230 2AE100 LC52 LHLD :00E1 Get original HL 069 C233 C9 RET 070 * 071 **************************** 072 * RETRIEVE MACC FROM STACK * 073 **************************** 074 * 075 * Gets data from TOS and place it in MACC. 076 * 077 * Entry: None. 078 * Exit: All registers preserved. 079 * 080 C234 22E100 POP SHLD :00E1 Save HL 081 C237 E1 POP H Get returnaddress 082 C238 22DF00 SHLD :00DF Save it 083 C23B 210000 LXI H,:0000 084 C23E 39 DAD SP Get SP in HL 085 C23F E7 RST 4 Copy TOS to MACC 086 C240 0C DATA :0C 087 C241 E1 POP H 088 C242 2ADF00 LHLD :00DF Get returnaddress 089 C245 E3 XTHL on stack 090 C246 C330C2 JMP :C230 Restore HL, ret 091 * 092 ***************************************** 093 * INPUT A FLOATING POINT NUMBER TO MACC * 094 ***************************************** 095 * 096 * Converts a FPT number to binary into MACC. 097 * The input string is converted as a integer FPT 098 * number, then multiplied/divided by a power of 099 * 10, corresponding to the explicit exponent and 100 * placement of the decimal point. 101 * 102 * Entry: C points to 1st digit of FPT nr in input. 103 * Exit: CY=1: No error. 104 * CY=0: Over/underflow error. 105 * C points past FPT string in input. 106 * ABDEHL, rest of F preserved. 107 * 108 C249 37 FCB STC CY=1 109 C24A F5 PUSH PSW 110 C24B D5 PUSH D 111 C24C E5 PUSH H 112 C24D CDAEC2 CALL :C2AE Clear MACC+DEH; L=2B 113 C250 CD2FC3 LC53 CALL :C32F Get bin.value of input char 114 C253 DCBAC2 CC :C2BA Value found: Move digit into 115 MACC 116 C256 DA50C2 JC :C250 and get next digit 117 C259 FE2E CPI :2E '.' ? 118 C25B CA6BC2 JZ :C26B Then jump 119 C25E 1D DCR E 120 C25F 1C INR E 121 C260 CAA6C2 JZ :C2A6 If error 122 C263 FE45 CPI :45 'E' ? 123 C265 CA84C2 JZ :C284 Then jump 124 C268 C39FC2 JMP :C29F Convert FPT exp; quit 125 PAGE 03 DAI FIRMWARE C1FB-C436 V1.1 126 * If digit is '.': 127 128 C26B CDD5C2 LC54 CALL :C2D5 E=0, H=H+1 129 C26E CD2FC3 LC55 CALL :C32F Get bin.value of input char 130 C271 DCBAC2 CC :C2BA If found: Move digit into 131 MACC 132 C274 DA6EC2 JC :C26E and get next digit 133 C277 1D DCR E 134 C278 1C INR E 135 C279 CAA6C2 JZ :C2A6 If error 136 C27C FE45 CPI :45 'E' ? 137 C27E C4D9C2 CNZ :C2D9 H=0 if not 138 C281 C29FC2 JNZ :C29F If not: convert exp, quit 139 140 * If digit is 'E': 141 142 C284 CDD9C2 LC56 CALL :C2D9 H=0 143 C287 CD2FC3 CALL :C32F Get bin.value of input char 144 C28A CCDCC2 CZ :C2DC If '+' or '-': char in L 145 C28D CC2FC3 CZ :C32F Then get bin.value of next 146 char 147 C290 D2A6C2 JNC :C2A6 Error if no char found 148 C293 CDDEC2 CALL :C2DE H = 10 * H + A 149 C296 CD2FC3 CALL :C32F Get bin.value of input char 150 C299 DCDEC2 CC :C2DE If found: H = 10 * H + A 151 C29C DC2FC3 CC :C32F Get bin.value of input char 152 153 * If digit is number: 154 155 C29F CDEBC2 LC57 CALL :C2EB Convert FPT exponent 156 C2A2 E1 LC58 POP H 157 C2A3 D1 POP D 158 C2A4 F1 POP PSW CY=1 159 C2A5 C9 RET 160 161 * If error: 162 163 C2A6 CD2DC3 LC59 CALL :C32D DCR C 164 C2A9 E1 LC60 POP H 165 C2AA D1 POP D 166 C2AB F1 POP PSW 167 C2AC 3F CMC CY=0 168 C2AD C9 RET 169 * 170 * CLEAR MACC AND REGISTERS D, E AND H: 171 * 172 * Exit: ABC preserved. 173 * L = 2B ('+') 174 * 175 C2AE 215EC4 LC61 LXI H,:C45E Addr. FPT(0) 176 C2B1 E7 RST 4 Copy FPT(0) to MACC 177 C2B2 0C DATA :0C 178 C2B3 110000 LXI D,:0000 Clear DE 179 C2B6 212B00 LXI H,:002B Clear H, L='+' 180 C2B9 C9 RET 181 * 182 * MOVE A DIGIT INTO THE MACC: 183 * 184 * MACC = MACC * 10 + A. 185 * 186 * Entry: A: Digit 1 - 9. 187 * Exit: AFBCHL preserved. PAGE 04 DAI FIRMWARE C1FB-C436 V1.1 188 * D=D-H; E=E-1. 189 * 190 C2BA F5 LC62 PUSH PSW 191 C2BB E5 PUSH H 192 C2BC 214DC3 LXI H,:C34D Addr FPT (10) 193 C2BF E7 RST 4 MACC = MACC * 10 (FPT) 194 C2C0 06 DATA :06 195 C2C1 D5 PUSH D 196 C2C2 87 ADD A ) 197 C2C3 87 ADD A ) DE = 4 * A 198 C2C4 5F MOV E,A ) (calc offset to startaddr) 199 C2C5 1600 MVI D,:00 ) 200 C2C7 215EC4 LXI H,:C45E Addr table FPT(1-9) 201 C2CA 19 DAD D Calc. addr nr to be added 202 C2CB D1 POP D 203 C2CC E7 RST 4 MACC = MACC + (1-9) (FPT) 204 C2CD 00 DATA :00 205 C2CE E1 POP H 206 C2CF 7A MOV A,D 207 C2D0 94 SUB H 208 C2D1 57 MOV D,A D=D-H 209 C2D2 1D DCR E E=E-1 210 C2D3 F1 POP PSW 211 C2D4 C9 RET 212 * 213 C2D5 1E00 LC63 MVI E,:00 214 C2D7 24 INR H 215 C2D8 C9 RET 216 * 217 C2D9 2600 LC64 MVI H,:00 218 C2DB C9 RET 219 * 220 C2DC 6F LC65 MOV L,A 221 C2DD C9 RET 222 * 223 * H = 10 x H + A: 224 * 225 * Exit: AFBCDEL preserved. 226 * 227 C2DE F5 LC66 PUSH PSW 228 C2DF 7C MOV A,H A=H 229 C2E0 87 ADD A A=2*H 230 C2E1 87 ADD A A=4*H 231 C2E2 84 ADD H A=5*H 232 C2E3 87 ADD A A=10*H 233 C2E4 67 MOV H,A 234 C2E5 F1 POP PSW 235 C2E6 F5 PUSH PSW 236 C2E7 84 ADD H A=10*H+A 237 C2E8 67 MOV H,A 238 C2E9 F1 POP PSW 239 C2EA C9 RET 240 * 241 * CONVERT A FPT EXPONENT: 242 * 243 * The MACC is multiplied/divided by a power of 10 244 * corresponding to the 'E'-exponent minus the number 245 * of digits after the decimal point. 246 * 247 * Entry: C: Points beyond 1st nonuseable char of 248 * FPT number in input. 249 * L: Contains sign of exponent. PAGE 05 DAI FIRMWARE C1FB-C436 V1.1 250 * H: Contains 'E....' exponent (10). 251 * MACC: Contains FPT conversion of string of 252 * digits. 253 * D: Contains nr of digits after '.'. 254 * Exit: BE preserved, AHL corrupted. 255 * C: Decremented to after FPT nr in input. 256 * D: Contains effective exponent. 257 * 258 C2EB CD2DC3 LC67 CALL :C32D Decr C 259 C2EE 7D MOV A,L Get exp. sign 260 C2EF FE2D CPI :2D '-' ? 261 C2F1 7C MOV A,H Get exponent 262 C2F2 C2F7C2 JNZ :C2F7 If exp. positive 263 C2F5 2F CMA ) Else: make exponent 264 C2F6 3C INR A ) positive 265 C2F7 82 LC68 ADD D Add nr of digits after '.' 266 C2F8 57 MOV D,A Save result 267 C2F9 F2FEC2 JP :C2FE If result positive 268 C2FC 2F CMA ) Else: make it 269 C2FD 3C INR A ) positive 270 C2FE C5 LC69 PUSH B 271 C2FF 0605 MVI B,:05 Nr of times of multipl. 272 C301 214DC3 LXI H,:C34D Addr table powers of 10 273 C304 B7 LC70 ORA A Flags on result LC68 274 C305 1F RAR lsb in carry 275 C306 D217C3 JNC :C317 If bit=0 276 C309 F5 PUSH PSW 277 C30A 7A MOV A,D Check if multipl/div 278 C30B B7 ORA A 279 C30C FA11C3 JM :C311 If division 280 C30F E7 RST 4 MACC = MACC * power of 10 281 C310 06 DATA :06 282 C311 F216C3 LC71 JP :C316 If multiplication 283 C314 E7 RST 4 MACC = MACC / power of 10 284 C315 09 DATA :09 285 C316 F1 LC72 POP PSW Restore A 286 C317 23 LC73 INX H 287 C318 23 INX H 288 C319 23 INX H 289 C31A 23 INX H HL pnts to next ^10 290 C31B 05 DCR B 291 C31C C204C3 JNZ :C304 Again if not ready 292 C31F B7 ORA A 293 C320 CA2BC3 JZ :C32B If result OK 294 295 * If error: 296 297 C323 7A MOV A,D 298 C324 B7 ORA A Set flags for error type 299 C325 F44BC0 CP :C04B If overflow error 300 C328 FC65C0 CM :C065 If underflow error 301 C32B C1 LC74 POP B Normal return 302 C32C C9 RET 303 * 304 C32D 0D LC75 DCR C 305 C32E C9 RET 306 * 307 * GET BINARY VALUE OF INPUT CHARACTER IN A: 308 * 309 * Entry: C points to character in input. 310 * Exit: C points to next character. 311 * BDEHL preserved. PAGE 06 DAI FIRMWARE C1FB-C436 V1.1 312 * CY=1, Z=0: Value in A. 313 * CY=0, Z=1: Char is +/-. 314 * CY=0, Z=0: otherwise. 315 * 316 C32F CD73C0 LC76 CALL :C073 Get char from line 317 C332 0C INR C Update pointer 318 C333 FE2B CPI :2B 319 C335 C8 RZ Abort if '+' 320 C336 FE2D CPI :2D 321 C338 C8 RZ Abort if '-' 322 C339 FE30 CPI :30 323 C33B 3F CMC 324 C33C D0 RNC Abort if < #30 325 C33D FE3A CPI :3A 326 C33F D24BC3 JNC :C34B Abort if > #3A 327 C342 D630 SUI :30 Convert ASCII to binary 328 C344 D5 PUSH D 329 C345 57 MOV D,A 330 C346 3C INR A Set Z-flag correctly for 331 reqd output 332 C347 7A MOV A,D 333 C348 D1 POP D 334 C349 37 STC CY=1: value in A 335 C34A C9 RET 336 C34B B7 LC77 ORA A Set flags correctly 337 C34C C9 RET 338 * 339 ************************** 340 * TABLE FPT POWERS OF 10 * 341 ************************** 342 * 343 C34D 04 LC233 DATA :04 FPT 10^1 344 C34E A0 DATA :A0 345 C34F 00 DATA :00 346 C350 00 DATA :00 347 * 348 C351 07 DATA :07 FPT 10^2 349 C352 C8 DATA :C8 350 C353 00 DATA :00 351 C354 00 DATA :00 352 * 353 C355 0E DATA :0E FPT 10^4 354 C356 9C DATA :9C 355 C357 40 DATA :40 356 C358 00 DATA :00 357 * 358 C359 1B DATA :1B FPT 10^8 359 C35A BE DATA :BE 360 C35B BC DATA :BC 361 C35C 20 DATA :20 362 * 363 C35D 36 DATA :36 FPT 10^16 364 C35E 8E DATA :8E 365 C35F 1B DATA :1B 366 C360 CA DATA :CA 367 * 368 ********************************************** 369 * CONVERT A FLOATING POINT NUMBER FOR OUTPUT * 370 ********************************************** 371 * 372 * A FPT number in MACC is converted to ASCII in 373 * outputbuffer 00E4-F1. The sign is in 00E4, the PAGE 07 DAI FIRMWARE C1FB-C436 V1.1 374 * decimal point in 00E5. The normalized value of 375 * the mantissa is in 00E6-EC (7 digits). In 00F1 376 * is the 10's exponent in 2-complement binairy 377 * signed format. 378 * 379 * Exit: A=6 (number of significant digits). 380 * BCDEHL, MACC preserved. 381 * 382 C361 C5 FBC PUSH B 383 C362 D5 PUSH D 384 C363 E5 PUSH H 385 C364 CD1EC2 CALL :C21E Save MACC on stack 386 C367 E7 RST 4 Copy MACC to reg A,B,C,D 387 C368 15 DATA :15 388 C369 F5 PUSH PSW Save exp.byte 389 C36A B0 ORA B 390 C36B B1 ORA C 391 C36C B2 ORA D 392 C36D CAD4C3 JZ :C3D4 If FPT nr is zero 393 C370 F1 POP PSW Get exp.byte 394 C371 F5 PUSH PSW 395 C372 2600 MVI H,:00 396 C374 E67F ANI :7F Mask sign bit mantissa 397 C376 FE40 CPI :40 398 C378 DA80C3 JC :C380 If exp is positive 399 C37B 25 DCR H 400 C37C 2F CMA ) Else: convert 401 C37D E67F ANI :7F ) exponent to 402 C37F 3C INR A ) positive 403 C380 F5 LC78 PUSH PSW Save value exponent 404 C381 AF XRA A 405 C382 E7 RST 4 Copy mantissa to MACC 406 C383 12 DATA :12 407 C384 F1 POP PSW Get exp.value 408 C385 44 MOV B,H B=FF (exp.<0), 00 (exp.>0) 409 C386 2137C4 LXI H,:C437 Addr table powers FPT(2) 410 C389 0E00 MVI C,:00 411 C38B 1607 MVI D,:07 7 digits to be examined 412 C38D 0F LC79 RRC Shift exp. into carry 413 C38E F5 PUSH PSW Save rest of exp. 414 C38F 7E MOV A,M Get 10's power byte 415 C390 23 INX H Points to next 416 C391 D2A2C3 JNC :C3A2 If n-th power of 2=0: 417 go to next 418 C394 81 ADD C 419 C395 4F MOV C,A Total 10's power in C 420 C396 05 DCR B 421 C397 04 INR B 422 C398 C29DC3 JNZ :C39D Jump if exp. negative 423 C39B E7 RST 4 Multipl. mantissa by 424 C39C 06 DATA :06 (2^2^n)/10^m 425 C39D CAA2C3 LC80 JZ :C3A2 426 C3A0 E7 RST 4 Divide mantissa by 427 C3A1 09 DATA :09 (2^2^n)/10^m 428 C3A2 23 LC81 INX H 429 C3A3 23 INX H 430 C3A4 23 INX H 431 C3A5 23 INX H Pnts to next in table 432 C3A6 F1 POP PSW Get rest exponent 433 C3A7 15 DCR D Decr digit count 434 C3A8 C28DC3 JNZ :C38D Again if not 7 digits done 435 C3AB 05 DCR B PAGE 08 DAI FIRMWARE C1FB-C436 V1.1 436 C3AC 04 INR B 437 C3AD 215AC4 LXI H,:C45A Addr FPT (0.1) 438 C3B0 C2C4C3 JNZ :C3C4 If exp. negative 439 440 * If exponent positive: 441 442 C3B3 E5 LC82 PUSH H 443 C3B4 2162C4 LXI H,:C462 Addr FPT(1) 444 C3B7 CD79C0 CALL :C079 Compare with 1 445 C3BA E1 POP H 446 C3BB FAD4C3 JM :C3D4 Jump if normalized 447 C3BE E7 RST 4 MACC = MACC * 0.1 (FPT) 448 C3BF 06 DATA :06 449 C3C0 0C INR C Update 10's power 450 C3C1 C3B3C3 JMP :C3B3 Cont. normalisation 451 452 * If exponent negative: 453 454 C3C4 79 LC83 MOV A,C ) 455 C3C5 2F CMA ) Change 10's power 456 C3C6 3C INR A ) to neg. value 457 C3C7 4F MOV C,A ) 458 C3C8 CD79C0 LC84 CALL :C079 Compare with 0,1 459 C3CB F2D4C3 JP :C3D4 Jump if normalized 460 C3CE E7 RST 4 MACC = MACC / 0.1 (FPT) 461 C3CF 09 DATA :09 462 C3D0 0D DCR C Update 10's power 463 C3D1 C3C8C3 JMP :C3C8 Cont. normalisation 464 465 * Load output buffer: 466 467 C3D4 79 LC85 MOV A,C Get 10's power 468 C3D5 32F100 STA :00F1 In output buffer 469 C3D8 F1 POP PSW Get signbyte mantissa 470 C3D9 B7 ORA A Set flags on it 471 C3DA 21E400 LXI H,:00E4 Addr output buffer 472 C3DD 362B MVI M,:2B '+' in buffer 473 C3DF F2E4C3 JP :C3E4 If mantissa is positive 474 C3E2 362D MVI M,:2D Else: '-' in buffer 475 C3E4 23 LC86 INX H 476 C3E5 362E MVI M,:2E '.' in 00E5 477 C3E7 23 INX H 478 C3E8 E5 PUSH H 479 C3E9 E7 RST 4 Copy MACC to reg A,B,C,D 480 C3EA 15 DATA :15 481 C3EB F5 PUSH PSW Save exp.byte 482 C3EC AF XRA A 483 C3ED E7 RST 4 Copy mantissa to MACC 484 C3EE 12 DATA :12 485 C3EF F1 POP PSW Get exp.byte 486 C3F0 2F CMA ) 487 C3F1 3C INR A ) 2-compl. 488 C3F2 E67F ANI :7F Mask sign bit mantissa 489 C3F4 2110C6 LXI H,:C610 Addr INT(10) 490 C3F7 E7 RST 4 MACC = MACC * 10 (INT) 491 C3F8 54 DATA :54 492 C3F9 2120C4 LXI H,:C420 Addr. INT(1) 493 C3FC 3D DCR A 494 C3FD FA02C4 JM :C402 If exp. converted 495 C400 E7 RST 4 Shift MACC right 496 C401 72 DATA :72 497 C402 F2FCC3 LC88 JP :C3FC If not ready PAGE 09 DAI FIRMWARE C1FB-C436 V1.1 498 C405 E1 POP H 499 C406 E7 RST 4 Copy MACC to reg A,B,C,D 500 C407 15 DATA :15 501 C408 C630 ADI :30 Exp.byte in ASCII 502 C40A 77 MOV M,A Into outputbuffer 503 C40B 23 INX H 504 C40C 0606 MVI B,:06 6 sign. digits for mantissa 505 C40E CD24C4 LC89 CALL :C424 Convert one digit to ASCII 506 C411 77 MOV M,A Into output buffer 507 C412 23 INX H 508 C413 05 DCR B 509 C414 C20EC4 JNZ :C40E Next digit if not ready 510 C417 CD34C2 CALL :C234 Retrieve MACC from TOS 511 C41A E1 POP H 512 C41B D1 POP D 513 C41C C1 POP B 514 C41D 3E06 MVI A,:06 6 sign. digits in outputbuf 515 C41F C9 RET 516 * 517 * DATA: 518 * 519 C420 00 I1 DATA :00 INT (1) 520 C421 00 DATA :00 521 C422 00 DATA :00 522 C423 01 DATA :01 523 * 524 * CONVERT A DIGIT FOR OUTPUT: 525 * 526 * Highest byte of MACC *10 is made ASCII. 527 * 528 * Exit: A: Converted highest byte MACC. 529 * BCHL preserved. DE corrupted. 530 * 531 C424 C5 LC90 PUSH B 532 C425 E5 PUSH H 533 C426 E7 RST 4 Copy MACC to reg A,B,C,D 534 C427 15 DATA :15 535 C428 AF XRA A Clear highest byte 536 C429 E7 RST 4 Copy reg A,B,C,D to MACC 537 C42A 12 DATA :12 538 C42B 2110C6 LXI H,:C610 Addr INT(10) 539 C42E E7 RST 4 MACC = MACC * 10 (INT) 540 C42F 54 DATA :54 541 C430 E7 RST 4 Copy MACC to reg A,B,C,D 542 C431 15 DATA :15 543 C432 C630 ADI :30 Make highest byte ASCII 544 C434 E1 POP H 545 C435 C1 POP B 546 C436 C9 RET 547 * 548 * 549 * 550 C437 END *************************** * S Y M B O L T A B L E * *************************** FBC C361 FCB C249 FDCM C1FB FPM1 C21A I1 C420 LC233 C34D LC52 C230 LC53 C250 LC54 C26B LC55 C26E LC56 C284 LC57 C29F LC58 C2A2 LC59 C2A6 LC60 C2A9 LC61 C2AE PAGE 10 DAI FIRMWARE C1FB-C436 V1.1 LC62 C2BA LC63 C2D5 LC64 C2D9 LC65 C2DC LC66 C2DE LC67 C2EB LC68 C2F7 LC69 C2FE LC70 C304 LC71 C311 LC72 C316 LC73 C317 LC74 C32B LC75 C32D LC76 C32F LC77 C34B LC78 C380 LC79 C38D LC80 C39D LC81 C3A2 LC82 C3B3 LC83 C3C4 LC84 C3C8 LC85 C3D4 LC86 C3E4 LC88 C402 LC89 C40E LC90 C424 POP C234 PUSH C21E