Emu71 - A freeware HP-71B Emulator
for Windows 9x, ME, NT, 2000, XP, Vista, 7, 8, 10 and 11

1. General

Emu71 is based on the sources of Emu48 and is an emulator for the Hewlett Packard Titan calculator HP-71B hardware. This calculator emulation is based on the 1LK7 Saturn CPU, the 1LF3 display driver, the 1LG7 ROM and 1LG8 RAM chips. The calculator emulation can be expanded by the emulation of additional RAM and ROM modules and by a simulation of the HP-IL modules inside the ports 0 to 5.

2. Acknowledgements

A big thank to Jean-François Garnier for his technical assistance and his code simulating the HP-IL I/O processor. Lode Vandevenne spent the PNG image decoder. Also thanks to Sebastien Carlier for his Emu48 v1.0, without him this emulator would never have been created. And finally I want to thank all the people making the IDS documents available.

3. ROM Images

You need ROM images. The necessary ROM images are copyrighted by Hewlett Packard and I have no license to distribute them. Please don't ask me, I will not send you mine.

This is a ROM dump program from Jean-François Garnier reading the HP-71B ROM content and sending the data to a HP-IL printer device. In this case I prefer using his PIL-Box with ILPer for capturing the data in the ILPer Printer area.

10 DIM A$[64]
20 A=HTD("0") ! start address of ROM to transfer
30 FOR I=0 TO 64*32-1 ! length of ROM (here for 64Kb)
40 A$=PEEK$(DTH$(A+I*64),64)
50 OUTPUT :1 ;A$
60 NEXT I

The output format is a memory dump file like used by Derek S. Nickel's Voyager program. With the program Dmp2rom.exe from the file tool package the memory dump file can be converted to the necessary ROM file format.

If you made the ROM dump, you may also modify the program above to read the HP-IL ROM module content.

10 DIM A$[64]
20 A=IP(HTD(ADDR$("HPILROM"))/256)*256 ! start address of HPIL ROM to transfer
30 FOR I=0 TO 16*32-1 ! length of ROM (here for 16Kb)
40 A$=PEEK$(DTH$(A+I*64),64)
50 OUTPUT :1 ;A$
60 NEXT I

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. Files in the packed form have the same format like the files used in Emu71 for DOS from Jean-François Garnier. They can be validated with the TITANCHK.EXE command line utility. TITANCHK.EXE is part of the Emu71 installation package or binary distribution or can be downloaded separately here. To do that, start a Command Prompt while running Windows, and type:

Titanchk <image-file>

where <image-file> is the ROM image you want to test. As result you will get a report of the Checksum check.

4. Installation

To install Emu71, unzip the emulator and the required emulator skins into an empty directory or use the Emu71 installer package. 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 Emu71, it will detect the directory in which you installed it, and will write the configuration to the registry at HKCU\Software\Emu71.

5. How to Start

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

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

Check in this dialog that the path in the "Emu71 Directory" text area points to the directory in which you installed the Emu71 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 Emu71's directory.

Available scripts from the author at the moment are:

There's also a 3rd party scripts collection with module overlay background images.

These scripts use "HP71B.ROM" as Name for the ROM image file.

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 Emu71 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 Emu71.

6. Command Line

The command line syntax is "Emu71 [file]". The parameter sets the filename of the emulation state file independent from the "LastDocument" setting, normally reponsible for opening the last used state file. The argument is 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 four sections: General, Disassembler, Sound and Infrared Printer.

8.6.1 General section

8.6.2 Disassembler section

Choosing the assembler syntax:

8.6.3 Sound section

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 Power-On and Power-Off 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 CPU strobe frequency is set by the registry key HKCU\Software\Emu71\Emulator\SaturnCycles. The content of this variable multiplied by 16384 is the CPU strobe frequency in Hz used by the emulator. Because older versions of the emulator were not able to measure the CPU strobe frequency properly or the content of the SaturnCycles 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 actual duration of a 10s beep. A deviance less than 1s is ok, otherwise you should perform a power cycle sequence of the calculator emulation in this session file. This recalls the measuring routine and save the result in the speed variable.

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 Port Configuration...

With the port configuration dialog you can add a large variety of different modules from various manufactures to your HP-71B emulation. At the moment Emu71 can emulate RAM and ROM modules and simulate the HP-IL Interface HP 82401A or the combination of the Dual HP-IL Adapter HP 82402A with two HP-IL Interface HP 82401A modules.

