The Multi Joystick Interface
============================

The Multi Joystick Interface is, as you probably already know, a device to
connect six digital joysticks to your personal computer. This file desribes

a) how to configure MULTIJOY for your computer
b) how the hardware of the interface works
c) how use the interface with your own programs
d) how to use the MULTIJOY and MINIJOY modules with your own programs
e) details of the emulation of joysticks using the keyboard
f) how to contact us
g) how to get the multijoy games
h) credits


a) How to configure MULTIJOY for your computer
-----------------------------------------------

All information MULTIJOY needs is to be stored in DOS environment variables.
This way, you only have to configure MULTIJOY once and all games will run fine
without configuring them individually. These environment variables are:

MULTICFG     tells MULTIJOY which config file to use. Config files store
             information about the hardware of your specific interface. There's
             also a file named KEYBOARD.CFG that puts MULTIJOY into joystick
             emulation mode.

MULTIPATH    tells MULTIJOY where on your disk to look for the config file.

MULTIPORT    tells MULTIJOY which printer port the interface is connected to.
             MULTIPORT is optional, if you don't set it, MULTIJOY uses the
             first printer port.

MULTIDELAY   Don't care about this variable. Your TTL-based interface will work
             well without setting it. However, some of the early, CMOS-based
             interfaces are slower, so the computer has to wait for them. As
             the speed of computers is steadily increasing, in times to come
             MULTIDELAY may be of more importance.

             MULTIDELAY is optional, too. It states the number of NOPs that
             will be executed in a tight loop between setting the printer port
             and reading it.


For example, a MULTIJOY user would add the following lines to his AUTOEXEC.BAT:

SET MULTIPATH=D:\MULTIJOY
SET MULTICFG=MULTI007
SET MULTIPORT=2

To try out a game on the computer of a friend who has no interface yet, one
could type from the DOS prompt:

SET MULTIPATH=A:\JETFIGHT
SET MULTICFG=KEYBOARD

You will find that most multi joystick games use the path provided by MULTIPATH
to save the names of the players. This is very convenient as you don't have to
enter all your friends' names again and again while you switch through the
games during a gaming session.


b) How the hardware of the interface works
-------------------------------------------

Apart from some elements that are responsible for the power supply, the Multi
Joystick Interface mainly consists of two multiplexors. The data lines D0 to D3
of the Centronics port are used to provide the address for both multiplexors.
Each of the multiplexors switches one of the joystick direction lines to it's
output. The output of the first multiplexor is connected to Centronics BUSY,
 the one of the second to Centronics PAPER EMPTY. By running through the
(16) addresses $00 to $0F, 32 joystick switches can be read, enough for
6 joysticks.
     To be precise, 2 switches more than enough. These switches are used for a
second fire button for the first two joysticks. The extra buttons are
available on pin 7 so that Sega, Amstrad and MSX joysticks work with the
interface.
     Pin 7 of the remaining four joystick ports is used to supply the joysticks
with +5V (Atari/Commodore compatible). Some fancy autofire joysticks depend on
this power supply. The power supply is also useful if you want to connect old
Atari Trakballs (tm), though special software is required to utilize them.
(If you are interested in this rather special application, contact us for some
routines dealing with trackballs). It also should be possible to connect up to
four Commodore type mouses to the interface, but we haven't tried that yet.
     Because pin 7 is used for different purposes, it's important that your
Amstrad joystick has a resistor of about 330 Ohms in line with the extra
button. Though it's very probable that the joystick you want to use is
equipped with this resistor, it's not guaranteed, and you could blow the fuse
of your interface without it.


c) How use the interface with your own programs
------------------------------------------------

After you've read b), this may read like a repetition: To read all joysticks
once, write $00 to $0F to the printer port and read out it's status register
immediately after writing each address. The status of the two joystick switches
belonging to the address you wrote is returned via the PAPER EMPTY and the BUSY
bit. On MSDOS computers, PAPER EMPTY (bit 5) is set and BUSY (bit 7) is cleared
when the corresponding joystick switches are closed. To determine which
joystick switch belongs to a given address, you need the table supplied by the
MULTI007.CFG file. It reads like this:

    0  6 r 4 u
    1  6 l 2 d
    2  6 d 2 r
    ...
    15 5 f 3 l

    ^  ^ ^ ^ ^
    |  | | | |action
    |  | | |joystick on BUSY
    |  | |action (left/right/up/down/fire/extra button ('*'))
    |  |joystick on PE
    |address

