Emu48 - A freeware HP38G/39G/40G/48SX/48GX/49G Emulator
for Windows 9x, ME, NT, 2000, XP, Vista, 7, 8 and 10

1. General

Emu48 is an emulator for the Hewlett Packard HP38G, HP39G, HP40G, HP48SX, HP48GX and HP49G calculator hardware. These calculators are based on the 1LT8 Clarke (HP48SX) and on the Yorke chip.

2. Acknowledgements

First of all a big thank to Sébastien Carlier for publishing Emu48 v1.0 under the GPL. Without this decision newer versions of the emulator wouldn't have been possible or ports to other similar calculators wouldn't have been made. Also a big thank to Jean-Yves Avenard for his technical assistance in the beginning. Lode Vandevenne spent the PNG image decoder and finally I want to thank all the unnamed authors for publishing material about these calculators.

3. ROM Images

Emu48 needs a ROM image for each calculator model you want to emulate. ROM images are valid in a packed (even address lower nibble, odd address higher nibble) or unpacked (one nibble per byte with even address first) form.

Since fall 2000 the emulator ROM's for the HP38, 39, 40, 48 and 49 are freely available on different Internet sites. Because there's no license for the distribution of the ROM images, they aren't included in the Emu48 package. Since accepting packed ROM images, in most cases converting the given ROM format (which is regulary a packed ROM image) into the native Emu48 ROM format is not necessary any more. You can still use the classic way extracting them from your own calculator.

The command line Convert utility delivered with the Emu48 program package was originally designed to convert HP48 ROM images files from one of the various used ROM image formats of the 90s to the unpacked format originally used by Emu48. The 2nd important task of this tool is updating the I/O register area with zeros. Most images had been created with a ROM upload program where the I/O register area was mapped over the ROM content and so the ROM image file contain a wrong content at this position. Executing the selftest on a HP38 or a HP48 will report an IROM fail then. To fix this the Convert utility overwrites the I/O register area in the destination file with zeros. Final notice, the convert utility shows the CRC result after the file convert and a passed ROM CRC test does not imply, that the source file is in an Emu48 suitable format! To create a ROM image in a suitable format, call the convert utility with the 2nd file argument.

The general syntax of the convert utility is:

Convert [-p] <old-rom-dump> [<new-rom-dump>]


Convert <old-rom-dump>

check if <old-rom-dump> is in a known source format and report the ROM Model, the ROM Version and the result of the CRC check.


Convert <old-rom-dump> <new-rom-dump>

convert the file <old-rom-dump> into the unpacked ROM image file <new-rom-dump> valid for use in Emu48.


Convert -p <old-rom-dump> <new-rom-dump>

convert the file <old-rom-dump> into the packed ROM image file <new-rom-dump> valid for use in Emu48.

3.1 Creation examples

4. Installation

To install Emu48 you may use the installer package which contain, among the binaries, some HP48 KML scripts or just unzip the emulator and the required emulator skins from archives into an empty directory. Finally copy your ROM images into this directory and adjust the ROM image name to the name used in the corresponding KML script. When you first run Emu48, it will detect the directory in which you installed it, and will write the configuration to the registry at HKCU\Software\Emu48.

5. How to Start

When Emu48 is installed and you have put valid KML scripts and the corresponding ROM image(s) into your Emu48 installation directory, you can start Emu48. You'll see a "Choose Your KML Script" box.

KML (Keyboard Mapping Language) scripts define the visual aspect of Emu48, the behaviour of the buttons, of the keyboard, ... It's a great way to customize your copy of Emu48.

Check in this dialog that the path in the "Emu48 Directory" text area points to the directory in which you installed the Emu48 KML files. Click the refresh button ("V") after modifying the directory path manually to update the list box or use the ("...") button to start a directory browser.

Choose a KML script in the list box for your calculator ROM you put into Emu48's directory.

Several HP48 scripts are included in the Emu48 archive:

If you want other great scripts, visit Rechlin's great HP archive

If you are interested in writing new scripts, get the KML 2.0 documentation from the authors Emu48 page.

Having selected a script, press OK to start the emulator. In most cases, when Emu48 crash after pressing the OK button, you are using an invalid ROM image. While it's running, you can use the "View/Change KML Script..." command to change the visual aspect of Emu48.

6. Command Line

