Mike's PCjr Page Logo

PCjr Sidecar LPT2 Parallel Port Modification

Introduction

Back in 1984 the only use of a parallel port was to connect a parallel printer. IBM built a serial port into the PCjr and sold a low cost serial printer designed for the machine, so a parallel port was not even needed to get printed output. Thus the machine didn't come with a parallel port - to get one you had to buy the parallel port sidecar.

One parallel port is more than enough for most machines, especially if you are just dealing with printers. If you had multiple printers it was less expensive to buy a switch box rather than add another parallel port. On the PCjr adding another parallel port wasn't practical; it was expensive and the parallel port sidecar didn't have jumpers to select addresses. If you had a Racore expansion unit you could get two parallel ports on the machine by jumpering the Racore's parallel port to be LPT2. That was about the only option for getting two parallel ports on a PCjr. Otherwise, you would have to get out the soldering iron.

Ten years later in 1994 there were many uses for the parallel port. They were faster than earlier versions thanks to the PS/2 bi-directional design, ECP mode, and EPP mode. People put floppy drives, SCSI adapters, IDE adapters, scanners, and all sorts of other devices on them. Unfortunately most machines were sold with just one parallel port, so you had to daisy chain the devices. For a while there was a good business in selling additional parallel ports, which besides helping things run faster also prevented conflicts among all of the devices.

In 2005 the heydey of the parallel port has past us. Everything is USB. However, parallel port devices are still useful, especially for PCjrs. The most useful devices are the storage devices, which give the PCjr cheap access to hard disks.

For most uses, you probably only need one parallel port. But if you want a hard disk on a parallel port and another parallel port device, such as the Xircom Ethernet adapter or a Zip drive, then two or three parallel ports become necessary. This modification will show you how to modify a standard PCjr parallel port sidecar so that it can co-exist with an unmodified parallel port sidecar, thus giving you two parallel ports on a single PCjr. The modification for the third parallel port sidecar is left as an excercise to the interested student ...

It is recommended that you do the bi-directional modification at the same time. (Click here for instructions.) No parallel port should be without that.


Theory of operation

Parallel ports on an old PC are very simple devices. They consist of three ports called the Data Port, the Status Port, and the Control Port. The three ports on parallel port start at a 'base address', which people commonly refer to as the parallel port's address. Usually only the base address is referred to.

When the BIOS of a machine boots the machine, it checks to see if any parallel ports are installed. There are three standard base addresses that are used:
  • 0x3BC: This base address was used by the printer adapter on the IBM monochrome display adapter.
  • 0x378: The usual address for LPT1.
  • 0x278: The usual address for LPT2.
The wiring and jumpers of the parallel port determine what address it listens too. By convention 0x378 is called LPT1 and 0x278 is called LPT2, but it is possible on a system with only one parallel port with address 0x278 to have it called LPT1. The BIOS is just filling in a table in memory, and the order it looks for addresses determines the naming. If there is no port at 0x378 but there is a parallel port jumpered/wired for 0x278, it takes the first slot in the table which makes it LPT1 even though you would expect 0x378 for a card named LPT1.

On a PCjr things are a little more restrictive. There is no monochrome display adapter for a PCjr, so you will never see 0x3BC normally. The BIOS of the machine only looks for parallel printers at two addresses - 0x378 and 0x278. You are almost guaranteed that LPT1, if present, will be on base address 0x378. If it is a Racore system and there is a parallel printer port sidecar, the Racore parallel printer port can be jumpered for 0x278 to avoid conflict with the sidecar.

What if you don't have a Racore, but you want two parallel printer ports? That is what this modification is for.

In theory, the modification is very simple. Take the standard parallel printer sidecar and instead of having it listen on three ports starting at base address 0x378, have it listen on the three ports starting at base address 0x278. In binary the numbers look like this:

Bit#:    5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
Pattern: 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 (0x378)
         0 0 0 0 0 0 1 0 0 1 1 1 1 0 0 0 (0x278)

The computer uses 16 bits to address I/O ports. The difference is in bit 8, which is highlighted in bold. For port 0x378 the bit is on while for port 0x278 the bit is off. This is the only difference between a normal parallel port at the customary address and one at an alternate address.

The part of the parallel printer sidecar that looks for these bits and decides whether to respond or not is called the 'address decode logic.' If the bits on the bus match what the decode logic is wired for, the parallel printer port will take action. If not, the parallel printer port does nothing. That is how different devices at different addresses behave. When two devices think they are supposed to act at the same time in response to the same bits, that is called a conflict and it leads to erratic behavior and system crashes.

If you just put two standard parallel printer sidecars on a PCjr they will both be looking for address 0x378 and both will try to respond when that address comes across the bus. The trick is to modify the address decode logic of one of the printer sidecars to respond to 0x278 instead.

This modification is a little bit more involved than the bi-directional modification. Keep your eyes open.


The Modification

