I recently picked up a copy of Free42 and it made me dig out the real thing to play with again. I'd forgotten many of the joys of using it, as well as the painful aspects, but they're all fresh in my mind again now. :)
At any rate, this program evolved over time, as they all do, and I guess it might be useful in some way to some of you, so I offer it for your consideration.
There might be enough comments within the listing. If not, ask.
I normally wouldn't use "@" for comments, but I seem to recall that was the convention for this sort of stuff.
Also, I don't presently have access to a web server to put a 39KB zip file on, so cannot include the .raw file and several formatted versions of the text listing. Sorry. I'll see what I can do if there's any interest.
Here it is:
00 { 388-Byte (Free42) Prgm } @@ pretty much pointless on native hardware @@
01>LBL "FWIW" @"For What It's Worth"; "show" all digits of stack X value
02 GTO 01
03>LBL 00 @two options placed early for ease of manipulation:
04 3 @<- maximum quantity of digits pre-radix / min. "E" multiplier
05 STO ".M." @@ "1" = "SCI"; "3" = "ENG"; but others seem to work as well...
06 3 @<- digits "grouping" size post-radix; practical range begins
07 STO ".G." @@ at "3" and ends at "24" (see declaration of ".J." below)
08 RTN
09>LBL 01
10 REAL? @we'll be using "LOG" which won't work well otherwise
11 GTO 02
12 GTO 11 @so abort; it's "otherwise"
13>LBL 02
14 X=0? @if nothing's in the register this whole thing's (even more?)
15 GTO 11 @@ pointless, so just skip to the end
16 STO ".X." @place copies of the stack aside for later restoration:
17 Rv @ @ excepting the ALPHA register, this program leaves the
18 STO ".Y." @ @ machine completely in it's same prior state when done
19 Rv @ @ unless named variables herein had pre-existed (see list
20 STO ".Z." @ @ of "CLV"s at the end); no user flags or REGs get molested
21 Rv
22 STO ".T."
23 LASTX
24 STO ".L."
25 CLA
26 XEQ 00
27 STO ".I."
28 24 @<- this variable is only necessary in Free42bin, where a
29 STO ".J." @@ smaller value would really be more appropriate anyway since
30 RCL ".X." @@ "noise" starts earlier, and keeps rising like so much radon
31 SIGN @@ from the cellar in that version
32 STO ".S." @<- keep track of the sign for display purposes
33 LASTX
34 ABS @LOG likes positive values for "real" results
35 ENTER
36 LOG @this section would be as easy to step through and watch as
37 ENTER @to read a description of it; at least easier than writing it...
38 X>=0?
39 GTO 03
40 FP
41 X=0?
42 GTO 03
43 Rv
44 IP
45 1
46 -
47 ENTER
48>LBL 03
49 Rv
50 IP
51 STO ".E."
52 RCL ".M."
53 MOD
54 STO- ".E."
55 Rv
56 RCL ".E."
57 10^X
58 X=0? @<- depending on ".M." (if >1) plus proximity to limits of
59 GTO 09 @@ "-E" values (where things can get "dicey" anyway for this in
60 ÷ @@ Free42bin), trouble can ensue here; this allows restoration
61 RCL× ".S." @@ of state in that unfortunate event, accompanied by a cryptic
62 AIP @@ statement at (failed) program exit (see below)
63 RCL× ".S."
64 FS? 28 @here we follow current radix display convention
65 |-"."
66 FC? 28
67 |-","
68 FP
69>LBL 04 @start appending post-radix digits
70 10
71 ×
72 AIP
73 FP
74 DSE ".J." @<- in Free42dec this isn't even necessary but in *bin it is;
75 X=0? @<- *dec's digits run out and break loop all on their own
76 GTO 07
77 DSE ".I." @restart in-group loop or add (linefeed/)separator to ALPHA
78 GTO 04
79 RCL ".G."
80 STO ".I." @re-use variable here to count back "group-size" digits from
81 Rv @@ end of first ALPHA line-width, to ensure entire
82 ALENG @@ un-"wrap-broke" groupings
83 22
84 X<=Y?
85 GTO 06
86 1
87 -
88>LBL 05 @add a linefeed within any appropriate group separator
89 X=Y?
90 |-"\LF"
91 DSE ST X
92 DSE ".I."
93 GTO 05
94 RCL ".G."
95 STO ".I." @re-reset counter for adding another "group" of digits to ALPHA
96 Rv
97>LBL 06
98 |-" " @at least this'll happen whenever we get into this loop
99 RCL ST Z
100 GTO 04 @back for (possibly) more digits above...
101>LBL 07 @no more digits to add at this point
102 ALENG
103 22
104 X<=Y? @add a linefeed if needed to prevent exponent component from
105 GTO 08 @@ getting "wrap-broke"
106 10 @@ as a result of "rudimentaryness" it'll always appear on the
107 POSA @@ second line of the display, even with a very short mantissa
108 X<0?
109 |-"\LF"
110>LBL 08 @and here it comes...
111 |-" E" @this is the "exponent" (little big) "E"
112 RCL ".E."
113 AIP
114 GTO 10
115>LBL 09 @this is the cryptic "we'd 'divode' by zero" message, if needed,
116 "Went out of" @ it can (probably?) be avoided by using a "1" for ".M."
117 |-" range! :("
118>LBL 10
119 AVIEW @show result
120 CLA @wipe the slate
121 RCL ".L." @restore all program-changed state
122 STO ST L
123 RCL ".T."
124 RCL ".Z."
125 RCL ".Y."
126 RCL ".X."
127 CLV ".M." @the unsorted list of variables created(?)/destroyed ensues
128 CLV ".G."
129 CLV ".I."
130 CLV ".J."
131 CLV ".S."
132 CLV ".E."
133 CLV ".L."
134 CLV ".T."
135 CLV ".Z."
136 CLV ".Y."
137 CLV ".X."
138>LBL 11
139 END
@I believe I've culled all code which would never get called...
@ © GMS 21 Feb 2011, for what it's worth :)
EDIT: Here's the FWIW.raw file uuencoded (base64):
begin-base64 644 FWIW.raw
wAD1AEZXSVeyAAETAPSBLk0uEwD0gS5HLoUComWzALwAA2e8APSBLlgudfSB
LlkudfSBLloudfSBLlQudvSBLkwuh+AAAPSBLkkuEhQA9IEuSi70kS5YLnr0
gS5TLnZhg1aDol+0AGlntAB1aBEAQYMEdWj0gS5FLvSRLk0uS/SDLkUudfSR
LkUuV2e6AEP0lC5TLqYx9JQuUy6sHPJ/Lq0c8n8saQUREABCpjFp9JcuSi5n
uAD0ly5JLrUA9JEuRy70gS5JLnWmQRISAEa3ABEAQQZ48n8Kl3P0ly5JLrYA
9JEuRy70gS5JLnUH8n8gkHG1AAimQRISAEa5ABEQAKZcZvJ/CgnzfyAY9JEu
RS6mMbsACvtXZW50IG91dCBvZvx/IHJhbmdlISAgOigLfof0kS5MLpF09JEu
VC70kS5aLvSRLlku9JEuWC70sC5NLvSwLkcu9LAuSS70sC5KLvSwLlMu9LAu
RS70sC5MLvSwLlQu9LAuWi70sC5ZLvSwLlguDMAADQ==
====
Edited: 24 Feb 2011, 12:46 a.m.