| 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 :
| 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