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.
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. And finally I want to thank all the unnamed authors for publishing material about these calculators.
Emu48 needs an image of a calculator ROM to be able to run. 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. You can still use the classic way extracting them from your own calculator. But in mostly all cases you have to convert the ROM files into the Emu48 ROM format.
To upload the ROM of your HP38G, you will need a special aplet called "ROM UPLOAD". Once you've uploaded the ROM, you have to convert it using the Convert utility.
To do that, start a Command Prompt while running Windows, and type:
Convert <rom-file> ROM.38G
Where <rom-file> is the path to your ROM image. This will create a file named ROM.38G. This tool will also check its validity.
To upload the ROM of your HP39G/HP40G, you will need a special aplet called "ROM UPLOAD". Once you've uploaded the ROM, you have to convert it using the Rom2emu utility.
To do that, start a Command Prompt while running Windows, and type:
Rom2emu <rom-file> ROM.39G
There's also a HP39G/HP40G beta ROM for emulators inside an old Emu48 package.
If you have already used another HP48 emulator, you can convert the ROM using the Convert utility.
To do that, start a Command Prompt while running Windows, and type:
Convert <rom-file> ROM.48G
Convert <rom-file> ROM.48S
Where <rom-file> is the path to your old ROM image. This will create a file named ROM.48G or ROM.48S, depending on the version you own. This tool should be able to read any style of ROM image, and will also check its validity. Note that if you run it with only one parameter, no file will be written, but it will still check the validity of the ROM.
If you have never used an HP48 emulator, and don't have a ROM dump, you can either use Jean-Yves Avenard's ROMUPL.BIN or the ROMDump Wizard V1.x, which will almost automatically get the ROM from your HP48. After the download you may have to convert your dump with the CONVERT utility into the Emu48 format.
You can find the latest version of the ROM dump programs on:
ROMDump Wizard http://hp.giesselink.com/emu48.htm
To create a HP49G ROM image file, start a Command Prompt while running Windows, and type:
UPD49ROM -f hp49119-6.flash ROM.49G
This will create a HP49G ROM image file with an empty User Port 2.
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 you have to 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.
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 scripts in fact define the visual aspect of Emu48, the behavior of the buttons, of the keyboard, ... It's a GREAT way to customize your copy of Emu48.
Check that the path in the "Emu48 Directory" text area is correct. Modify it if the directory in which you installed Emu48 is not the directory displayed. Click the refresh button ("V") after modifying it to update the list box or use the ("...") button to start the 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:
- Emu48's Default Faceplate for HP48G/GX
- Emu48's Default Faceplate for HP48S/SX
These two are simple scripts, good for 800x600 display resolution.
- Casey's Gx with Toolbar and Touch Screen
- Casey's Sx with Toolbar and Touch Screen
These script uses many advanced features, and is a good demonstration of the power of Emu48's scripting language KML. Try it, it is really great!
- Floating buttons
This one looks really great.
- Small but realistic HP48 Gx
This one has been designed for small resolutions such as 640x480.
And if you are interested in writing new scripts, get the KML 2.0 documentation from the authors Emu48 page.
Once you have 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.
The command line syntax is "Emu48 [E48file [Port2file]]". The first parameter sets the filename for the emulation data independent from the "LastDocument" setting, 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.
There are two ways to use the virtual keyboard on the emulated calculator:
The easiest way to use the emulated calculator is using the mouse. The KML script define buttons with an area where mouse input is active. The mouse cursor change from an arrow to a hand cursor in these areas. The state of the virtual key follow the state of your left mouse button. When the mouse cursor leaves the virtual key area the virtual button automatically release. 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 hold. To release all hold 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 support a large variety of commands to implement this feature. So keyboard usage 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. For further details read the KML 2.0 documentation mentioned before please.
Creates a new emulation session. You're asked for a new KML script where you can select the calculator type and skin to emulate.
Opens an existing emulation session. The emulation continues at the same position where the loaded session was aborted. Loading emulation sessions made with a different ROM revision may destroy the memory content or may cause other unpredictable results.
Saves the current running session with the actual name.
Saves the current running session with a new name. You're also get in this dialog when you Exit a new session without a state file name.
Closes the current session without closing the emulator.
This calls the Settings dialog. This dialog has three tabs: General, Memory and Peripheral.
22.214.171.124 Section General
- Authentic Calculator Speed
When this option is checked, the emulation speed will be similar to the real calculator depending on the RATE control register content.
- Enable Virtual LCD Delay
Try this option for a better 4 color gray scale display simulation output.
- Always On Top
When this option is checked, the emulator window will always be the topmost one.
- Activation Follows Mouse
This option enables a X-Mouse style windows activation. When the mouse is moved over the emulator window, the emulator is getting the focus and popping up into foreground.
- Single Instance
When this option is checked, the program is only allowed to run in a single instance. If another running instance is detected, the detected instance is set into foreground as active window and get a request to change his state file to the given one by the current instance. Finally the current instance is terminated.
- Automatically Save Files
When this option is checked, the current state file will automatically saved when you change to another state file, but not when you close the emulator program.
- Automatically Save Files On Exit
When this option is checked, the current state file will be saved automatically at the end when the emulator program is closed.
- Show Load Object Warning
When this option is checked, you'll get a warning message box when you try to load an object with the Load Object... menu command. If this option is unchecked, the warning will be skipped.
- Always Show KML Compilation Result
When this option is checked, you see the results of the KML (Keyboard Macro Language) interpreter at every KML script load.
126.96.36.199 Section Style
- Show Title
When this option is checked, the window title bar is visible.
- Show Menu
When this option is checked, the menu bar is enabled. If unchecked, the menu is accessible as context menu in the client area outside the calculator button definitions.
188.8.131.52 Section Disassembler
Choosing the assembler syntax:
- HP Mnemonics
This is the standard syntax used by HP.
- Class Mnemonics
Class (Clarke assembler) was written by Lutz Vieweg in 1991, at a time when HP had not published their own development tools. The syntax is very similar to the AG and STAR mnemonics used at this time. Especially published assembler programs written for the HP28S use the similar AG syntax.
184.108.40.206 Section Memory Cards
- Port 1 is Plugged
When this option is checked, a 128 KB RAM card is emulated in card Port 1. The RAM card content is saved in the current emulator state file.
- Port 1 is Writeable
When this option is checked, the RAM card in card Port 1 is writable else the card is Read-Only by simulating the card write protect switch.
- Port 2 is Shared
When this option is unchecked, only the first instance of Emu48 will allow you to use the RAM card in Port 2. When this option is checked, the first instance of Emu48 will give you both read and write access to this RAM card. If you start Emu48 in another instance, the RAM card in Port 2 will be write-protected. Thus you can transfer files very easily between two calculators. This RAM card is used by both S/SX and G/GX types.
- Port 2 is Writeable
This option represents the actual read/write state of the Port 2 file. Changing the option will also change the state for the calculator by modifying the Read-Only attribute of the file.
- Port 2 File
You can add a RAM card of up to 4MB to a HP48. By default, no such card will be created when you start Emu48. The MkShared.exe utility will allow you to create one. To create a Port 2 RAM Card, call the program, select the RAM Card size, enter the card file name and press the 'Create' button. That's it. Please remember, this program replace the destination file without any request!
If you already have a Port 2 card file in unpacked format, you have to copy the file into the emulator directory. If you choose a different directory you have to use a full path file name.
If you use RAM cards greater than 128 KB in a HP48SX, you can only see the first 128 KB of the card. Please remember, the firmware of all HP48GX versions has a bug when using a 4 MB RAM card. You always get the message "Warning: Invalid Card Data" at startup and Port 33 is inaccessible. This is not a bug of the emulator!
When you have created or copied the file, enter the card file name into the Port 2 File edit box.
Please remember, all port configuration changes mostly behave like on the original calculator. This means when you do this changes with the emulated calculator on, it's the same like when you do this with a real calculator on. In many times, this depends on the current state of the calculator, this will work without any problems by doing an automatically calculator warmstart. But for the most secure way, switch off the emulated calculator first, please!
220.127.116.11 Section Sound
A new implementation of the sound engine made ROM patches for sound output obsolete. The new sound engine emulates the behavior of the beeper output ports and only work in connection with a sound card. Using the internal PC speaker isn't possible any more. The old beeper method with a ROM patch is still working but deprecated, it's strongly recommended to remove all beep patches from your current KML scripts to enable the new sound engine. The support of the old sound implementation by a ROM patch maybe removed in later versions of the emulator and remaining beep patches will corrupt the ROM with an illegal opcode then.
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 resulting 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. Is the difference to 10s less than 1s everything is ok, if not, 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!
The output volume can be selected with the Volume slider relative to the Master Volume control.
By default the sound device is set to "Standard Audio", but you can also manually choose the output device. The device name is somehow cut since Window Vista, but the method of reading the device name is used for backwards compatibility to older versions of the Operating System. When you change the Standard Audio device in the Operating System settings dialog, the internal device numbering may change, and so the manually selected audio device.
18.104.22.168 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.
22.214.171.124 Section Serial Ports
In the Wire combo box you can select the COM port device connected to the wire port of the calculator.
In the Ir combo box you can select the COM port device connected to the IR port of the calculator. Please remember that the IR port only work with 2400 baud.
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.
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.
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.
Copy the screen content as bitmap to the clipboard.
This is only valid 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 point maybe important when you try to paste the numbers into a program using the locale settings of the host operating system.
This is only valid 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, in all other cases as "String" object.
To import "Real or Complex Numbers" from the clipboard, the decimal point (radix mark) of the clipboard and calculator must be equal. 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.
This emulates the Reset pin of the internal CPU.
This saves the current emulator status into a backup slot. If the backup slot already contain data, it will be overwritten.
This restores a previous saved emulator status without request. If you changed the calculator model meanwhile, the emulator will switch back to the old model.
This deletes the data in the backup slot.
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.
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 inside the list box to the clipboard.
The assembler code debugger of the emulator. For more details refer to the extra documentation of the debugger please.
The keyboard macro recorder unit.
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.
Prompts a dialog box to ask for the keyboard macro file to play. The replay starts immediately after selecting the file.
Stops recording or replaying a keyboard macro file.
Settings for the Macro Replay mode
Replay macro with the original recording speed.
Replay macro with the speed set by the speed slider.
Call this document.
The version, copyright and license message...
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.
|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)|
Emu48 - A HP38G/39G/40G/48SX/48GX/49G Emulator
Copyright (C) 2017 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.