Routines 
Prev: 12218  Up: Map  Next: 12292 
This subroutine shifts a floatingpoint number up to 32 places right to line it up properly for addition. The number with the smaller exponent has been put in the addend position before this subroutine is called. Any overflow to the right, into the carry, is added back into the number. If the exponent difference is greater than 32, or the carry ripples right back to the beginning of the number then the number is set to zero so that the addition will not alter the other number (the augend).


SHIFT_FP  12253  AND A  If the exponent difference is zero, the subroutine returns at once.  
12254  RET Z  
12255  CP 33  If the difference is greater than 32, jump forward.  
12257  JR NC,ADDEND_0  
12259  PUSH BC  Save BC briefly.  
12260  LD B,A  Transfer the exponent difference to B to count the shifts right.  
ONE_SHIFT  12261  EXX  Arithmetic shift right for L', preserving the sign marker bits.  
12262  SRA L  
12264  RR D  Rotate right with carry D', E', D and E, thereby shifting the whole five bytes of the number to the right as many times as B counts.  
12266  RR E  
12268  EXX  
12269  RR D  
12271  RR E  
12273  DJNZ ONE_SHIFT  Loop back until B reaches zero.  
12275  POP BC  Restore the original BC.  
12276  RET NC  Done if no carry to retrieve.  
12277  CALL ADD_BACK  Retrieve carry.  
12280  RET NZ  Return unless the carry rippled right back. (In this case there is nothing to add.)  
ADDEND_0  12281  EXX  Fetch L', D' and E'.  
12282  XOR A  Clear the A register.  
This entry point is used by the routine at multiply.


ZEROS_4_5  12283  LD L,0  Set the addend to zero in D', E', D and E, together with its marker byte (sign indicator) L', which was 0 for a positive number and 255 for a negative number. This produces only 4 zero bytes when called for near underflow by multiply.  
12285  LD D,A  
12286  LD E,L  
12287  EXX  
12288  LD DE,0  
12291  RET  Finished. 
Prev: 12218  Up: Map  Next: 12292 