Note: I have written a post containing updated compatibility information you may want to read here. The remainder of this post below is still very important, but I’d like to make sure everyone has the most up-to-date information about compatibility between the different DLLs and parallel port cards out there. If you’re looking for my patched io.dll for Willem programmer compatibility, see below.

Last year I bought a Willem EPROM programmer board from Sivava. It’s basically a cool little board with various sockets for plugging in EPROM/EEPROM/Flash/etc chips for reading/erasing/writing. Apparently it can even program some AVR microcontrollers. I have the PCB50 version of the board.

Here’s the deal. It has a USB port, but it’s only for supplying power. All communication goes through the parallel port. As everybody should know at this point, the parallel port is on the way out. No, scratch that. The parallel port is long gone. I had to use a really old HP Pavilion with a Celeron running Windows 98 to do anything with it. The programmer worked great, and I was able to fix a computer’s BIOS chip that I had messed up while trying to hack its BIOS.

Let’s fast forward to over a year later (a.k.a. now). I have a homebuilt PC with an Intel DX58SO motherboard and a Core i7 CPU, running Windows 7 Ultimate edition, 64-bit. The DX58SO literally has no legacy peripherals, other than a single PCI slot. It has no PS/2 ports, no parallel port, no serial ports, and no standard IDE ports. It does have a variety of types of PCI Express slots, though.

I recently bought a sweet PCI Express 1x card with four serial ports and a parallel port from Newegg. (Note: Newegg’s product specs lie about this card — the parallel port does not support EPP or ECP mode, according to a sticker on the box, even though Newegg says it does). I remembered that I had my programmer and decided I totally needed to get it working in Windows 7.

Easier said than done.

It’s difficult enough to get low-level legacy stuff working in Windows 7, but when you’re using the 64-bit edition, a lot of older stuff breaks even more. Also let’s remember that add-on parallel ports do not get mapped to the standard I/O addresses for parallel ports (0x378 and 0x278), but instead some other random address (mine is at 0x3000). I tried running the software that came with the board, but it just gives me errors and actually won’t let me exit without forcing it to quit from the task manager.

Let’s go on a Google adventure. Google lesson #1: sometimes when you’re looking for info about Windows 7 64-bit, you can find very useful stuff when you search for Vista 64-bit (or XP 64-bit) instead. My first search was willem vista 64-bit.

The second result was a digg posting titled Willem Eprom for Vista and 64bit XP (digg post is no longer available; link removed). The linked page is a forum posting at a forum called The post is by the admin of the site, and he mentions to install software called TVicPort and then a modified io.dll file. The first comment on the digg posting was by a user named rabitguy, who said he had a Willem board working on Windows 7 64-bit with tvicport and iodllwrapper.

So I kept seeing this io.dll and iodllwrapper stuff. What exactly is it? Let’s Google for “io.dll”.

The first result is to a homepage for io.dll. Basically, it explains that it’s a library allowing direct port access from several different Windows versions. Awesome! Except it doesn’t mention Windows Vista or Windows 7, or anything 64-bit at all. Crap. Well, I looked in the installation directory for the Willem software that came with my Sivava programmer board, and sure enough, in C:\Program Files (x86)\EPROM50, there’s an evil file named io.dll. So that’s why it doesn’t work.

So anyway, I searched for iodllwrapper, deciding to follow the advice of rabitguy. The first result is to a forum posting on an Amiga message board. I did a search on that page for “Willem” and found a posting by Toni Wilen who wrote a 64-bit-compatible io.dll wrapper which depends on TVicPort and uploaded it as an attachment to the forum, called He even included the source code. Aha! So I think I get it. He wrote a DLL that provides all the functions that io.dll would provide, except rather than implementing the raw functionality himself, he forwards the relevant function calls to TVicPort, which handles all the low level stuff (in a manner that works on 64-bit operating systems!). Actually it’s a pretty genius idea. So I downloaded his DLL and tried it out, replacing the stock io.dll file that came with the Willem software with his new wrapper.

I crossed my fingers and opened the programmer software. Awesome! I no longer got a bunch of weird errors when the program opened! I’m pretty sure Toni’s DLL would have worked great, but there’s a problem in my case. I don’t have a built-in parallel port, so my parallel port is at a non-standard I/O address (0x3000). The Willem software only lets you choose from a list of three standard I/O addresses where built-in parallel ports would appear.

Ugh! So I was stuck again. At this point I was about to throw in the towel. But first, I thought about it and came to the conclusion that I can’t be the only one with this problem. So I searched for io.dll willem address.

The first result this time was Ben Ryves’ Remapped IO.DLL. So someone else had the exact same problem! Ben also wrote an IO.DLL wrapper (and he included his source code, too!). His solution is to add an additional file called io.ini into the same directory as io.dll. You put the I/O address of your parallel port into that file (so my io.ini file would contain one line — 0x3000), and set the Willem software to use LPT1. The wrapper DLL looks for any I/O reads/writes in the LPT1 range and remaps them to actually occur at the address specified in the io.ini file. This is exactly what I needed!

It uses another DLL called inpout32.dll to do the dirty work. Actually, Ben’s site very nicely describes everything his DLL does, so I won’t go into any more detail about it.

Well, it turns out that his DLL didn’t work for me, either. It seems that it’s just not compatible with 64-bit Windows 7, at least in my experience. I just could not get it to work. The Willem software would not detect the connected board. I looked at the homepage for inpout32, and apparently there is a 64-bit version, so maybe if I had fiddled long enough I could have gotten inpoutx64 to work, but at this point I actually had an idea of my own, after looking at the source code that Ben included for his DLL.

I knew from everything I had read that Toni’s 64-bit-compatible io.dll wrapper using TVicPort did work. All it was missing was the remapping. So I took Ben’s code and modified it to use TVicPort rather than inpout32.dll. (Alternatively I could have added the remapping to Toni’s code.) I only changed a few lines. I just changed the calls to inpout32.dll for reading/writing to use the corresponding TVicPort functions instead, and also added initialization and deinitialization code for TVicPort.

So I compiled it with Visual C++ Express Edition 2008…ran the “Test Hardware” function on the Willem software…and success! It found the hardware! I was stoked, so I grabbed a BIOS chip from an old motherboard I’m not using anymore (Asus A7V133). It’s a SyncMOS F29C51002T. I chose that model in the software, set up the DIP switches correctly, and stuck the chip in the cool ZIF socket on the programmer board. I then read the BIOS from the chip. I looked at the read buffer and it looked good! I saw stuff about an Award BIOS, so it sure looked like it was working. I happened to have a good copy of the same BIOS file from when I had messed with that same chip on the older computer, so naturally I did a diff against them to make sure that the file was read correctly.

It didn’t read correctly. It differed by just a few bytes. It was mostly OK, but mostly is not good enough when you’re reading to/writing from chips that contain computer code and/or data. At this point I decided to sleep on it and think about it the next day. That approach really works well in all aspects of life in my experience. When I had trouble learning to play a piano piece I would sleep on it and the next day it was like my brain had somehow prepared itself ahead of time, and I would play the part I had been struggling with perfectly.

The next day I noticed that the TVicPort driver actually has an option for two I/O port access “modes.” The default mode is hard mode, which is slower, but provides more reliable access to an I/O port if it’s already been opened by a different driver. Soft mode is faster, but has trouble if a port is already open by another driver. On a whim I decided to try out soft mode. I read the chip again, and this time it worked perfectly. I then erased it, wrote the file back, and compared it. Perfect. I did this several times just to make sure I wasn’t getting lucky, and it worked every time.

So either I got really unlucky on my first try with hard mode, or using soft mode fixed it. I don’t know which one is the case, but regardless, I now have my programmer working in Windows 7 64-bit. And this is the end of our Google adventure.

Google can do a lot of great things if you’re willing to sit down and search. And search. And search. I didn’t actually find all this stuff that easily. I tried many different searches, wording things slightly differently. I ended up only showing you guys the search queries I tried that gave me interesting results.

So…thank you to everyone I mentioned in my post. I’ve never met you or even corresponded with you, but you all helped me get this working. Thank you rabitguy, admin at onecamonly, Toni, and Ben. With all of your info I got it working.

So naturally, here’s my io.dll wrapper, based on Ben’s wrapper, along with the source code for it.
Remember, I’m not responsible for any damage done by this software–it’s been tested lightly and seems to work for me, but your mileage may vary!
Download 64-bit remapped IO.DLL wrapper and source code (new version 1.1 which fixes a bug–thanks Paco!)
You will also need to download TVicPort from here.

Install TVicPort, then restart your computer (mine didn’t work until I restarted, and it does ask you to restart). Replace the io.dll file in the Willem software directory (C:\Program Files (x86)\EPROM50 on my computer) with this patched version. Open up the io.ini file, replace the address there with your parallel port’s I/O address (make sure you keep the “0x” before the address or it won’t work), and put it in the same directory you just copied the DLL file to. Set the Willem software to use LPT1 (0x378). If everything is working correctly, you should be able to go to the Help menu and choose Test hardware, and it will say “Hardware present” in the status bar at the bottom.

If you need to compile the modified io.dll for yourself or make modifications, grab TVicPort.h and TVicPort.lib from the TVicPort installation (C:\TVicPortPersonal\Examples\MSVC) and put them in the project directory. After doing that it should compile.

Hope this helps anyone out there, and thanks again to everyone whose information and source code helped me out!

A quick note: To find your parallel port’s I/O address, go into the Device Manager and open up your parallel port. It’s in the Resources tab:

