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
#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.