From the GitHub repository (https://github.com/isene/hp-41cl_update):

“There are two alternative programs on the PC side, both doing exactly the same: “HP-41CL_update.rb” is the Ruby version, while “HP-41CL_update.py” is the Python equivalent. There is one FOCAL program on the HP-41CL side, “FUPDATE”.

HP-41CL_update.rb (or HP-41CL_update.py) takes HP-41 ROM files from a folder named “roms” and adds those to a LIF file that can be mounted by pyILPer. The pyILPer is a Java program that can mount LIF files so that an HP-41 can access that file via a PILbox. The “roms” folder must reside in the same folder as the HP-41CL_update.rb (or HP-41CL_update.py) program. The file names of the ROMs to be updated must be prefixed with the HP-41CL address so that the FOCAL program knows where in flash to update the ROMs (only the first three hex numbers are inserted at the beginning of the file name).

Example: You want to update the ISENE.ROM on your HP-41CL. The ISENE.ROM should go to the location “0C9”, therefore you rename the rom to 0C9ISENE.ROM and drop it into the folder called “roms”. You run HP-41CL_update.rb (or HP-41CL_update.py) and you get a LIF imge called cl_update.lif in the same directory as the HP-41CL_update.rb (or HP-41CL_update.py) program. Mount this LIF file in pyILPer and run the FUPDATE program on the HP-41CL.”

And from http://www.hpmuseum.org/forum/thread-9456-page-2.html:

“As it is now, you can simply drop the roms in the “roms” folder - but with all the roms you want updated prefixed with the three first location numbers. Example: The ISENE.ROM should go to the location “0C9”, therefore you rename the rom to 0C9ISENE.ROM and drop it into the folder called “roms”. You run the program and you get a LIF imge called cl_update.lif.

The idea is that the user then mounts this LIF image via pyILPer and then run a FOCAL program (yet to be made) on the HP-41CL and go for dinner.”

I also plan to create ready-made LIF files for even easier auto-updates.

After member “jsi” (http://www.hpmuseum.org/forum/user-2921.html) at the speed of sound created “romlif” to add uncompressed ROM images to LIF files (to cater for CL specific, modern roms), the only missing element is that MCODE routine already mentioned that can read such uncompressed ROMs from mass storage into an HP-41 page (or directy into an HP-41CL RAM page).

As you can see from the code on the GitHub repo, the solution concists of a compact Ruby/Python program on the PC side and only 66 FOCAL lines on the HP-41 side.