C64 paddles

Using paddles in your own programs

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 potentiometers 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 character 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 almost impossible to play with a joystick. But also racing games are much more enjoyable with a paddle as the steering becomes more smoothly. Unfortunately 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 limited and therefore not much paddle games have been developed ("not much" compared to joystick based games that is).
Each joystick port holds two paddle inputs. This means that you can connect up to 2 controllers into one joystick port. So in practice you can play paddle games with four players at the same time. Unfortunately 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 potentiometers inside the Atari paddles are1Mohm and the Commodore paddles are 470Kohm. The Atari paddles can be used on the commodore 64 without problems, only the usable range is limited, but practically most people won't even notice. Sometimes the limited 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 wish 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 four 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 two perpendicular axis (X and Y) with a much more limited range.
Analog control is much more fluently and I often wonder why the analog joystick never caught on. As it would be great for racing games, but instead I played all sorts of racing games on my C64, but always with a digital joystick. And although that worked, I would have had much more control over the game if I could have used analog. But (most) games simply weren't designed to use paddles and considered digital joysticks as the standard input device. However, analog joysticks were available, but only for PC's. Well perhaps in the future somebody might write a paddle racing game. Using one paddle for steering and the other for throttle. Perhaps a custom paddle, looking very like a modern RC-car controller.

Programming:

Using the registers below you'd get all the info you'd need for reading out the paddle related registers. Allowing you to incorporate paddles into your own game. Although... there is a catch. 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-64hardware uses a multiplexer to "switch" between the two control ports.
The two most significant bit lines in port A of CIA-1 are used to "tell" the multiplexer which of the joystick ports to connectwith. 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 key presses. So reliably reading the paddles implies temporarily disabling the keyboard scan as the reading takes place.
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)
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.
According to the Programmers reference guide, paddles can not be read out reliably from BASIC. So that's a bit of a dissapointment. A piece of machine language below demonstrates how to do this example_code.txt

Downloads:

Considering how hard it can be to find these games I've made them available to those who want to play them, everything is combined in one large .zip file: paddles.zip