| Routines

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
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