080A | C1 | FSub | POP B | Get lhs in BCDE. |

080B | D1 | POP D | ||

080C | CDFA09 | CALL FNegate | Negate rhs and slimily | |

080F | 21.... | LXI H,.... | LXI into FAdd + 2. |

The lhs is on the stack, the rhs is in FACCUM. The steps for adding the two numbers are :

- Handle special cases where either side is 0.
- Denormalise mantissas.
- Align the two numbers.
*fixme: give Monte's decimal example*. - Add (or subtract) mantissas.
- Normalise result and store in FACCUM.

0810 | C1 | FAdd | POP B | Get lhs in BCDE. |

0811 | D1 | POP D | ||

Special cases for when lhs or rhs are zero. | ||||

0812 | 78 | MOV A,B | If lhs==0 then we don't need | |

0813 | B7 | ORA A | to do anything and can just | |

0814 | C8 | RZ | exit. | |

0815 | 3A7201 | LDA FACCUM+3 | If rhs==0 then exit via a copy | |

0818 | B7 | ORA A | of lhs to FACCUM. | |

0819 | CA120A | JZ FLoadFromBCDE | ||

Get exponents' difference into A. | ||||

081C | 90 | SUB B | A=rhs.exponent-lhs.exponent. | |

081D | D22C08 | JNC 082C | If rhs' exponent >= lhs'exponent, jump ahead. | |

Swap lhs and rhs if lhs exponent was more than rhs exponent. | ||||

0820 | 2F | CMA | Two's complement the exponent | |

0821 | 3C | INR A | difference, so it's correct. | |

0822 | EB | XCHG | ||

0823 | CD020A | CALL FPush | Push old rhs | |

0826 | EB | XCHG | ||

0827 | CD120A | CALL FLoadFromBCDE | rhs = old lhs | |

082A | C1 | POP B | lhs = old rhs. | |

082B | D1 | POP D | ||

Unpack the mantissas. This loses the signs of both numbers, but we do get back their relationship : the call to FUnpackMantissas leaves A +ve if the signs mismatched, or -ve if the signs were equal. | ||||

082C | F5 | PUSH PSW | Preserve exponent diff | |

082D | CD370A | CALL FUnpackMantissas | ||

0830 | 67 | MOV H,A | H=sign relationship | |

0831 | F1 | POP PSW | A=exponent diff. | |

Align lhs with rhs. | ||||

0832 | CDC908 | CALL FMantissaRtMult | Shift lhs mantissa right by (exponent diff) places. | |

Decide whether to add or subtract the mantissas. We subtract if the signs were mismatched. | ||||

0835 | B4 | ORA H | A=0 after last call, so this tests | |

0836 | 216F01 | LXI H,FACCUM | the sign relationship. | |

0839 | F24D08 | JP FSubMantissas | Jump ahead if we need to subtract. | |

Add the mantissas. | ||||

083C | CDA908 | CALL FAddMantissas | ||

083F | D27E08 | JNC FRoundUp | Jump ahead if that didn't overflow. | |

0842 | 23 | INX H | Flip the sign in FTEMP_SIGN. | |

0843 | 34 | INR M | ||

0844 | CAA408 | JZ Overflow | Error out if exponent overflowed. | |

0847 | CDD608 | CALL FMantissaRtOnce | Shift mantissa one place right | |

084A | C37E08 | JMP FRoundUp | Jump ahead. | |

Subtract lhs mantissa from rhs mantissa. | ||||

084D | AF | FSubMantissas | XRA A | B=0-B |

084E | 90 | SUB B | ||

084F | 47 | MOV B,A | ||

0850 | 7E | MOV A,M | E=(FACCUM)-E | |

0851 | 9B | SBB E | ||

0852 | 5F | MOV E,A | ||

0853 | 23 | INX H | ||

0854 | 7E | MOV A,M | D=(FACCUM+1)-D | |

0855 | 9A | SBB D | ||

0856 | 57 | MOV D,A | ||

0857 | 23 | INX H | ||

0858 | 7E | MOV A,M | C=(FACCUM+2)-C | |

0859 | 99 | SBB C | ||

085A | 4F | MOV C,A |

Fall into FNormalise

[Index] [Previous] [Next]