How to query the MultiJoy Interface
Back to current versionRestore this version

How to query the MultiJoy Interface#


General Information#

The MultiJoy is an adapter to connect 8 or 16 Joysticks to a ATARI 8Bit (600XL, 800XL, 130XE, ...). The MultiJoy was designed by Radek Sterba (RASTER). You can find detail Information on this adapter on Radeks website

Mathy van Nisselroy has information about MultiJoy Games on his site

Assembler / Machine Language#

First you must initialize the communication direction of the ports. The pins of Joystick 1 work as Input and the pins of Joystick 0 work as output.

This has to be done once at the start of the program.

  LDA #$30	 ; clear BIT 2 of PACTL (direction control register)
  STA $D302      ;PACTL, control read/write direction with PORTA
  LDA #$F0	 ;4 upper bits=OUT (Joystick 1),4 lower bits=IN (Joystick 0)
  STA $D300      ;PORTA, set directions
  LDA #$34	 ; restore OS default value for PACTL 
  STA $D302      ;PACTL

Now we can query the joysticks: (proceed a delay 30 cycles at least between write to PORTA register and following reading of PORTA or TRIG0. )

  LDA #0	  ;Number of the Joystick to query (0-7 for MultiJoy, 0-15 for MultiJoy16)
  ASL A		  ; multiply by 16
  ASL A
  ASL A
  ASL A
  STA $D300       ;PORTA, select Joystick to read
  LDX #$06        ;Here is a delay 30 cycles before reading of PORTA
WAI DEX
  BNE WAI
  LDA $D300       ;PORTA, read value
  AND #$0F	 ; mask out upper 4 bits

The joystick button can be queried after selection of the joystick with register TRIG0:

  LDA $D010  ;TRIG0

You must take care to synchronize the queries. Especially take care that not players on the first Joysticks have any unfair opportunities.

Basic / Turbo Basic#

BASIC#

Initializing:

POKE 54018,48 : REM control read/write direction with PORTA
POKE 54016,240 : REM 4 upper bits=OUT (Joystick 1),4 lower bits=IN (Joystick 0)
POKE 54018,52 : REM restore OS default value for PACTL 

Query the Joystick:

POKE 54016,NUM*16 : REM NUM = Number of Joystick (0-7/0-15)
ST=PEEK(54016):ST=ST-INT(ST/16)*16 : REM read Joystick value
TR=PEEK(53264 ) : REM read Trigger value directly from GTIA

TURBO BASIC#

Initializing:

POKE $D302,$30
POKE $D300,$F0
POKE $D302,$34

Query the Joystick:

POKE $D300,NUM*$10 : REM NUM = Number of Joystick (0-7/0-15)
PAUSE %10 : REM wait for value
ST=PEEK($D300)&$0F : REM read Joystick value
REM ST=STICK(%0) - this does not work properly, because the Joystick value 
REM which is read from register 632 is only updated every 1/50th second
REM TR=STRIG(%0) : REM this does not work either
TR=PEEK($D010): REM read it directly from the GTIA register

ACTION!#

Initializing:

PROC INITMULJOY()
 CARD PACTL=$D302,PORTA=$D300
 ;
 PACTL==&$FB
 PORTA=$F0
 PACTL==%$04
RETURN

Query the Joystick:
PROC QUERYMULJOY(INT PL, INT POINTER STI,TRI)
 ; call procedure stating PL (range 0...3) and 2 variables to which the result is returned
 ; e.g. "QUERYMULJOY(0,ST,TR)" check for Joystick 0, return values in ST and TR

 CARD PORTA=$D300, TRIG0=$D010
 ;
 PORTA=(PL LSH 4)
 WSYNC=PL
 WSYNC=PL
 TRI^=TRIG0
 STI^=PORTA%$0F
RETURN

Quick#

to be added

FORTH#

to be added