ATR: chpt.18: Joystick Ports

From: Craig Lisowski (aa853@cleveland.Freenet.Edu)
Date: 01/04/94-02:49:49 PM Z


From: aa853@cleveland.Freenet.Edu (Craig Lisowski)
Subject: ATR: chpt.18: Joystick Ports
Date: Tue Jan  4 14:49:49 1994



                                  CHAPTER 18
     
     
                              THE JOYSTICK PORTS
     
     
     The joystick ports are the I/O ports of the PIA chip.  This means that
     they are bidirectional, capable of output as well as input.  The
     joystick ports are usually set up for input.  To read them, simply
     read the port registers.  PORTA [$D300 (53016)] will read joystick
     ports 1 and 2.  PORTB [$D301 (54017)] will read joystick ports 3 and
     4.  Joystick ports 3 and 4 are used for memory control on the XL/XE
     models and don't have external connectors.
     
     Each bit of each port can be configured independently for input or
     output.  To reconfigure a port, the port control registers, PACTL and
     PBCTL [$D302 (54018) and $D303 (54019)], are used.  The port control
     registers also control some lines on the serial I/O connector.
     
                          The port control registers
     
     
                7 6 5 4 3 2 1 0
     PACTL     -----------------
     or        |n 0 1 1 n n 0 n|
     PBCTL     -----------------
                1 6 3 1 8 4 2 1
                2 4 2 6
                8
     
       bits
                        PACTL
     
          7    Peripheral A interrupt status.  Set by peripheral
                interrupt; reset by reading PORTA.
          3    Cassette motor control (0 = on: 1 = off).
          2    0 = PORTA is now port A direction control.
                Writing to PORTA will now set bits for input
                or output.
                0 sets bit for input; 1 sets bit for output.
                1 = PORTA operational
          1    1 = peripheral A interrupt enabled.
     
                        PBCTL
     
          7    Peripheral B interrupt status.  Set by peripheral
                interrupt; reset by reading PORTB.
          3    Serial connector command line.
          2    0 = PORTB is now port B direction control.
                Writing to PORTB will now set bits for input
                or output.
                0 sets bit for input; 1 sets bit for output.
                1 = PORTB operational
          1    1 = peripheral B interrupt enabled.
     
     The electronic configuration of the controller ports is as follows.
     
       -----------     -----------  
       \0 1 2 3 R/     \4 5 6 7 R/  
        \t + - L/       \t + - L/   
         -------         -------    
     
     0 through 7 are the binary data bits for port A or port B.
     
     + and - are +5 volts and ground respectively.
     
     R and L are the left and right game paddles.
     
     t is the joystick trigger line.
     
     The data bits in the joystick ports are used as follows for the
     joysticks and game paddles.
     
                     The joysticks and the port registers
     
                7 6 5 4 3 2 1 0
               -----------------
     PORTA     |U|D|L|R|U|D|L|R|
               -----------------
                1 6 3 1 8 4 2 1
                2 4 2 6
                8
     
     paddle     | |     | |
     triggers   3 2     1 0
     
     
     PORTB     -----------------
     (400/800  |U|D|L|R|U|D|L|R|
     only)     -----------------
     
     paddle     | |     | |
     triggers   7 6     5 4
     
          U = up
          D = down    
          L = left
          R = right
     
     
     The joysticks may be read either directly from the port registers or
     from the joystick shadow registers.  During vertical blank, the data
     in the port registers is separated and put into the shadow registers. 
     These registers are, STICK0 [$0278 (632)], STICK1 [$0279 (633)],
     STICK2 [$027A (634)] and STICK3 [$027B (635)].  The triggers may be
     read from the joystick trigger registers, TRIG0 - TRIG3 [$D010 - $D013
     (53264 - 53267)].  These register have shadow registers, STRIG0 -
     STRIG3 [$0284 - 0287 (644 -647)].  If these registers read zero the
     associated triggers are pressed. The paddle triggers may be read from
     their shadow registers also.  They are, PTRIG0 - PTRIG 7, [$027C -
     $0283 (236 - 643)].
     
     THE GAME PADDLE REGISTERS
     
     Although the game paddles are plugged into the joystick ports, they
     are not read from the port registers.  The game paddles are read by
     first writing any number to the start-pot-scan register, POTGO [$D20B
     (53771)]].  This turns off the capacitor dump transistors and allows
     the pot reading
     capacitors to begin charging.  It also sets the TV scan line counter
     to zero.  As each capacitor crosses a certain trigger voltage, the
     number of TV lines scanned is put in the respective pot value
     register.  When the scan counter reaches 228, the capacitor dump
     transistors are turned on and the number 228 is put into any pot value
     registers which are still empty.
     
     Before reading the pot value registers, ALLPOT [$D208 (53768)] should
     be checked.  In this register, each bit corresponds to the validity of
     a pot value register.  If a bit is zero, its' associated pot value
     register is valid.  If bit 2 of SKCTL, [$D20F (53775)], is 1, the pots
     go into the fast scan mode.  In this mode the paddles are read in only
     2 TV scan lines.  They can also be read without regard to POTGO or
     ALLPOT.
     
     The pot value registers contain the number of TV scan lines it last
     took for the paddle reading capacitors to charge (up to 228).  These
     registers are POT0 - POT7 [$D200 - $D207 (53760 -53767)].  Their
     shadow registers are PADDL0 - PADDL7 [$0270 - $0277 (624 - 631)].
     
     THE LIGHT PEN REGISTERS
     
     Whenever a joystick trigger is pressed, the light pen registers, PENH
     and PENV are updated.  PENH [$D40C (54284)] takes a value based on a
     color clock counter.  The value can be from 0 to 227.  PENV [$D40D
     [54285)] takes the 8 highest bits of the vertical line counter.  A
     light pen is simply a photo transistor connected to a joystick trigger
     line and focused on the TV screen.  When the electron beam strikes the
     part of the screen the light pen is focused on, the transistor turns
     on pulling the trigger line low.  The light pen registers then contain
     numbers relative to where the light pen was pointing.  The shadow
     register for PENH and PENV are LPENH [$0234 (564)] and LPENV [$0235
     (566)).
     
     
     
                        Useful operating system equates
     
     
     TRIG0  $D010          (53264): joystick triggers
        |
     TRIG3  $D013          (53268):
     POT0   $D200          (53760): paddle value
        |
     POT7   $D207          (53767):
     ALLPOT $D208          (53768): reads validity of pot values
     POTGO  $D20B          (53771): starts paddle read
     SKCTL  $D20F          (53775): bit 2 enables fast pot scan
     PORTA  $D300          (53016): port A data
     PORTB  $D301          (53017): port B data
     PACTL  $D302          (54018): port A control
     PBCTL  $D303          (54019): port B control
     PENH   $D40C          (54284): light pen horizontal value 
     PENV   $D40D          (54285): light pen vertical value
     
     
                               Shadow registers
     
     
     LPENH  $0234            (564): light pen horizontal value
     LPENV  $0235            (566): light pen vertical value
     PADDL0 $0270            (624): game paddle values
          |
     PADDL7 $0277            (631)
     STICK0 $0278            (632): joystick registers
          |
     STICK0 $027B            (635):
     PRTIG0 $027C            (636): paddle triggers
          |
     PTRIG7 $0283            (643):
     STRIG0 $0284            (644): joystick triggers
          |
     STRIG3 $0287            (647):
                                                                           


-----------------------------------------
Return to message index