512k SRAM extension for Atari XL/XE
v1.2 (c) 2006-2009 by Matthias Reichl <hias@horus.com>

1. Introduction

The main goals when designing this SRAM extension was that it
should be cheap (less than 10-15 EUR), easy to build (I can be
quite lazy when it comes to soldering) and compatible with as many
programs as possible.

Several users asked for battery backup support (so that the
contents are preserved when you switch off your Atari), so I added
this, too. But this is an optional feature, you don't need to
add it if you don't need it.

Concerning compatibility with software: This RAM extension is able
to operate in 4 modes, depending on the switch settings.

If both switches are open, the RAM extension is completely disabled.

If the EN5 switch is closed, and EN7 is open, the RAM extension
is in 256k mode and uses PB2,3,5,6 for selecting one out of
16 banks. PB4 is used to enable/disable the RAM extension.
This mode is compatible with the "Atari Magazin Ramdisk"

If EN5 is open and EN7 is closed, the RAM extension is in 256k
mode and uses PB2,3,6,7 for bank selection. PB4 enables CPU
access to the ram extension, PB5 enables ANTIC access to the
RAM extension. If both CPU and ANTIC access is disabled,
PB7 enables/disables the builtin selftest ROM. If the RAM
extension is enabled, the selftest is switched off.
This mode is compatible with the "Rambo" or "Compy Shop"
RAM extension

If both EN5 and EN7 are closed, the RAM extension is in 512k
mode and uses PB2,3,5,6,7 for bank selection. PB4 enables/disables
the RAM extension. Like in the previous mode, PB7 controls
the selftest ROM unless the RAM extension is active.


2. Component list

These are all components required for the RAM extension:

512k SRAM (eg BS62LV4006PC)
GAL 22V10-15
24pin narrow DIP socket (for GAL)
8 pcs 4k7 resistors
100nF capacitor
2 pcs SPST switch (or jumpers, if you like)

Of course you'll also need a GAL programmer to program the logic
(SRAM12.JED) into the GAL.

If you want to add the optional battery backup feature, you need
a few other components:

another 100nF capacitor
DS1210 (the successor MXD1210 should work, too)
3V battery (for example a CR2032 plus battery holder)

Important note: Please make sure that the SRAM is able to operate
at 3V! Most current 5V SRAMs support a 3V "data retention mode",
if in doubt have a look at the datasheet.


3. How to build

You can find the schematics to this upgrade in the SRAM12.PNG
and SRAM12.SCH (Eagle format) files.

Most of the connections are the address and data lines to the SRAM.
If you don't want to build a PCB, the easiest way is to solder
the SRAM on top of either the OS ROM or the BASIC ROM. I'd recommend
soldering it on top of the BASIC ROM, so you can install a
replacement OS later (if you want).

The pinout of the SRAM is very similar to the pinout of the ROMs.
You just have to bend up a few pins of the SRAM and can get most
signals (address and data lines, GND) directly from the ROM.
If you want to build a PCB, just take these signals from somewhere
in your Atari (ROMs, CPU or ANTIC).

3.1 Installing the SRAM on top of the OS ROM

Bend up the following pins of the SRAM: 3, 22, 24, 29, 30

Now align the SRAM on top of the OS ROM so that SRAM pin
16 (GND) connects to OS ROM pin 14 (GND). The SRAM is a little
bit larger than the OS ROM, pins 1,2,31,32 of the SRAM aren't
connected to anything (yet). Solder all pins that aren't bent
up to the OS ROM.

If you don't want to build the optional battery backup, use
a short insulated wire and connect
SRAM pin 32 to OS ROM pin 28 (VCC)

3.2 Installing the SRAM on top of the BASIC ROM

Bend up the following pins of the SRAM: 22, 24, 28

Now align the SRAM on top of the BASIC ROM so that SRAM pin
16 (GND) connects to BASIC ROM pin 12 (GND). SRAM Pins 1-4
and 29-32 aren't connected, yet. Solder all pins that aren't bent
up to the BASIC ROM.

Now you need to solder 2 wires to connect A11 and A13 from the
Atari to the SRAM:
SRAM pin 4 (A12) to CPU pin 20 (A11)
SRAM pin 28 to CPU pin 23 (A13).

Note: no, I didn't mix up A11 and A12 :-) The pinout of the BASIC
ROM differs a little bit from the pinout of the SRAM:
A11 and A12 "swapped" and A11 of the BASIC ROM (pin 18) would connect
to /CE of the SRAM (pin 22) if we soldered these pins together.

If you don't want to build the optional battery backup, use
a short insulated wire and connect
SRAM pin 32 to BASIC ROM pin 24 (VCC)

