This instructable looks at using the Atari 800 joystick port for outputs with an LED cube as an example.
Ever seen one of those LED cubes? They're totally cool. Ever wondered if your Atari could do something similar? Me too.
An 8 bit Atari - I'm using an 800 XL
16 channel multiplexer - search for CD74HC4067 using your favourite search engine
A ton of LEDs - I made a 4x4x4 matrix which uses 64
Female 9 pin D connector x 2
Step 1: Building It
Suffice it to say that building these things is much harder than it looks (if you have paws instead of fingers), and fixing bad joins is like doing key hole surgery with a soldering iron.
I'm not going to spend any time on the construction of the matrix as there are guys who have done it so much better. Have a look at
This is the clever bit. Having 64 LEDs normally means 64 wires to control them, but the Atari doesn't have that many pins that can be used to write.
Enter the multiplexer!
The cube is divided into 16 columns and 4 rows. Each column of LEDs share a +v input from the multiplexer, and each row shares a 0v. So to turn on an LED we work out which column it's in, and switch on the +v line, then turn on the appropriate ground.
However, you can only light up one LED at a time. If you try two or more, other LEDs will turn on as well.
Be aware that your multiplexer might have different connections to mine! Check your instructions first.
Step 2: The Atari Code - BASIC
In addition to their normal operation, joystick ports can also write. There's a bit of a trick to make it work;
1) Poke port A control $D302 with $38
2) Poke port A $D300 with $FF
3) Poke port A control $D302 with $3C. This turns on bit 2 allowing us to write to the port.
There's a bit more about using the joystick ports as an interface here
Port A is structured so that bits 0 to 3 take care of stick 0, and bits 4 to 7 deal with stick 1. By poking bits 0 to 3 with 1 to 15 we can control the multiplexer and switch on a column of LEDS. If we then switch on bits 4 to 7, we can control a row. Where the column and row coincide, an LED turns on.
You don't have to switch individual rows on; by combining bits 4 to 7, two or more rows will be on. Just beware that other LEDs that you don't want turned on, might light up as well.
30 POKE PCTL,56
40 POKE PORT,255
50 POKE PCTL,60
70 POKE PORT,I
75 FOR WAIT=0 TO LIMIT:NEXT WAIT
90 GOTO 60
Nothing flash going on here; the code sets port A for writing then turns on an LED at random. The effect is a bit like a computer from a cheesy early 80's sci-fi show.
Step 3: The Atari Code - 6502 Assembly
Basic's okay for switching on one LED at a time, but the fancy stuff happens when you start turning them on an off rapidly which gives the illusion that several LEDS are on at once. The effect is called persistence of vision and relies on the LEDs switching faster than the eye is able to detect. Basic's just too slow so it's assembly time.
This code switches on the corner LEDS
20 PORT = 54016
30 PCTL = 54018
70 LDA #56
80 STA PCTL
90 LDA #$FF
100 STA PORT
110 LDA #60
120 STA PCTL
130 LDY #0
160 LDA SEQ,Y
170 STA PORT
190 CPY #8
200 BNE MAIN
210 LDY #0
220 JMP MAIN
320 .BYTE 16,18,24,26
330 .BYTE 64,66,72,74
There's some 'experimental' files in the Leds.atr attachment.