A group of functions for manipulating mantissas.
Result mantissa in CDEB is normalised, rounded up to CDE, and stored in FACCUM.
| If carry set then negate the mantissa. Most users of this function call over this step. | ||||
| 085B | DCB508 | FNormalise | CC FNegateInt | |
| Normalise the mantissa : We shift it left until bit 23 is set. | ||||
| 085E | 2600 | MVI H,00 | ||
| 0860 | 79 | MOV A,C | Test most-significant bit of mantissa | |
| 0861 | B7 | ORA A | and jump ahead if it's 1. | |
| 0862 | FA7E08 | JM FRoundUp | ||
| 0865 | FEE0 | NormLoop | CPI E0 | If we've shifted 32 times, |
| 0867 | CABE09 | JZ FZero | then the number is 0. | |
| 086A | 25 | DCR H | ||
| 086B | 78 | MOV A,B | Left-shift extra mantissa byte | |
| 086C | 87 | ADD A | ||
| 086D | 47 | MOV B,A | ||
| 086E | CD9008 | CALL FMantissaLeft | Left-shift mantissa. | |
| 0871 | 7C | MOV A,H | ||
| 0872 | F26508 | JP NormLoop | Loop | |
| Adjust exponent by however many left-shifts had do be done during normalization. | ||||
| 0875 | 217201 | LXI H,FACCUM+3 | ||
| 0878 | 86 | ADD M | ||
| 0879 | 77 | MOV M,A | Since A was a -ve number, that certainly should | |
| 087A | D2BE09 | JNC FZero | have carried, hence the extra check for zero. | |
| 087D | C8 | RZ | ?why? | |
| Round up the extra mantissa byte. | ||||
| 087E | 78 | FRoundUp | MOV A,B | A=extra mantissa byte |
| 087F | 217201 | LXI H,FACCUM+3 | ||
| 0882 | B7 | ORA A | If bit 7 of the extra mantissa byte | |
| 0883 | FC9A08 | CM FMantissaInc | is set, then round up the mantissa. | |
| Set the sign and exit. The XRA C is interesting : remember that bit 7 of C is the most significant bit of the normalised mantissa, which is invariably 1. Also, we need to use this bit for the sign. Well, in FUnpackMantissas the temporary sign in FTEMP_SIGN was inverted, so an XOR with 1 will get back the correct sign. | ||||
| 0886 | 46 | MOV B,M | B=exponent | |
| 0887 | 23 | INX H | ||
| 0888 | 7E | MOV A,M | A=FTEMP_SIGN | |
| 0889 | E680 | ANI 80 | ||
| 088B | A9 | XRA C | Bit 7 of C is always 1. Thi | |
| 088C | 4F | MOV C,A | ||
| 088D | C3120A | JMP FLoadFromBCDE | Exit via copying BCDE to FACCUM. | |
Shift the mantissa in CDE left by one bit.
| 0890 | 7B | FMantissaLeft | MOV A,E | |
| 0891 | 17 | RAL | ||
| 0892 | 5F | MOV E,A | ||
| 0893 | 7A | MOV A,D | ||
| 0894 | 17 | RAL | ||
| 0895 | 57 | MOV D,A | ||
| 0896 | 79 | MOV A,C | ||
| 0897 | 8F | ADC A | ||
| 0898 | 4F | MOV C,A | ||
| 0899 | C9 | RET |
Increments the mantissa in CDE and handles overflow.
| 089A | 1C | FMantissaInc | INR E | |
| 089B | C0 | RNZ | ||
| 089C | 14 | INR D | ||
| 089D | C0 | RNZ | ||
| 089E | 0C | INR C | ||
| 089F | C0 | RNZ | ||
| 08A0 | 0E80 | MVI C,80 | Mantissa overflowed to zero, so set it | |
| 08A2 | 34 | INR M | to 1 and increment the exponent. | |
| 08A3 | C0 | RNZ | And if the exponent overflows... |
A convenient place for exiting with the overflow (OV) error.
| 08A4 | 1E0A | Overflow | MVI E,0A | |
| 08A6 | C3D501 | JMP Error |
Adds the mantissa pointed to by HL to the one in CDE.
| 08A9 | 7E | FAddMantissas | MOV A,M | |
| 08AA | 83 | ADD E | ||
| 08AB | 5F | MOV E,A | ||
| 08AC | 23 | INX H | ||
| 08AD | 7E | MOV A,M | ||
| 08AE | 8A | ADC D | ||
| 08AF | 57 | MOV D,A | ||
| 08B0 | 23 | INX H | ||
| 08B1 | 7E | MOV A,M | ||
| 08B2 | 89 | ADC C | ||
| 08B3 | 4F | MOV C,A | ||
| 08B4 | C9 | RET |
Negate the 32-bit integer in CDEB by subtracting it from zero. Also flips the sign in FTEMP. Used by FAsInteger and FAdd.
| Flip the sign byte kept in FTEMP. | ||||
| 08B5 | 217301 | FNegateInt | LXI H,FTEMP | |
| 08B8 | 7E | MOV A,M | ||
| 08B9 | 2F | CMA | ||
| 08BA | 77 | MOV M,A | ||
| Negate extended mantissa, ie CDEB = 0 - CDEB. | ||||
| 08BB | AF | XRA A | ||
| 08BC | 6F | MOV L,A | ||
| 08BD | 90 | SUB B | ||
| 08BE | 47 | MOV B,A | ||
| 08BF | 7D | MOV A,L | ||
| 08C0 | 9B | SBB E | ||
| 08C1 | 5F | MOV E,A | ||
| 08C2 | 7D | MOV A,L | ||
| 08C3 | 9A | SBB D | ||
| 08C4 | 57 | MOV D,A | ||
| 08C5 | 7D | MOV A,L | ||
| 08C6 | 99 | SBB C | ||
| 08C7 | 4F | MOV C,A | ||
| 08C8 | C9 | RET | ||
Shifts the mantissa in CDE right by A places. Note that lost bits end up in B, general practice so we can round up from something later should we need to.
| 08C9 | 0600 | FMantissaRtMult | MVI B,00 | Initialise extra mantissa byte |
| 08CB | 3C | INR A | ||
| 08CC | 6F | MOV L,A | ||
| 08CD | AF | RtMultLoop | XRA A | |
| 08CE | 2D | DCR L | ||
| 08CF | C8 | RZ | ||
| 08D0 | CDD608 | CALL FMantissaRtOnce | ||
| 08D3 | C3CD08 | JMP RtMultLoop |
Shifts the mantissa in CDE one bit right.
| 08D6 | 79 | FMantissaRtOnce | MOV A,C | |
| 08D7 | 1F | RAR | ||
| 08D8 | 4F | MOV C,A | ||
| 08D9 | 7A | MOV A,D | ||
| 08DA | 1F | RAR | ||
| 08DB | 57 | MOV D,A | ||
| 08DC | 7B | MOV A,E | ||
| 08DD | 1F | RAR | ||
| 08DE | 5F | MOV E,A | ||
| 08DF | 78 | MOV A,B | NB: B is the extra | |
| 08E0 | 1F | RAR | mantissa byte. | |
| 08E1 | 47 | MOV B,A | ||
| 08E2 | C9 | RET |