The Museum of HP Calculators

HP Forum Archive 17

[ Return to Index | Top of Index ]

Stack preservation in the HP35S
Message #1 Posted by Valentin Albillo on 25 July 2007, 1:05 p.m.

Hi all:

In a different thread (Gerson W. Barbosa's "alternative cos(x) and tan(x) [HP-33S]"), Les Wright posted:

    "[...] Unfortunately the routines don't keep the entire stack in its original state, but this is a nice touch. One problem about RPN programs is they make a mess of the stack sometimes, unlike the internal routines."

      The HP35S' ability to mix RPN and algebraic equations in a single program in RPN mode can be used to perform what you want, i.e., program a complicated function that behaves as built-in ones, i.e., the argument is taken from ST X, ST X is replaced by the function's value, and the original argument is stored in LAST X.

      For instance, suppose that you want to program a two-term version of Stirling's approximation to the factorial function X!, namely:

             f(X) = (X/e)^X*Sqrt(2*Pi*X)*(1+1/(12*X)+1/(288*X^2))
      and you want it to behave as a built-in function as far as stack behaviour is concerned. You can achieve that in the HP35S without using any auxiliary registers or variables with this simple trick, key in this little proof-of-concept program in your HP35S:
             A001 LBL A
                  Roll Down
             A005 RTN

      where I've used "/" to denote the division key and "*" to denote the multiplication key, as well as "Pi" to denote the Pi key.

      To run it, just key in you argument in ST X, and XEQ A [ENTER]: the result will be returned to ST X, the previous contents of ST X will be stored in LASTx, and the rest of the stack will be unaffected.

      For instance, in FIX 4, press:

             4 [ENTER] 3 [ENTER] 2 [ENTER]
                                 5 [XEQ] A [ENTER] -> 120.0025
                                        [ROLLDOWN] -> 2.0000
                                        [ROLLDOWN] -> 3.0000
                                        [ROLLDOWN] -> 4.0000
                                           [LASTx] -> 5.0000
      Perhaps this is a little slower than pure RPN, but quite convenient indeed. Of course the same trick will work with any f(X) you care to define as long as it can be defined as an equation.

    I'll hope you'll like this little neat technique but if not, just stick to pure RPN and you'll be no worse than before :-)
Best regards from V.
Re: Stack preservation in the HP35S
Message #2 Posted by Les Wright on 25 July 2007, 2:25 p.m.,
in response to message #1 by Valentin Albillo

Another option would be to write a little subroutine that stuffs the Y, Z, and T register values into unused data registers and returns the values to the stack when you want to. The temp registers would need to be lettered registers I think, since if you try to access indirect registers putting the value of the index in X register before storing it in I or J will bump off the contents of the T register.

Just a thought.


Edited: 25 July 2007, 2:25 p.m.

Re: Stack preservation in the HP35S
Message #3 Posted by Gene Wright on 25 July 2007, 3:27 p.m.,
in response to message #2 by Les Wright

Yes, that option would work, but then anyone wanting to use the routine would have to make sure the temporary registers you used to store the stack were not being used by their own programs.

Valentin's idea, and the similar ideas found in the 35s learning modules and datafile issue, make no such requirement. No other registers are affected and the stack is preserved.

Re: Stack preservation in the HP35S
Message #4 Posted by Howard Owen on 25 July 2007, 6:17 p.m.,
in response to message #1 by Valentin Albillo

That is PDK! (Pretty Darned Kewl.) And not at all obvious. For example, LASTx doesn't show up on the RDN menu in equation mode, since there is a dedicated key.

Thanks for that tip, Valentin! It is now part of my repertoire!


[ Return to Index | Top of Index ]

Go back to the main exhibit hall