Mike's PCjr Page Logo

PCjr Sidecar Bi-directional Parallel Port Modification

Introduction

The most common use for the parallel port on an IBM compatible computer was to connect a printer. In this setup, the computer puts eight bits of data out on the parallel port at a time. (The word “parallel” comes from the fact that multiple bits are sent at a time, as opposed to the serial port where one bit is sent at a time.) There are some control and status lines that can come from the printer, but in general the port is write only - it was not designed to receive data.

Device manufacturers figured out that the parallel port could be used for devices other than printers. If you were willing to use the status and control lines, you could read four bits of data at a time from the parallel port in addition to being able write eight bits at a time. Writes would be slower than reads, but could still be pretty fast compared to the serial port. All parallel ports have this capability.

IBM introduced the PS/2 line of computers in 1987, and either at the same time or shortly after IBM introduced the “PS/2 parallel port.” This parallel port was essentially the same as previous parallel ports, however it had the ability to read on the eight data lines that used to be reserved for writing. This made reads twice as fast as they had previously been, and you didn’t have to cheat and use the special purpose control and data lines to make it work.

Some implementations of the original parallel port could be modified to provide the same exact capability. In the original version of the parallel port, a chip called the 74LS374 was used. Pin 1 on the 74LS374 is called “Output Enable” and it was always tied to ground, which made the chip perform output only. Allowing this pin to “go high” would allow the existing circuit to read inputs presented to it from outside.

Although there are many ways to make this pin go high, the one way that makes the parallel port PS/2 compatible with bi-directional capability is to connect it to the pin on an unused gate on the board. If connected to a specific gate under software control at a specific address, it will be entirely PS/2 compatible.

Many years ago there was a well-known modification that described how to do this on the IBM implementation of the original parallel port. We have reviewed this modification and determined that it will work on the PCjr parallel port sidecar with no changes - the parallel port sidecar uses nearly the same implementation as the parallel port for the PC. Therefore, the instructions presented here do not break any new ground - they are just more specific for PCjr users who wish to modify their parallel port sidecar.

The modification turns your parallel port sidecar into a PS/2 compatible bi-directional parallel port. By default, the PS/2 compatible parallel port looks and smells like an original parallel port. Software can not tell the difference. Sending a particular bit sequence to an output port recognized by the PS/2 parallel port reverses the flow of data so that it can be used for reading data. Enhanced software will test for a PS/2 compatible parallel port explicitly and take advantage of it.

The beauty of the modification is the simplicity, and the fact that there is no need to try to reverse it - the default behavior is that of a standard parallel port.


The Modification

This modification is valid on any parallel port implemented in a similar way, however it is tailored to the PCjr parallel port sidecar. Before modifying the sidecar, your parallel printer card, or anything else on your computer, do you 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

  • Open the sidecar. The four screws that hold the sidecar to the machine (or to other sidecars) should be completely removed. The sidecar is held together by friction and tabs. Be careful not to break the tabs as you gently pry the sidecar apart.
  • Find the chips in question. They are 74LS374 and 74LS174. They are marked in the diagram below.
  • Using extreme caution, cut or somehow disconnect pin 1 on the 74LS374 from the board. As wired, this pin is grounded. The modification will allow the pin to be grounded or go high under the control of the 74LS174 chip. It is beyond the scope of this document to explain soldering and modification techniques, but I will suggest using a side cutters and gently bending the leg upwards to make it accessible.
  • Continuing to use extreme caution, do the same to Pin 15 on the 74LS174. Pin 15 is supposed to be unused - it is soldered to the board, but no traces are connected to it. If your Pin 15 is in use then you are either doing something wrong or you have a different revision of the board. In that case, you are on your own. (You did read these instructions completely before starting, right?)
  • Connect Pin 1 on the 74LS374 to Pin 15 on the 74LS174. Use solder. Don’t bridge any pins by accident.
  • The modification is now done. Double check your work. Route your wire nicely.
  • Close the parallel port sidecar and attach to your system for testing. To be on the safe side, use a system that you don’t absolutely love and cherish.

Parallel port diagram


Testing the modification