To allow to emulate or simulate most of the modules published by manufactures like HP (Hewlett Packard), HHP (Handheld Products) and CMT (Corvallis Microtechnology Inc) the port configuration interface is very flexible but not easy to understand.

Therefore we have to learn something about the memory design of the HP-71B. In the HP-71B syntax, a PORT is a memory device of a specified size. A module or better say a housing in a PORT slot can contain more than one PORT. A good example for understanding is the internal 16KB Port0 memory. The memory is divided into four chunks of 4KB accessible with PORT(0), PORT(0.01), PORT(0.02) and PORT(0.03). A HHP 96KB module for the Port5 slot is normally shown as three ports (5, 5.01, 5.02) of 32KB each.

Because of a limitation in the address decoder, each chip in such a hybrid RAM or ROM PORT must have a size which is a result of a power of 2 operation (1, 2, 4, 8, 16, 32, ...) and can only be located on a base address which is a multiple of it's own size. So a 48KB ROM module for example, is technically a hybrid module consisting of three single 16KB ROM chips.

In the HP-71B literature the name "port" is used in two contexts. First, like used above, as memory device and second as name of a physical port slot. Don't mix them up please. A memory port itself can be RAM or ROM. Memory Mapped I/O parts aren't shown by the operating system in this context.

ROM memory ports can be hard or soft configured. An example for a hard configured ROM is the ROM of the operating system. ROM in modules are normally soft configured like RAM modules. The two exceptions are the FORTH module (HP 82441A) and the HP-41 translator module (HP 82490A) which have a soft and a hard configured ROM inside.

What's the difference between soft and hard configured ROM's?

A hard configured ROM has a fixed base address programmed by the manufacturer of the ROM, whereas, at a soft configured ROM, the base address is chosen by the operating system at runtime. Soft configured modules responds with an ID telling their type (RAM/ROM), the size and if they are the last chip in a multiple chip queue.

The port configuration and the data is saved in the Document file. Because the content of most ROM images is copyrighted, only a link to the image file is saved. I suggest to place ROM images of modules in the same directory like the KML files. In this case only a relative path in the document is saved. This let you use the document files on other PC's with a different directory structure or drive letters without path change to the ROM image files at document loading. The content of RAM data is saved as image in the document file.

9.1.1 Overview

9.1.1.1 Group Box "Port"

9.1.1.1.1 Port selection

Inside the group box you see on right hand the current port slot selection. Default is "Port1" at startup. Available ports are Port0, Port1, Port2, Port3, Port4 and Port5. Port0 drive the internal RAM and the port slot at backside of the calculator housing. This slot is normally reserved for the HP-IL (HP 82401A) or Dual HP-IL (HP 82402A) module. The Port1 to Port4 slots are at the front and Port5 is the card reader slot. From software aspect, there's no difference between these port slots. From the hardware aspect, it was impossible in the 80ties to put a 160KB RAM module, because of it's size, in a Port1 - Port4 slot. But here we are on an emulator, and the virtual 160KB RAM module is mechanically not really larger than the virtual standard 4KB module.

9.1.1.1.2 Port list box

On left hand is a list box showing the ports in the current port slot.

Explanation of such a port line:

9.1.1.1.3 Data manipulation of independent RAM

In the list box you're able to select a single port definition. Calling the context menu (right mouse button) for the selection of a memory port you get a menu with the two entries:

The items of the context menu are grayed when you selected a ROM or HRD module type or a RAM configured as MAIN memory. Only in the case that the selected RAM module is configured as independent RAM, the menu entries are enabled. Independent RAM has the signature #B3DDDDDE at the beginning of the port.

With "Save Memory Data..." you can write the independent RAM module data to a file. With "Load Memory Data..." you directly overwrite the current independent RAM module data with file data (when you leave the "Port Configuration" dialog with the "Cancel" button the change is persistent). In this case the module size has to match. The file format is compatible with independent RAM files from "Emu71 for DOS".

9.1.1.1.4 Changing HP-IL TCP/IP settings

When you call the context menu (right mouse button) on a HP-IL module type you get a menu with the entry:

With "Change TCP/IP Settings..." you get a dialog where you can change the IP-Address of the next device ("Out TCP/IP Address"), the IP-Port of the next device ("Out Port (49152 - 65535)") and my IP-Port ("In Port (49152 - 65535)") for data listening in the virtual IL. The changes are persistent, even if you leave the "Port Configuration" dialog with the "Cancel" button.