The command line syntax is "Emu48 [E48file [Port2file]]". The first parameter sets the filename of the emulation data independent from the "LastDocument" setting, normally reponsible for opening the last used state file. The second parameter the Port2 file. You're not able to set a Port 2 file without setting the emulation data file. The arguments are optional.

7. Virtual Keyboard

There are two ways to use the virtual keyboard on the emulated calculator:

  1. by Mouse
  2. by PC keyboard

The easiest way to use the emulated calculator is by using the mouse. The KML script defines buttons with an area where mouse clicks take effect. The active area is indicated by changing the cursor from an arrow to a hand cursor. Pressing the left mouse button over an active area will press the virtual button. When the mouse cursor leaves the virtual key area with still the left mouse button pressed, the virtual button is automatically released. The visual aspect of a pressed or released virtual button is defined in the KML script. In some cases you need to press more than one key on the emulator. For these cases press the virtual key with the right mouse button. When you release the mouse button or leave the area of the virtual key, the key is still held. To release all held virtual buttons, just use the left mouse button again. A single release of a hold virtual key isn't possible.

Another convenient way is using the PC keyboard. The KML script language supports a large variety of commands to implement this feature. So keyboard usage mostly depends on your used KML script and not on the emulator. Because of this it's impossible to say what's happen when you press a key on the PC keyboard. Some Windows specific accelerator keys like F10 cannot be overloaded by the KML script. For further details read the KML 2.0 documentation mentioned before please.

8. File Menu

8.1 New...

Creates a new emulation session. You're asked for a KML script where you can select the calculator type and skin to emulate.

8.2 Open...

Opens a previously saved emulation session. The emulation continues at the same position where the session was aborted. Loading emulation sessions made with a different ROM revision may destroy the memory content or may cause other unpredictable results.

8.3 Save

Saves the current session with the actual name.

8.4 Save As...

Saves the current session with a new name. You're also get this dialog when you Exit a new session without a state file name.

8.5 Close

Closes the current session without closing the emulator.

8.6 Settings

This calls the Settings dialog. This dialog has three tabs: General, Memory and Peripheral.

8.6.1 Settings General Section General Section Style Section Disassembler

Choosing the assembler syntax:

8.6.2 Settings Memory Section Memory Cards

8.6.3 Settings Peripheral Section Sound

A new implementation of the sound engine made ROM patches for sound output obsolete. The new sound engine emulates the behaviour of the beeper output ports and only work in connection with a sound card. Using the legacy PC speaker mode isn't possible any more. The old beeper method with a ROM patch has been removed, so you have to remove the ROM beep patches from your KML scripts. Actually the program informs you when detecting ROM beep patches by opening the "KML Script Compilation Result" dialog reporting an error.

For the sound generation the calculator must know his own CPU strobe frequency. On the real calculator the speed depends on various settings like component tolerances, actual temperature, humidity and other variables. The actual speed is measured by the calculator firmware at a cold- or at a warmstart and stored in the =CSPEED variable. The content of this calculator variable has direct influence on the resulting frequency and duration. On the emulator the HP48SX CPU strobe frequency is set by the registry key HKCU\Software\Emu48\Emulator\SXCycles, for all other calculators at HKCU\Software\Emu48\Emulator\GXCycles. For some reasons the CPU cycles are only estimated and so the strobe frequency value in the registry is not the exact CPU strobe frequency of the calculator in Hz divided by 16384 like in the other emulators. Because older versions of the emulator were not able to measure the CPU strobe frequency properly or the strobe frequency registry content has been changed since the last measurement, the =CSPEED variable of this session file may contain a wrong frequency value. You easily may discover this by measuring the real duration of a 10s beep. A deviance less than 1s is ok, otherwise you should perform a warmstart of the calculator in this session file. Alternatively you may execute a Reset Calculator. This recalls the measuring routine and save the result in the speed variable. Both restart variants purge the stack content! Section Infrared Printer

The emulator has the ability to print data to a HP82240A/B printer simulation. The data transfer to the printer simulator is done over UDP. In this section you can the define the IPv4 address and the port the printer simulator is listening. A suitable HP82240B printer simulation can be found here. Section Serial Ports

8.7 Exit

Quit emulation. The default actions at finishing are defined in the Settings dialog. If the current session is "Untitled" you are asked for a session file name using the Save As... dialog. If you quit the emulator without a given filename, you're asked for choosing a KML script at next startup.

9. Edit Menu

9.1 Load Object...