First and most important, your machine should boot and operate normally. You should not see flames, smoke, sparks, or anything else that would be considered abnormal. If you do, then you probably should have done a better job checking your work.

Second, the system should think that it has a normal parallel port installed. Software should behave normally. Nothing about the behavior of the system will tell you otherwise, as the BIOS doesn’t know to look for a PS/2 bi-directional parallel port.

To actually test that your modification has made a difference you will need a diagnostic program that will examine your system hardware and tell you what it finds. Or you can find a program that will detect and make use of a bi-directional parallel port if one is found. Lastly, you may write a simple program to test it.

Here is a simple BASIC program that will do the test:

100 REM Parallel port detection
110 REM Michael Brutman (mbbrutman@yahoo.com), 2002-12-02
120 REM
130 REM Do a few simple tests to see if a parallel port is
140 REM available, and if it is a standard parallel port or
150 REM if it is a bi-directional PS/2 parallel port.
160 REM
170 DEFINT A-Z:REM Declare our variables to be integers.
180 DEF SEG=0: REM Set base segment to 0 so we can look at BIOS areas.
190 REM
200 CLS:PRINT "Scanning up to 4 parallel ports":PRINT
210 FOR L=0 TO 3
220 REM
230 REM Get a port address from the BIOS.
240 P=PEEK(&H408 + (L*2)) + (PEEK(&H408 + (L*2) + 1) * 256)
250 IF P = 0 THEN PRINT "Port number" L "not found.":GOTO 440
260 PRINT "Port" L "found at port address: " HEX$(P)
270 REM
280 REM Put suspected port in output mode
290 I = INP(P + 2):OUT P + 2, ( I AND &HDF )
300 REM Test for presence of port: Test is performed twice
310 OUT P, 174
320 IF INP(P)<>174 THEN PRINT " Parallel port not detected or broken":GOTO 440
330 OUT P, 67
340 IF INP(P)<>67 THEN PRINT " Parallel port not detected or broken":GOTO 440
350 REM
360 REM Try to put the port in PS/2 mode (bi-directional)
370 I = INP(P + 2): OUT P + 2, ( I OR &H20 )
380 OUT P, 75
390 IF INP(P)<>75 THEN PRINT " Port is a PS/2 bi-directional port.":GOTO 440
400 REM Try again with a different value, just in case it is a coincidence.
410 OUT P, 223
420 IF INP(P)<>223 THEN PRINT " Port is a PS/2 bi-directional port.":GOTO 440
430 PRINT "Standard (not PS/2 bi-directional) parallel port found at " HEX$(P)
440 PRINT:NEXT L


How it works

I can’t hold a candle to the people who originally developed this modification, but I will try to explain it in layman’s terms. If you want a deeper explanation, refer to the data sheets for the chips and the PCjr Technical Reference manual.

The 74LS374 is a “latch”, meaning that it can be set to remember data sent to it. It remembers a byte of data at a time. As wired from the factory, the 74LS374 only writes - it can not read. It is constantly putting data on the bus. This presents a problem if an outside source also tries to put data on the bus; electrically that is not a good thing. Wiring the Output Enable pin to the 74LS174 puts that pin under software control; now the latch is not constantly asserting itself on the data bus. This allows data coming from outside the computer to be read by the system.

Pin 15 on the 74LS174 is unused in the original design. It is connected to a gate that is under software control. The address of the gate is bit 5 of the 2nd port address associated with the parallel port. Setting this bit to 1 enables reads from the parallel port, while setting it to 0 enables writes to the parallel port. The BIOS of a machine normally initializes it to zero, which puts it in output mode, just like a normal parallel port.


Credits

Brian Heise for suggesting and actually implementing the modification. It had been done years before by other people, but we rediscovered it.

Mark F. Bower, for his instructions posted in the comp.sys.ibm.pc.hardware newsgroup on July 10th, 1991. Mark posted the modification for the original IBM PC parallel printer port.

"If I have seen further it is by standing on the shoulders of Giants" - Sir Isaac Newton
(That makes me look educated.)

Created December 2nd 2002, Last updated June 30th, 2008
(C)opyright Michael B. Brutman, mbbrutman at gmail.com

Return to Mike's IBM PCjr Page main page