9.1.1.1.5 Button "Add"

This button allows you to add a single port to the port slot. If there's no port selected in the "Port list box", the port will be appended at the end. If a port is selected, the new port will be inserted before the selection. If the "Add" button is disabled, you are already in the port configuration mode.

9.1.1.1.6 Button "Delete" / "Abort"

This button has two meanings, dependent on the current mode:

9.1.1.1.7 Button "Apply"

This button transfer the data in the Configuration group box to the list box.

9.1.1.2 Group Box "Configuration"

The fields in the "Configuration" group box are enabled when you press the "Add" button.

9.1.1.2.1 Combo box "Module Type"

In this field you can choose the module type. Available are "RAM", "ROM", "HRD" and "HPIL".

9.1.1.2.2 Combo box "Size"

This field is only relevant for "RAM" ports. A "ROM" port get it's size information from the image file size. Available are different sizes from 512 bytes up to 160 KB. Be aware that this size is the overall size of a single RAM port and not the overall size of the RAM module in the port slot! So the HHP 96KB module from above consists of three 32KB ports.

A special case is the "Datafile" selection. Some of the larger 3rd party RAM modules have a backup battery allowing to remove the RAM module without memory loss for the case that all ports in the module are configured as independent RAM. To "plug" such a RAM module into the emulator session you must have a file image of the RAM content. When you select "Datafile" the edit field "Filename" is enabled. Here you can enter the RAM image filename. At port configuration dialog exit, the RAM content is filled with the data from the RAM image file. The original RAM image file will be untouched. The file format of independent RAM ports is compatible with the port RAM files of the "Emu71 for DOS" emulator.

9.1.1.2.3 Combo box "No. of Chips"

As I mentioned before a memory chip has always a size created by power of 2 operation. So a chip of 96KB size isn't possible, it must be a hybrid chip of 3 or a multiple of 3 chips (3*32KB, 6*16KB, ...). Furthermore I mentioned that a chip can only be located on a base address which is a multiple of it's own size. For a non existing 256KB chip this would be the addresses #00000 and #80000 in the Saturn address area.

When we go back to the mid of the 80ties the number of memory chip for the Saturn bus was very limited. We had the 1LG7 ROM chip with a size of 16KB, the 1LG8 RAM chip with a size of 1KB and the 1LQ4 interface chip for multi purpose use. Many 3rd party manufactures build there 32KB modules with one 1LQ4 chip and 4 * 8KB static RAM chips. A single 32KB instead of 4 * 8KB chips would be even smaller, but was more expensive then 4 8KB chips. A 48KB ROM normally consists of 3 * 16KB 1LG7 ROM chips.

Many people don't really know what they have to choose, so this combo box has also an "Auto" selection which is default. "Auto" choose automatically a reasonable settings depending on the "Module Type" and "Size".

9.1.1.3 Button "OK"

Apply all configuration changes and quit the Port Configuration dialog.

9.1.1.4 Button "Cancel"

Discard all configuration changes (with the exception of direct independent RAM data overwriting) and quit the Port Configuration dialog.

9.1.2 Module examples

All examples also work with "No. of Chips" Auto setting. The image file names for the ROM modules may differ to your image copy.

9.1.2.1 HP 82420A 4KB memory module in Port2 slot

  1. Switch off calculator
  2. Open the "Port Configuration" dialog
  3. Select "Port2"
  4. Delete Port2 content if necessary
  5. Press "Add" Type: RAM, Size: 4K Byte, No. of Chips: 4
  6. Press "Apply"
  7. Press "OK" to quit the "Port Configuration" dialog
  8. Switch on calculator

9.1.2.2 CMT or HPP 32KB memory module in Port3 slot

  1. Switch off calculator
  2. Open the "Port Configuration" dialog
  3. Select "Port3"
  4. Delete Port3 content if necessary
  5. Press "Add" Type: RAM, Size: 32K Byte, No. of Chips: 1
  6. Press "Apply"
  7. Press "OK" to quit the "Port Configuration" dialog
  8. Switch on calculator

9.1.2.3 CMT or HPP 64KB memory module (2x 32KB ports) in Port5 slot

  1. Switch off calculator
  2. Open the "Port Configuration" dialog
  3. Select "Port5"
  4. Delete Port5 content if necessary
  5. Press "Add" Type: RAM, Size: 32K Byte, No. of Chips: 1
  6. Press "Apply"
  7. Press "Add" Type: RAM, Size: 32K Byte, No. of Chips: 1
  8. Press "Apply"
  9. Press "OK" to quit the "Port Configuration" dialog
  10. Switch on calculator