This is only valid for the HP48SX, HP48GX and the HP49G emulation. You can load HP48 and HP49G binary objects to stack level 1. Therefore the object must begin with "HPHP48-x" for a HP48 or with "HPHP49-x" for a HP49G binary object where x can be any alphanumeric character. If the binary header isn't present, the object is loaded as string. Dropping HP objects over the emulator window will also load objects. Be sure that the emulator isn't busy before doing this.

9.2 Save Object...

This is only valid for the HP48SX, HP48GX and the HP49G emulation. Save the current object in stack level 1 as binary object to disk.

9.3 Copy Screen

Copy the screen content as bitmap to the clipboard.

9.4 Copy Stack

This menu item is enabled for the HP48SX, HP48GX and the HP49G emulation.

Copy a "Real Number", "Complex Number" or "String" object in stack level 1 to the clipboard. On all other objects, the command will be ignored. This prevents sending binary objects to the clipboard.

The decimal point (radix mark) of "Real Numbers" in the clipboard is equal to the calculator setting. This is important when you try to paste the numbers into a program using the locale settings of the host operating system.

9.5 Paste Stack

This menu item is enabled for the HP48SX, HP48GX and the HP49G emulation.

Paste the text field content of the clipboard to stack level 1 of the emulated calculator. If the clipboard content is representing a real number, the number will be saved as "Real Number" object. Is the content a complex number object, the number will be saved as "Complex Number" object, otherwise cases as "String" object.

To import "Real or Complex Numbers" from the clipboard, the decimal point (radix mark) of the clipboard and calculator must match. A real or complex number is only detected in the case of valid real number characters in the clipboard. Especially heading and tailing white spaces aren't valid number characters also.

Complex numbers must be in the form (a,b) when using the point radix mark or in the form (a;b) when using the comma radix mark. The Cartesian or algebraic form a+bi is not supported.

9.6 Reset Calculator

This emulates the Reset pin of the internal CPU.

9.7 Backup

9.7.1 Backup Save

This saves the current emulator status into a backup slot. If the backup slot already contain data, it will be overwritten.

9.7.2 Backup Restore

This restores a previous saved emulator status without request. If you changed the calculator model meanwhile, the emulator will switch back to the model used in the backup.

9.7.3 Backup Delete

This deletes the data in the backup slot.

10. View Menu

10.1 Change KML Script...

This allows you to change the skin of the current emulated calculator. In opposite to the New... command you see only scripts emulating the same calculator model.

11. Tools Menu

11.1 Disassembler...

This is a simple disassembler.

Enter the address to disassemble in hexadecimal into the "Address (HEX)" field and press <Return>. With the "Next Address" button the next opcode is disassembled. With the "Copy Data" button you can copy all selected lines from the list box to the clipboard.

11.2 Debugger...

The assembler code debugger of the emulator. For more details refer to the extra documentation of the debugger please.

11.3 Macro

The keyboard macro recorder unit.

11.3.1 Macro Record...

Prompts a dialog to enter the macro file for the data to record. After accepting the confirm message, every key event is recorded into the macro file with it's time information.

11.3.2 Macro Play...

Prompts a dialog box to ask for the keyboard macro file to play. The replay starts immediately after opening the selected file.

11.3.3 Macro Stop

Stops recording or replaying a keyboard macro file.

11.3.4 Macro Settings...

Settings for the Macro Replay mode

12. Help Menu

12.1 Help Topics

Show this document.

12.2 About Emu48...

Show the version, copyright and license message...

13. DDE Server

Emu48 has an integrated DDE server to transmit data from and to the HP stack. Because only the HP48 and HP49 have a stack, all DDE transfers are ignored on the other calculators. You have the same restrictions like with the commands "Load object..." and "Save Object...", that a running program may corrupt memory. In difference you can choose the stack level for the transfer in the DDE item field. Take care to transmit data only after the acknowledge of the last DDE transaction.

Technical data:

Servicename: Emu48
Topicname: Stack
Item: 1 (stack level)
Clipboardformat: "CF_HPOBJ" (user defined)

The DDE commands CONNECT, POKE and REQUEST are supported.

The structure of the clipboard format "CF_HPOBJ":

4 Byte (length of object, LSB first) HP object (normal HP object)

14. License

Emu48 - A HP38G/39G/40G/48SX/48GX/49G Emulator
Copyright (C) 2022 Christoph Gießelink

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.