If you're interested in what's been going on with Free42,
see the project history.
If you have questions or comments about Free42, you can contact me, Thomas Okken, via email at thomasokken@gmail.com.
You can find answers to some frequently asked questions in the Free42 FAQ.
![]() |
AndroidGet it at Google Play, or if you prefer the manual approach, download Free42Android.apk for side-loading.Requires Android 4.0 or later. |
![]() |
iOS (iPhone, iPad, iPod touch)Get it from the App Store.Requires iOS 8.0 or later. NOTE: This is an "iPhone only" app, and as such, if you're using an iPad, the App Store app won't show it to you by default. You must select the "iPhone only" option from the drop-down menu in the top-left corner first. The app runs fine on iPads; Apple just makes it hard to find. |
![]() |
WindowsDownload: Free42Windows.zipRequires Windows 2000 SP4 or later. If, when you try to run Free42, Windows says "This application has failed to start because the application configuration was incorrect. Reinstalling the application may fix this problem," then you also need to download and install the Microsoft Visual C++ 2008 Redistributable Package. |
![]() |
MacOSDownload: Free42Mac.zipRequires MacOS 10.7 or later. |
![]() |
LinuxDownload: Free42Linux.tgzBuilt in Ubuntu 12.04, with glibc 3.2, libstdc++ 4.6.3, and GTK+ 3.4.2. It should work on any Linux (x86_64) with those or similar libraries. |
|
|
![]() |
SkinsSome skins to use instead of the faceplates built into Free42. |
![]() |
HP-42S/Free42 programsA small collection of HP-42S/Free42 programs. |
![]() |
rom2rawA C program that converts user code from HP-41 ROM images, from ROM or MOD files, to Free42/Emu42 compatible "raw" program files.Download rom2raw.zip; source code and Win32 console executable included. |
![]() |
Free42 Source CodeGet it from GitHub: https://github.com/thomasokken/free42Package for GTK only, no HP logo, for building Linux packages: upstream.
|
There is no manual for Free42 per se, but since it is an accurate simulation of the HP-42S, the original HP-42S Owner's Manual should be adequate for most purposes. I also recommend the Alternative HP-42S/Free42 Manual, written by José Lauro Strapasson and Russ Jones; you can get it here, in PDF and Word formats. Finally, the HP-42S Programming Examples and Techniques book is a great source of advanced programming advice and inspiration.
The User Interface functionality that is specific to Free42, e.g. printer emulation, skin switching, etc., is fairly simple and should be self-explanatory, but Free42 also has extended functionality in the calculator simulation: program import/export, time and date functions, configurable word size for BASE functions, enhanced debugging functions, local variables, and access to the accelerometer / GPS / compass on Android and iOS devices. These are all documented below.
Loading and saving programs is possible in all Free42 versions.
The exact process is pretty straightforward in the desktop versions
(Windows, MacOS, Linux), but it is a bit more complicated on mobile devices.
For instructions for all versions, see here.
Starting with release 2.0, you can use Copy and Paste to get programs into and out of Free42. In PRGM mode, Copy puts a text representation of the current program onto the system clipboard, and Paste takes a text representation of a program from the clipboard and loads it as the last program. This works in all Free42 versions, including mobile.
Basic Copy and Paste, handling real and complex scalars, has been a feature of Free42 since its early days. In version 2.0, however, the capabilties of Copy and Paste were greatly improved, now handling all the types of data that the calculator supports.
Scalars
Real and complex numbers are copied from the X register at full precision, without thousands separators, and with a decimal point or comma according to the RDX. or RDX, setting in the DISP menu. Complex numbers are copied with the notation matching the RECT or POLAR setting in the MODES menu: a+bi in RECT mode, and r ∠ θ in POLAR mode.
When pasting scalars, periods and commas are interpreted according to the RDX. / RDX, setting. Thousands separators are permitted but ignored. Complex numbers are recognized in several formats: a+bi, a+bj, and (a, b) representing the rectangular form, and r ∠ θ and r ∡ θ representing the polar form.
Strings
Strings are copied and pasted from and to the X register, up to six characters in length, and from and to the ALPHA register (while in ALPHA mode) up to the full 44-character ALPHA register length. When copying, characters are converted from the HP-42S encoding to Unicode where possible, the only exceptions being the HP-42S characters LF and EC, which have no equivalents in Unicode, and are translated to [LF] and [ESC]. When pasting, Unicode characters that can't be mapped to HP-42S characters are replaced by • (bullet, which looks like a small square).
Matrices
Matrices are copied from and pasted to the X register in tab-delimited text format, where cells are separated by tab characters, and rows are separated by linefeed characters. This format is supported by all major spreadsheet applications, and the Free42 matrix Copy and Paste operations have been tested with Microsoft Excel, Google Sheets, LibreOffice Calc, and Apple Numbers.
Free42 supports copying and pasting complex matrices, but be aware that most spreadsheets offer only very limited support for complex numbers, and Google Sheets does not support them at all.
Programs
When in PRGM mode, Copy and Paste can be used to copy and paste entire programs. When copying, the current program is converted to text format, exactly as when it is printed using PRP. When pasting, the text from the clipboard is parsed as a program listing, and the resulting program is loaded at the end of program memory as a new program. It is possible to paste multiple programs in a single Paste operation; they will be loaded into program memory in the order they appear in the text.
When pasting, all text that Free42 doesn't recognize as HP-42S instructions is silently ignored. This helps with listings that contain comments, but it can cause problems when pasting code that is basically valid, just not formatted in a way Free42 recognizes. Because of this, when pasting a program from an unverified source, it is recommended to at least check that the pasted program has the same number of lines as the listing.
Starting with version 2.5, Free42 allows you to save the calculator's state to files, share these files between different instances of Free42, and manage a set of states and switch between them with just a few mouse clicks.
The States command, found in the File menu in the Windows, MacOS, and Linux versions, and in the main menu in the Android and iOS versions, pops up the States management window, as seen in the screen shot on the right.
The calculator's state includes all programs and variables, the automatic stack, the flags, CUSTOM menu, programmable menu, ALPHA register, and all the state associated with the numerical solver and integrator. You can save a state to a file with the extension .f42, and load such files, using the Export and Import commands in the State manager's More menu. States that have been imported show up in the list of States, and can be activated by double-clicking them, or clicking them and then pressing Switch To.
Other operations in the States manager include duplicating an existing state, creating a new, empty state, and renaming an existing state. In addition, the mobile versions of Free42 offer the option of "sharing" a state, which brings up a system-provided dialog where you can send the state file in an email.
Note that State files are not the same as the "raw" files used for exchanging programs. A "raw" file contains one or more programs, but nothing else, and can be loaded into Free42 without replacing what's already there. A state file, by contrast, defines the calculator's entire state, and loading a state file replaces the previously loaded one in memory. You can only work with one state at a time, but states do let you customize the calculator to a far greater extent than merely loading a program can.
While Free42 originally used Binary math exclusively, all releases starting
with 1.4 have come in two versions, Binary and Decimal. The two look and
behave identically; the only difference is the way they represent numbers
internally.
The desktop versions of Free42 on this site, that is, the ones for Windows, MacOS,
and Linux, include both the Binary and Decimal versions in the download packages.
The versions for Android and iOS, on the other hand, are Decimal only. They
could in principle be built with Binary math as well, but due to the way the
Android and iOS app stores work, distributing both versions at the same time
would be problematic.
Free42 Decimal uses the Intel Decimal Floating-Point Math Library; it uses IEEE 754-2008 quadruple precision decimal floating-point, which consumes 16 bytes per number, and gives 34 decimal digits of precision, with exponents ranging from −6143 to +6144.
Free42 Binary uses the PC's FPU; it represents numbers as IEEE 754 compatible double precision binary floating-point, which consumes 8 bytes per number, and gives an effective precision of nearly 16 decimal digits, with exponents ranging from −308 to +308.
The binary version has the advantage of being much faster than the decimal version; also, it uses less memory. However, numbers such as 0.1 (one-tenth) cannot be represented exactly in binary, since they are repeating fractions then. This inexactness can cause some HP-42S programs to fail.
If you understand the issues surrounding binary floating-point, and you do not rely on legacy software that may depend on the exactness of decimal fractions, you may use Free42 Binary and enjoy its speed advantage. If, on the other hand, you need full HP-42S compatibility, you should use Free42 Decimal.
If you do not fully understand the above, it is best to play safe and use Free42 Decimal.
These functions are documented in detail in the HP-82182A Time Module Owner's Manual and the HP-41CX Owner's Manual, both of which can be viewed on-line here, here, and here.
Note: the date functions handle dates between October 15, 1582, and
September 10, 4320. The former is the first day of the Gregorian
Calendar, and the latter is 999,999 days later.
The format in which the date functions accept and return dates is
MM.DDYYYY when in MDY mode, DD.MMYYYY when in DMY mode, and YYYY.MMDD in YMD mode.
ADATE Appends the contents of the X register to the ALPHA register, formatted as a date value: in DMY mode, DD.MMYYYY is displayed as DD.MM.YYYY; in MDY mode, MM.DDYYYY is displayed as MM/DD/YYYY; and in YMD mode, YYYY.MMDD is displayed as YYYY-MM-DD. In MDY and DMY modes, if the number of digits of the display mode is 4 or less, the century part is omitted; if it is 2 or less, the entire year part is omitted; and if it is 0, the months or days part is omitted (in DMY or MDY mode, respectively). In YMD mode, if the number of digits in the display mode is 2 or less, the day part is omitted, and if it is 0, the month and day parts are omitted.
ATIME Appends the contents of the X register to the ALPHA register,
formatted as a time value: HH.MMSSss is displayed as HH:MM:SS.ss. In CLK12 mode,
times with HH between −23 and 23 are displayed in 12-hour format: −23 to −13 as
−HH−12 PM; −12 to −1 as −HH PM; 0 as 12 AM; 1 to 11 as HH AM; 12 as 12 PM;
13 to 23 as HH−12 PM. When |HH| ≥ 24, the sign is ignored, and HH is shown
as is, with no AM or PM appended. In CLK24 mode, HH between −1 and −11 are
displayed as −HH+12; all other values are shown as |HH|. No AM or PM are
displayed.
If the number of digits of the display mode is 4 or less, the centiseconds part
is omitted; if it is 2 or less, the seconds part is omitted; and if it is 0,
the minutes part is omitted.
ATIME24 Like ATIME (see above), except it always formats the time in 24-hour format, regardless of the CLK12/CLK24 setting.
CLK12 Display the time in 12-hour format with AM/PM.
CLK24 Display the time in 24-hour format.
DATE Returns the current date to the X register. In MDY mode, the date is returned as MM.DDYYYY; in DMY mode, it is returned as DD.MMYYYY; and in YMD mode, it is returned as YYYY.MMDD. In addition, when executed from the keyboard, this also displays the date formatted as "MM/DD/YYYY DOW", "DD.MM.YYYY DOW", or "YYYY-MM-DD DOW", respectively.
DATE+ Takes a date from the Y register, and adds a number of days from the X register.
DDAYS Calculates the number of days between the date in the Y register and the date in the X register. If the date in the Y register is earlier, then the result will be positive.
DMY Display, return, and accept dates in day/month/year format.
DOW Calculates the day of the week for the date in the X register. Returns a number from 0 to 6, where 0 is Sunday, 1 is Monday, and so on. When this function is executed from the keyboard, the day is also displayed in a human-friendly format, i.e. MON for Monday, TUE for Tuesday, etc.
MDY Display, return, and accept dates in month/day/year format.
TIME Returns the current time in the X register. The time is returned in HH.MMSSss format, with HH from 0 to 23, regardless of the CLK12/CLK24 setting. In addition, when executed from the keyboard, it displays the time in "HH:MM:SS AM" or "HH:MM:SS" format, when the display format is CLK12 or CLK24, respectively.
YMD Display, return, and accept dates in year/month/day format.
In n-bit signed mode, the numerical range is from −(2n−1) to 2n−1−1, and in n-bit unsigned mode the numerical range is from 0 to 2n−1.
Wrapped mode changes the behavior when arguments or results go beyond the aforementioned ranges. In the standard, non-wrapped mode, arguments outside of those ranges result in Invalid Data errors, and results outside of those ranges result in Out of Range errors, unless the Range Error Ignore flag (flag 24) is set, in which case the result is the closest value from within the range.
In wrapped mode, parameters and results are held within the allowable range by simply ignoring or discarding any bits to the left of bit n−1. This behavior will be natural to anyone familiar with the behavior of microprocessors, or of integer arithmetic and bitwise logic in C and related programming languages.
Free42 2.4 adds the following functions, in a new row in the MODES menu, for managing the new BASE modes:
WSIZE Sets the word size to the number in the X register, which must be between 1 and 64.
WSIZE? Returns the current word size.
BSIGNED Toggles signed mode. In signed mode, numbers are interpreted as two's complement signed integers, like on the real HP-42S and in earlier versions of Free42; in unsigned mode, numbers are always interpreted as non-negative, and negative numbers do not exist. You can check whether signed or unsigned mode is active by checking the MODES menu, where there will be a dot marking the BSGN menu item when signed mode is active. Alternatively, you can check flag 78.
BWRAP Toggles wrapped mode. In wrapped mode, numbers are kept within WSIZE bits by discarding any bits to the left of bit WSIZE−1; in non-wrapped mode, numbers outside of the binary range are not allowed and cause Invalid Data errors when parameters are out of range, or Out of Range errors when results are out of range. You can check whether wrapped or non-wrapped mode is active by checking the MODES menu, where there will be a dot marking the BWRP menu item when wrapped mode is active. Alternatively, you can check flag 79.
BRESET Resets all BASE modes back to their defaults, which match the behavior of the real HP-42S: WSIZE 36, signed, not wrapped.
SST↓ or Step Into: Executes one line of code, and if the line in question is a function call, the next line to be executed will be the first line of the function being called. That is, you are Stepping Into the function;
SST→ or Step Over: Executes one line of code, and if that line is a function call, it is executed in that one step. You are not Stepping Into the function; rather, you are Stepping Over it.
SST↑ or Step Out: Starts program execution, continuing until just after the end of the current function. You are Stepping Out of the function.
Step Into is the same as the original SST function in the HP-42S. Free42 2.1 adds the alias SST↓ for this function, but its behavior is the same, because it's just another name for the same function. Step Over and Step Out are new functions in 2.1. The three together can be assigned to a row in the CUSTOM menu, for example:
A note about Step Over: for most instructions, Step Over behaves the same as Step Into. In high-level language debuggers, the only difference between the two is with function or method calls. In Free42, Step Over steps over XEQ instructions, those being the keystroke-programming equivalent of function calls, but it also steps over SOLVE and INTEG, while Step Into will step into the function being solved or integrated.
Conversely, if you interrupt program execution while SOLVE or INTEG are active, Step Out will cause execution to continue until SOLVE or INTEG are done, as if SOLVE or INTEG are a kind of XEQ.
00 { 37-Byte Prgm } 01▸LBL "FAC" 02 X≠0? 03 GTO 00 04 SIGN 05 RTN 06▸LBL 00 07 R↑ 08 LSTO "T" 09 R↓ 10 LSTO "N" 11 1 12 - 13 XEQ "FAC" 14 RCL "N" 15 × 16 RCL "T" 17 R↓ 18 ENDSince local variables make it possible to implement recursive algorithms that the real HP-42S can't handle, it also becomes much more useful to have a larger return stack. While the real HP-42S, and older versions of Free42, have an 8-level RTN stack, Free42 2.2 has 1024 RTN levels.
ACCEL Query the accelerometer. The three components of the
acceleration vector are returned in the X, Y, and Z registers. Holding the
device facing you, in portrait orientation, and the dock connector
pointing towards the floor, positive X is acceleration toward the left,
positive Y is acceleration downwards, and positive Z is acceleration
away from you — or, in terms of gravity, positive X is gravity pulling
to the right, positive Y is gravity pulling upwards, and positive Z is
gravity pulling toward you.
Note: Accelerations are returned in units of Earth gravities, not
m/s2 as you might expect. The iOS API documentation states that the unit used is
9.81 m/s2, and those values are returned unchanged by the ACCEL function.
On Android, the API returns the accelerations in m/s2, and these are
converted by Free42 to gravities using the "standard gravity" of 9.80665 m/s2.
LOCAT Query GPS. The location is returned as follows: latitude in X, longitude in Y, elevation in Z, and horizontal and vertical accuracy in a two-element vector in T. The latitude and longitude are given in decimal degrees, with North and East being positive; the elevation and accuracies are given in meters. If an accuracy is −1, that means that the corresponding measurement is not valid.
HEADING Query the compass. This returns the following data: magnetic heading in X, true heading in Y, heading accuracy in Z, and the raw magnetic vector in a three-element vector in T. The headings and accuracy are given in degrees, where North is 0, East is 90, and so on; the components of the magnetic vector are given in microteslas. The components are oriented with respect to the device along the same axes as the accelerometer readouts.
Having ruled out human error, the reasons an HP-42S program may not work correctly in Free42 are:
The HP-42S represents numbers with a 12-digit decimal mantissa, and an exponent from 10−499 to 10499; Free42 Decimal uses a 34-digit decimal mantissa, and an exponent from 10−6143 to 106144; and Free42 Binary uses native binary floating-point, which on all currently supported platforms is IEEE-754 double precision, with a 53-bit binary mantissa which is roughly equivalent to 16 decimal digits, with an exponent from 10−308 to 10308.
These differences can cause Free42 to calculate different results than the HP-42S. For example, 1 ENTER 3 1/x − LASTX − LASTX − returns 1e−12 on the HP-42S but 1e−34 on Free42 Decimal, because of the wider mantissa; 1 ENTER .2 − .2 − .2 − .2 − .2 − returns 0 on the HP-42S but 5.55111512313e−17 on Free42 Binary, because 0.2 is a repeating fraction in binary.
Most of these kinds of compatibility problems can be avoided by using Free42 Decimal, but, although they are rare, there are programs that don't work correctly even in Free42 Decimal. Mostly these are programs that specifically rely on the size of the mantissa and/or the range of the exponent, but the extra precision of Free42 Decimal can also potentially throw off straightforward numerical algorithms, for example, if they use termination conditions that aren't robust.
If your computer / smartphone / tablet is set to a locale where the decimal is a comma, Free42 is set to RDX, (radix comma) mode on hard reset; in all other locales, it is set to RDX. (radix dot) mode on hard reset. If you're seeing incorrectly formatted data in your program's output, you may have to switch to RDX. mode (RDX. in the MODES menu, or SF 28).
This is not actually a difference between Free42 and the HP-42S that causes HP-42S programs to fail in Free42, but it is something that can cause confusion. What's going on?
In programs, the HP-42S stores numbers basically as you enter them. If you want to enter the number 1000 in a program, you can enter 1000, or 1E3; the latter saves one byte, but apart from that, there is no difference.
Free42, on the other hand, stores numbers in programs in floating-point format, which means that the distinction between 1000 and 1E3 is not preserved. When it displays a program line containing a number, it formats the number in whichever way would be the most compact on the HP-42S, so, if you enter 1000, it is displayed as 1E3, but if you enter 10, it is displayed as 10. (When scientific and fixed-point representations are the same length, it chooses the latter, so 100 is displayed as 100, not as 1E2.)
Again, none of this has any effect on how Free42 performs calculations. I am mentioning this here because even though it may appear that Free42 does something differently than the HP-42S, this is a difference you should ignore.
Unfortunately, iOS does not provide apps with a way to detect whether the devices they're running on have Haptic Feedback support or not, and so, in order to make sure that the option is available on all devices that do have that support, I have no choice but to put the Haptic Feedback switch in the Preferences screen on all devices.
If Apple ever adds a way to detect Haptic Feedback support, I'll change the Preferences screen so the Haptic Feedback switch is hidden or disabled on devices where it's of no use, but until then, the current confusing situation will continue. My apologies!
For the longest time, Apple didn't seem to mind, but when I submitted 1.4.75a, it was rejected because of this issue. I had no choice but to comply, and so now, OFF just beeps, and OFF in a program causes the program to stop.
For people who liked and used the original OFF functionality, I added a back door to re-enable that behavior. Follow these steps:
Enter ALPHA mode: Shift ENTER
Type YESOFF using the ALPHA menu: XEQ √x Σ+ LN LN 1/x LOG 1/x 1/x Σ+ 1/x Σ+
Store the text in the X register using ASTO ST X: STO . √x
Perform OFF: Shift EXIT
With the string YESOFF in the X register, OFF works again. You only have to do this once; executing OFF this way sets a hidden flag telling Free42 to always perform the old-style OFF behavior from then on, regardless of the contents of the X register.
If you ever uninstall and reinstall Free42, you will have to repeat the procedure. You will not have to repeat the procedure when you get updates.
Yes, this is highly misleading, because Free42 is not "iPhone only," at least not in the sense that it only runs on iPhones. What Apple means by "iPhone only" are apps that are not designed to take advantage of the iPad's larger screen. Free42 is "iPhone only" in that sense: it runs on iPads, but it acts just like it does on iPhones.
When this happens, it's because the calculator is in BASE mode. You can verify this by pressing and holding any of the arithmetic or +/− keys: in BASE mode, they perform BASE÷, BASE×, BASE−, BASE+, and BASE+/−, respectively, and these commands interpret their arguments as 36-bit signed binary integers, and return results within those same constraints.
To get back to normal behavior, leave the BASE application by pressing EXIT until no menu is shown in the display.
When even RCL 00 returns Size Error, however, that usually means that the REGS matrix was inadvertently deleted. This also causes all statistical functions to fail, since they all use numbered registers to access the summation data.
To fix this, and restore REGS to its default size, say SIZE 0025: Shift +/− ▼ Σ+ 0 0 2 5.
The answer is to spell it out using the ALPHA menu: Shift 1 ENTER LN 1/x LN 1/x LN √x ▼ 1/x √x ENTER Σ+
(Replace Σ+ with whichever key in the CUSTOM menu you want to assign SST↓ to.)