Atari 5200 Notes
A.N.A.L.O.G. #15, January 1984
TRANSPORTING
ATARI COMPUTER PROGRAMS
TO THE
5200
by Claus Buchholz
When Atari designed the 5200 "Supersystem" as a successor to
the aging 2600 VCS, they made use of the state-of-the-art
hardware they put into their 400/800 home computers. As a
result, the systems are quite similar. The differences are
great enough, however, that transporting programs from one
system to the other requires some effort.
The 5200 is a single-board machine with four controller
jacks, a cartridge slot, an I/O expansion connector and a
power/RF cable. It shares the same VLSI chips with the
400/800, except for the 6520 PIA (joystick/parallel I/O
ports). The other chips (ANTIC, GTIA, POKEY and the 6502
CPU) are in the 5200, although some of their registers are
in different memory locations than those in the 400/800.
Also, some of the registers serve slightly different
purposes. Figure 1 is a block diagram of the 5200. Let's
look at each section of the hardware in turn.
When a specific register is mentioned in the article, the
name is taken from the Hardware Manual in the 400/800
Technical Reference Notes. With the exceptions listed in
this article, the Hardware Manual applies also to the 5200.
6502 CPU.
Although it is a standard 6502 from the programmer's view,
Atari has reworked this chip to save four support chips.
Those four chips mediate access of the system bus by the
6502B and ANTIC in the 400/800, but that function is built
into the 6502C in the 5200. Atari also uses the 6502C in the
new XL series of computers.
16K RAM.
The 5200 contains 16K bytes of RAM addressed from $0000 to
$3FFF, just as in an unexpanded 400. The memory circuit is
nearly identical to that in the 400, except it uses 4516s, a
5V-only version of the 4116 16K-bit dynamic RAM.
The 5200 monitor program reserves locations $0000 through
$0018 and $0200 through $021B for shadows and RAM vectors.
And, of course, page $01 is reserved for the 6502 stack. The
rest of the RAM is available to the cartridge program.
ANTIC.
This is the same ANTIC chip used in the 400/800. Since ANTIC
shares the address bus with the CPU and has no chip select
input, its registers reside in the same place in the 5200's
memory as in the 400/800's, page $D4.
The 5200 has no System Reset key, so bit 5 of NMIST is
useless and the 5200's interrupt handler ignores it.
GTIA.
The GTIA and its registers perform the same functions in the
5200 and 400/800, except as noted below. The registers,
however, reside at page $C0 in the 5200's memory, not at $D0
as in the 400/800.
The trigger inputs, TRIG0 through TRIG3, are wired to the
controller ports, one to a port. The bottom button on either
side of the leftmost controller zeroes the TRIG0 register
when pressed, and likewise for the other ports.
The bits in CONSOL, the 400/800's console switch port
(START, OPTION, SELECT and speaker), are used as outputs in
the 5200, Bit 3, the 400/800's speaker control can still be
toggled in the 5200 to produce sounds through the TV
speaker. Bit 2 controls the pots in the joystick
controllers. It must be set high to enable the pots.
Bits 1 and 0 select which controller port is to be active at
one time. 00 selects port #1 (the leftmost), 01 selects #2,
10 selects #3, and 11 selects #4. The trigger buttons and
pots are independent of this selection; it applies only to
the keypads and top side buttons on the controllers.
POKEY.
POKEY's registers are all addressed at page $EB in the 5200
as opposed to $D2 in the 400/800. Its functions are
unchanged, however, except for two.
The eight pot inputs used for paddles in the 400/800 are
wired to the 5200's controller ports, two to a port. Each
controller has an analog joystick, using one pot to sense
horizontal position and a second pot for vertical position.
The even pots (POT0-POT6) give the horizontal positions of
range from 1 to 228; the maximum readings are to the right
for the horizontal pot and at the bottom for the vertical
pot. Figure 2 shows the pinout for the 5200 controllers.
Pin Function
1 Keypad -- right column
2 Keypad -- middle column
3 Keypad -- left column
4 Start, Pause, and Reset common
5 Keypad -- third row and Reset
6 Keypad -- second row and Pause
7 Keypad -- top row and Start
8 Keypad -- bottom row
9 Pot common
10 Horizontal pot (POT0, 2, 4, 6)
11 Vertical pot (POT1, 3, 5, 7)
12 5 volts DC
13 Bottom side buttons (TRIG0, 1, 2, 3)
14 Top side buttons
15 0 volts -- ground
The keyboard scanning lines in the 400/800 are used in the
5200 to read the keypad keys to the one controller that is
selected by bits 1 and 0 in CONSOL. Only four lines are
used, though, so only bits 1 through 4 of KBCODE are valid.
Table 1 gives the keycode for each key on the controller.
The top side buttons on the selected controller act like the
400/800 shift keys and also cause a BREAK-key interrupt, if
that's enabled. Bit 0 of SKCTL, the debounce enable bit,
need not be set in the 5200.
KBCODE
Key bits Keypad code
-------------------
none 0000 $FF
# 0001 $0B
0 0010 $00
* 0011 $0A
Reset 0100 $0E
9 0101 $09
8 0110 $08
7 0111 $07
Pause 1000 $0D
6 1001 $06
5 1010 $05
4 1011 $04
Start 1100 $0C
3 1101 $03
2 1110 $02
1 1111 $01
POKEY's serial I/O lines are used in the 5200, but they are
wired to the I/O expansion connector, an edge connector
hidden behind a small door in the rear of the 5200. This
connector allows for more hardware registers addressed at
page $E0, and for peripherals using the serial port. See
Figure 3 for the pinout of this connector. Its existence
demonstrates Atari's original plans to expand the 5200
system.
Top Bottom
-----------------------------------------------
+5V DC 1 36 +5V DC
Audio Out (2 port) 2 35 Not connected
Ground 3 34 Ground
R/W Early 4 33 Not connected
Enable E0-EF 5 32 D7
D6 6 31 D5
D4 7 30 D3
D2 8 29 D1
D0 9 28 Ground
IRQ 10 27 A0
Ground 11 26 A1
Serial Data In 12 25 A2
Serial In Clock 13 24 A3
Serial Out Clock 14 23 A4
Serial Data Out 15 22 A5
Audio In 16 21 A6
A14 17 20 A7
System Clock 01 18 19 A11
ROM.
The 5200 has a 2K ROM on board which holds the character set
and monitor program. The character set, which is an exact
copy of the 400/800's set, resides at pages $F8 through $FB,
and the monitor sits at $FC through $FF.
The cartridge ROM can be 32K bytes long and resides in
memory from $4000 to $BFFF. Figure 4 shows the pinout of the
cartridge slot. The two interlock connectors are wired
together on a cartridge board. The 5200 uses this as a
switch for the cartridge's power connections and as a Reset
signal. Therefore, a cartridge may be safely removed or
inserted while the 5200 is powered on.
D0 1 36 Interlock
D1 2 35 A11
D2 3 34 A12
D3 4 33 A10
D4 5 32 A13
D5 6 31 A9
D6 7 30 Audio In (2 port)
D7 8 29 A8
Enable 80-8F 9 28 Not Connected
Enable 40-7F 10 27 A7
Not Connected 11 26 +5V DC
Ground 12 25 Ground
Ground 13 24 Ground (Video In on 2 port)
Ground (System Clock
02 on 2 port) 14 23 Ground
A6 15 22 A4
A5 16 21 A3
A2 17 20 A1
Interlock 18 19 A0
The 5200 monitor program.
The 1K monitor program in ROM has three functions: (1) to
initialize the system before running the cartridge program,
(2) to service interrupts as they occur, and (3) to maintain
shadows of some important hardware registers. Recall that
the 400/800 Operating System is 10K bytes long and performs
the above functions. It also provides peripheral handlers,
predefined graphics modes, a screen editor, and floating
point math routines. Those utilities do not exist in the
5200.
Table 2 shows the RAM locations used by the monitor for
shadows and RAM vectors.
Table 2. 5200 Monitor RAM Locations.
Page Zero Locations
$00 Shadow for IRQEN
$01 Real time clock (high byte)
$02 Real time clock (low byte)
$03 Critical code flag (if non-zero, VBI routine is abbreviated)
$04 Attract mode timer/flag
$05 Shadow for DLISTL
$06 Shadow for DLISTH
$07 Shadow for DMACTL
$08-$10 Shadows for COLPMO through COLBK
$11-$18 Shadows for POT0 through POT7
Page Two Vectors
$200 Immediate IRQ vector
$202 Immediate VBI vector
$204 Deferred VBI vector
$206 DLI vector
$208 Keyboard IRQ vector
$20A Keypad routine continuation vector
$20C BREAK key IRQ vector
$20E BRK instruction IRQ vector
$210 Serial Input Data Ready IRQ vector
$212 Serial Output Data Needed IRQ vector
$214 Serial Output Finished IRQ vector
$216 POKEY Timer 1 IRQ vector
$218 POKEY Timer 2 IRQ vector
$21A POKEY Timer 4 IRQ vector
Upon Reset, the 6502 vectors through $FFFC to the
initialization routine. This routine performs the following
sequence.
1. Disable maskable interrupts, clear the 6502 decimal flag,
and set the stack pointed to $01FF.
2. If the cartridge address $BFFD contains $FF, then jump
immediately through the vector at $BFFE (diagnostic
cartridge).
3. Zero all hardware registers and page $00, set CHBASE to
point to the character set at $F8, and initialize the first
six RAM vectors starting at $0200.
4. Set up the Atari logo rainbow display. The cartridge
title (20 characters) and copyright year (2 characters) in
ANTIC mode 7 display code are taken from cartridge addresses
$BFE8 through $BFFD.
5. Enable VBI (Vertical Blank Interrupt) and DLI (Display
List Interrupt), and enable key scan.
6. Wait four seconds, then jump through the vector at $BFFE
to the cartridge program.
When the 6502 receives a non-maskable interrupt (NMI), it
vectors through $FFFA to the NMI handler. The following
steps take place:
1. Check NMIST and strobe NMIRES to reset the interrupt
status.
2. If a DLI is pending, jump through the DLI vector
(initialized to point to the rainbow effect routine).
3. If a VBI is pending, jump through the immediate VBI
vector (initialized to point to the VBI routine).
4. Else, return from the interrupt (no System Reset).
A cartridge program can change these vectors to point to its
own DLI and VBI routines, if it must. The default VBI
routine takes the following action.
1. Push A, X, and Y onto stack, increment the real time
clock, and update the attract mode timer.
2. If the critical code flag byte is non-zero, then pop Y,
X, and A from the stack and return from the interrupt.
3. Update DLISTL, DLISTH, and DMACTL from their shadows.
4. Maintain the attract mode flag and update the GTIA color
registers from their shadows.
5. Update the pot shadows from POT0 through POT7, and strobe
POTGO to start another pot scan.
6. Jump through the deferred VBI vector (initialized to
point to the end-of-interrupt routine, which pops Y, X, and
A, and returns from the interrupt).
If maskable interrupts (IRQs) are enabled and one is
received, the 6502 vectors through $FFFE to an instruction
which jumps through the immediate IRQ vector. That vector is
initialized to point to the IRQ routine, which performs the
following tasks.
1. Push A and check IRQST.
2. For each of the eight bits in IRQST, check for a pending
interrupt. If found, then clear the status bit, update IRQEN
from its shadow, and jump through the appropriate IRQ
vector.
3. If no interrupt found, then push X and check for a BRK
instruction interrupt. If found, then jump through the BRK
instruction IRQ vector.
4. Else, pop X and A and return from the interrupt.
The only IRQ vector that is initialized is the keyboard IRQ
vector, which points to the keypad read routine. That
routine does the following:
1. Push X and Y.
2. Read KBCODE and mask bits 1 through 4.
3. Convert to the keypad code given in Table 1, leaving that
code in A.
4. Jump through the keypad routine continuation vector
(initialized to point to the end-of-interrupt routine).
Comparing the 5200's monitor vectors to the 400/800's OS
vectors, we see that Atari paid no attention to
compatibility between the two. This further complicates the
task of converting a program from one system to the other.
Transportability.
It would not be difficult, given the information in this
article, to write a program in two versions, one for the
400/800 and another for the 5200. Nor would it be difficult,
given the source code, to convert a finished program from
the 5200 to the 400/800. The reverse is more difficult if
the program takes advantage of special features in the
400/800 OS. Otherwise, the only task, aside from redefining
some addresses, is to convert the keyboard/joystick input
routines from one system to the other.
I acquired the information in this article by dissecting a
5200 and disassembling its ROM. The 400/800 schematics in
the Hardware Manual were quite helpful. It is interesting to
note the difference between the two machines and to guess
Atari's motives for the design differences. But the
similarities grossly outweigh the differences, so that a
5200 program can be developed and almost entirely debugged
before testing on a 5200. With the addition of an EPROM
burner, a 400/800 can be a powerful development system for
5200 programs. An adventuresome hacker can even bypass the
EPROM by putting dual-port RAM on the cartridge board and
downloading programs from the 400/800 development system
into the 5200 for testing.
A.N.A.L.O.G. #16, February 1984
READER COMMENT
5200 Article Update. (ANALOG #15)
Newer releases of the 5200 incorporate some minor hardware
changes. Controller ports 3 and 4 have been eliminated,
making POT4 through POT7, TRIG2, TRIG3, and bit 1 of CONSOL
useless. A few of the connector pins have been redefined.
Pin 2 of the I/O expansion connector now carries POKEY's
Audio Out signal. Three pins on the cartridge connector have
changed to accomodate the new 2600 adapter. The system
clock, 02, is output on pin 14, isolated through a diode. An
alternate video input is taken from pin 24 and is also
isolated through a diode. Pin 30 provides an alternate audio
input.
There is space on the newer boards for circuitry for a PAL
(European TV standard) version of the 5200. Also, on power-
up, the monitor program checks for the PAL version by
examining the GTIA register PAL after step 2 of the
initialization routine. It also checks the cartridge program
for PAL compatibility. The byte at $BFE7 should read $02 if
compatible, or $00 if not. This is the only important change
to the monitor program. There are some additional hardware
changes, but none affects the machine's operation from the
programmer's view.
Claus Buchholz
Greenwich, CT