The I/O range that is 8 bytes long (in my case, 3000-3007) is the important one. So prefix the start address with 0x (so in my case, I ended up with 0x3000) and that’s the value you should put in the io.ini file.

Version History:

  • 1.1 – Fixed a bug where I was calling functions from DllMain that I should not have been calling, causing the DLL to not work for at least one person – August 15, 2011. [Download]
  • 1.0 – Initial release – October 9, 2010. [Download]


  1. Aviator747 @ 2010-11-23 15:40

    Your fix for the Willem program worked 100%. I too am running Win 7 and could not use my programmer. I am also using a PCI-E para/serial add in port. Which of course like yours is not assigned to the default I/O addresses.

    I gratly appreciate your effort in creating your tutorial and the creators of the needed files to make this work.

    Nice work guys! 🙂

  2. Thanks for the kind words! Glad to hear it worked for you.

  3. Thank you very much! Now I can use my Willem programmer under Windows 7

    I didn’t have to remap the parallel port, because my motherboard has a real LPT port at 0x378, but the other tips were very useful

  4. Hey, you’re welcome. It’s sure nice not having to boot into Windows XP or (gulp) Windows 98 to flash chips! 🙂

  5. Hi there! Great research work you’ve done there. I’m expecting a PCI add-on card as we speak because I already have the willem programmer bought last year but i’ve upgraded my PC, so no LPT port for me either. Looking forward to test this when I receive the board. I’ll keep you posted! Thank you very much for your info and patience you had in order to solve this matter.

  6. Thanks! I’ll definitely be interested in the results. The patched IO.DLL has been downloaded from my server many times but there have only been a few comments on it. Good luck!

  7. Hi there, I’ve got my LPT PCI adapter board but it does not work with my mainboard. If the board is plugged in a pci, the computer will not startup so i’ll have to find another board that actually works with my mainboard because this one generates some conflict with my mainboard. Hope to solve this one soon…

  8. That’s interesting, and it worked for me as well, but I have the same problem you did with “Hard Mode” and haven’t seen where you can switch it. Where does it load from?? I’m new to using this software.

  9. Hi Shuan,

    It was an option that I compiled my patched IO.DLL with. So if you downloaded the patched DLL from me, it is already using soft mode. I do have another idea, though — newer versions of Windows apparently poll the parallel port automatically for devices every so often. It’s possible that the polling process is interfering with reading/writing the EEPROM. You could try doing the registry fix mentioned on the third question on this page:

    It mentions Windows XP, but I went ahead and added it on Windows 7 as well. Not sure if it will make a difference but it might be worth adding the registry entry there ([HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Parport\Parameters] “DisableWarmPoll”=dword:00000001) and rebooting. I hope that helps!

  10. My bad. It works perfectly. I had a bad IC. I guess if your memory is bad it will always give an error when it checks.

  11. Hi Shuan,

    Haha, that will definitely do it! Thanks for the update, and glad to hear it’s working!

  12. ILYSFM

    Seriously, thank you so much!

  13. Glad to have helped!

  14. Hey man,

    Thanks not only for posting a method for getting the Willem programmer to work, but also for describing the route you took to get there. Not only did it help me get the board working, but I learned a thing or two about the whys and hows of the whole situation. Thank you.

  15. You’re welcome Dante! I’m happy that it helped you out.

  16. OMG, I can’t believe that this actually worked! I got my Willem back! Thank you thank you thank you!!!

  17. You’re welcome you’re welcome you’re welcome! 🙂 I felt the same way when I first got it to work!

  18. Amit Dey @ 2011-05-10 01:25

    Hi Doug Brown,

    I am new to willem programming.

    For last 3 days i am trying to flash a intel 82802AB BIOS. Tried in Windows XP SP3 and on WIndows 7 64 as you guided.

    I can erase, check/verify okay. But if I try to program with P15-0028.BIO file it completes but gives Error at 0x000000 Chip = 0x00 buffer = 0x52.

    Pls help me how to solve this.

  19. Hi Amit,

    I’m not a Willem expert — in fact I’ve only used mine a handful of times. I’ll try to think of ideas though. It’s basically saying that it tried to write a 0x52 as the first byte, but it found a 0 there instead. I’m not familiar with this particular chip, but a lot of the chips I have used end up with all the bytes being 0xFF after an erase. Are you sure the erase is working properly? Also, have you verified that all the jumpers are correct? If you had to solder it, have you checked that all pins have good solder joints? Other than that, it’s always possible that you have a bad chip, too.

  20. Thanks for the help. I just got it today and I was getting a wee bit annoyed that I couldn’t find any information about the io.dll error. I changed my search term a bit and Google finally found your article.

    I would have been extremely unhappy if I was going to be forced to install WinXP in a VM to use this!

  21. Glad to hear it helped you! I know exactly what you mean about not wanting to install an XP VM. Yuck!

  22. Hi Doug!
    Thanks for sharing your problem an solving of it with the Willem and Win 7 64bit.
    Well, i’ve done everything as you said, but the program keeps saying “Could not parse adress in io.ini” followed by “Could not open TVIC Driver” What am i missing? Installed the TVIC Port driver 4.1, changed the io.ini with my PCI Parallel Port Adress (DC00-DC07) or os this a invalid adress? thats’ what it says at I/O Range?
    Hope you will answer soon, cause my nervs are down 🙁


  23. Hi Andy,

    Did you prefix the address in io.ini with “0x”? Also, make sure you only put the start address (0xDC00). So your io.ini file should be a single line containing:


    There’s nothing special about that address that should cause it not to work, so hopefully that’s the problem there. 🙂

    As for TVicPort, have you rebooted since installing it? I found that it didn’t work until I rebooted. Let me know how it goes, and if it still doesn’t work we can do some troubleshooting to figure out why it’s not loading.

  24. Hi Doug,

    wow thx for the quick answer 😀
    *dough* of course i haven’t prefix the adress -.-
    Here we go!!!!
    So much thanks to you and a nice weekend


  25. You’re welcome Andy! That can actually be kind of confusing, so I’ll update the post to make it clear that you need to prefix it with 0x. Thanks and you have a nice weekend too!

  26. Great Job it work. i was using my onboard LPT but before it didnt work. Once again Great JOB. THX

  27. You’re welcome DeMeo, glad it helped you!

  28. The article was really interesting and
    the fix allowed me to modify my Miata ECU.

    Good job and thank you very much! from japan

  29. So you’re modifying your car’s engine control unit? That’s pretty nifty! 🙂 Glad to hear you got it working!

  30. […] a different memory address than a built-in parallel port.  I struck gold when I stumbled across this site.  This guy ran in to the same combination of problems as me and completely rewrote the interface […]

  31. […] sought to find a solution to using one of these gadgets on Windows 7 X64, and lots of Google-fu, poking at libraries, and a little code modification he does just that […]

  32. Hi Doug, had long been waiting for this, but do not get it to work, I have the same problem:
    “Could not open TVIC driver” I check the file IO.ini, only contents one line: 0x378 this is my parallel port addres.
    I unistall and re-install the TVIC4.1 whit the same result.
    no longer do, some idea?.

  33. Hi Paco,

    Have you restarted your computer since installing TVICPort? You have to restart the computer after installing it. Also, are you running a 64-bit operating system? My DLL will only work on 64-bit. Let me know if you’ve already checked both of those, and then we can continue trying to figure out why it doesn’t work.

  34. Great article, very useful!

    I still use my Willem programmer on a 32bit Windows XP with a real parallel port, so no worries at the moment – but this looks great should I ever want to use something newer.

    Just one question – do you think this would work on a USB-Parallel adapter?

    Obviously a PCI-E Parallel card isn’t an option if one needed to use a laptop.

  35. Hi Agent24,

    Thanks! I don’t think any of the USB to parallel adapters would work. My understanding is they are designed mostly just to work with printers. There are some True-USB Willem programmers available at:

    I don’t know how well they work, but that might be an option. I wonder if there are any PC card or ExpressCard to Parallel adapters — I would assume something like that would work too, if a laptop had a slot like that.

  36. Hi Doug, thanks for responding so quickly.
    Regarding your questions:
    Yes,I rebooted after installing the TVIC.
    Yes, my OS is windows 7 64 bit.
    your new dll file and io.ini are in the same directory as the EpromM51.exe
    We also tell you that I do not happen the error “Could not parse adress in io.ini” as happens to Andy, I have only the error: “Could not open ICVT Driver” and does not detect the hardware.
    My motherboard has integrated parallel port at address 0x378.
    Doug thanks for your interest.

  37. Hey no problem! Sorry about taking longer to reply today. Interesting…the fact that you’re not getting the first error about io.ini means that it is correctly reading the io.ini file, so that file is OK.

    The “Could not open TVIC driver” error message appears if the call to TVicPort’s OpenTVicPort() function fails. Immediately after opening TVicPort, I check if it’s open. That message only is displayed if I’ve determined that it didn’t open correctly. It’s acting like TVicPort isn’t installed correctly, or it’s refusing to initialize for some other reason. Did you notice anything strange happen when you installed TVicPort?

    I have 2 other ideas:

    1. Have you tried to find a newer version of EpromM51.exe? I have one version of that particular program name here that won’t run at all on my computer, but a newer one with that same name will. However it doesn’t exhibit the same problems you have with yours — it just doesn’t load at all.

    2. Have you tried Ben Ryves’ original remapped DLL that I linked to in the article? His says that it does support 64-bit now, so it might be worth a shot. It doesn’t use TVicPort, so that might help.

    I could also try writing a simple program for you to run on your computer that only loads TVicPort and tells you whether it succeeded or not, so we could eliminate EpromM51.exe as causing any problems. Let me know if you’d like to try that out and I can throw something together pretty quick.

  38. Hello again Dough
    I have been testing the solutions that have told me with the following results:
    I uninstalled the TVIC and I installed the Ben Ryves Dll with the three files: “io.dll, io.ini, inpoutp32.dll”
    At this point the program does not fail at startup but the programmer is not recognized in the test.
    I’ve also tried another version of the program, specifically the 097ja version with the same result, anyway I can´t find more versions.
    (Now I use the version 098D11 whit the pcb50)
    My programmer works well because I can use with a virtual version of Windows XP.
    Anyway, I’m willing to try anything that you propose to me.
    Thank you.

  39. Hi Paco,

    Very interesting! Well, I made a quick test program for you to try:

    It will tell you whether it could open TVicPort or not. Also, it will print some results in the command prompt window that appears. Here is what mine says:

    SERVICE_NAME: TVicPort64
    WIN32_EXIT_CODE : 0 (0x0)
    SERVICE_EXIT_CODE : 0 (0x0)
    CHECKPOINT : 0x0
    WAIT_HINT : 0x0

    Let me know what you get! Make sure you have installed TVicPort and rebooted before running this app.

  40. Hi Doug
    I tried your test program seems to work correctly, I sent the address to a screenshot so you can verify it.
    Thanks for your interest.

  41. Hi Paco,

    Thanks for running the app. The results show that TVicPort is running and installed correctly. In fact, it succeeded at opening TVicPort at the spot where it’s failing in the patched io.dll. Have you tried running the programmer software again with the patched io.dll? Is it still showing the error?

    If it’s still showing the error when you use the DLL, I’m running out of ideas to try — have you redownloaded the patched io.dll in case your copy of it was corrupted or something? Do you have any antivirus software or something that might be interfering with loading the library through the DLL? Have you tried running it as administrator? That’s a wild guess and I doubt any of those will help, but it might be worth trying.

    Even though you get that error message, does it work anyway? Have you tried the Test Hardware function to see if it’s communicating despite the error message?

    Since your parallel port is at the standard 0x378 address, you could also try a non-remapped 64-bit io.dll. This one also uses TVicPort (it’s where I got the idea to use TVicPort): ( It might be worth a try. Let me know and I’ll keep trying to think about what else might be causing it not to load.

  42. Success!
    Hi Doug
    The problem is solved by installing a dll not remapped, as you’ve shown me, the program works correctly:

    I do not understand it does not work with dll remapped, it may be due to some problem with my hardware, because I’ve disabled antivirus, firewall, etc.
    anyway I hope this has helped also to others with this same problem.

    Thank you so much for your help and your interest. I am at your disposal for anything you need.
    A hug.

  43. Hi Paco,

    Glad you got it working! The DLL that worked for you is also open source. It does a few different things when it loads TVicPort, but both methods should be working. The one that works for your computer explicitly loads TVicPort with LoadLibrary() and gets function pointers to the relevant functions through that. The DLL I’ve provided (originally by Ben and patched by me) links against TVicPort and tries to call it directly. So that LoadLibrary() call must be fixing it on your computer — I’m not sure why though! 🙂 If anybody else ever comes across this comment and has any ideas why, I would really appreciate it if they posted a comment here and told me. Well, thanks for letting me know that you got it working, I appreciate hearing back from you! I agree, this will be useful info to have for others out there.

    P.S. I noticed the other library doesn’t call SetHardAccess(FALSE). If you run into any problems with bytes reading or writing incorrectly sometimes, you might want to add a call to that after the code that initializes TVicPort. You can call it in a similar way to how the other TVicPort functions get called in that library. Ever since I added that to my DLL, I have never gotten a bad read from a chip.

    Edit: I just did some research, and it looks like both of these DLLs are doing naughty things that Microsoft says to not do. The MSDN library says:

    The entry-point function should perform only simple initialization or termination tasks. It must not call the LoadLibrary or LoadLibraryEx function (or a function that calls these functions), because this may create dependency loops in the DLL load order. This can result in a DLL being used before the system has executed its initialization code.

    This could definitely be causing problems. I may want to change my DLL’s code to delay initializing TVicPort until the first request to read/write the port, or something like that….I hope it doesn’t add too much overhead.

  44. Doug hello again
    After reading your last note I am a little scared.
    I say this io.dll not work well if not call the function “SetHardAccess (FALSE)”.
    would have to include this call in the source code and recompile the dll?
    The truth I have little experience in such things, please let me indicate where I place the call and how I can compile it.
    thanks (sorry to be so heavy)

  45. Hi Paco,

    Yes–that was my experience. I needed SetHardAccess(FALSE) because I sometimes ended up with a few bytes wrong when I would read from a chip. Maybe it will work fine for you, though — you will only be able to tell by trying it out.

    If you look at the edit I made to my comment above, I have determined that both of the libraries are doing things they shouldn’t do when they load. This could be creating weird problems. It’s possible that this is the reason that my library isn’t working for you.

    I’m going to patch my library to behave according to Microsoft’s requirements, and I’ll post a link to a test version for you to try. If that version still doesn’t work, then I’ll patch the iodllwrapper that worked for you to include SetHardAccess(FALSE). I’ll try to get that done today soon, so keep checking here 🙂

  46. Hi again Paco,

    Here is an updated version of my io.dll (with the remapping) that addresses the problems I found in the code regarding DllMain. You will need to put the io.ini file there again with 0x378 in it. Try it out and let me know if it works any better. I tested it here and it seems to still work OK.

    If it doesn’t work, then I’ll add the SetHardAccess(FALSE) code to the other library and post a download link for you for that.


  47. Hi Doug
    I tried your new dll and seems to work well, even I have noticed that the program runs faster.
    I’ve only tested with a 27256 EPROM at hand, but tomorrow I will try to try some micro pic and some eeprom for writing and reading, so you can tell that this works more deeply.
    Tomorrow I’ll write Doug, now I have to leave.

  48. Hi Paco,

    Thanks! That is great news! It means that the problem was because I was calling functions I shouldn’t have been calling from DllMain. That was the root cause of the entire problem. So you have really helped me out, finding a major bug in the DLL. I appreciate it, and I’ll be anxiously awaiting your results with programming a PIC and other EEPROMs. Thank you for getting back to me so fast! 🙂


  49. Hi Doug
    Here I am again with good news.
    I’ve tested the program with everything I had on hand, and when all tests have been successful:

    27256 -> ok
    AT49F002T-> ok reading and writing.
    62256 -> tests ok.
    24C02-> ok reading and writing.
    PIC16F84A-> ok reading and writing.
    For now, I have no devices to test, but I think the prospects are good.

    if you give me your approval, I will link to your article on my website, is a small website that I recently started: (sorry is in Spanish).

    By the way, you are interested ARM Cortex M3 micros, I’m starting with them and find them very interesting.

    a hug.

  50. Hi Paco,

    Great! Thanks for doing all that testing. I think it’s safe to say the bug in my DLL is gone and it’s working for you. I’ll update the download link in the article to point to the new one now.

    Cool website, I would be honored if you linked to my article on it. Thanks 🙂

    Yes the Cortex-M3 is great! It just feels like it makes some of the low level stuff easy (like interrupt handlers), the same stuff that was a little bit more difficult on other microcontrollers.

    Anyway thanks again for helping find the bug!

  51. Hey, Doug.
    I’ve been following the messages here with interest.
    I recently received a Willem Programmer from a Chinese company via Ebay. My programmer sure looks like the Standard PCB3B Willem Programmer shown here: Installation & Configuration
    I’ve downloaded and installed the Willem Programmer software, the TViPC software and changed the io.ini and io.dll files per the above info. But when I select Test Hardware, I still get “Hardware Error: Check Power & connection.”
    My parallel port is from a Rosewill RC-302E PCIe card, which provides an ECP Parallel Port. (I got the PCIe card from
    The LEDs all light up on the Programmer. But I get the Hardware Error indication. Any ideas on what I should do?
    – Steve

  52. Hi Steve,

    The parallel port card you got seems like it should work fine. When I plug in my programmer to my parallel port, all the lights turn on also. As soon as I open the software, the lights go off — that’s another way to tell if the communication is working. If your board is a PCB3 board, it’s possible that you need matching software — I noticed the directions say you have to click the “Willem” in the toolbar to select PCB3 mode. Just to make sure — have you done that so that the window says you’re using a PCB3 board? The version I have doesn’t seem to let me change to anything other than PCB5, but hopefully you have one that matches.

    Do you get any errors when you open the app at all? If not, the remapped io.dll is probably working. Also, just to make sure–what is the I/O address you put into io.ini, and what is the range that the Device Manager reports? Mine shows two ranges: 3000-3007 and 3028-302B. That 8-byte-long one from 3000-3007 is the important one, so my file contains “0x3000”.

    Have you tested the board on an XP or older computer with a built-in parallel port? It might be easier to try getting it working there first. Or even running XP or Windows 98 in a VMware Player virtual machine with the parallel port forwarded to it would be a way to test it too…

  53. Thanks, Doug.
    I’ll bet the first thing you mentioned is the problem. My software is PCB45(0.98D5)-. I don’t have a “Willem” in the toolbar.
    I see now from Installation & Configuration that for the PCB3B hardware, I should use the 0.97ja software. That software does have a “Willem” on the toolbar. In that location on the toolbar, my software has only “PCB45.”
    I think I’ll try different software this evening. (I’m on lunch break now.) I’ll let you know what happens.
    I’ll also check the I/O Address Range.
    I haven’t tested the Programmer with an older computer. I don’t have any computer with a built-in parallel port.
    – Steve

  54. Hi Steve,

    Sounds like a good plan! My software also has that same thing except it says “PCB50”. You might try clicking on the “PCB45” to see if it changes the version number on your current software. I’m not sure though–clicking the “PCB50” on mine does nothing.

    Some of the old versions of the software won’t run for me on Windows 7 64-bit, so hopefully 0.97ja will run correctly. Also some of the older versions use a different I/O DLL — I think it’s DLPORTIO.DLL or something like that. I don’t think it’s compatible with io.dll. Anyway I’ll wait to hear back from you and then we’ll see where to go from there.

  55. Success!!!
    I uninstalled the software that I had and installed the 0.97ja software. I still got the Hardware Error.
    So I then went down your list. I looked for I/O Range in Device Manager for the PCIe Parallel Port, but could only find Address = 00000000. I tried many variations for that in the io.ini file, but nothing worked.
    Looking some more, I discovered “Resource Type” which I initially thought was something else. Under the Resource Type tab, I found “I/O Range: E010 -E017” and “I/O Range: E000 – E003.” With 0xE010 in the io.ini file, the programmer worked!
    I’ve now programmed my first 28F512, and the programmed part checks perfectly!
    Thanks for your help.
    – Steve, in Peachtree City, GA

  56. That’s great Steve! Thanks for the update. I should probably update the post with some instructions (maybe a screenshot or two) showing how to find the I/O range. Glad you got it figured out 🙂

  57. […] Willem EPROM programmer working in Windows 7 thanks to this article from Doug Brown. Thanks Doug! So after copying the original EPROM’s contents to my HDD (you never know!), I made a test […]

  58. Hi Doug, great guide however I have a problem. I keep getting the Hardware error when testing. I’m using a parallel to USB adpater to plug the programmer into the PC so it’s slightly different to yours so I’m not sure if I’m getting the correct I/O range. What I think it is is “Ports (COM/LPT)/Communications Port (COM1) but this says COM1 instead of LPT1 so I think something is wrong and I’m wondering if you know how to fix this.


  59. Hi Jordan,

    Unfortunately my instructions will not help you if you are using a USB to parallel adapter. As far as I know, there is no way to make that combination work. USB to parallel adapters are really only meant for printers–they don’t provide the full functionality of a real parallel port (that is my understanding, anyway). If you add a PCI or PCI Express parallel port card, that should work. Sorry!

  60. Ah bugger. Ah well, I can return that and grab myself a cheap PCI parallel port off eBay (Unless this isn’t recommended?). Going to have to wait another few days before I can get my project done now :(.

    Thanks a lot,

  61. Any PCI or PCI Express card should be OK as long as it has drivers for your OS. Good luck! Sorry you’re going to have to wait, I know the feeling! 🙂

  62. THANKS for all the hard work on this! I’m going to give it a go shortly, but even if I can’t get it to work, thanks for taking the time to write this all up!

  63. Hey Trey,

    Thanks for the kind words! I’m glad to have (hopefully) helped you. If you get a chance, let me know how it goes!

  64. Minor Issue.
    Since my laptop does not have a serial or parallel port, I’m using a USB – Ser/Par cable from Cables Unlimited.
    The problem, in Device manager, the device is listed, but no address/resource tab is given.
    I tried picking a few addresses, that are related to parallel ports with no luck.
    I may end up using an old laptop to work with this Willem Eprom programmer. I’ll let you know if I get anywhere with this one.

  65. Hi Trey,

    Sorry — USB to parallel adapters won’t work 🙁 Apparently they are only designed for printers and don’t give the full functionality of the port. You need a built-in port of some kind. No guarantees, but if your laptop has an ExpressCard or PCMCIA slot, the right kind of card might work (one that isn’t just creating a USB-parallel port like you already have)…

  66. Not the info I was hoping for. 🙂 I will check into a PCMCIA card or just use an older laptop with an actual parallel port.


  67. It seems that a PCMCIA card that would do the trick would run about $100.
    I bought an old d610 laptop previously for $80 that has a real parallel port.
    I was also looking into this:
    MPLAB Compatible USB PIC Programmer

    I haven’t decided which way to go yet. Use existing hardware or buy new toys. 🙂


  68. A Cheap alternative that seems to detect that the hardware is present is using my dell docking station.
    It shows up as a real LPT1 port and detects the hardware. I have not programmed with it yet, will be trying that soon. Not sure I like the idea of having to use my docking station whenever I want to program a PIC chip, but its hardware I have and I can get a USB programmer when funds allow.
    Thanks for all you help!


  69. Hey Trey,

    If it says the hardware is present, you’re probably in good shape. If you ever do decide to get a PCMCIA card, this $50-ish one should do the trick, I think. But that $50 would also go a long way toward a USB programmer, too, so I’m not sure that I can recommend that approach 🙂 Glad to hear you’ve got a solution with your existing hardware!

  70. Anunay Inuganti @ 2012-01-31 05:59

    Hey Doug,
    Good to know about this,I spent a week on Google searching for this. Does this work on Windows 7 32-bit?
    Thanks a lot Doug.

  71. Hey Anunay,

    I haven’t actually tried it on Windows 7 32-bit, but I think it should work fine. If I get around to it, I’ll try it out in the next few days. If it doesn’t, Ben Ryves’ DLL should definitely work. Let me know if it works for you. Thanks!

  72. […] ed hanno una porta parallela non mappata agli indirizzi standard, la soluzione la troverete a questo […]

  73. Rohit Gupta @ 2012-02-06 04:08


    I am working on a problem and while browsing i came to your blog, i think you can help me to solve this problem. Please understand my need and guide me properly.

    I have a hardware device(very old fashion) which gives direct print to printer through parallel port. i wants to capture data and get it to the pc through parallel port, i tried so many ways to read data from parallel port but i am not getting any single string on my parallel port.

    Please do tell me if you have any sample application to get data from hardware to computer.

    Thanks in Advance..

    Rohit Gupta

  74. Hi Rohit,

    It should be possible using TVicPort. You just have to link against TVicPort and then use its provided functions to read/write to the I/O address of your parallel port. See my DLL’s source code as an example for how to initialize TVicPort (although keep in mind I do my initialization in a weird place in the code because I had no choice). There are a ton of resources at Jan Axelson’s website about parallel port I/O, much more than I could provide.

    I don’t have any sample programs, but TVicPort comes with many examples that will probably be helpful.

  75. […] to this tutorial I was able to replace the io.dll that comes with the Willem software with a new one that works with […]

  76. Jao varela @ 2012-03-13 04:25

    hello.. i wonder if you could help me out.. my programs is already working but it seams that when i go to the port properties ther is no resources/address.. “Prolific Usb-serial Comm Port (COM4)”

    and can i use sp200Se eeprom programmer with the willem software?

    Thanks in advance!

  77. Hi Jao,

    That means your programmer uses a USB to serial chipset (probably the Prolific PL2303). Unfortunately the Willem software only works over parallel ports (at least the software I’m using). It is designed to talk directly to a parallel port. Because of that, I don’t think you can use that programmer with the Willem software. Sorry!

  78. Thank you Doug. Worked 100% for me.


  79. Hi,

    I am not a computer-expert so please can you explain
    step 4.) (open up the io.ini file …) a little more ?
    I got no clue where to look for the IO-address
    or what I have to write to the io.ini.

    Thanks a lot,


  80. Michael,

    To find your parallel port’s I/O address, open up the Start menu. Right click on “Computer” in the Start menu and choose Properties (this is just a quick way to get to the System control panel). Click on Device Manager. One of the Device Manager categories should be called “Ports (COM & LPT).” Expand that category and find your parallel port. Double-click the parallel port. Click on the tab called “Resources”. On my computer, two I/O ranges appear in the list. Find the one that is 8 bytes long (mine is 3000-3007 — this is 8 bytes long because there are 8 addresses in that range [3000, 3001, 3002, 3003, 3004, 3005, 3006, and 3007]). Take the first number of that I/O range (3000 in my case) and put “0x” before it. So mine is “0x3000”. That is what you should put into the io.ini file. For example, if your I/O range is 2300-2307, you would write 0x2300 into io.ini.

    Just for a little more detail, here is one more example — the I/O ranges are written in hex, so it’s possible you might see a range like this: 3008-300F. This is also an 8-byte range: [3008, 3009, 300A, 300B, 300C, 300D, 300E, and 300F].

    I hope that helps — let me know if you run into any other snags and I will try my best to help.

  81. Migwell2 @ 2012-04-07 16:25

    I don’t understand why I cannot use my willem on W7 64 !
    I use a Shentek PCIE to parallel adapter:
    I have follow your tutorial point by point, reboot after Tvicport install, enter my address 0x9010 in io.ini.
    So if anybody have an idea ? I know that I have to test my willem on a XP with a build in parallel port, but I don’t have it.

  82. Hi Migwell2,

    What happens when you try to use it? Do you get any error messages? Does the “hardware test” succeed or fail? As far as I can tell, the adapter you linked to should work fine.

    Did your Willem software come with io.dll? I have seen older versions that use a different mechanism (DLPORTIO). If you are using a version that did not come with an existing io.dll, my io.dll replacement won’t work.

    Just a few ideas…let me know and I’ll try to figure out more ideas for you to try.


  83. Migwell2 @ 2012-04-07 20:58

    First, thanks you for your response !

    I have no message error, just the hardware test failed.
    The willem software come with io.dll so I replace it with yours, it is version Willem EPROM PCB50b(0.98D12C3).
    I have test with your testtvicprog.exe, it seem there is no problem.
    I am really lost…

  84. Hi again,

    You’re welcome — I always hope to help solve problems like this 🙂 It sounds like you’ve tested everything just as I was hoping, so TVicPort is working (since the test program works and you aren’t getting any errors when you open the willem software). Have you verified that you have entered the correct I/O address? It looks like you have entered everything correctly based on what you said in your first comment (0x9010), but I just want to make sure. What I/O ranges do you see in the device manager for your parallel port card? Is 0x9010 the 8-byte range? (Is there a range 9010-9017 listed in the device manager? What other I/O ranges are also listed?)

    Also, are you powering the board? Other than the parallel port cable, you also need to power the Willem board using either a USB cable or the DC-in jack. Just making sure that you have also done this…

    Other than those suggestions, the only other thing I can really think of is to test the programmer on an older computer with a built-in port to ensure that it is functional…anyway, let me know and we can try to go from there.

  85. Migwell2 @ 2012-04-07 22:55

    I have verified, I have enter the correct I/O address 0x9010 in io.ini. In the device manager properties, the I/O address is 9010-9017 and on the second line 9000-9003. There is no other range of address for LPT1, LPT2 or LPT3.
    The willem card is powered with USB.
    I will try the willem card on a old XP with built in parallel port, when I found it.
    I will test the continuity of the cables I use.
    As long as I connect the willem the orang LED is light on. There is no other led light on. Only the red VPP one which blink two time 0.1 second when plugging the Express card. There no change when running the willem software…

  86. Hi Migwell2,

    Thanks for the info. Hmmm…you definitely have io.ini configured correctly for your computer’s I/O addresses. Only other thing I can think of is: you did choose LPT1 in the Willem software, right? (No matter what number your parallel port is given in Device Manager, you must choose LPT1 in the Willem software)

    Other than that, the “XP computer with a built in parallel port” test is definitely the next best thing you can do.

    I haven’t heard from anyone else who has tried getting the remapped io.dll working with an ExpressCard parallel port adapter, but it should definitely work — it’s just PCI Express in a different form factor. ExpressCard carries both PCI Express and USB signals, but the Shentek website clearly states that your card is using the PCI Express interface (plus, the fact that your parallel port *has* I/O addresses means it has to be using the PCI Express signals). It’s no different from putting a PCI Express card with that same chipset into a desktop PC.

    Anyway, let me know how it goes with the XP test. If the XP test succeeds, then I’m going to be very confused…

  87. Migwell2 @ 2012-04-07 23:57

    Hi Doug,
    I have test the continuity of my cables, they are good.
    I have tried with LPT1 in willem software.
    So I will give you more info when I will test with a XP with built in parallel port.

  88. Migwell2 @ 2012-04-09 05:24

    Hi Doug,
    I have tested my willem on XP with a built in parallel port successfully.
    At power on 3 led light on, and during booting two of them light on. It works at the first time.
    I am glad about my willem and disgusted about my express card !
    I really want a portability solution without buying an old laptop or a new programer but I have no other solution.
    Thanks you for helping,

  89. Hi Migwell2,

    Rats 🙁 So something about that ExpressCard isn’t working with your Willem programmer. At this point I’m very confused. If you have access to an oscilloscope, it would be interesting to see if the data pins on the ExpressCard parallel port toggle when you try to tell the Willem software to burn a chip. That way, we could verify that the DLL is correctly controlling the parallel port.

    I have a MacBook Pro with an ExpressCard/34 slot…I just bought one of those cards from Shentek’s eBay store and I will see if I can get it working with my Willem programmer, first of all in stock 32-bit XP, and then possibly Vista afterward. I think it will be useful to the community to know what adapter cards work with the Willem programmers.

    I’m also thinking about eventually making a USB to parallel adapter that would be compatible with the Willem programmer. It doesn’t seem too difficult to do at first thought — a custom io.dll could communicate over USB to a microcontroller to bit-bang the pins as needed. Not sure if performance would suffer though…

  90. Migwell2 @ 2012-04-09 20:21

    Hi Doug,
    I could have an oscilloscope next week, so I could do the test.
    It seem the parallel works very differently between built-in and adapter one:
    Built-in: At power off 3 led light on, and during booting two of them light on.
    Adapter:As long as I connect the willem the orang LED is light on. There is no other led light on. Only the red VPP one which blink two time 0.1 second when plugging the Express card. There no change when running the willem software…

  91. Migwell2 @ 2012-04-09 20:33

    I have a response about my problem from Shentek:
    for address to 378 or 278 or 3BC that is from ISA base card, after ISA, PCI(Cardbus) or PCIe(ExpressCard) the IRQ address is giving by OS system, that is why we can not set up for IRQ address anymore. That is why we can see only LTP1 or LPT2 or LPT3 for Parallel port, com1 or com2 … for Serial Port.
    now we have one product it can address to 378 or 278 or 3BC. I have check it but the product is not finish yet.

  92. My understanding from reading the schematic is that one of the LEDs should always be on (indicates the programmer is powered) and the other two indicate that VCC and VPP are being supplied to the chip to program. VCC and VPP are controlled by two of the parallel port pins. So their state depends on what the parallel port pins are outputting–as soon as the Willem software has control of them, it tries to turn them off. The oscilloscope would be useful so we can see if some of the data pins are doing anything at all under control of the Willem software.

    I think the reply from Shentek is just saying that their parallel port card can’t use the standard LPT1-3 I/O addresses and IRQs. Not a problem though–the remapped DLL takes care of the address problem (and the Willem software does not use any IRQs)

  93. Hi Migwell2,

    I have received my Shentek ExpressCard parallel port card. The card isn’t working with my Willem programmer either. I’m running Windows XP 32-bit, but that shouldn’t matter — the DLL is 32-bit and links against TVicPort’s 32-bit DLL. I’ve tried both my remapped DLL and Ben Ryves’ original remapped DLL. Ben’s DLL doesn’t print any errors, but it doesn’t work. My DLL prints out a TVicPort error. My red VPP light doesn’t do anything when I plug in the ExpressCard, but I see the same behavior that you see with the lights.

    I’m tempted at this point to grab a PCI Express to ExpressCard adapter, stick it into my desktop machine, and try *that*. First, I’m going to try to figure out if communication with the card is working at all by writing some test patterns to the pins on the parallel port. I’ll update again if I discover anything. I just don’t understand why this card isn’t working — it meets all of the requirements necessary for a Willem programmer…

  94. Ok, so I made a quick test app to control the parallel port pins and see if I can find anything weird.

    It turns out that the eight parallel data pins are definitely working correctly. At first I was a little concerned because the pins are only at 3.3V instead of 5V, but my working card is also only at 3.3V, so that’s not a problem. However, there are other output and input pins that the Willem programmer uses as well.

    What I’ve seen so far is that the other status/control pins are behaving strangely. (My desktop PC’s parallel port card’s pins *are* behaving as I expect, and it works fine). I’ve experimented endlessly with putting the card into the correct SPP mode that the Willem programmer software expects, but nothing seems to be working as it should according to the OXPCIe840 datasheet (that’s the chip that the adapter uses). Before I make any conclusions, I’ve ordered two other ExpressCard parallel port adapters from other manufacturers to test out. I may be nuts, but it will be useful to know for future recommendations. Stay tuned for more information next week…

  95. I’ve pretty much come to the conclusion that the Shentek adapter just doesn’t work with the Willem programmer. I’ll know for sure once my PCI express to ExpressCard adapter arrives and I can test it in my desktop machine running Windows 7.

    This Syba ExpressCard adapter with 1 parallel port and 2 serial ports arrived today, and it works fine with the Willem hardware on my MacBook Pro. My DLL doesn’t work well with it in Windows XP, but Ben’s remapped DLL works fine. I have been fighting a bit with the DisableWarmPoll registry setting, but I think I have it working right now. Again, once my adapter arrives, I’ll try all of the various ExpressCards in my desktop PC. That should give us some good hard info on what cards work in Windows 7.

  96. Latest update:

    The Syba card linked above (MCS9900 chipset) works fine in Windows 7 64-bit with my DLL and also in Windows XP with my laptop. However, in both OSes, it appears that every 5 seconds it tries to turn on VPP, so the red light keeps coming on. This goes on for a while until it gives up and quits doing it. This is despite the fact that I have the DisableWarmPoll registry item added on both machines. Not sure what causes this, but other than that weird quirk, it works fine.

    The Shentek adapter (link removed, product no longer available — 33006, OXPCIe840 chipset) does not work with the Willem software (and my DLL or Ben’s DLL) in Windows XP or Windows 7.

    This StarTech adapter (OXPCIe952 chipset) also doesn’t work with the Willem software (and my DLL or Ben’s DLL) in Windows XP or Windows 7.

    The next step, I guess, is to figure out why the Oxford chipsets do not work with the Willem software. The Willem software is not fancy — it writes to the parallel port as a standard parallel port (SPP). It writes to the data register and control register, and reads from the status register. This is all very basic parallel port I/O that any parallel port should support. Is Windows doing something weird to screw up raw access to the device? Do the Oxford chipsets have strange quirks in SPP mode? I just don’t know. I may try to contact Oxford (now PLX Technology) about this, but I don’t know if that’ll get me anywhere. I’m just really puzzled now.

    Anyway, my recommendation as for now is: if you’re going to try to get this working with your Willem programmer, get something that has a Moschip (now ASIX) MCS9900 or MCS9901 chip! I have a PCIe card with an MCS9901 chipset, and this ExpressCard with an MCS9900, and they are both working…

  97. Migwell2 @ 2012-04-20 00:38

    Hi Doug,
    many thanks for your support 😉
    is there any chance to see the willem programmer working with a Shentek adapter, or do I need to buy a Syba adapter ?

  98. Hi Migwell2,

    Not a problem 🙂 It was worth it for the research. At this point, I just don’t know if it will ever work with the Oxford chipset. I tried to sign up for PLX Technology’s support site, but because I’m a private individual and not a business, apparently they aren’t interested in talking to me (my signup for their support site was rejected). I’m still planning on trying a few things — particularly, I’m interested in knowing if the parallel port behaves correctly in Linux as opposed to Windows. If you’re in a hurry to get your parallel port working, I’d recommend the Syba card.

    Like I said, the Syba card does do some weird behavior with VPP when you first start using it, but it stops acting weird after a while and seems to be OK. Also, ExpressCard I/O addresses change depending on whether you plug them in before or after booting the computer, so that might get annoying changing the I/O address around. Keep those in mind if you get the Syba card…

  99. Corprius @ 2012-05-07 13:21

    Hi Doug,

    Many thanks for sharing your brilliant solution! I was just about to give up on getting the programmer to work with windows 7.

  100. E36power @ 2012-05-17 04:44

    Thank You for this article!

    I used this PCIe to Parallel card:

    At first, Willem was not working because I used I/O from LPT1, but this card also has LPT3 and COM2.
    Then I tried I/O from LPT3 and there wasn’t any errors. Have read and write few EPROMs and everything seems to be working fine.


  101. Excellent Doug.. Now have my Willem working on Windows 7. Copied new ini and dll into directory.
    Have Core2duo with std built in parallel port.
    Thank you very much for this work..

  102. Awesome write-up! Probably would have been stuck (or at least messing around with this thing for hours) without it!

  103. Hi Doug,
    when I use the programmer with your files, I get when reading with or without EPROM always 04H 06H displayed in the buffer.

    Why could this be?

    I’m using an original LPT1 on my motherboard.


  104. Hi Dietmar,

    Is your io.ini file a single line containing:


    ? That’s what it should be if you are using LPT1 from your motherboard. Also, have you verified that the programmer works on another machine with an older OS? Have you verified that the EPROM chip is good? Since you don’t need the remapping capability (because you have a built in parallel port), you could also try some of the other solutions I linked to in the blog post.


  105. Hallo Doug,
    I found the Error. The cable was broken.
    The program is now working.
    I’ve found two interesting links

    The respective programs you only need to replace the original.


  106. Hi Dietmar,

    Glad you figured it out! Thank you for the links — I’ll have to try the newer software versions sometime.

  107. hi there.. i found that this is lecturing me good in using the same thing here.. i do not know whether its still active or not, just trying my luck.. i’m also having a Wilem eprom programmer, i followed every step above, but i keep on getting an error message stated > Hardware Error: Check Power and Connection

    I have read through all of this, and i hope that maybe you guyz which already succeed in using it can give me a clue on what’s going on..

    *sorry for my bad english.. from Malaysia

  108. Hey Janick,

    What kind of a parallel port do you have? Is it a PCI Express card? If so, what card is it? Are you using Windows 7? What version of the Willem software do you have, and what Willem programmer board do you have?

  109. i need guide

  110. migwell2 @ 2012-11-11 19:42

    Hi Doug,
    I still want to use my willem on my win7 laptop.So, I am looking for a Syba express card 34mm to Parallel for my Willem since a while. I am not able to found someone to ship it to French Polynesia. I keep looking for it.
    Maybe you have an other solution since your last answer ?
    You sais:”Anyway, my recommendation as for now is: if you’re going to try to get this working with your Willem programmer, get something that has a Moschip (now ASIX) MCS9900 or MCS9901 chip! I have a PCIe card with an MCS9901 chipset, and this ExpressCard with an MCS9900, and they are both working…”
    I have also found this one:
    Compatibities with spécifications ExpressCard 1.0
    Chipset NetMos MCS7715
    No IRQ, DMA reservation nether I/O addresses
    Hot swappable
    Thanks in advance for yours always goods advices !

  111. Hi Migwell,

    Unfortunately I haven’t had time to play with the Oxford chipset to determine why it isn’t working correctly. I still have the ExpressCard adapters here and I want to hopefully figure it out sometime, but right now I don’t have any new info for you–sorry 🙁

    The MCS7715 appears to be a USB chipset, which won’t work. You have to use a PCI Express chipset. The USB chipsets don’t give you a full parallel port (and even if one of them did give a real parallel port, it would be extremely slow compared to a PCI Express card)


  112. I’ve finally had some time to look into the incompatibility between the Willem programmer and the Oxford/PLX chipsets.

    There are two problems I’m seeing. First of all, every card I’ve tried with an Oxford chipset does not have pull-up resistors on its bidirectional pins (strobe, auto/linefeed, initialize, and select printer). It sounds like it’s pretty normal for parallel ports to include those pull-up resistors, so the Willem programmer doesn’t have any. The lack of pullups causes an issue when you try to use these pins as outputs. If you drive them low, it will correctly drive a low value onto the pin. But if you try to drive a high value, it leaves it floating instead (open drain/open collector). This would be remedied with a pull-up resistor to put the high value onto the pin when it’s floating. It might be possible to add extra pull-ups to the Willem board (or maybe on a cable in between) to fix that behavior. I’m planning on trying that soon to see if it helps at all.

    The second problem is that I can’t get any of the input pins to work correctly (ack, busy, paper out, select, and error). They don’t appear to respond to me putting voltages onto the pins. With a Moschip/ASIX chipset, those pins correctly respond as I touch them to ground or +3.3V (or +5V). I would also assume most motherboard parallel ports would respond correctly the same way. With the Oxford chipset I’m not seeing a response at all, at least with my little tester program. I can’t figure out why those pins aren’t working. I don’t think it’s related to the first problem at all.

    So in simpler terms, only the eight data pins are behaving correctly for me. I need to figure out why the rest of the pins won’t behave.

  113. Ray Milton @ 2012-12-22 03:54

    What a Genius, solved all my problems ! This works perfectly with my programmer (I think it’s a PCB3 with adjustable prog voltage) I am using the 0.97j version of Willem software on Windows 7 pro 64 bit and a PCI parallel card. …………. Well done.

  114. Hey Doug,

    I’m having a bit of trouble with the hardware error. Could this be because my parallel port is recognised as COM1 as opposed to LPT1?

    Cheers for the guide.

  115. Hey Jordan,

    Yeah — it needs to be recognized as a parallel port because the software talks directly to the parallel port hardware. If your adapter is recognized as a COM port, it probably means it’s not a true parallel port adapter. Just a guess though…

  116. Thanks for the reply.

    It’s definitely a proper adapter as I’ve used it for about a year until I re-formatted and ran into all these problems all over again :p. I just can’t get it to recognise as a LPT connection.

  117. Hey, I got it working. My driver is different to what seems to be the norm as it comes under ‘Multifunctional Devices” in device manager and I even have to use the second I/O range.

    I do have another issue though where I get a message like “Error at 0x000000 Chip = 0xFF Buffer = 0x4C. Any idea how to fix this?


  118. Hmmmm, I have no idea about that particular device you’re using. As long as the I/O range is 8 bytes long and it responds like a typical parallel port would in those 8 bytes, it should work.

    No idea on the other error — that’s meaning it attempted to write 0x4C and it read back 0xFF — as in the programming operation didn’t work. Have you verified that you can read other known good chips? I guess it’s possible the I/O range isn’t correct and it’s just happening to respond correctly to make the hardware test pass in the willem software. It could also be a bad chip you’re trying to flash. Not sure…

  119. Got it working! For some reason I had to enable something to do with Serial ports (COM) in the BIOS. Seems I have a few more hoops to jump through than usual.

    Thanks again for getting this working on Windows 7 64bit!

  120. Weird! I’ve always hated BIOS voodoo. Anyway, glad to hear you figured it out!

  121. Bought up the last (used) one from your Amazon link:
    Syba Best Connectivity PCI-E Based ExpressCard SD-EXP50021

    Finding a Moschip based PCMCIA form factor card is very difficult now since no one stocks them. Seems to works fine with WinXP (32 bit just using inpout32). Also confirmed another Moschip based PCIx1 card for 64 bit Win7 working fine with Willem

    Thanks for putting this info up!

  122. Wow, this is such a great post.
    I’d like to know about the compatibility with Linux. Do you have any opinion on that?

    I’ve found several posts stating sucessful attempts with wine on Windows 98 compatibility mode.
    Here’s one:

    It’s quite old, though. I guess expresscard did not exist on that time, but the guy said it worked with PCMCIA.


  123. One more question: from the comments, I read you saying Shentek ExpressCard to Parallel does not work. You mean it doesn’t work with Willem anyway (including Win 98, XP etc, por example) or with Win 7 64 bit and your library?


  124. Hi Otto,

    It seems to me that it shouldn’t be that hard to make an io.dll wrapper for Wine that forwards the io.dll calls onto Linux’s parallel port driver. I really do want to try that, especially with one of the Shentek cards that I can’t seem to get working in Windows. It would basically be a special version of io.dll that only works while inside of Wine. Maybe if I could get it working inside of Linux it would give me some clues about why it doesn’t work in Windows.

    I haven’t been able to get the Shentek ExpressCard card to work in Windows XP or Windows 7, with my library or with someone else’s library (Ben’s I think). I just don’t know what the deal is with that chipset, but it doesn’t seem to behave correctly when you try to control its control lines for whatever reason. The company that makes the chipset was not interested in talking to me — my request for a developer support account with them was denied because I’m not a business 🙁

  125. Thank you very, very much! Just bought a Willem and experienced the same problems you had.

    You’re my personal hero!

  126. Hello I have a programmer William departure of William is LPT I have ASUS VIVOBOK X202E windos 8
    How do I install the Huilam computer and I have a USB TO PARLLEL need help

  127. Hi Eliran,

    Sorry, but a USB to parallel adapter won’t work. They don’t work as real parallel ports. They’re only for printers. You would need a card you can insert into the laptop if your computer has an ExpressCard slot. Also, I have no idea if it will work with Windows 8.

  128. Ram murthy @ 2013-03-28 10:44

    sivava programmer no 45b this equipment are not available 25 series is not working. most urgent working of 25xxseries pls

  129. I added pull-up resistors to the four bidirectional pins on my Willem programmer, and now the programmer seems to behave just fine with both the Shentek and the StarTech card (using Ben Ryves’ DLL in Windows XP, anyway).

    The input pins must have been a non-issue. I still can’t manually get data from them in a TVicPort-based program, but they seem to work fine when controlled by the programmer software and Ben’s DLL.

    It’s a pretty ugly hack that I had to do to the bottom of the Willem board, though. It would be way too easy to accidentally short something out. You have to find the four bidirectional pins on the parallel port and find a convenient place to solder to VCC. Then you solder resistors between each pin and VCC. I’ll make a blog posting about it, but I don’t like the solution. I think a cleaner solution would be to make a parallel cable that includes the pull-ups and somehow gets +5V onto it too (maybe through another USB connector or something)

  130. One final update on this. My observation about the input pins acting up has revealed something really weird that I can’t explain.

    If I do a byte read of the data register or control register (base + 0x00 and base + 0x02, respectively), everything appears OK on all of the parallel port cards I’ve played with, with both TVicPort and Inpout32.

    If I do a byte read of the status register (base + 0x01), it works OK on MosChip chipsets, but it returns junk on Oxford chipsets. This only appears to apply to TVicPort though, because other libraries such as Inpout32 seem to do a correct byte read from the Oxford chip. If I do a word read starting at base + 0x00 with TVicPort in that failure case, it correctly reads the status register. That makes me think it’s a problem caused by accessing odd addresses, but I don’t understand why the problem only applies to the Oxford chipsets with TVicPort. I’d understand if it applied to ALL chipsets with TVicPort, or if it applied to Oxford chipsets with ALL software drivers, but the TVicPort + Oxford chipset combination inducing the bug doesn’t make much sense to me. Regardless of how much sense it makes, that’s how it is, at least from my testing.

    So in order to get these Oxford-based chipsets working with the Willem programmer, in addition to adding the pull-up resistors, it is probably wise to use Ben Ryves’ DLL instead of mine — because I think his is going to work correctly with the byte read of the status register and my TVicPort-based one won’t. I don’t understand why it’s acting the way it is, but all I can say is that’s what the results appear to be implying to me.

  131. Migwell2 @ 2013-06-27 00:13

    Hi Doug,

    I confirm that your hack with adding pull-up resistors to the four bidirectional pins on Willem programmer work like a charm. It needs XP and Ben Ryve’s DLL with my Shentek 34mm expresscard. I have soldered the resistor under the programmer and isolated all resistors and cable with heat shrinkable sleeve. It’s quicker than install xp on a Windows 8 laptop ! I have tested it on a 93C56 with success.
    Many thanks.

  132. I’m glad you’re up and running now 🙂 This mystery is finally solved.

  133. DimitrisK @ 2013-07-06 07:28

    Dear Doug,

    Before i begin i should note the wonderful job you are doing and that the knowledge you are sharing is unbelievable. I will share my problem with you.

    I have purchased my willem programmer but i am facing problems (after following your guide at every detail).
    I just can’t seem to make it work (it gives: Hardware Error: Check power and connection). All the leds are ON as stated in the manual.

    I use a PCI parallel port (It appears as SUNIX in device manager) on windows 7 64bit.
    The weird part is that at the device manager it does not give me a resources tab so i can check the I/O range.
    Your parallel port tester I think gave me fine results since when i toggled the outputs the data register altered.

    Please advice, i am kindly waiting for your reply.

  134. Hi there,

    Thanks! Here are a few things:

    Did you actually look at the data pins on the parallel port when testing with the tester utility? The data register value changing in the display doesn’t really mean much, because it will still do that even if you don’t have a working parallel port. The important thing to do is look at the actual pins with a voltmeter to see if they do something as you click the checkboxes. Also check if the input pins correctly change state if you ground them.

    That’s very strange that the port doesn’t show a resources tab in the device manager. Did my tester utility find the port’s base address? In the dropdown menu it should say something like LPT1 (0x3000). In that case, 0x3000 should be the base address you stick into io.ini. I would try that…

    If you can’t get it to work, it might also be worth trying Ben Ryve’s remapped IO.DLL instead of mine–especially if the tester works, because it also uses inpout32.

  135. Hi, guys, I have the same problem, what about if I buy LTP1 to USB converter, did someone try this?

  136. Unfortunately the USB converters don’t work. They don’t map themselves as a memory address; they are basically designed only for printers. Even if they did, USB’s latency would make chip programming very slow.

  137. Hi there,

    I also got an Willem Programmer from Ebay, and was really concerned, if it would work with Windows 8 64bit at all.

    But now I can say it worked very well!

    I was using the LPT Port from my Mainboard (Gigabyte EP43-DS3L) through an external breakthrough cable.
    All I had to do was enabling and setting the Port Adress in BIOS.

  138. Just got my hands on a *clone* Willem PCB5.0E (how’s that for a frightening thought? A clone of a generic piece)

    I bought this parallel port card: (Rosewill RC-302E PCIe).
    I’m on windows 7 professional 64bit.
    I used the software linked in this article and followed the directions.
    It worked on the first try!
    I have successfully read, burnt, verified, etc.

    Thank you VERY much for this article, I would have been completely up a creek without it.

  139. Thank you for this solution
    Ihave willem programmer PCB5.0C I want to use it with my labtop (windows 7 64bits) but the problem is my labtop doesn’t have LPT port I tried to use USB to LPT female cable.
    The first time I used my programmer with this cable I had found the same problem as you described. I followed your soluution but when I went to help and test hardware ,I got the message :hardware error ,check power and connection is there any solution for this problem? thank you

  140. This technique does not work with USB to LPT adapters. A USB parallel port does not get an address in I/O space. Even if it did, USB’s latency would cause a simulated parallel port to be very slow. I’d recommend looking for a true USB programmer, or if your laptop has an ExpressCard slot, it’s possible you can get an ExpressCard to parallel port adapter to work.

  141. Hi Doug
    I bought a PCMCIA to parallel adapter but i still have the same problem (hardware error ,check power and connection). is there any advice? Thank you and good night.

  142. Hi Fodhil,

    There are a lot of things that could be wrong. I’d recommend trying Ben Ryves’ DLL to see if it works any better. Also you could try my Parallel Port Tester (along with a multimeter) to make sure all the parallel port inputs and outputs are working correctly. On some cards I have had to add pull-up resistors to some of the control lines on the Willem programmer board. See the comments on this post for details.

  143. Frank_casde @ 2014-03-31 22:09

    Thank you very much Dugh.

    I have tried this method with my sivava willem PCB50B and work like a charm!! Just for clarify that this method doesn’t work with version .98D12 or .98D12C14 use instead .98D11

    Thanks again!!

  144. Thanks a LOT !!!! and a LOT more !!

  145. Johannes @ 2014-05-13 23:02


    im now using TVICPort under Win 7 x64 now.
    But I have another Problem.

    Now all apllications which usw the serial Ports, say “Port already open” and I´cant use the serial Ports anymore. Is there any Solution for this Problem?

  146. Hi Johannes,

    I’ve never seen that problem before. I have TVicPort installed and I use several of my serial ports with no problems. If you can’t get it to work, you can always try uninstalling TVicPort and using the inpout32 library along with Ben Ryves’ io.dll wrapper instead. See the updated information linked at the top of this blog post.

  147. Hi Doug !

    I read your fantastic work with this issue, and your solution. I read all comment. I was feeling that solution for my shentek express card could be here in some comments. But I never image that you could buy some card to help Migwell2. Awesome.

    Unfortunately also I have a shentek card. And I have the same issue.

    One only question: where I have to solder pull up resistor ? There is a diagram or a photo that show me how I will can apply your solution ?

    many, many thanks in advance

  148. Hi Carl,

    Thanks! I actually just went back through my archives and I did take a picture of what I did to my Willem board temporarily to make it work:

    The black wire is soldered to VCC, and I hooked each of those resistors to the other end of the black wire and it magically started working. You can probably find a prettier/safer way to make the mod. I would recommend using heat shrink or something to insulate it all.

    Just as a description to go along with it, there are four bidirectional pins on the parallel port: strobe, auto/linefeed, initialize, and select printer. Pins 1, 14, 16, and 17. If you solder a 10K resistor between each of these pins and VCC on the Willem programmer, that should make it work. Also, you have to use Ben Ryves’ DLL instead of mine because mine has trouble doing I/O with that particular chipset’s registers for some reason.

    I hope this helps!

  149. That’s perfect Doug !!! As soon as possible I’ll do the job , thanks in advance. I give any feedback will get. Talk you soon , many thanks again.

  150. Unfortunately, I failed…
    Soldered the resistors “on the fly” , and test again… I get always “check hardware and power connection” red messagge on status bar.


    After this mod, I noticed that green and red leds (vdd & vpp) stay always on when I connect USB cable. Yellow (vcc) led is powered too.

    But before this mod, only yellow led was on with usb cable. The other two leds only lit up during read/write eproms process.

    I have PCB45 . I don’t know if there are significant differences.

    Many thanks for any other help you can give me.

  151. Hi Carl,

    I’m pretty sure that the lights coming on is a good thing. After communication is successful I think they turn off. It’s been a while since I used my programmer though, so I don’t remember for sure. Did you try with Ben’s DLL that uses inpout32? I know my DLL doesn’t work with that chipset.

    You should use Parallel Port Tester, also available on my blog, to verify operation of your parallel port and inpout32. Other than that, I’m not totally sure 🙁

  152. Rato_Alado @ 2014-08-06 10:03

    Man, I owe my ass to you as you saved it. Works fine on Win8.1. And for guys that had all lights up, becareful!
    Make a read first with the programmer empty and it should turn the lights off. So you avoid write glitches on eproms when you insert your ic on zif.

  153. I thought my board had gone bad. I was about ready to shell out another $50 for a new programmer. Turns out it was the software. Thanks!

  154. Tamás Gyurka @ 2015-01-06 10:54

    Thanks for the writting! 🙂

  155. Hi, i’m not very smart, and i dont understand much of this article, but i am trying really hard to figure out how the program works, i am stuck at Hardware error: check power and connection. Could you spare come time to guide me trough this? i would be very thankful.

  156. Hey, I know this article is a few years old. But recently, I dug out my old Willem board (bought about 12-13 years ago) to flash a 29F040 chip. Downloaded the latest software from that Sivava (or whatever) site, but kept getting those same weird errors & the inability to shut it down w/o using Taskman. And I still had an installed PCI parallel card that was also on a weird address (previously used w/ an old, now-dead HP Laserjet). Well, after following your instructions, I got my Willem working…on Windows 10!

  157. Yiannis Kontarinis @ 2016-10-16 10:03

    Thank you for your post. My programmer now works under Windows 10 64 bit.

  158. Thankyou for figuring this out! I want it to work however after rebooting several times I still get a message while starting the programming software:
    OpenTVicPort() failed — have you rebooted since installing TVicPort?

    Of course, I have, however I still get this message. Furthermore I cannot even detect hardware. (I say OK, the message goes away, and the software opens up)

    Has anyone else had this problem? Any known way to fix it?

  159. […] a different memory address than a built-in parallel port.  I struck gold when I stumbled across this site.  This guy ran in to the same combination of problems as me and completely rewrote the interface […]

  160. Worked great on windows 10 Pro with a cheap £2 PCI parallel card from ebay in a Dell computer. Thanks for the help. Mark

  161. Works like a champ!
    Computer = Lenovo E73 running Win 7
    Parallel card = Perle Speed 1 LE1P PCIe
    Target = Kee Willem PCB 5.0 just bought new off Ebay

    Thanks a lot for your efforts on this!

    — Scott

  162. Eric Jorgensen @ 2017-12-19 12:18

    Works like a charm here.

    Computer = generic Phenom II machine with win7 x64
    Parallel card = generic pci-express card based on WCH (Jiangsu QinHeng) chips.
    Target = Willem 5.0e sourced from random chinese ebay vendor

  163. Hi
    Thanks for Your work.

    I’ve got everything works to moment i test hardware: i get Hardware error Check Power and connection

    Comp: phenom II/win7 x64
    card: pci MOSCHIP MCS9805 (adress range E800 – E807, and i’ve edited io.ini to 0xE800)
    willem version:

    When i connect willem to lpt i get red power light come up, when i connect power to willem (usb or dc 12V) i got two other lights come up (green) and then i run software which runs ok without errors (green lights turns off when i start the program) port setting is LPT1:0x387, version 0.97ja

    please help

  164. John Cove @ 2018-04-18 15:35


    I am running a Windows 10 box and connected my Willem programmer using a StarTech PCI Express parallel port on LPT1. I have installed the patch io.sys and also TVicPort.

    When I run the Willem EPROM programming software, I get the error message, “OpenTVicPort() failed – have you rebooted since installing TVicPort?”

    I have rebooted a few times but still get the error.

    The oi.ini also contains the correct IO address.

    I hope anyone can help me as I am eager to retire my old Windows XP box!!! 🙂

  165. Hi John,

    Hmm. Seems like TVicPort is saying it’s not installed properly. You could try reinstalling it. I’d recommend trying Ben Ryves’ remapped io.dll, since I have confirmed it works properly in 64-bit Windows now. See my notes here: arabex, you might want to try that too. I have had issues with TVicPort in the past.

  166. Hello,

    Thanks to you, I was able to run my old programmer on Windows 7. I confirm that everything works perfectly, following the steps indicated, with this configuration:

    OS: Windows 7 64-bit
    Hardware: Willem EPROM Programmer PCB50B
    Software: v.98D12C3
    Controller card: Sienoc OC-PI28-DE PCI-Express x1(1xParallel + 2xSerial)

    Thank you so much.

  167. Glad it works!

  168. Frederick @ 2020-03-16 12:09

    Greetings all,

    Will this work with WIN10 64bit ?

  169. Frederick Carrado Jr. @ 2020-03-17 16:45

    how do you switch between soft and hard modes?

  170. I would recommend clicking the link at the top of the post with updated info — Ben Ryves’ DLL is probably better than this one.

    Hard mode is selected in the source code by changing the line “SetHardAccess(FALSE)” to SetHardAccess(TRUE)”. But I had better luck with it disabled.

  171. Thank you, got to work but it seems temperamental.

    That’s why I was asking about the soft mode

    How do I get to the settings you just mentioned?

    God speed, fred

  172. Frederick Carrado Jr. @ 2020-03-18 01:55

    Hi Doug,

    How do I get into the source code ?

  173. Frederick Carrado Jr. @ 2020-03-18 02:28

    Sorry for all the questions . But I am running a dell e5440 thru a docking station LPT.

    willem pcb5.E

    Like I said I did get it running , but sometime I have to uninstall and reinstall to get it running.

    I am using this to program ecu chips for my 1986 Buick Grand national.

  174. Hey Fred, that’s cool that you are programming ECU chips with it. Unfortunately I haven’t been using this DLL for a while and I can’t vouch for how well it works. Getting into the source code and changing it is going to be pretty tricky. I’d recommend trying this other DLL, it may work better:

  175. Frederick Carrado Jr. @ 2020-03-19 13:47

    thank you. I will give that try.

    How do I get into and change fro hard to soft in the IO file? do I need a dissembler program ? Microsoft C++ thru Windows ?

  176. Frederick Carrado Jr. @ 2020-03-19 15:08

    Yea, bens dll did not work .yours does ,it reads the chip but stop about 3 or 4 hex steps in.

  177. Frederick Carrado Jr. @ 2020-03-19 16:03

    Will not program, maybe bad chips? 3 to 4 hex steps in it stops

  178. Frederick Carrado Jr. @ 2020-03-19 17:27

    it reads and verifys fine. it will not program unless I am loading all 00 or FF .seems to choke on anything else.
    Bens dll did not work.

  179. Frederick Carrado Jr. @ 2020-03-20 03:13

    sorry for all the notes, but do more research it looks like a might have a VPP & VCC voltage issue.

    Once again thank you for your help

  180. Frederick Carrado Jr. @ 2020-03-20 04:16

    And someday I learn how to spell

    i did more research and it looks like I might have a VPP /VCC issue

  181. Frederick Carrado Jr. @ 2020-03-23 13:20

    Hi everyone,

    Turns out the used chips I bought are bad. Just load a new chip and it works

    Thank you very much for you help

  182. Hey, thanks for keeping everybody up to date in the comments! Glad you were able to figure it out!

  183. Ray Milton @ 2021-06-06 03:18

    Fantastic, it works perfectly on Windows 10 64 bit.

  184. Hi Doug,

    Thank you so much for the time & work invested in this. With your help, now I managed to get the dust off my old Willem 4 Pro ISP programmer and continue my (long overdue) work on reviving old Z80 based (ZX Spectrum clones) machines (just for learning purposes and because I started programming with them).

    I owe you more than a couple of beers.


  185. Thank you so much for doing this. I’ve been struggling with my Willem Eprom 5.0T for a week now trying to get it to work but with your tutorial everything just worked immediately. Im very grateful

  186. thank you very much for your help. 13 years after your article helps us greatly. Your explanation was clear and easy to follow. my pcb 5.0B willem works like hell on W10 64Bits. THANKS from france

Add your comment now