blah
Returns the integer part of FACCUM in CDE.
Return with BCDE=0 if A=0. | ||||
0A77 | 47 | FAsInteger | MOV B,A | |
0A78 | 4F | MOV C,A | ||
0A79 | 57 | MOV D,A | ||
0A7A | 5F | MOV E,A | ||
0A7B | B7 | ORA A | ||
0A7C | C8 | RZ | ||
Preserve HL and copy FACCUM to BCDE | ||||
0A7D | E5 | PUSH H | ||
0A7E | CD1D0A | CALL FCopyToBCDE | ||
Unpack FACCUM's mantissa to get the hidden most-significant-bit (see top of page) and get the sign back via an XOR to undo what FUnpackMantissas did with it. Preserve the sign in H | ||||
0A81 | CD370A | CALL FUnpackMantissas | ||
0A84 | AE | XRA M | Get sign back | |
0A85 | 67 | MOV H,A | ||
If FACCUM was negative then decrement the mantissa (two's complement?) | ||||
0A86 | FC9B0A | CM FMantissaDec | ||
Shift mantissa in CDE right by (24-B) places. This gets the integer part of FACCUM into CDE, which is the whole point of the function. | ||||
0A89 | 3E98 | MVI A,98 |
Shift mantissa right | |
0A8B | 90 | SUB B | by (24-exponent) places? | |
0A8C | CDC908 | CALL FMantissaRtOnce | WHY? | |
If floating point sign is negative (ie bit 7 of H set) then two's complement CDE to get the signed integer. We do two's complement by first adding 1, then negating. | ||||
0A8F | 7C | MOV A,H | ||
0A90 | 17 | RAL | ||
0A91 | DC9A08 | CC FMantissaInc | ||
0A94 | 0600 | MVI B,00 | Needed for FNegateInt. | |
0A96 | DCB508 | CC FNegateInt | ||
Restore HL and return with the integer result in CDE. | ||||
0A99 | E1 | POP H | ||
0A9A | C9 | RET |
Decrements the mantissa in CDE.
0A9B | 1B | FMantissaDec | DCX D | DE-- |
0A9C | 7A | MOV A,D | If DE!=0xFFFF... | |
0A9D | A3 | ANA E | ||
0A9E | 3C | INR A | ||
0A9F | C0 | RNZ | ... then return | |
0AA0 | 0D | DCR C | C-- | |
0AA1 | C9 | RET |
Removes the fractional part of FACCUM.
If FACCUM's exponent is >= 2^24, then it's too big to hold any fractional part - it is already an integer, so we just return. | ||||
0AA2 | 217201 | Int | LXI H,FACCUM+3 | |
0AA5 | 7E | MOV A,M | ||
0AA6 | FE98 | CPI 98 | ||
0AA8 | D0 | RNC | ||
Convert FACCUM to an integer in CDE. On returning, HL points to FACCUM's exponent byte (ie FACCUM+3). | ||||
0AA9 | CD770A | CALL FAsInteger | ||
Now we need to convert the integer in CDE to a proper floating point value. To do this we first set FACCUM's exponent to 2^24. | ||||
0AAC | 3698 | MVI M,98 | ||
0AAE | 79 | MOV A,C | ||
0AAF | 17 | RAL | ||
0AB0 | C35B08 | JMP 085B |