9.1.2.4 HPP 96KB memory module (3x 32KB ports) in Port5 slot

  1. Switch off calculator
  2. Open the "Port Configuration" dialog
  3. Select "Port5"
  4. Delete Port5 content if necessary
  5. Press "Add" Type: RAM, Size: 32K Byte, No. of Chips: 1
  6. Press "Apply"
  7. Press "Add" Type: RAM, Size: 32K Byte, No. of Chips: 1
  8. Press "Apply"
  9. Press "Add" Type: RAM, Size: 32K Byte, No. of Chips: 1
  10. Press "Apply"
  11. Press "OK" to quit the "Port Configuration" dialog
  12. Switch on calculator

9.1.2.5 HPP 96KB memory module (1x 32KB, 1x 64KB ports) in Port5 slot

  1. Switch off calculator
  2. Open the "Port Configuration" dialog
  3. Select "Port5"
  4. Delete Port5 content if necessary
  5. Press "Add" Type: RAM, Size: 32K Byte, No. of Chips: 1
  6. Press "Apply"
  7. Press "Add" Type: RAM, Size: 64K Byte, No. of Chips: 2
  8. Press "Apply"
  9. Press "OK" to quit the "Port Configuration" dialog
  10. Switch on calculator

9.1.2.6 HPP 160KB memory module (5x 32KB ports) in Port5 slot

  1. Switch off calculator
  2. Open the "Port Configuration" dialog
  3. Select "Port5"
  4. Delete Port5 content if necessary
  5. Press "Add" Type: RAM, Size: 32K Byte, No. of Chips: 1
  6. Press "Apply"
  7. Press "Add" Type: RAM, Size: 32K Byte, No. of Chips: 1
  8. Press "Apply"
  9. Press "Add" Type: RAM, Size: 32K Byte, No. of Chips: 1
  10. Press "Apply"
  11. Press "Add" Type: RAM, Size: 32K Byte, No. of Chips: 1
  12. Press "Apply"
  13. Press "Add" Type: RAM, Size: 32K Byte, No. of Chips: 1
  14. Press "Apply"
  15. Press "OK" to quit the "Port Configuration" dialog
  16. Switch on calculator

9.1.2.7 HP 82480A Math Pac module in Port2 slot

  1. Switch off calculator
  2. Open the "Port Configuration" dialog
  3. Select "Port2"
  4. Delete Port2 content if necessary
  5. Press "Add" Type: ROM, No. of Chips: 2, Filename: MATHROM.BIN
  6. Press "Apply"
  7. Press "OK" to quit the "Port Configuration" dialog
  8. Switch on calculator

9.1.2.8 HP 82441A Forth/Assembler module in Port3 slot

  1. Switch off calculator
  2. Open the "Port Configuration" dialog
  3. Select "Port3"
  4. Delete Port3 content if necessary
  5. Press "Add" Type: ROM, No. of Chips: 1, Filename: FORTHROM.BIN
  6. Press "Apply"
  7. Press "Add" Type: HRD, No. of Chips: 2, Filename: HRDFORTH.BIN, Hard Wired Address: E0000
  8. Press "Apply"
  9. Press "OK" to quit the "Port Configuration" dialog
  10. Switch on calculator

9.1.2.9 HP 82490A HP-41 Translator Pac module in Port3 slot

  1. Switch off calculator
  2. Open the "Port Configuration" dialog
  3. Select "Port3"
  4. Delete Port3 content if necessary
  5. Press "Add" Type: ROM, No. of Chips: 1, Filename: FTH41ROM.BIN
  6. Press "Apply"
  7. Press "Add" Type: HRD, No. of Chips: 2, Filename: HRDFTH41.BIN, Hard Wired Address: E0000
  8. Press "Apply"
  9. Press "OK" to quit the "Port Configuration" dialog
  10. Switch on calculator

9.1.2.10 HP-71B Diagnostic ROM module in Port1 slot

  1. Switch off calculator
  2. Open the "Port Configuration" dialog
  3. Select "Port1"
  4. Delete Port1 content if necessary
  5. Press "Add" Type: HRD, No. of Chips: 1, Filename: DIAG71.ROM, Hard Wired Address: 00000
  6. Press "Apply"
  7. Press "OK" to quit the "Port Configuration" dialog
  8. Switch on calculator

