[Index] [Previous] [Next]

2.2 Addition & Subtraction



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


[Index] [Previous] [Next]