| Routines

12951: THE 'RE-STACK' SUBROUTINE (offset 61)

Used by the routine at atn. The routine at RE_ST_TWO continues here. The address of this routine is found in the table of addresses. It is called via the calculator literal 61 by the routines at CIRCLE, DRAW, exp, ln and get_argt. The routine at RE_ST_TWO also continues here. This subroutine is called to re-stack one number (which could be a 'small integer') in full five-byte floating-point form.
Input
HL | Address of the first byte of the number
re_stack | 12951 | LD A,(HL) | If the first byte is not zero, return - the number cannot be a 'small integer'.
| 12952 | AND A
| 12953 | RET NZ
| 12954 | PUSH DE | Save the 'other' pointer in DE.
| 12955 | CALL INT_FETCH | Fetch the sign in C and the number in DE.
| 12958 | XOR A | Clear the A register.
| 12959 | INC HL | Point to the fifth location.
| 12960 | LD (HL),A | Set the fifth byte to zero.
| 12961 | DEC HL | Point to the fourth location.
| 12962 | LD (HL),A | Set the fourth byte to zero; bytes 2 and 3 will hold the mantissa.
| 12963 | LD B,145 | Set B to 145 for the exponent, i.e. for up to 16 bits in the integer.
| 12965 | LD A,D | Test whether D is zero so that at most 8 bits would be needed.
| 12966 | AND A
| 12967 | JR NZ,RS_NRMLSE | Jump if more than 8 bits needed.
| 12969 | OR E | Now test E too.
| 12970 | LD B,D | Save the zero in B (it will give zero exponent if E too is zero).
| 12971 | JR Z,RS_STORE | Jump if E is indeed zero.
| 12973 | LD D,E | Move E to D (D was zero, E not).
| 12974 | LD E,B | Set E to zero now.
| 12975 | LD B,137 | Set B to 137 for the exponent - no more than 8 bits now.
RS_NRMLSE | 12977 | EX DE,HL | Pointer to DE, number to HL.
RSTK_LOOP | 12978 | DEC B | Decrement the exponent on each shift.
| 12979 | ADD HL,HL | Shift the number right one position.
| 12980 | JR NC,RSTK_LOOP | Until the carry is set.
| 12982 | RRC C | Sign bit to carry flag now.
| 12984 | RR H | Insert it in place as the number is shifted back one place normal now.
| 12986 | RR L
| 12988 | EX DE,HL | Pointer to byte 4 back to HL.
RS_STORE | 12989 | DEC HL | Point to the third location.
| 12990 | LD (HL),E | Store the third byte.
| 12991 | DEC HL | Point to the second location.
| 12992 | LD (HL),D | Store the second byte.
| 12993 | DEC HL | Point to the first location.
| 12994 | LD (HL),B | Store the exponent byte.
| 12995 | POP DE | Restore the 'other' pointer to DE.
| 12996 | RET | Finished.