3.3 Getting signals from the PIA

Bend up pins 12-17 (PB2-PB7) of the pia, take 6 4k7 resistors
and solder one end of each resistor to each of the PIA pins.
Connect all other ends of the resistors and make a connection
to PIA pin 20 (VCC). These resistors are used as pull-ups so
that the default signal is high (which means RAM extension
disabled) in case the PIA is programmed for input.

If the PIA is socketed, you may also just clip off pins
12-17 directly at the PCB and carefully bend them up a little
bit so that there's no more connection to the PCB. In the
Atari 600/800XL, only pin 17 is really connected to the board,
so you only need to clip this pin and you can leave all other
pins soldered to the PCB. On the XE series computers this might
be different, if in doubt, carefully check the traces from the
PIA or just clip off all pins.

Now take 3 wires and connect pins 12,13,16 (PB2,3,6) of the
PIA to SRAM pins 1,2,3 (A18, A16, A14). The other PIA pins
will later be connected to the GAL.

3.4 Getting signals from the MMU

This RAM extension intercepts the /CI (CAS-inhibit) signal to
disable the builtin RAM. This mode works with all XL/XE computers
but it also requires that you bend up one pin of the MMU
(or cut it off in case it's soldered in).

So, bend up pin 16 of the MMU (this is /CI).

3.5 Connecting the GAL

I'd recommend you use a DIP socket for the GAL, but you may also
connect all wires directly to the GAL if you like. Just be sure
you programmed the GAL right before soldering it in :-)

First, solder the 100nF bypass capacitors to pin 12 (GND) and
pin 24 (VCC) of the GAL.

Next, install two 4k7 pullup resistors for the mode select switches.
Solder one 4k7 resistor between pin 10 (EN5) and pin 24 (VCC), another
resistor between pin 11 (EN7) and pin 24 (VCC).

Take some wires and connect the switches to the mode select pins.
Install the first switch between pin 10 (EN5) and pin 12 (GND),
the second switch between pin 11 (EN7) and pin 12 (GND).

Use a short, insulated wire and connect GAL pin 1 (NPHI2 / CLK) to
GAL pin 23 (NPHI2_OUT).

Now connect the PIA pins 14,15,17 (PB4,5,7) to the GAL pins
7,8,9 (in this order!).

Now its time to connect several pins of the CPU to the GAL:
GAL pin 2 to CPU pin 24 (A14)
GAL pin 3 to CPU pin 25 (A15)
GAL pin 4 to CPU pin 35 (/HALT)
GAL pin 5 to CPU pin 36 (RW)
GAL pin 12 to CPU pin 1 (GND)
GAL pin 13 to CPU pin 37 (PHI0)
GAL pin 24 to CPU pin 8 (VCC)

And a pin to the ANTIC:
GAL pin 6 to ANTIC pin 29 (PHI2)

And some connections from the GAL to the SRAM:
GAL pin 17 to SRAM pin 24 (/OE)
GAL pin 19 to SRAM pin 29 (/WE)
GAL pin 20 to SRAM pin 30 (A17)
GAL pin 21 to SRAM pin 31 (A15)

If you don't want to build the optional battery backup, connect
GAL pin 18 to SRAM pin 22 (/CE)

And now some pins at the MMU:
GAL pin 15 to MMU pin 6 (/MAP)
GAL pin 16 to MMU pin 16 (/CI)

For the last connection (GAL pin 14), the new /CI signal going into
the Atari, you've got several options. One possibility, that works
identically with all Atari, is to connect this signal directly
to the PCB where you bent up (or cut off) pin 16 of the MMU.

Unless you make the connection on the back side of the PCB it's
quite hard to get there and there's also the risk that you create
a short circuit between the bent-up pin 16 of the MMU and the PCB
by accident.

So, it's better to connect this pin to the IC where the /CI signal
is going to.

For all Atari computers with a Freddie, connect pin 14 of the
GAL to Freddie pin 4.

In an 800XL, without the Freddie, connect pin 14 of the GAL to
pin 10 of the 74LS08

In an 600XL connect pin 14 of the GAL to pin 9 of the 74LS08.

If unsure, check the connection from MMU pin 16 and verify the
exact location where this trace is running to. Or just connect
to the former MMU pin 16 on the PCB :-)

3.6 Building the optional battery back-up

First solder a 100nF capacitor between SRAM pin 16 (GND) and
SRAM pin 32 (VCC).

Then connect the DS1210 to the SRAM:
DS1210 pins 3, 4 and 7 to SRAM pin 16 (GND)
DS1210 pin 1 to SRAM pin 32 (VCC)
DS1210 pin 6 to SRAM pin 22 (/CE)

