Routines 
Prev: 2D3B  Up: Map 
The address of this routine is found in the table of addresses.
This subroutine gives a 'last value' on the top of the calculator stack that is the result of converting a number given in the form xEm, where m is a positive or negative integer. The subroutine is entered with x at the top of the calculator stack and m in the A register.
The method used is to find the absolute value of m, say p, and to multiply or divide x by 10↑p according to whether m is positive or negative.
To achieve this, p is shifted right until it is zero, and x is multiplied or divided by 10↑(2↑n) for each set bit b(n) of p. Since p is never much more than 39, bits 6 and 7 of p will not normally be set.


e_to_fp  2D4F  RLCA  Test the sign of m by rotating bit 7 of A into the carry without changing A.  
2D50  RRCA  
2D51  JR NC,E_SAVE  Jump if m is positive.  
2D53  CPL  Negate m in A without disturbing the carry flag.  
2D54  INC A  
E_SAVE  2D55  PUSH AF  Save m in A briefly.  
2D56  LD HL,$5C92  This is MEMBOT; a sign flag is now stored in the first byte of mem0, i.e. 0 for '+' and 1 for ''.  
2D59  CALL FP_0_1  
2D5C  RST $28  The stack holds x.  
2D5D  DEFB $A4  stk_ten: x, 10  
2D5E  DEFB $38  end_calc: x, 10  
2D5F  POP AF  Restore m in A.  
E_LOOP  2D60  SRL A  In the loop, shift out the next bit of m, modifying the carry and zero flags appropriately; jump if carry reset.  
2D62  JR NC,E_TST_END  
2D64  PUSH AF  Save the rest of m and the flags.  
2D65  RST $28  The stack holds x' and 10↑(2↑n), where x' is an interim stage in the multiplication of x by 10↑m, and n=0, 1, 2, 3, 4 or 5.  
2D66  DEFB $C1  st_mem_1: (10↑(2↑n) is copied to mem1)  
2D67  DEFB $E0  get_mem_0: x', 10↑(2↑n), (1/0)  
2D68  DEFB $00  jump_true to E_DIVSN: x', 10↑(2↑n)  
2D69  DEFB $04  
2D6A  DEFB $04  multiply: x'*10↑(2↑n)=x"  
2D6B  DEFB $33  jump to E_FETCH: x''  
2D6C  DEFB $02  
E_DIVSN  2D6D  DEFB $05  division: x/10↑(2↑n)=x'' (x'' is x'*10↑(2↑n) or x'/10↑(2↑n) according as m is '+' or '')  
E_FETCH  2D6E  DEFB $E1  get_mem_1: x'', 10↑(2↑n)  
2D6F  DEFB $38  end_calc: x'', 10↑(2↑n)  
2D70  POP AF  Restore the rest of m in A, and the flags.  
E_TST_END  2D71  JR Z,E_END  Jump if m has been reduced to zero.  
2D73  PUSH AF  Save the rest of m in A.  
2D74  RST $28  x'', 10↑(2↑n)  
2D75  DEFB $31  duplicate: x'', 10↑(2↑n), 10↑(2↑n)  
2D76  DEFB $04  multiply: x'', 10↑(2↑(n+1))  
2D77  DEFB $38  end_calc: x'', 10↑(2↑(n+1))  
2D78  POP AF  Restore the rest of m in A.  
2D79  JR E_LOOP  Jump back for all bits of m.  
E_END  2D7B  RST $28  Use the calculator to delete the final power of 10 reached leaving the 'last value' x*10↑m on the stack.  
2D7C  DEFB $02  delete  
2D7D  DEFB $38  end_calc  
2D7E  RET 
Prev: 2D3B  Up: Map 