The Museum of HP Calculators

Feet-Inches-Fractions Calculator for the HP-41CX

This program is © 1984 by Fred E. Lusk III, PE and is used here by permission.

Introduction

FEET performs feet-inches-fractions (F-I-F) calculations using a two-register RPN stack ("XX" and "YY"). The program handles addition and subtraction of two F-I-F numbers (as long as the result isn't negative), multiplication and division of an F-I-F number by a non-negative constant, and F-I-F to decimal and decimal to F-I-F conversions. The program also provides one data storage register ("RR").

One interesting feature of the program is that the user is not limited to 16ths of an inch, though that is the default, or even the binary fractions 1/2, 1/4, 1/8, etc. FEET can work with ANY fraction, including 1/10, 1/31, 1/88, etc. The program handles incompatible fractions by rounding values off to the nearest multiple of the selected fraction. For example, if FEET is set for 8ths of an inch, an entry of 17/23" will be rounded to 6/8", then reduced to 3/4" and displayed. In addition, an entry such as 1'15-25/8" will be corrected to 2'6-1/8". The program also provides a feet-inches (F-I) only mode that eliminates the need to enter fractions. F-I mode is set by entering an initial fraction value of 0 or 1.

As written, FEET requires an HP-41CX with at least 438 bytes of available program space plus 15 data registers. The program uses several extended functions, including X<>F, XTOA, and REGMOVE, though there are workarounds. The heart of the program (the part that reduces the fractions) is based on the fraction reduction routine in the PPC ROM. However, a PPC ROM is not required.

As well as this program works and as "cool" as I think it is, I am planning a major rewrite. FEET currently stores separate numbers for the feet, inches, numerator, and denominator that comprise each dimension value. The next version will store just one number for each dimension (e.g. 1'2-3/4" would be stored as 236 if the fraction is set to 16ths or 59 if the fraction is set to 4ths). The original programming decision was based on the false notion that big numbers with small fractions would lead to inaccuracies if the entire dimension was reduced to a single number. The reality is that 10000'1-1/16" (an absurdity) would reduce to 1,920,017 16ths, which is well within the non-scientific-notation dynamic range of the HP-41CX. This change will simplify data handling and eliminate the need for the REMOVE command. I may even expand the FEET stack to three or four registers, permit the use of negative numbers, and clean up the program structure. This will also accomplish what I was trying to do in creating an HP-42S version, but never got around to finishing.

Function Keys

```                   RESET    STO     RCL     D>F     F>D
[a]     [b]     [c]     [d]     [e]

+       -       *       /     ENTER
[A]     [B]     [C]     [D]     [E]
```

 RESET Restart the program. This is a quick alternative to XEQ "FEET", and is useful for changing the fraction setting, although the contents of XX and YY are cleared. STO Copy the contents of XX to RR. XX and YY are left undisturbed. Flag 0 is set as a reminder that RR is in use. RCL Recall the contents of RR to XX. The previous contents of XX are moved to YY. The original contents of YY are lost. D>F Convert the decimal value in X (in the regular RPN stack) to F-I-F or F-I and place in XX. The previous contents of XX are moved to YY. The original contents of YY are lost. F>D Convert the F-I-F or F-I contents of XX to decimal feet. The FEET stack is left undisturbed. + Add the contents of XX and YY. The result is placed in XX. Because YY is the top of the two-register FEET stack, YY remains intact. - Subtract XX from YY (YY must be greater than XX). The result is placed in XX. Because YY is the top of the two-register FEET stack, YY remains intact. * Multiply the contents of XX by the constant in X. The result is placed in XX. YY is undisturbed. / Divide the contents of XX by the constant in X. The result is placed in XX. YY is undisturbed. ENTER ENTER: Process the contents of the four-register RPN stack and place in XX and YY RPN stack for F-I-F mode X: Denominator Y: Numerator Z: Inches T: Feet RPN Stack for F-I mode X: Inches Y: Feet

General Instructions

1. To run program: XEQ [ALPHA] FEET [ALPHA]
2. Enter the desired fraction at the FRACTION ? prompt and hit [R/S]. If calculations will be performed using 16ths, the user may skip entering 16 and just hit [R/S] because the default value of 16 is already in X. The program can use any value for the fraction. Use 0 or 1 to set F-I mode, which does not use fractions at all.
3. Data Entry
• For F-I-F mode:
Feet [ENTER^]
Inches [ENTER^]
Numerator [ENTER^]
Denominator [E]
• For F-I mode:
Feet [ENTER^]
Inches [E]
4. See the following examples for additional instructions.

Examples

```1.     a) Find the missing dimension to the nearest 1/16".
b) Multiply the result by 2/3 (just for kicks).
c) Convert to decimal feet and back again.
(drawing not to scale)

|<- 2'3-5/8" ->|<- 2'3-5/8" ->|<-- 7/16" -->|<- 30" ->|<- 1' ->|
|<----- ??? ----->|<- 2'0-32/100" ->|<- 15-1/2" ->|<- 39/16" ->|

KEYBOARD                       DISPLAY                         Notes
--------------------------------------------------------------------
XEQ [ALPHA] FEET [ALPHA]       FRACTION ?
[R/S]                          FT^, IN^, N^, D                 {1.1}
2 [ENTER^]
3 [ENTER^]
5 [ENTER^]
8 [E]                          2'3-5/8"
[A]                            4'7-1/4"                        {1.2}
7 [ENTER^]
16 [A]                         0'0-7/16"                       {1.3}
4'7-11/16"
30 [ENTER^]
0 [ENTER^]
1 [A]                          2'6"                            {1.4}
7'1-11/16"
1 [ENTER^]
0 [ENTER^]
0 [ENTER^]
1 [A]                          1'0"
8'1-11/16"
39 [ENTER^]
16 [B]                         0'2-7/16"
7'11-1/4"
15 [ENTER^]
1 [ENTER^]
2 [B]                          1'3-1/2"
6'7-3/4"
2 [ENTER^]
0 [ENTER^]
32 [ENTER^]
100 [B]                        2'0-5/16"
4'7-7/16"                      {1.5}
2 [ENTER^]
3 / [C]                        3'0-15/16"                     {1.6}
[e]                            3.0781'                        {1.7}
[d]                            3'0-15/16"                       "
Notes
{1.1}  The default value is 16, so no entry is needed this time.
{1.2}  Or: 2 [C]
{1.3}  The new number is displayed while the result is calculated (typ).
{1.4}  For a dimension without any fraction, any denominator will do.
{1.5}  The result for a).
{1.6}  The result for b).
{1.7}  The results for c).

2.     A circle has a diameter of 1'6". Find the circumference and the
quarter circle length to the nearest 1/8" and to the nearest 1/100".

KEYBOARD                       DISPLAY                         Notes
--------------------------------------------------------------------
XEQ [ALPHA] FEET [ALPHA]       FRACTION ?
8 [R/S]                        FT^, IN^, N^, D
1 [ENTER^]
6 [ENTER^]
0 [ENTER^]
1 [E]                          1'6"
[b]                                                            {2.1}
[pi] [C]                       4'8-1/2"
4 [D]                          1'2-1/8"                        {2.2}
[a]                            FRACTION ?
100 [R/S]                      FT^, IN^, N^, D
[c]                            1'6"                            {2.3}
[pi] [C]                       4'8-11/20"
4 [D]                          1'2-7/50"                       {2.4}
Notes
{2.1}  The display shows F00 as set, indicating use of RR.
{2.2}  The first result.
{2.3}  Even though [a] clears F00, RR remains intact.
{2.4}  The second result.

3.     A 24'0" long Archimedes screw pump is to be installed at an angle of
38°. What are the horizontal and vertical distances between the
supports, first to the nearest inch, then to the nearest 1/4"? This
is based on the real-life example that prompted me to write FEET: the
headworks pumps at the Arvin, CA, wastewater treatment plant.

KEYBOARD                       DISPLAY                         Notes
--------------------------------------------------------------------
XEQ [ALPHA] FEET [ALPHA]       FRACTION ?
0 [R/S]                        FT^, IN                         {3.1}
24 [ENTER^]
0 [E]                          24'0"
[b]
38 [COS] [C]                   18'11"                          {3.2}
[c]                            24'0"
38 [SIN] [C]                   14'9"                           {3.2}
[a]                            FRACTION ?
4 [R/S]                        FT^, IN^, N^, D
[c]                            24'0"
38 [COS] [C]                   18'11"                          {3.3}
[c]                            24'0"
38 [SIN] [C]                   14'9-1/4"                       {3.3}
Notes
{3.1}  Or: 1 [R/S]. The display shows F01 as set, indicating F-I mode.
(3.2}  The first two results.
{3.3}  The second two results.
```

Program Listing

The annotations included with the program listing are intended to explain generally how FEET works, and are by no means exhaustive.

```LINE  KEYS
01 * LBL "FEET"        ; ### FEET ###
02 * LBL a             ; ### RESET ###
03   0                 ; [03-11] Clear XX (R01-R04) and YY (R05-R08)
04   STO 01
05   STO 02
06   STO 03
07   STO 04
08   STO 05
09   STO 06
10   STO 07
11   STO 08
12   X<>F              ; Clear flags 0-7
13   1.005004          ; REGMOVE constant for XX and YY
14   STO 09
15   16                ; Default "Fraction" (FF)
16   "FRACTION ?"      ; [16-17] Prompt for FF
17   PROMPT
18   ABS               ; [18-19] Ensure FF is non-negative integer
19   INT
20   X=0?              ; [20-21] Convert FF=0 to FF=1
21   SIGN
22   STO 00            ; Store FF
23   1                 ; [23-25] If FF=1 (or previously 0) program sets
24   X=Y?              ;      F-I mode
25   SF 01
26   FIX 0             ; [26-30] Initialize remaining program settings
27   CLST
28   CF 22
29   SF 27
30   CF 29
31   "FT^, IN"         ; [31-35] Display data entry prompt for F-I and
32   FC? 01            ;      F-I-F calculations
33   "^, N^, D"
34   AVIEW
35   RTN
36 * LBL b             ; ### STO ### -------------------------------------
37   1.011004          ; [37-38] Copy contents of XX into RR
38   REGMOVE
39   SF 00             ; Indicate storage register is in use
40   CLST
41   CF 22             ; Clear data entry flag
42   AVIEW             ; Redisplay XX
43   RTN
44 * LBL c             ; ### RCL ### -------------------------------------
45   RCL 09            ; [45-46] Copy contents of XX to YY
46   REGMOVE
47   11.001004         ; [47-48] Copy contents of RR to XX
48   REGMOVE
49   GTO 99            ; Go to routine to display XX
50 * LBL d             ; ### D>F ### -------------------------------------
51   RCL 09            ; [51-52]  Copy contents of XX to YY
52   REGMOVE
53   X<>Y              ; Bring input decimal value back to X
54   INT               ; [54-69] Parse decimal value into F-I-F and store
55   STO 01            ;      components
56   LASTX
57   FRC
58   12
59   *
60   FS? 01            ; [60-61] Jump out if only working with F-I
61   GTO 15
62   INT
63   STO 02
64   LASTX
65   FRC
66   RCL 00
67   *
68   RND
69   STO 03
70   GTO 98           ; Go to routine to display XX
71 * LBL e            ; ### F>D ### --------------------------------------
72   XEQ 02           ; Data handling
73   RCL 01           ; [73-78] Fill RPN stack with XX components
74   RCL 02
75   FS? 01           ; [75-76] Skip [77-80] if in F-I mode
76   GTO 10
77   RCL 03
78   RCL 04
79   /                ; [79-84] Convert F-I-F or F-I to decimal feet
80   +
81 * LBL 10
82   12
83   /
84   +
85   FIX 4            ; [85-92] Display result
86   CLA
87   ARCL X
88   39
89   XTOA
90   X<>Y
91   FIX 0
92   AVIEW
93   RTN               ; Result kept in X so [d] will "reverse" process
94 * LBL A             ; ### + ### ---------------------------------------
95   SF 06             ; Set addition flag
96 * LBL B             ; ### - ###
97   XEQ 02            ; XEQ routine to convert RPN stack to F-I-F or F-I
98   FS?C 06           ; [98-103] Subtraction = adding -XX to YY
99   GTO 01
100   -1
101   ST* 01
102   ST* 02
103   ST* 03
104 * LBL 01
105   RCL 05            ; [105-121] XX + YY
106   ST+ 01
107   RCL 06
108   ST+ 02
109   FS? 01
110   GTO 98
111   RCL 03
112   RCL 04
113   /
114   RCL 07
115   RCL 08
116   /
117   +
118   RCL 00
119   *
120   RND
121   STO 03
122   GTO 98
123 * LBL 02            ; -------------------------------------------------
124   FS? 22            ; [124-125] If data entered into RPN stack, XEQ 21
125   XEQ 21            ;      to raise FEET stack
126   FS?C 22           ; [126-127] if data entered into RPN stack, XEQ 97
127   XEQ 97            ;      to process data in RPN stack
128   RTN
129 * LBL C             ; ### * ### ---------------------------------------
130   ST* 01
131   ST* 02
132   ST* 03
133   GTO 03
134 * LBL D             ; ### / ### ---------------------------------------
135   ST/ 01
136   ST/ 02
137   ST/ 03
138 * LBL 03
139   RCL 01            ; [139-166] Reduce XX to proper components
140   INT
141   STO 01
142   LAST X
143   FRC
144   12
145   *
146   ST+ 02
147   RCL 02
148   FS? 01
149   GTO 15
150   INT
151   STO 02
152   LASTX
153   FRC
154   RCL 03
155   RCL 04
156   /
157   +
158   RCL 00
159   *
160   RND
161   STO 03
162   GTO 98
163 * LBL 15
164   RND
165   STO 02
166   GTO 98
167 * LBL E             ; ### ENTER ### -----------------------------------
168   SF 05             ; Set FEET data entry flag
169 * LBL 97            ; Jump-in point for other subroutines
170   FS? 01            ; [170-171] If in F-I mode, skip fraction
171   GTO 07
172   /                 ; [172-175] Convert fraction to multiple of FF
173   RCL 00
174   *
175   RND
176   STO 03            ; Store fractional part of XX
177   RDN
178 * LBL 07
179   STO 02            ; Store inches part of XX
180   RDN
181   STO 01            ; Store feet part of XX
182 * LBL 98
183   RCL 03            ; [183-...] Normalize XX, incl. reducing fraction
184   X<0?
185   DSE 02
186   .                 ; The fasted NOP available
187   -12
188   RCL 02
189   X=Y?
190   GTO 03
191   X<0?
192   DSE 01
193   .
194 * LBL 03
195   RCL 03
196   RCL 00
197   RCL 03
198   RCL 00
199   XEQ 08            ; XEQ fraction reduction subroutine
200   ST/ Z
201   /
202   STO 04
203   X<>Y
204   STO 03
205   X<>Y
206   /
207   INT
208   ST+ 02
209   RCL 03
210   RCL 04
211   MOD
212   STO 03
213   RCL 02
214   12
215   /
216   INT
217   ST+ 01
218   RCL 02
219   12
220   MOD
221   STO 02
222   RCL 01            ; [222-224] After normalizing, if the feet part of
223   X<0?              ;      XX is negative, then it's all wrong. Create
224   SQRT              ;      an error in lieu of writing more code.
225   FS?C 05
226   XEQ 21
227 * LBL 99            ; -------------------------------------------------
228   CLA               ; [228-246] Display XX as F-I-F or F-I
229   ARCL 01           ; Feet
230   39                ; [230-231] Append feet (') symbol
231   XTOA
232   ARCL 02           ; Append Inches
233   RCL 03            ; [233-235] If no fraction, skip fraction display
234   X=0?
235   GTO 09
236   "-"             ; Append hyphen (between inches and fraction)
237   ARCL 03           ; Append numerator
238   "/"             ; Append virgule
239   ARCL 04           ; Append denominator
240 * LBL 09
241   34                ; [241-242] Append inches (") symbol
242   XTOA
243   CLST              ; [243-244] Clean-up
244   CF 22
245   AVIEW             ; Display XX
246   RTN
247 * LBL 08            ; -------------------------------------------------
248   MOD               ; [248-254] Part of fraction reduction routine
249   LASTX             ;      (see FR in the PPC ROM User's Manual)
250   X<>Y
251   X!=0?             ; X not equal to 0?
252   GTO 08
253   +
254   RTN
255 * LBL 21            ; -------------------------------------------------
256   X<> 09            ; [256-258] Raise stack
257   REGMOVE
258   X<> 09
259   END
```

Program Resources

Registers

```R00:  Fraction (FF)
R01:  XX Feet
R02:  XX Inches
R03:  XX Numerator (reduced)
R04:  XX Denominator (reduced)
R05:  YY Feet
R06:  YY Inches
R07:  YY Numerator (reduced)
R08:  YY Denominator (reduced)
R09:  REGMOVE constant for XX and YY
R10:  Not used
R11:  RR Feet
R12:  RR Inches
R13:  RR Numerator (reduced)
R14:  RR Denominator (reduced)
```

Flags

```F00:  RR in use
F01:  F-I mode set
F22:  Data entry
F27:  USER Mode
F29:  Digit separators
(F02-F07 cleared for "clean" display)
```