|An old trick rediscovered: combining conditional tests|
Message #1 Posted by Dieter on 12 Aug 2012, 10:36 a.m.
Namir's post re. "question to TI58/59 programmers" reminded me of the olden days when the average calculator nerd had a comprehensive programmer's toolbox at hand, containing numerous clever ways to overcome the restrictions of the devices that were available at that time.
One of these tricks is the combination of conditional tests, one followed by another. Such a combination allows the construction of logical operations that are usually not available on programmable calculators, making programs shorter, faster and more elegant.
For instance, two consecutive tests A and B set up a logical disjunction, i.e. the combination behaves like an OR operator, leading to a test (NOT A) OR B. Or, the other way round, if you want to test if condition A or condition B is true, simply use the test for (NOT A) directly followed by B.
...tests if Flag 01 or (!) Flag 02 is set.
In a similar way, this helped back then to build those tests commands that were not available on contemporary hardware. Even the HP-41 did not feature a X>=Y? test, but this could be accomplished easily: According to the mentioned rule, a test like "X=Y? OR X>Y?" is equivalent to the sequence...
Or, if you prefer,
Such a combination of two tests can also be used to invert a test command. Simply make sure the second command always tests false. According to the stated rule, this is equivalent to (NOT A) OR FALSE, which in turn is logically the same as NOT A.
On the HP-41, flag 54 (only set during a PSE command) may be used for the always-negative test. For instance like this:
The already mentioned X>=Y? test missing on most classic HPs is equivalent to NOT(X<Y?), so it can be substituted by...
A DSE or DSZ that skips if the respective register is not zero. In other words, something like INV DSZ on TI machines. ;-)
GTO 02 // exit loop if R03 has become zero
... // otherwise continue
So combining conditional tests is a handy feature that makes user programs faster, shorter and more elegant.
But two consecutive tests is not where this idea ends. What about three commands - this will work just as well. Finally, can you figure out what this combination of four consecutive HP-41 flag tests will do?
I remember an old issue of some HP-related magazine where this subject was discussed in detail with regard to the HP-67/97. If you have access to this article, please do not cheat. ;-)