Routines |
Prev: 33C0 | Up: Map | Next: 33F7 |
Used by the routine at series.
The address of this routine is found in the table of addresses. It is called via the calculator literal +34 by the routines at BEEP, CD_PRMS1, S_RND, LOG_2_A, exp, ln and get_argt.
This subroutine places on the calculator stack, as a 'last value', the floating-point number supplied to it as 2, 3, 4 or 5 literals.
When called by using offset '+34' the literals follow the '+34' in the list of literals; when called by the series generator, the literals are supplied by the subroutine that called for a series to be generated; and when called by SKIP_CONS and stk_con the literals are obtained from the calculator's table of constants.
In each case, the first literal supplied is divided by +40, and the integer quotient plus 1 determines whether 1, 2, 3 or 4 further literals will be taken from the source to form the mantissa of the number. Any unfilled bytes of the five bytes that go to form a 5-byte floating-point number are set to zero. The first literal is also used to determine the exponent, after reducing mod +40, unless the remainder is zero, in which case the second literal is used, as it stands, without reducing mod +40. In either case, +50 is added to the literal, giving the augmented exponent byte, e (the true exponent e' plus +80). The rest of the 5 bytes are stacked, including any zeros needed, and the subroutine returns.
|
||||||||||
stk_data | 33C6 | LD H,D | This subroutine performs the manipulatory operation of adding a 'last value' to the calculator stack; hence HL is set to point one past the present 'last value' and hence point to the result. | |||||||
33C7 | LD L,E | |||||||||
This entry point is used by the routines at SKIP_CONS and stk_con.
|
||||||||||
STK_CONST | 33C8 | CALL TEST_5_SP | Now test that there is indeed room. | |||||||
33CB | EXX | Go to the alternate register set and stack the pointer to the next literal. | ||||||||
33CC | PUSH HL | |||||||||
33CD | EXX | |||||||||
33CE | EX (SP),HL | Switch over the result pointer and the next literal pointer. | ||||||||
33CF | PUSH BC | Save BC briefly. | ||||||||
33D0 | LD A,(HL) | The first literal is put into A and divided by +40 to give the integer values 0, 1, 2 or 3. | ||||||||
33D1 | AND $C0 | |||||||||
33D3 | RLCA | |||||||||
33D4 | RLCA | |||||||||
33D5 | LD C,A | The integer value is transferred to C and incremented, thereby giving the range 1, 2, 3 or 4 for the number of literals that will be needed. | ||||||||
33D6 | INC C | |||||||||
33D7 | LD A,(HL) | The literal is fetched anew, reduced mod +40 and discarded as inappropriate if the remainder if zero; in which case the next literal is fetched and used unreduced. | ||||||||
33D8 | AND $3F | |||||||||
33DA | JR NZ,FORM_EXP | |||||||||
33DC | INC HL | |||||||||
33DD | LD A,(HL) | |||||||||
FORM_EXP | 33DE | ADD A,$50 | The exponent, e, is formed by the addition of +50 and passed to the calculator stack as the first of the five bytes of the result. | |||||||
33E0 | LD (DE),A | |||||||||
33E1 | LD A,$05 | The number of literals specified in C are taken from the source and entered into the bytes of the result. | ||||||||
33E3 | SUB C | |||||||||
33E4 | INC HL | |||||||||
33E5 | INC DE | |||||||||
33E6 | LD B,$00 | |||||||||
33E8 | LDIR | |||||||||
33EA | POP BC | Restore BC. | ||||||||
33EB | EX (SP),HL | Return the result pointer to HL and the next literal pointer to its usual position in HL'. | ||||||||
33EC | EXX | |||||||||
33ED | POP HL | |||||||||
33EE | EXX | |||||||||
33EF | LD B,A | The number of zero bytes required at this stage is given by 5-C-1, and this number of zeros is added to the result to make up the required five bytes. | ||||||||
33F0 | XOR A | |||||||||
STK_ZEROS | 33F1 | DEC B | ||||||||
33F2 | RET Z | |||||||||
33F3 | LD (DE),A | |||||||||
33F4 | INC DE | |||||||||
33F5 | JR STK_ZEROS |
Prev: 33C0 | Up: Map | Next: 33F7 |