C64 Paddles
HOME            CONTACT
Like many other platforms the Commodore 64 also has it's history of paddle games. Although not always known there are various kinds of these paddle games. Paddle are analogue, this means they do not use switches like a joystick but potentionmeters to sense which direction you are steering. Where a joystick can only do left,right,up,down (or combinations) a paddle can steer between left and right in 256 steps. This means that paddles are much more sensitive or precise. And when the position of the character of the game is directly coupled to the position of the paddle then charatcer can be moved very fast, it moves as fast as you can turn the paddle. This makes it perfect for those nasty pong like games that are allmost impossible to play with a joystick. But also racing games are much more enjoyable with a paddle as the steering becomes more smoothly. Unfortunatly paddles are very dull to operate. You can only turn them left or right and press the fire button and that's it. A joystick offers more freedom in it's movement. So where you can direct you game character in all directions with a joystick... with a paddle you simply can't. This eventually makes paddle games very limitted and therefore not much paddle games have been developped.

Each joystick port holds 2 paddle inputs. This means that you can connect up to 2 controllers into one joystick port. So in pratice you can play paddle games with 4 players at the same time. Unfortunatley there are not much of these games. Actually at the current time there is only one, that game is called Space Lords. If for any reason you don't have a paddle, you can make one yourself, it is not difficult and very cheap.
 
As the images below show, there is not much difference between the Atari paddles (black) and the Commodore paddles (white). The only real difference is that the potentionmeteres inside the Atari paddles are 1Mohm and the Commodore paddles are 470Kohm. The Atari paddles can be used on the commodore 64 without problems, only the usable range is limitted, but practically most people won't even notice. Sometimes the limitted range is an advantage as you do not need to turn your wrist that far to achieve the same movement of your character.

Build your own paddle

For those of you who don't own a paddle but whish to play these games, here are the schematics how to build your own paddle system. As you can see it is nothing more then a potentiometer and a button connected via simple wiring. Depending the game you want to use it for you may need the "fire" button. As you can see, you can make 2 paddles and connect them to a single joystick port. So this means that a C64 can use a total of 4 paddles. Paddles and analog joystick have lot's in common. The work exactly the same the only difference is that the paddle has a single axis which is projected on a circular movement and an analog joystick has 2 axis (X and Y).

Anlog control is much more fluently and I wonder why the analog joystick never caught of. It would be great for racing games, but instead I played all racing games with a digital joystick. And although that worked, I would have had more control if I could have used analog. But (most) games were not designed to use them and digital joysticks were the standard. Analog joysticks only were available for PC's. Well perhaps in the future sombody writes a paddle racing game. One paddle would be for steering the other for throttle.

How to program for a paddle

Wel actually that is quite simple, using the registers below you'd get all the info you'd need.
In theory, reading the "position" of paddles is as easy as reading byte values from the SID registers at 54297-54298 to allow for a total of four paddle knobs/potentiometers, the C-64 hardware uses a multiplexer to "switch" between the two control ports. And this complicates matters a bit.

The two most significant bit lines in port A of CIA-1 are used to "tell" the multiplexer which of the joystick ports to connect with. At the same time, these lines are involved in the scanning of the keyboard matrix, and so gets manipulated constantly as the computer scans for keypresses. So realiably reading the paddles implies temporarily disabling the keyboard scan as the reading takes place.

The SID measures the two analog inputs once per 512 machine cycles, or about 1950 times a second, independent of (and thus asynchronous with) the timing of the program the CPU is running, i.e. when the program commands the multiplexer to switch to the other port. So the programmer has to "assume" that the keyboard scan and/or other activities have recently caused the multiplexer to switch ports, set up the multiplexer and disable anything that may interfere with it, then wait for 512 machine cycles to allow the SID to do a full reading, before finally reading the analog input register.

Decimal value Hex value $ Specification Status
56320 $DC00 Control-Port 1 selected Control-Port 1 selected (bit7=0 and bit6=1)
Control-Port 2 selected (bit7=1 and bit6=0)
54297 $D419 Paddle X value bit7...0 = value range 0..255
54298 $D41A Paddle Y value bit7...0 = value range 0..255
56321 $DC01 Paddle in port-1 Paddle X fire button = bit2 (0=Firebutton pushed)
Paddle Y fire button = bit3 (0=Firebutton pushed)
56320 $DC00 Paddle in port-2 Paddle X fire button = bit2 (0=Firebutton pushed)
Paddle Y fire button = bit3 (0=Firebutton pushed)
According to the Programmers reference guide, the paddles cannot be read out reliably from basic. A piece of machine language below demonstrates how to do this:

PADDLE_JOY_1 SEI ;disable interrupts (for example keyboard scanning)
LDA $DC02 ;GET CURRENT VALUE OF DDR
STA TEMPBUF ;SAVE IT AWAY
LDA #$C0 ;
STA $DC02 ;SET PORT A FOR INPUT

LDA $DC00 ;Control-Port 1 selected (when bit6=1 and bit7=0)
AND #%00111111 ;clear bit-6/7
ORA #%01000000 ;set bit-6
STA $DC00 ;now control-port 1 is selected for reading the POT registers

LDY #$80 ;WAIT A WHILE (data aquisition time)
PDLRD_J1
NOP ;
DEY ;
BPL PDLRD_J1 ;

LDX #11 ;
LDY #3 ;
JSR SET_CURSOR ;
LDA $D419 ;Paddle X value 0..255
STA
PADDLE_1_X ;save to memory for later use...

LDX #11 ;
LDY #6 ;
JSR SET_CURSOR ;
LDA $D41A ;Paddle Y value 0..255
STA PADDLE_1_Y ;save to memory for later use...

TEST_P1_02
LDA #%00000100 ;Paddle fire (BIT 2 is the X-fire button)
BIT $DC01 ;
BNE TEST_P1_02a ;
DO SOMETHING HERE
;action when button is pressed
TEST_P1_02a

TEST_P1_03
LDA #%00001000 ;Paddle fire (BIT 3 is the Y-fire button)
BIT $DC01 ;
BNE TEST_P1_03a ;
DO SOMETHING HERE
;action when button is pressed
TEST_P1_03a

LDA TEMPBUF ;
STA $DC02 ;RESTORE PREVIOUS VALUE OF DDR
CLI ;restore interrupts
RTS ;


TEMPBUF
BYTE $0
PADDLE_1_X BYTE $0
PADDLE_1_Y BYTE $0

Downloads:

Considering how hard it can be to find these games I've made them available to those who want to play them: <click here to go to the download section> Paddle games are best played at a real C64. If you have a paddle game that is not in this list, please contact me at jd1541@hotmail.com