I have traced through this myself and compared notes with other people who have done this. I have tested this on my personal systems. That being said, before modifying your sidecar or anything else on your computer, do your homework:
  • Understand the modification
  • Refer to data sheets for the chips in question
  • Refer to other sources for tips on how to do this modification
  • Do not even think of calling my lineage into question if you screw up. I am NOT responsible. This is at your own risk.

Steps for the modification

Address line A8 is responsible for the bit we are going to alter. On the sidecar bus it corresponds to pin B11. B11 is used to feed pin 4 of the 74LS30 chip and pin 1 of the 74LS04 chip. Both chips are used for address decode. 74LS30 is an eight input NAND gate, which is used to feed a decoder chip. The signals get messy because of active highs vs. active lows, so we'll leave that as an exercise to the interested student.

The 74LS04 is a NOT gate. Input from pin 1 appears inverted on pin 2, which goes nowhere. Strange, don't you think? Not really. In the schematics somebody was planning ahead. The schematics indicate that swapping from a base address of 0x378 to 0x278 should have just been a jumper change, and to make that happen they give you the A8 address line both in normal form and inverted form. When I saw this my jaw dropped - what an easy modification!

Well, the schematics were not the same as the board layout. The board layout makes you cut two traces and add two jumper wires. Here is the first cut:



After you make this cut, address line A8 will not be fed to pin 1 on the 74LS04. This is actually unfortunate - we do need to feed pin 1 of the 74LS04 with this signal but the wiring of the board feeds it first to pin 4 of the 74LS30 chip, then to pin 1 of the 74LS04. We willl use a jumper wire to re-establish the link between address line A8 (pin B11 on the I/O connector) and pin 1 of the 74LS04 later.

The next cut is on the back side of the board:



The highlighted area is the underside of the 74LS30 chip. The trace you are cutting connects address line A8 to pin 4 of this chip, which represents the '1' bit that we are trying to get rid of. As noted above, the side effect is to cut the input to pin 1 on the 74LS04 chip above it, which we still need.

Finally, we start adding back to the board:



The blue wire goes from a trace that starts at pin B11 on the I/O connector, and brings the signal (address line A8) to pin 1 of the 74LS04. Then it gets inverted and comes out on pin 2 of the same chip. Pin 2 is then fed back to pin 4 of the 74LS30 using the yellow wire. Now the card will respond to addresses 0x278, 0x279, and 0x27A and not conflict with an unmodified card.

So, not quite as easy as a jumper setting, but not too bad.


Testing

Hopefully you were careful and cut only the two traces that were specified. Use an Ohm meter to check your work. A simple continuity test will do.

And hopefully your soldering technique is better than mine. Once again, check your work.

At boot up, the PCjr BIOS will scan for two different parallel ports. For a machine that was designed for one, that is strange but useful. This also makes testing a breeze. You can use the built-in diagnostics to test the port because both ports will be found and identified. To get into the diagnostics use CTRL-ALT-INS and then refer to the Guide To Operations on how to run the parallel printer test.


Miscellaneous notes

You can use this modified sidecar as the only parallel printer port on the system. The BIOS will find it and call it LPT1, even though it is on port 0x278. This is not a problem, just a little different than the normal conventions.

You can also use this modified sidecar with an unmodified parallel printer sidecar or a Racore printer port jumpered at 0x378.

One thing that we didn't modify was the IRQ line that the parallel port uses. The parallel port sidecar can be setup to use IRQ7 to tell the PCjr about incoming data. There are not many available IRQs on the system, so we didn't change IRQ7 to a different IRQ. This means if a standard parallel port and this modified parallel port are both used on the system, they will both generate IRQ7.

That sounds like a bad thing, and technically it is. However, very few pieces of software written for the 8088 class of machines uses the parallel port interrupt. As long as software doesn't enable IRQ7 on the parallel port, no conflict will occur. Even if one parallel port uses IRQ7 it won't be a problem, and that would be a rare piece of software. If the interrupts were enabled on both parallel ports, then there would be problems.

On a PC system IRQ5 was often assigned to the second parallel port. We can't do that on a PCjr, as IRQ5 is already in use by the video circuitry.

The modification for a third parallel printer sidecar is more involved. If you look at the addresses involved, 'swizzling' the bits to go from 0x378 to 0x3BC is more than just cutting some traces and inverting a bit. Also, there is no BIOS support to look for a parallel port at any address other than 0x378 and 0x278. If you do a third parallel port you can pretty much pick any non-conflicting address range because you'll have to write a device driver or utility to put the base address in the BIOS RAM area yourself.


Credits

This has been on my todo list forever. I'm certain that I'm not the first to do it, but what I've presented here is entirely my version of it. I did verify my modification against a similar one done by Charles Terra. My modification differs from his in that I did all of my wiring on the backside of the board, which I found easier than trying to mess with the pins on the components. However, it was reassuring to see that we both did the same thing.
Created February 1st, 2005, Last updated June 30th, 2008
(C)opyright Michael B. Brutman, mbbrutman at gmail.com

Return to Mike's IBM PCjr Page main page