9.1.2.11 HP 82401A HP-IL module in Port0 slot

  1. Switch off calculator
  2. Open the "Port Configuration" dialog
  3. Select "Port0"
  4. Delete Port0 content if necessary
  5. Press "Add" Type: HPIL, No. of Chips: 1, Filename: HPILROM.BIN
  6. Press "Configure" to open the "HP-IL Interface Setup" dialog and enter the virtual HP-IL parameters
  7. Press "OK" to quit the "HP-IL Interface Setup" dialog
  8. Press "Apply"
  9. Press "OK" to quit the "Port Configuration" dialog
  10. Switch on calculator

9.1.2.12 HP 82402A Dual HP-IL module in Port0 slot

  1. Switch off calculator
  2. Open the "Port Configuration" dialog
  3. Select "Port0"
  4. Delete Port0 content if necessary
  5. Press "Add" Type: HPIL, No. of Chips: 1, Filename: HPILROM.BIN
  6. Press "Configure" to open the "HP-IL Interface Setup" dialog and enter the virtual HP-IL parameters for the 1st loop
  7. Press "OK" to quit the "HP-IL Interface Setup" dialog
  8. Press "Apply"
  9. Press "Add" Type: HPIL, No. of Chips: 1, Filename: HPILROM.BIN
  10. Press "Configure" to open the "HP-IL Interface Setup" dialog and enter the virtual HP-IL parameters for the 2nd loop
  11. Press "OK" to quit the "HP-IL Interface Setup" dialog
  12. Press "Apply"
  13. Press "OK" to quit the "Port Configuration" dialog
  14. Switch on calculator

9.2 Copy Screen

Copy the screen content to the clipboard.

9.3 Copy Stack

This is work in CMD and in CALC mode.

Copy the display content as "String" to the clipboard.

9.4 Paste Stack

This only work in CMD mode.

Paste the text field content of the clipboard to the command buffer of the calculator.

9.5 Reset Calculator

This emulates the Reset pin of the internal CPU.

9.6 Backup

9.6.1 Backup Save

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

9.6.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 model used in the backup.

9.6.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.

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 inside 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.

For High-Speed recorded files, with small or none delay between the keystrokes, or using Manual Replay Speed selection with Fast slider setting, the "Authentic Calculator Speed" option in the settings dialog should be unchecked for maximum emulation speed. If not, you may loose keystrokes on the fast replay.

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 Emu71...

Show the version, copyright and license message...

13. Virtual HP-IL

The HP-IL (Hewlett Packard Interface Loop) is an interface system designed for connecting handheld devices with peripheral hardware. Therefore the devices are connected over a simple 2-wire cable in a loop. This allows to produce low-cost and lightweight peripherals.

Today we are simulating the handheld devices and also the peripherals. It makes for example no sense to save data on a 3½ inch floppy disk any more. The data is much safer on a hard disk, flash memory or on an optical media. Also printers with a HP-IL interface are quite old and rare.

Jean-François Garnier published his PIL-Box project in 2009 to combine real HP-IL hardware with virtual devices on a PC. He called his "HP-IL Peripheral emulator" ILPer. ILPer simulated a generic printer and a mass storage device on a PC connected over the PIL-Box hardware with the real HP-IL world.

With Emu71 and ILPer we have now completely virtualized hardware devices. So in consequence we have to virtualize also the HP-IL system. I chose TCP/IP as transport protocol for the single data frames. Choosing TCP/IP as transport protocol gives the advantage of communicating with (virtualized) HP-IL devices around the world. Each virtual HP-IL device contain a TCP/IP server listening for data frames on the specified port number and a TCP/IP client sending the data frames to a port of the next virtual device. A HP-IL data frame is normally 11 bits long, but TCP/IP is a byte oriented protocol, so each data frame on TCP/IP is 16 bits (2 bytes) long. The remainder upper five bits are filled with zero. The two bytes of a frame are transferred in network byte order. ILPer since v1.4 supports the virtual HP-IL mode.

Meanwhile the actual version of ILPer simulates a generic printer, two mass storage devices and a DOSLINK interface on a PC. Additional devices like a HP-82163A or a HP-92198 display simulation or separate versions of the DOSLINK device and the HP-IL frame Scope are also available now. With a bridge software for the PIL-Box we have the possibility to connect Emu71 or the Virtual HP-IL interface devices with the real HP-IL world.

14. License

Emu71 - A HP-71B Emulator
Copyright (C) 2023 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.