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):