As config files are used to adapt the software to improvements of the hardware,
it's a good idea not to hardcode the table but to read it from the CFG file
when starting the program.

The files MINIJOY.PAS and MINIJOY.C are examples of basic modules for reading
the Multi Joystick Interface. MULTIJOY.PAS has some extra features, the most
useful being the emulation mode in wich you can use the keyboard to emulate the
first two joysticks.


d) How to use the MULTIJOY and MINIJOY modules with your own programs
----------------------------------------------------------------------

MULTIJOY.PAS and MINIJOY.PAS are Turbo Pascal units, MINIJOY.C is a Turbo C
file which can be compiled and linked into your programs. To get information
about the joysticks, your program has to call the GetAllJoyState routine
regularly. GetAllJoyState saves the status of the joysticks in the JoyState
record/struct. x, y, knopf and xtra depict the status of x axis, y axis, button
(german knopf=english button) and extra button at the time of the call, the
variables ending on -hit are set if the appropriate switches are closed now
but were not closed at the time of the previous call of GetAllJoyState. (This
is useful when you don't want a continuous movement but only a step whenever
the joystick is pushed into any direction).
      If you want to support joystick keyboard emulation, you must use MULTIJOY
instead of MINIJOY. See e) for details.

A very, very basic example of MULTIJOY usage:

program multijoy_demo;
(* minimal drawing program *)

uses crt, multijoy; (* joystick will be used for drawing *)

var x, y : integer; (* screen position *)

begin
  x := 40;          (* center of screen *)
  y := 12;
  ClrScr;
  repeat
    GetAllJoyState;                  (* request status of joysticks         *)
    x := x + JoyState [1].x;         (* x movement controlled by joystick 1 *)
    y := y + JoyState [1].y;         (* y movement                          *)
    GotoXY (x,y);
    if JoyState [1].knopf then begin (* pen down when the knopf is pressed  *)
      Write  ('X');
      GotoXY (x,y);
    end;
    Delay (50);
  until keypressed;
end.


e) Details of the emulation of joysticks using the keyboard
------------------------------------------------------------

If you don't have an interface yet and want to try out the games to see what
awaits you, you can use the keyboard to emulate the first two joysticks.
     Emulation mode is invoked by setting MULTICFG to KEYBOARD or another
keyboard config file. The standard CFG file KEYBOARD uses the following keys:

     Joystick 1 (cursor keys)       Joystick 2

up            ^                         E
left/right  <   >                     S   F
down          v                         D

fire        CTRL                       TAB

MULTIJOY additionally has two procedures, EmulationOn and EmulationOff, that
are necessary for the joystick emulation to work correctly. As MULTIJOY has to
take control of the keyboard in emulation mode, the keyboard is not longer
available for entering data or starting the program. To circumvene this
problem, the game program has to switch the emulation off in the menu part and
to switch it on again for the game part. If MULTIJOY is not in emulation mode,
it ignores these switches.

Keyboard config files look like that:

keyboard              <- keyword KEYBOARD
l 75                  <- joystick 1 left (cursor left here)
r 77
u 72                           ...
d 80
f 29                  <- joystick 1 fire (control here)
l 31                  <- joystick 2 left
r 33
u 18                           ...
d 32
f 15                  <- joystick 2 fire
^ ^
| | keyboard scancode
| dummy character to remind humans of the expected sequence of keys


f) How to contact us
--------------------

You can contact us by email at

        incr@asterix.rz.tu-clausthal.de

or by snail mail at

        Christof Ruch
        Rollplatz 19
        38678 Clausthal-Zellerfeld
        Germany


g) How to get the multijoy games
--------------------------------

Don't miss the multijoy games, they are not included in this package. You can
find them at

        ftp.tu-clausthal.de     /pub/msdos/games/multijoy

For those of you without ftp access, there is also a mail server. Just mail
a message with 'help' as body to

        mail-server@ftp.tu-clausthal.de

to see how it works.

If you plan to spread the multijoy software you have written, you should upload
a copy to this server (/pub/msdos/incoming). This way, all multijoy software
will be available at one place. Multijoy enthusiasts will find it easy to keep
track of the latest developments.


h) Credits
----------

The Multi Joystick Interface was conceived and realized by:

        Friedrich Fiege         design of first interface
        Peter Fiege             realization of the first interface,
                                chemical engeneering
        Felix Meyer             many contributions of great value
        Christof Ruch           original idea and restless production of
                                software
        Henning Ruch            basic Multijoy software and PCB design
        Peter Waldheim          original idea and first Multijoy game, TRON,
                                which existed long before our hardware