(Free42) tips & tricks: local flags
|
07-23-2020, 10:21 AM
(This post was last modified: 07-23-2020 10:24 AM by Werner.)
Post: #1
|
|||
|
|||
(Free42) tips & tricks: local flags
LSTO has given us local variables, but we do not have local flags.
We can use a local variable (say, "F") to store a flag, and at first glance, 0 for a clear flag and 1 for a set flag would seem logical. However, the values -1e99 and 1e99 (the exponents are not important as long as they are larger than 34) are more convenient, as then the testing of the 'flag' can be performed with DSE and ISG, which will not change the stored value, but will skip accordingly: Flag Clear? -> ISG "F" Flag Set? -> DSE "F" to Set the flag (without disturbing the stack): LSTO "F" CLX 1e99 X<> "F" to Clear the flag: LSTO "F" CLX -1e99 X<> "F" Bear in mind that you can turn these into subroutines, but you can't include the LSTO statement in the subroutine.. (actually, even -1e9 and 1e9 will do for the flag values.. you're not likely to test the flag a billion times.. ;-) In case you need multiple flags, you may resort to saving the state of flags 0-7, using them for your own purpose, and restoring them. For that, X<>F (as in the '41 X-Functions) may be used: Code: 00 { 40-Byte Prgm } Hope you like it, Werner 41CV†,42S,48GX,49G,DM42,DM41X,17BII,15CE,DM15L,12C,16CE |
|||
07-24-2020, 05:18 AM
Post: #2
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
(07-23-2020 10:21 AM)Werner Wrote: In case you need multiple flags, you may resort to saving the state of flags 0-7, using them for your own purpose, and restoring them. For that, X<>F (as in the '41 X-Functions) may be used: I'm adding X<>F in the next major release. Maybe something like RCLFLAG and STOFLAG would be useful, too? The X-FCN version recalls and sets flags 0-43, that would have to be expanded to include at least flags 81-99, so the result would not fit in a six-character string... |
|||
07-24-2020, 05:44 AM
Post: #3
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
You need even more flags: 55-60, 66, 68-71, 72, 73, 74, well...
If you use a number instead of a string, all 100 flags will fit. 2^100 is only about 1e30. Cheers, Werner 41CV†,42S,48GX,49G,DM42,DM41X,17BII,15CE,DM15L,12C,16CE |
|||
07-24-2020, 05:50 AM
Post: #4
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
In the binary version it wouldn't fit in a number.
I could use a two-element vector, but then you wouldn't be able to store it in a numbered register... but if you're going to store it using LSTO anyway, that wouldn't be a problem, I suppose. |
|||
07-24-2020, 06:28 AM
Post: #5
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
I keep forgetting about Free42 Binary, while I'm probably its biggest fan!
Now, I would say RCL/STOFLAGS is used more for mode-preserving, so perhaps it could leave out the User flags? Werner 41CV†,42S,48GX,49G,DM42,DM41X,17BII,15CE,DM15L,12C,16CE |
|||
07-24-2020, 06:42 AM
Post: #6
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
A pair of registers if numbered (n & n+1), a complex number if not? Yeah, a bit of a hack.
FWIW: 0-43, 81-99 would just fit into a numbered register but not remotely nicely. Pauli |
|||
07-24-2020, 07:10 AM
Post: #7
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
(07-24-2020 06:28 AM)Werner Wrote: I keep forgetting about Free42 Binary, while I'm probably its biggest fan! Glad to read that, because the binary version is great! When we refer to Free42, we very often think of the 34-digit accuracy of the BCD version, but the binary version (Windows platform) is so FAST! I'm using it a lot. So, Thomas, don't ever give up the binary version. Actually I'm missing it on the Android platform, but I'm not an Android fan and I'm still enjoying the old Pocket PC versions. J-F |
|||
07-24-2020, 08:55 AM
(This post was last modified: 07-24-2020 09:20 AM by Thomas Okken.)
Post: #8
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
There are a few flags that really never need to be preserved because they are just status indicators, like 45 and 46 (solving, integrating), 49 (low battery), 53 (INPUT), and a few others as well. The remaining 96 or fewer flags that should be able to be saved and restored could then be split into two chunks of 48, which could be stored as a two-element vector containing two strings, or by using the X and Y registers simultaneously, or perhaps by having separate instructions for preserving the user flags and everything else, though then the 48/48 split wouldn't work. Hmm...
EDIT: 48 flags could also be stored in the mantissa of a binary floating-point number, so then the whole set could fit into a complex number, which would be LSTO-friendly and easy to split up for storage in numbered registers as well. EDIT 2: Oh right, that's what Pauli just suggested. (07-24-2020 07:10 AM)J-F Garnier Wrote: So, Thomas, don't ever give up the binary version. Actually I'm missing it on the Android platform, but I'm not an Android fan and I'm still enjoying the old Pocket PC versions. I have felt tempted to drop the binary version at times, but since building it requires next to no extra effort, I ended up keeping it anyway. But building it for Android and iOS, in a way that it can coexist with the decimal version or at least allow easy switching between the two, is a bit more difficult and I could never be bothered to sort that out. There doesn't appear to be much interest in it so I prefer to keep things simple there. |
|||
07-24-2020, 09:36 AM
Post: #9
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
I count 47 'system mode' flags, but I think flag 75 can be left off, so we have 46:
11 auto execution 12 print double wide 13 print lower case 15-16 printer: 0)manual 1)normal 2)trace 3)trace w/stack print using the flags as a two-digit binary 21 printer enabled 22 numeric input available 23 alpha input available 24 ignore range errors 25 ignore any errors & clear 26 BEEP enabled 27 custom mode is active 28 radix mark: Clear is a comma, set is a period. 29 digit groupings shown: Clear - no Set - yes 31 YMD setting with F67 34-35 AGRAPH merging: 0) OR 1) duplicate "on" get turned off 2) overwrite 3) XOR 36-39 number of digits, 0-15 by using the four flags as a binary number. 40-41 display format: 0)sci 1)eng 2)fix 3)all by using the two flags as a two-digit binary 42-43 angle mode: 0)deg 1)rad 2)grad 3)rad by using the two flags as a two-digit binary 44 continuous on 55 printer exists 56 curve fit model: 1)linear 2)log 4)exponential 8)power 60 all \GS mode 65 matrix editor in use 66 auto grow matrices 67 YMD setting with F31 68 base: 0)decimal 1)binary 7)octal 15)hexadecimal 72 local label 73 polar mode 74 real result only 75 programmable menu selected 76 matrix wrap, edge to edge 77 matrix wrap, first to last 78 BSIGNED 79 BWRAP And even so, flags 56-59 and 68-71 can be 'condensed' into 2 flags each. Werner 41CV†,42S,48GX,49G,DM42,DM41X,17BII,15CE,DM15L,12C,16CE |
|||
07-24-2020, 09:39 AM
Post: #10
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
BTW Free42 doesn't do a 'trace with stack print' when both flag 15 and 16 are set - I have no idea (and no means to find out) if a 42S does that or not. The flags doc mentions this is a 'HP-IL' printer behaviour, which of course doesn't apply to a 42S.
Werner 41CV†,42S,48GX,49G,DM42,DM41X,17BII,15CE,DM15L,12C,16CE |
|||
07-24-2020, 10:19 AM
Post: #11
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
(07-24-2020 08:55 AM)Thomas Okken Wrote: ... or perhaps by having separate instructions for preserving the user flags and everything else, though then the 48/48 split wouldn't work. A 64 bit binary float can safely hold 62 flags:
It would probably be more user friendly to restrict it to the 52 mantissa bits (and possibly the sign). User friendly in the sense that changes could easily be made to the value. All 64 bits could be used at a pinch if no operations were ever done. Perhaps using a different type field for this? I expect this would be a huge pain. Pauli |
|||
07-24-2020, 11:06 AM
Post: #12
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
All 64 bits could be used; Free42 will display <Infinity>, <-Infinity>, or <Not a Number> when appropriate. Restricting the encoding to the 48 bits of a 6-character string or the 52 bits of a floating-point mantissa would just look a bit tidier.
Good question about the trace-with-stack mode. I don't have an 82240 but I could test this with Emu42. And even if the real 42S does not implement this behavior, there's no reason Free42 couldn't. |
|||
07-24-2020, 11:14 AM
Post: #13
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
(07-24-2020 10:19 AM)Paul Dale Wrote: A 64 bit binary float can safely hold 62 flags: Avoiding Inf/NaN and subnormal/zero, exponent range = 2^11 - 2, thus able to hold 10 flags. But, if we use binary float to hold flags, there is no reason to avoid them. |
|||
07-24-2020, 11:28 AM
Post: #14
|
|||
|
|||
RE: (Free42) tips & tricks: local flags | |||
07-24-2020, 11:35 AM
Post: #15
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
(07-24-2020 11:14 AM)Albert Chan Wrote: But, if we use binary float to hold flags, there is no reason to avoid them. My concerns are about the possibility of the value changing behind the scenes and signalling NaNs. These shouldn't be a problem but a compiler being clever or a poor implementation might be. They'd also make for a surprising display for the user. Pauli |
|||
07-24-2020, 12:53 PM
Post: #16
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
(07-24-2020 11:06 AM)Thomas Okken Wrote: Good question about the trace-with-stack mode. I don't have an 82240 but I could test this with Emu42. And even if the real 42S does not implement this behavior, there's no reason Free42 couldn't. This is likely mentioned for compatibility w/41 programs which used this mode to print to the 82162A IL Printer, to act the same when printing to the 82240A/B IR Printer. This mode was intended as a debugging aid, when there were few other choices, but it uses up paper at prodigious rates and ultimately not used often, though a few folks in the PPC Journal insisted it was "the only way to properly debug a program", apparently forgetting about paper and pencil... I can check this later on DM42 if curious... --Bob Prosperi |
|||
07-24-2020, 01:55 PM
Post: #17
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
It's a lot more useful with a virtual paper trail for sure than burning up thermal paper (pun intended).
|
|||
07-24-2020, 03:34 PM
Post: #18
|
|||
|
|||
RE: (Free42) tips & tricks: local flags
It looks like the real HP-42S does not have this mode. I checked with Emu42 and the HP82240B Printer Simulator.
It sounds like implementing this in Free42 would require changing most or all occurrences of Code: if flag 15 set and flag 55 set to Code: if flag 15 set and flag 55 set Is that what the real 41C with IL printer does? I have a 41CX but no printer so I can't check that either, and i41CX on my phone only emulates the 82143A where the printing mode is controlled by a hardware switch and flags 15 & 16 have no effect... It would make sense for it to print the stack when STO ST operations are performed. Does the real thing do that? |
|||
07-24-2020, 08:26 PM
Post: #19
|
|||
|
|||
RE: (Free42) tips & tricks: local flags | |||
07-25-2020, 12:08 AM
Post: #20
|
|||
|
|||
RE: (Free42) tips & tricks: local flags | |||
« Next Oldest | Next Newest »
|
User(s) browsing this thread: 1 Guest(s)