Remapped IO.DLL

This software allows you to use Gitti Ieo's Willem programmer software using a parallel port at a non-legacy address (such as a PCI expansion card).

Willem PCB 3

Letting old software work with "modern" parallel ports.


You will need the two files below. The first is the programming software itself, the second is the fix.


This software is presented as a quick fix to a problem with software that is hard-coded to use legacy port addresses.

I cannot accept any liability for any damages (to your computer, programmer, devices being programmed or any other device) that might occur when using this software. You use this software at your own risk.

Inpout32.dll was originally from Logix4u, this package contains the updated 64-bit compatible version from HighRez, io.dll is by Fred.


Install the Willem EPROM/FLASH Programmer software normally, then copy io.dll, io.ini and inpout32.dll to its installation directory (it should contain the current io.dll). Open io.ini and change the default address (0x378) to the base address of your parallel port.

Click for a larger image.

You can find the base address of your parallel port in Device Manager. Now run the Willem software normally, and ensure that it's using LPT1 (0x378) and you should be good to go.

You may need to also install the VC++ 2008 SP1 runtimes.

How it Works

Included in this zip file is a cut-down version of io.dll, originally written by Fred. This version of io.dll has been written from scratch. It only exposes three of the functions in io.dll, PortOut(), PortIn() and IsDriverInstalled().

When one of these functions is called, the port address is checked. If it lies in the port range of the legacy LPT1 (0x378~0x37F) it is offset to a user-specified base address.

I couldn't get the original io.dll to work from the DLL (I kept getting privileged instruction errors), so I'm using Inpout32.dll instead, which has a much simpler interface.


I've been using this fix for a while, and it appears to work fine when programming an AM29F010B 128K×8 Flash memory, a 24LC256 32K×8 I2C serial EEPROM and a PIC 16F84 microcontroller.

I have also received a report that it works with an Atmel AT89C2051.

I am using a MosChip 9835 card, and have received a report that the software also works with the MosChip 9865.


If you have any problems, contact me at

The most likely problem I can see you having is an access violation at address 0x00000000, which will be triggered if the programming software calls a function I have not reimplemented. Failing that, check that you have set the working directory properly when running the software, as it may not pick up io.ini otherwise.

Source Code

I have included the source code and VC++ Express 2008 project files. Someone may find it useful!


For programming a wider range of devices, you may wish to use WinPic800 to complement the Willem software above. This too requires a bit of tweaking to work.

First, configure WinPic800 to use the Willem programmer via the Settings→Hardware menu. I left the settings at LPT1. Now exit the software, and browse to its installation directory. In the Hardware directory, you should find a file named WILLEM.hwp. Make a back-up copy of it, then open it in a text editor. The following values need to be changed:

The port addresses must be converted to decimal first. My parallel port has a base address of 0xCCD8, and so that part of the file looks like this:


Save the file and you should be able to use the Willem programmer with WinPic800 successfully.