And connect the DS1210 to the GAL:
DS1210 pin 5 to GAL pin 18 (/CE)

Finally, connect the power supply and 3V battery
DS1210 pin 8 to BASIC ROM pin 24 or OS ROM pin 28 (+5V)
SRAM pin 16 to the "-" connector of the 3V battery (GND)
DS1210 pin 2 to the "+" connector of the 3V battery (+3V)


4. Check if it works

First, set both switches into the "open" position and turn on your
Atari. Check that everything works before, including the selftest etc.

Next, close both switches and check if your Atari still works.
If everything's fine so far, it's time to use some ramdisk test
programs to verify proper operation of the RAM extension. I'd
recommend using the XRAM test program (XRAM021.COM). It is able
to detect all ram extension that use PortB and also has the nice
feature that you can re-run the ram detection any time.
This is very useful to test the various modes of this ram
extension. Just set the switches and press the "DEL" key.
XRAM should then immediately display the available RAM banks.


5. How it all works

The design of this RAM extension is really straight forward. There's
nothing too complicated in the design. Just have a look at the
PALASM logic source (SRAM12.PDS).

There are only maybe one or two small parts that might look
interesting at first glance:

- Write Enable (/WE) is set using "PHI2 & PHI0". This part is
  necessary with some broken Ataris that don't meet the official
  timing specification. PHI0 is almost identical to PHI2, except
  that this signal is set a little bit earlier. Using "PHI2 & PHI0"
  will shorten the write cycle a little bit. This doesn't hurt the
  SRAM at all (it's quite fast, anyway) but will cure all problems
  with those broken Ataris. Usually the address and data lines
  should be valid for some time after the trailing edge (high to
  low transition) of PHI2. But Atari really built quite some crap
  and this isn't true for all Atari computers (especially later
  XL/XE models seem to be affected). Since the actual write operation
  to the SRAM occurs at the rising edge of /WE, this all is really
  bad: if address and/or data lines aren't valid at this time,
  the write operation fails and wrong data will be written to
  the RAM (eventually also right data to the wrong address or
  even random data to a random location). Older RAMs weren't
  that fast (back in the 80s), but newer RAMs notice the difference.

- Separate ANTIC access: There are quite some rumors and tales
  going on about separate ANTIC access. Some people believe it's
  only possible with this "magic" U35 IC of the 130XE, some
  people also believe you need a special MMU for that. But this
  is all just plain wrong. This U35, an 74LS95, is just used
  as a flip flop (a register) that is clocked by the falling edge
  of PHI2. That's nothing unusual, only in this way that most other
  74xx flip flops/registers are clocked at the rising edge. If
  you like, you can just run the PHI2 signal through an inverter
  and substitute the LS95 with an LS74.

  Why is this "strange" register needed? The answer is quite simple:
  If the ANTIC wants access to the RAM, it signals it by setting
  the /HALT line of the CPU to low. ANTIC asserts this signal
  approximately 100ns after the falling edge of PHI2 (this is in
  the first phase of a clock cycle) and this means that the
  _next_ clock cycle will be used by ANTIC (and the CPU will be
  halted). ANTIC will then set the /HALT signal to high again
  some 100ns after the falling edge of PHI2. Since the signal
  is valid for quite some time at the beginning of the clock
  cycle, but then is de-asserted during the clock cycle where
  ANTIC accesses the RAM, it has to be stored in a register.
  The time, when we store it in a register, is just the time
  when the ANTIC access clock cycle starts. So it really isn't
  magic at all, one has just to understand the docs correctly :-)

- (optional) battery backup: This is handeled by the NVRAM controller
  DS1210. Basically this chip intercepts the VCC and /CE pins of the
  SRAM so that the SRAM is powered by the battery and
  chip enable is disabled when your Atari is powered off.

  Using an NVRAM controller has several advantages over the
  "poor man's" battery backup solution using diodes and a pull-up
  resistor that I've seen in some other RAM upgrades:

  It consumes less power (meaning the battery will last longer)
  and, most important of all, it's a lot safer: The NVRAM controller
  disables RAM access (holds /CE high) unless the +5V supply from
  the Atari is stable. When you power up your Atari the +5V line rises
  from 0V to 5V. During this time the chips in the Atari aren't properly
  initialized yet (this takes some time) and their pins may output
  random signals. This may lead to "fake" SRAM write accesses that
  corrupt SRAM data. A similar thing can happen when you power off the
  Atari, in this case the +5V line drops from +5V down to 0V. The DS1210
  takes care of this, it enables /CE only after +5V has reached a stable
  state (usually 4.25..4.75V) and disables it immediately when the
  +5V line has dropped below 4.25..4.75V.

