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 10^499; Free42 Decimal uses a 34-digit decimal mantissa, and an exponent from 10^(-6143) to 10^6144; 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 10^308.
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.
The HP-42S is set to Printer Off mode on hard reset, but because Free42 has a built-in printer simulator, I thought it made more sense to have it be set to Printer On mode on hard reset. This has the unfortunate side effect that programs that print but not display their results in Printer On mode may appear to malfunction in Free42. To rule out this possibility, check the Print-Out window for the results you are missing, or switch to Printer Off mode (POFF in the PRINT menu, third row) and try again.
N.B. Since release 2.0.3, hard reset clears flags 21 and 55, bringing its behavior in line with the real HP-42S. However, if such a version is installed as an upgrade, with an older state file still in place, the printer flags will retain their previous value, along with all other state. In other words, the change in 2.0.3 or later only takes effect in new installs, or when the old state file is deleted or corrupted, as indicated by the Memory Clear or State File Corrupt messages.
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.
Apps are still allowed to write to a specific directory, dedicated to just that app. These app-specific directories are named Android/data/<app-id>. In order to allow Free42 to write to your SD card, you should create a directory named Android/data/com.thomasokken.free42 on the SD card. Free42 will be able to write to this directory.
These functions have existed for quite some time, but in releases prior to 1.4.78, LOCAT in the Android version didn't work, because the app didn't have permission to access the GPS. Someone brought this to my attention, and I released 1.4.78 for Android to fix this bug. So now LOCAT works, but whether you ever use it or not, you will have to grant permission to access the GPS -- that's the all-or-nothing Android permissions model, unfortunately.
Free42 does not query your GPS and then send that data somewhere behind your back. If you don't use the LOCAT function, Free42 won't touch the GPS, and when you do use LOCAT, the GPS coordinates are placed in the calculator's stack registers, nowhere else.
The LOCAT function, and all the other functions that Free42 has that aren't HP-42S functions, are documented here.
The iOS version does not yet have Enable Key Clicks and Enable Key Vibration settings in its Preferences screen, but you can turn off key clicks by setting the calculator to Quiet mode: QUIET: [Shift] [+/-] [▼] [1/x], or CF 26: [Shift]  [1/x]  . Note, however, that this turns off all sounds, i.e. the TONE and BEEP functions, and the short beep when you press an incorrect key; controlling key clicks separately from the sounds generated by the calculator is not yet possible.
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.