Prev: 33C0 Up: Map Next: 33F7
33C6: THE 'STACK LITERALS' SUBROUTINE (offset +34)
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.
Input
DE STKEND
HL' Address of the next literal
Output
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