How to make a joystick adapter for the PC parallel port

1. Introducing

I made this adapter together with the author of the TurboGraFX emulator David Michel to support more then just 2 joysticks in his TGX emulator...
That is why I called him 'TurboGraFX-controller' but the layout is primary for Amiga/C64 joysticks.

The standart ParPort has 5 input lines and 12 output lines. After sending 0x04 to the control port you get 9 input lines and 8 output lines. All you need for 7 js with 5 fire buttons.


2. Schematic

To get up to 7 js you need to control the ground of the js connector. I do that with the output lines. Only one output should have a low signal at a time, elsewere you don't know from witch js the input signal came.
Also you need a diod in every line of the js,

The pull-up resistors are needed to give the 'open colector' input a high as the standard signal.

For 5 Fire Buttons AutoFeed(14) / INIT(16) / SelectInput(17) and Strobe(1) can be used. See the enhanced schematic for details.

3. The board

Here is my version of a 6- and 7-js adapter. Anyone who needs more infos just send me a mail. Klick on the image for instructions on how to rebuild the adapters.


The best way to start is to make first a 2-player adapter. It fits in a normal connector shell. And with the 2 analog joysticks on the pc you have all in all 4 js connected.

4. The program

A short C program to demonstrate how it works

Executabe Programs: LPT1 LPT2

#include <stdio.h>
#include <dos.h>
#include <conio.h>

int main(void)
{
   int port = 0x378;                                        // LPT1
   int i,j,k,l,m;

   clrscr();
   outportb(port+2,0x04);                                   // 4 extra inputs
   outportb(port,0xFF);                                     // all out high
   for (i=0;i<30000;i++)
   {
      m=0xFE;                                               // start with 1st js
      for (j=0;j<7;j++)                                     // js1-7
      {
         outportb (port,m);                                 // active js to low
         m<<=1;                                             // shift the low signal
         m=m | 0x1;
         k=inportb(port+1);
         l=inportb(port+2);
         gotoxy(1,(j+1));
         printf("js%d:  ",(j+1));
         if (!(k & 16))  printf("up ");                     // Select    B4
         if (!(k & 32))  printf("down ");                   // PaperEnd  B5
         if (!(k & 64))  printf("left ");                   // -ACK      B6
         if ((k & 128))  printf("right ");                  // Busy      B7
         if (!(k & 8))   printf("F1 ");                     // -Error    B3
         if ((l & 2))    printf("F2 ");                     // -AutoFeed C1
         if (!(l & 4))   printf("F3 ");                     // -SelectIn C2
         if ((l & 8))    printf("F4 ");                     // Init      C3
         if ((l & 1))    printf("F5 ");                     // -Strobe   C0
         printf("                                    \r");  // clearing the line
      }
   }
        return 0;
}

5. Drivers

For all out there who use WinXP/2000 there is a brand new WDM-Driver developed by Deon van der Westhuysen. His driver supports some other joysticks too - here is a local copy (ver 0.83).

Vojtech Pavlik wrote a driver for LinuX, it is included in the current Linux Kernels.

Earle F. Philhower made a DirectInput driver for my adapter. This Project is canceled (but still works for all Win95/98 versions) - here is a local copy.

Thanks to Fabrizio Gennari - Allegro since version 3.9.32 (a game programming library) has a driver included.

And for sure PCE the TG16 emulator supports the adapter.

last modified on 30-11-04, any comments to Steffen Schwenke.