diff --git a/TommyPROM/TommyPROM.ino b/TommyPROM/TommyPROM.ino
index 350e59b..92fac22 100644
--- a/TommyPROM/TommyPROM.ino
+++ b/TommyPROM/TommyPROM.ino
@@ -19,7 +19,7 @@
#include "XModem.h"
-static const char * MY_VERSION = "2.8";
+static const char * MY_VERSION = "3.0";
// Global status
diff --git a/docs/hardware.md b/docs/hardware.md
index 73d4246..c09b4eb 100644
--- a/docs/hardware.md
+++ b/docs/hardware.md
@@ -19,10 +19,10 @@ The basic circuit is as follows:
* Pins D2..D9 are wired to the data lines on the target PROM.
* Pins A0..A2 are wired to the WE, CE, and OE control lines on the target PROM.
* Pins A3..A5 control shift registers to produce the address lines.
-* Pins D10..D12 control A16..A18 for chips larger than 64K bytes.
+* Pins D10..D12 control A16..A18 for chips larger than 64K bytes.
Note that the existing design uses 74LS164 shift registers, but another 8-bit parallel out
-shift register, like the 74LS595, could be used instead with some pin changes. See the
+shift register, like the 74LS595, can be used instead with some pin changes. See the
[74LS595 Shift Registers](#74ls595-shift-registers) section below for details.
The two shift registers can produce a sixteen bit address, although the 28C256 only needs
@@ -35,10 +35,9 @@ A16..A18
## 74LS595 Shift Registers
When using the [74LS595](images/TommyPROM-595.jpg) instead of the 74LS164, there is
-an additional output latch that
-is pulsed to put the contents of the shift register on the output lines. The code
-supports the 164s or the 595s by default. No code changes are needed to use either
-version of the shift register hardware.
+an additional output latch that is pulsed to put the contents of the shift register on the
+output lines. The code supports the 164s or the 595s by default. No code changes are
+needed to use either version of the shift register hardware.
The table below shows the connections when using either the 74LS164 or the 74LS595 for the
address shift registers. USR refers to the Upper Shift Register
diff --git a/docs/images/TommyPROM-nano-700.jpeg b/docs/images/TommyPROM-nano-700.jpeg
new file mode 100644
index 0000000..c6c8af6
Binary files /dev/null and b/docs/images/TommyPROM-nano-700.jpeg differ
diff --git a/docs/images/TommyPROM-nano.jpg b/docs/images/TommyPROM-nano.jpg
index 8df0674..3e62def 100644
Binary files a/docs/images/TommyPROM-nano.jpg and b/docs/images/TommyPROM-nano.jpg differ
diff --git a/docs/images/TommyPROM-pcb -500.jpg b/docs/images/TommyPROM-pcb -500.jpg
new file mode 100644
index 0000000..9d7465a
Binary files /dev/null and b/docs/images/TommyPROM-pcb -500.jpg differ
diff --git a/docs/images/TommyPROM-pcb.jpg b/docs/images/TommyPROM-pcb.jpg
new file mode 100644
index 0000000..a14e1b2
Binary files /dev/null and b/docs/images/TommyPROM-pcb.jpg differ
diff --git a/docs/index.md b/docs/index.md
index 7db83e8..c4c0b14 100755
--- a/docs/index.md
+++ b/docs/index.md
@@ -11,41 +11,45 @@ This is a simple EEPROM programmer and reader that can be assembled using an Ard
few additional parts. It has been successfully built using the Arduino UNO, Nano and
Boarduino models.
-The original code was specific to the 28C256 32Kx8 EEPROM, but it has been extended to also support Intel 8755A EPROMS and some 29C010 Flash.
+The original code was specific to the 28C256 32Kx8 EEPROM, but it has been extended to
+also support SST39SF flash, 27C EPROMs, 29C flash and the Intel 8755A EPROMS.
-![TommyPROM Nano Hardware](images/TommyPROM-nano.jpg)
-
-## Design
-
-The 28C design can be used with other 5V EEPROMS as well. Many 5V chips, including UV
-EPROMs, such as the 2716, 2764, 27C2001 and 27C040, can be read, but not written, with the
-basic hardware. Some pin changes may be needed to get the signals to the correct pins on
-the device. See the [Extending the design](extending) page for details on suggested
-hardware and software changes needed to support new EPROM and EEPROM families.
-
-The PROM-specific code is modular and can be easily adapted to support additional devices.
-There are currently drivers and hardware designs for 28C series EEPROMS and the Intel
-8755A EPROM.
-
-Some 29C series chips, like the 29C010 can be written with the 28C hardware. The 29C
-series only differs from the 28C in that the 29C chips erase and write an entire sector at
-a time. The 29C010 and some 29C020 chips use a 128 byte sector, which matches the XModem
-buffer in the current code. Other 29C020s and all 29C040s use a 256 byte sector and
-cannot be written without code changes to buffer up an entire 256 byte block of data
-before writing.
+[![TommyPROM Nano Hardware](images/TommyPROM-nano-700.jpg)]((images/TommyPROM-nano.jpg)
Features include:
* Simple hardware design that can be assembled on a breadboard.
* ROM images transfers using XMODEM - no special host client needed.
* Support for fast block EEPROM writes - a 32K EEPROM will program in just a few seconds.
* Optimized code that supports the timing requirements needed to unlock the 28C series Software Protection Algorithm.
-* Modular software design to easily support other EEPROM and EPROM families.
+* Modular software design to easily support other EEPROM, flash, and EPROM families.
+* Hardware support for 19 address lines, allowing the use of chips as large as 512KB, like the SST39SF040 and 29C040.
-The [hardware](hardware) page has descriptions of the hardware designs and links to schematics. The [software](software) page has class definitions and more information
-on the software design.
+## Design
+
+The 28C hardware and software design can be used with [other 5V PROMS](prom-families) as
+well. Many 5V chips, including UV EPROMs such as the 2716, 2764, 27C2001 and 27C040, can
+be read, but not written, with the basic hardware. Some pin changes may be needed to get
+the signals to the correct pins on the device. See the [Extending the design](extending)
+page for details on suggested hardware and software changes needed to support new EPROM,
+flash, and EEPROM families.
+
+The PROM-specific code is modular and can be easily adapted to support additional devices.
+There are currently drivers for 28C series EEPROMS, SST39SF flash, 27C EPROMs and the
+Intel 8755A EPROM.
+
+Some 29C series chips, like the 29C010 can be written with the 28C hardware and driver.
+The 29C series only differs from the 28C in that the 29C chips erase and write an entire
+sector at a time. The 29C010 and some 29C020 chips use a 128 byte sector, which matches
+the XModem buffer in the current code. Other 29C020s and all 29C040s use a 256 byte
+sector and cannot be written without code changes to buffer up an entire 256 byte block of
+data before writing.
+
+The [hardware](hardware) page has descriptions of the hardware designs and links to
+schematics. The [software](software) page has class definitions and more information on
+the software design.
The project was inspired by the
-[MEEPROMMER programmer](http://www.ichbinzustaendig.de/dev/meeprommer-en).
+[MEEPROMMER programmer](https://github.com/mkeller0815/MEEPROMMER).
## Compiling
@@ -59,8 +63,12 @@ unlocking. To use different Arduino hardware, like the Micro, the board-specifi
PromDevice.cpp and PromAddressDriver.cpp must be change to match the port mappings between
the ATmega chip and the Arduino I/O pins.
-To use the 8755A version of the code and matching hardware, uncomment PROM_IS_8755A and
-comment out the other PROM_IS_xx choices in Configure.h.
+Because the Arduino has limited code and RAM space available, only one PROM driver is
+compiled in at a time. To change drivers, uncomment the desired PROM_IS_xx line in
+Configure.h and comment out the other choices. The code to instantiate the driver is
+near the top in TommyPROM.ino. The change to Configure.h will automatically cause a
+driver to be installed, but it may be necessary to modify the parameters for a specific
+chip type.
## Operation
![TommyPROM console screenshot](images/tommyprom-console.png)
@@ -118,7 +126,3 @@ Protection enabled. Use the UNLOCK command to disable this. See the
Arduino pins that match the definitions in the code.
* This repo contains a standalone program called HardwareVerify that allows low-level
access to the address, data, and control lines through a menu-driven interface. See the [troubleshooting](troubleshooting) section for more tips.
-
-## Further Work
-* [ ]Add a new PromDevice class for 27 series EPROMS.
-* [x] Additional error checking in the CmdLine code.
diff --git a/docs/prom-families.md b/docs/prom-families.md
new file mode 100644
index 0000000..eefd56d
--- /dev/null
+++ b/docs/prom-families.md
@@ -0,0 +1,145 @@
+---
+title: PROM Types
+description: "PROM types supported by TommyPROM - EPROM, EEPROM, Flash"
+has_children: false
+nav_order: 5
+---
+
+TommyPROM can be used to read and write several different types of PROM chips. Due to
+differences in the technologies of these chips, some features of TommyPROM may work
+differently or may not be applicable at all. The standard code can read most types of
+PROM, even if there is no specific softare support for them.
+
+
+# PROM Types
+
+## EPROM - Erasable Programmable Read-only Memory
+
+EPROMs can be written once, but must then be erased by exposing them to UV light for
+several minutes. They are usually easily read by TommyPROM, but there is limited
+support for programming.
+
+## EEPROM - Electrically Erasable Programmable Read-only Memory
+
+EEPROMs are the easiest PROMs to use. They usually can be erased and reprogrammed
+electrically at the individual byte level. This makes them appear similar to a slower
+static RAM. All of the interactive features of TommyPROM work well with EEPROMs. Due
+to their complexity, EEPROMs typically come in smaller sizes than other technologies.
+The largest EEPROM in the 28C family is 32K bytes.
+
+## Flash ROM
+
+Flash is similar to EEPROM, in that it can be electrically erased and reprogrammed. Unlike
+EEPROMs, Flash cannot erase single bytes individually. Instead, the chip is arranged into
+memory blocks called sectors. The programmer can erase individual sectors or, sometimes,
+the entire chip. Some chip families require an explicit erase command and others initiate
+an erase at the start of a programming operation.
+
+Most of the features of TommyPROM are supported for Flash, but some operations that would
+do multiple writes to the same sector work differently.
+
+## OTP ROM - One-time Programmable ROM
+
+One-time Programmable (OTP) ROM is written once, either at the factory or in the field.
+These chips cannot be erased and re-written, but it can be read by TommyPROM. Interesting
+trivia - some of the field-programmable OTPs are just EPROMs packaged without the erase
+window.
+
+# Supported Chip Families
+
+## 28C EEPROM
+
+The 28C series EEPROMs, specifically the 28C256, are the original chips that TommyPROM supported. As a result, these have the best support, with all of the interactive features of the command line. In addition the basic read and write operations, there are also
+commands to enable and disable the
+[Software Data protection (SDP)](../28C256-notes) features of 28C chips. There is also
+support for the fast block write mode of these chips, allowing a 32KB chip to be
+programmed in just a few seconds.
+
+## 27C EPROM
+
+The 27C EPROMs use a variety of programming algorithms. Code exists for some of these,
+but very few of the chips have been tested.
+
+Most, if not all, 27C series chips are not 5V only and require a higher voltage to program
+them. Some need the voltage constantly applied while programming and others use high
+voltage pulses for each byte. For constant voltage chips, it is probably easiest to just
+add an external power supply and manually assert the voltage before starting a write. For
+those with switched voltages, some elements of the 8755 hardware may be leveraged to build
+a version of the programer that supports these chips.
+
+## Atmel SST39FS Flash
+
+TommyPROM has a driver for Atmel SST39FS flash chips. This driver replaces the 28C driver at compile time. See configure.h to enable a different driver.
+
+The SST39FS chips use fixed 2KB sectors that must be manually erased before a new program
+operation, but the code manages this transparently. Whenever a write is started to a new
+segment, the driver first initiates an erase of that sector. A second write to the same
+sector will not cause an erase, so is is possible to write to a segment multiple times
+with no additional steps as long as the writes are to different parts of the sector. For
+example, 256 bytes could be written to the start of a sector from one file and then 512
+bytes could be written to the end of the sector from another file.
+
+Writing data that spans multiple sectors also works with no additional steps. When
+a sector boundary is crossed, the new sector is erased and set as the current sector.
+
+The SST39FS driver supports a manual erase from the command line using the E command.
+This is only needed if data will be rewritten to the same location after a previous write
+to that sector.
+
+## Misc Flash
+
+**29C Series**
+
+The 29C series flash chips are similar to the 28C EEPROMs, except they must erase an
+entire sector before programming new data. The start of a block write operation causes
+the target sector to be erased before the block is written. If the entire sector is not
+written in one operation, there is no way to write additional data to the sector because
+a new block write will erase the sector again.
+
+The write algorithm for the 29C chips is similar to 28C, so it is possible to use that
+code to write these chips as well with some restrictions. All 29C010 and 29C020 chips
+that have been encountered use a sector size of either 64 bytes or 128 bytes. A single
+XModem packet holds 128 bytes of data, so these chips will program without issue.
+
+The 28C040 chips from some manufacturers use a 256 byte sector. This will not currently
+work with TommyPROM, because each of the 128 byte XModem packets received will do its own
+block write. The first write will erase 256 bytes and then write data into the first half
+of the sector. The second write will then erase the data just written and then write 128
+bytes into the second half of the sector. To fix this, the code would need to be modified
+to keep 256 bytes of data from two packets before initiating a block write.
+
+**28F Series**
+
+The 28F series flash do not have sectors. The entire chip must be erased before writing
+new data. Data is written a byte at a time using a command register to control the
+programming. **These chips require a 12V programming voltage that must be present during
+the programming or erase operations**. TommyPROM does not currently support 28F chips,
+but it would not be difficult to write a driver. The default 28C driver will read 28F
+chips.
+
+**29F Series**
+
+The 29F series flash do not have sectors that must be explicitly erased before writing new
+data. Data is written a byte at a time using a command register to control the
+programming. TommyPROM does not currently support 29F chips, but it would not be
+difficult to write a driver. The default 28C driver will read 29F chips.
+
+
+## Intel 8755/8355 EPROM
+
+TommyPROM has a driver for Intel 8755 EPROMs. This driver replaces the 28C driver at
+compile time. See configure.h to enable a different driver. This driver will also read
+Intel 8355 OTP EPROMs. Also note that the TommyPROM hardware for the 8755 is drastically
+different from the other versions.
+
+The Intel 8755 is a peripheral chip designed for 8085 systems. It is a 40 pin device that
+contains a 2KB EPROM plus two general-purpose I/O ports. The 8355 is a one-time
+programmable version of the 8755. The 8755 requires a 25V programming pulse for each byte
+to be written.
+
+A new hardware build was created to support the 8755 chips. Because the 8755 has a multiplexed data and address bus, the usual shift registers are not used for addressing.
+The chip only needs 8 connects that are shared for address and data, plus three dedicated
+address lines. The Arduino has enough pins to drive all of these directly, without the
+need for shift registers to create address lines.
+
+The 8755 build of TommyPROM also has a circuit to control the 25V programming pulses.