The page is mostly verbatum from the article listed below. However, I have redrawn all of the diagrams/tables, added some modifications, and comments. These additions will be ended with my call sign. There is also a section, that I added, at the bottom named MC6800 EPROM Programmer Modifications for Other EProms. That section describes modifying the original EPROM Burner for the other EPROM configurations. - K7MEM
![]() |
an EPROM programmer for 6800 computer
Low-cost device program the 1K-by8-bit 2708 EPROM using specially provided software
One of the handiest devices available to the small-computer user is the EPROM (Erasable Programmable Read Only Memory). The basic ROM's advantage over RAM (Randon Access Memory) is that its contents are retained when operation power is removed. This means that often-used programs such as bootstraps, monitors, operating systems, high-level languages, etc., can be permanently stored, thus eliminating time-consuming data retrieval from cassette or paper tape.
An EPROM is a special type of ROM that can be erased, and re-programmed as desired. Consequently, it makes an ideal storage medium for semipermanent data for experimental programs, or for software prototyping where changes may be made as work progresses.
The EPROM Programmer described here is an inexpensive device that can program the popular 1K by 8-bit, low cost 2708 EPROM when used with a 6800-based computer having an MC6820 PIA (Peripheral Interface Adapter). The simple schematic on the next page illustrates this.
The computer, controlled by software to be described, supplies the EPROM PRogrammer with correct addresses, data, and properly timed programming pulses. In addition, the software ensures that the EPROM contains after programming is correct. The software also transfers the entire contents, or any portion of it, into RAM (where it can be altered) and writes it into blank EPROM or returns it to the same one. The software package is positione-independent and occupies less than 256 bytes.
![]() |
As shown in the schematic, lines PB0 through PB7 of the B side of the PIA supply the necessary addresses to the EPROM. Quad latch IC1, strobed by control line CB2, latches the two most significant address lines (A8 and A9) to the EPROM to form the required 10-bit address (210 = 1024)
When switch S1 is placed in the READ position, pin 20 (Chip Select) of the EPROM is grounded and power is removed from the transistor circuit driving tthe PROG input (pin 18). The computer can now examine the contents of the EPROM. In this mode, lines PA0 through PA7 of the A side of the PIA allow the EPROM data to reach the computer
In the PROGRAM setting of S1 pin 20 (Write Enable) of the EPROM is connectes to +12 volts to place the EPROM in its programming mode. Lines PA0 through PA7 now allow the computer to supply data to the EPROM. The other section of S1 connects +26 volts to the three-transistor circuit that generates the programming pulse for pin 18. Transistors Q2 and Q3 form a complementary pair that actively pulls the programming input high or low as recommended by the 2708 data sheets. The when-to-burn signal comes in via CA2.
![]() |
This consists of four major sections; VBLNK, READ, BURN, VRFY and several subroutines.Although the order of these routines may appear strange, they are carefullly arranged so that all internal branching may be in the relative mode. This allows the code to be executed at any address in the system memory without change.
Subroutine INIT initializes the PIA so that the A-lines are inputs, the B-lines are outputs with CA2 high and CB2 low. This subroutine also disables the IRQ level interrupts so that nothing will disturb the timing of the programming pulses, and because memory locations $A000 and $A001, use to store the IRQ interrupt vector by JBUG and MIKBUG, are used here to store PRMAD (starting EPROM address set by user). This routine is also called at the beginning of each of the four other major sections of the software.
Subroutine ADROUT is used to output the 10-bit address for the EPROM. The most significant two bits are output on the PIA B-side followed by raising and lowering CB2 to latch these two bits into IC1. The least-significant bits are then output, which together with the first two bits, make up the required 10-bit address. The EPROM address (PRMAT) is then incremented in the computer's RAM
Subroutine INPUT calls subroutine ADROUT to output the current address to the EPROM and then loads Accumulator-A with the contents of this location of the EPROM.
Subroutine VERI calls subroutine INPUT to get a byte of information from the EPROM. It then compares this byte with the contents of Accumulator-B. If they are the same, it returns to the caller. If an error is detected, the index register is decremented so that it will point to the failing EPROM address. A software interrupt is then executed to return to the monitor. Accumulator-A will contain the bad data, and Accumulator-B the expected data.
Subroutine WRITE is used to generate the correct width programming pulses for pin 18 of the EPROM. See the description of the BURN routine below for details of this pulse.
Program section VBLNK makes sure that the EPROM is erased before attempting to progran it. Each byte in the EPROM is compared with $FF, which is the erased state It is not necessary to start verifying the EPROM address 0000. If a section of the EPROM already contains data, and it is desired to verify that the rest of the EPROM is blank so that additional data can be inserted, then the desired start of verification address is placed in memory location PRMAD and PRMAD+1. Otherwise these two locations should be set equal to zero prior to starting execution at locations VBLNK
The READ section is used to transfer the contents of the EPROM into the computer's RAM. Anything from 1 byte to the entire 1024 bytes may be transferred by setting up PRMAD, BEGAD, and ENDAD prior to execution. Keep in mind that PRMAD is the location within the EPROM and has nothing to do with the memory address at which the EPROM will be located when installed in the system. PRMAD equal to zero implies the first location within the EPROM. Data is transferred from the EPROM starting at location PRMAD into RAM addresses BEGAD through ENDAD inclusive.
Section VRFY compares the data contained in RAM addresses BEGAD through ENDAD with the data stored in the EPROM starting at location PRMAD. If an discrepencies are found, a software interrupt (SWI) is issued to return to the monitor. With most 6800 monitors, this will cause a display of the CPU registers. At this time, the Index Register will contain the location within the EPROM that contains the failing data, Accumulator-A will contain the failing data, and Accumulator-B will contain what the data should have been.
A BURN routine "burns" the data into the EPROM. Once the EPROM has been put in the PROGRAM mode via S1, the address and data to be programmed into that address are applied to the EPROM. Then a +26 volt program pulse is applied to pin 18. Duration of the pulse must be at least 100µs and not more than 1 ms. The next address and corresponding data are applied and another programming pulse is issued. This continues until all the addresses have been programmed. The entire process is repeated 256 times. This is done because the total program time applied to each address must be greater than, or equal to, 100ms. As it is forbidden to apply more than one pulse at a time to any address, programming of the sequential addresses must be repeated many times.
THe system that this is currently being used one is an MEK6800D2, a Motorola two-board microcomputer kit, that runs at a clock rate of 614.4 KHz. The number 3610 (2516) loaded into the INDEX register in the WRITE subroutine is used to establish the width of the program pulse. If a clock rate of 1 MHz is used, this number should be changed to 6110 (3D16). This is based on eight machine cycles in the two-instruction loop at label WRT1, and an additional eight machine cycles outside this loop. If the duration of the program pulse is maintained at 500 µs and the program loop is repeated 256 times, this allows a total program time of 128 ms/location.
Data sheets for the 2708 specify that all 1024 locations should be programmed in each loop, but making the loop as small as 128 bytes has proved successfu. Making the loop too small may be detrimental to to the EPROM. Length of the program loop is estblished as ENDAD-BEGAD+1. Note that, at 614.4 KHz, the time required to program all 1024 bytes is only about two and a half minutes.
![]() |
Since the circuit is not critical, the Programmer can be built using perf board with Wire-Wrap techniques, or a small pc board can be designed. To avoid pin damage, the use of a low-insertion force socke for the EPROM is suggested. Sockets for IC1 and the three transistors are optional.
Suitable connectors must be made to contact the A and B parts of the MC6820 PIA and the CA2 and CB2 lines. Sources of +5, -5, +12 and +26 volts are also needed.
Any type of enclosure can be used as long as it will hole the power supplies with EPROM socket and S1 on top.
![]() |
Switch S1 should be in the READ position whenever an EPROM is inserted in or removed from the socket. In its unprogrammedd state, the EPROM contins logic 1's at all storage locations. These 1's may be changed to 0's by programming - but 0's may be changed to 1's only by erasing the entire EPROM with exposure to 2537-Angstrom ultra violet light.
Programming can, in certain cases, alter the contents of a previously programmed EPROM. For example, 2710 (0010 01112) can be changed to 2310 (0010 00112), but not vice versa. This is accomplished by using the READ routine to transfer the contents of the EPROM into RAM, locating the 2710 in the RAM, changing it to 2310, then using BURN to program this data back into the same EPROM.
To program in a small section of new data, for example only four bytes, use VBLNK to make sure that the four locations are in the unprogrammed state. THen with the EPROM removed from the socket, use READ to initialize a section of RAM to all 1's. This can be done because data read back from an empty socket is FF16.
Place the four data bytes in the RAM buffer, replae the EPROM and use S1 at PROGRAM and BURN to program the data into the EPROM. Keep this section at least 128 bytes long. Since trying to program a 1 nto the EPROM has no effect, only the four bytes of new data will make a change in the EPROM contents. After using BURN, set S1 to READ and use VRFY subroutine to make sure that the EPROM was correctly programmed.
Once you gain some proficiency in programming, you can create "personality modues" for any function you desire, from instant bootstrap at turn-on, to full BASIC at the touch of a key.
![]() |
I'm including this sections because, I don't have any 2708s. But I do have a bunch of EPROMS with different configurations and different programming requirements. I have 34-Intersil IM5654 (512 x 8), and 4-Hitachi HN27C64G-20 (8K x 8). I like the overall approach of the programmer, but it needs to be modified, hardware and software, to make it useful with the EPROMs that I have.
Modification for those two EPROMs shold make the programmer a bit simpler, as the two EPROMs that I have only require +5 Volts, for normal operation. Unlike the 2708 which requires +5V, -5V, & +12Volts.
It should be noted that, if your intent is to use 2716, there is a bit of a hitch that
you need to be aware of.
Both Texas Instrument (TI) and Intel developed EPROMs at the same time. During the
development of TI's TMS-2716, TI followed the same format as the TMS-2708, with the
requirements for multiple supply voltages (+5V, -5V, & +12V). However, before TI
could release their TMS-2716 EPROM, Intel released their version of the 2716 that only
required a single 5 Volt power supply, for normal operation. TI then changed the designator
to TMS-2516 to make sure the user didn't mix it with the 2716s.
TMS-2516 is equivalent to the Intel (and all other) 2716s
TMS-2716 is NOT equivalent to other 2716s TI specific, limited use (..in arcade games anyways..)
bigger and bigger 27XX
series EPROMs, Texas Instruments created a 25XX series. While most of the EPROMs were equivalent
(2732 is equivalent to 2532) the 2716 was not equivalent to the TI 2516
The drawing on the right shows the two EPROMs, schematically. Overall, the two EPROMs are very similar. Probably the most notable difference is in the Power Requirements. The M2708 requires +5, -5, and +12 volts. Wheras, the M2716 only requires +5 volts. Of course, they both require +26 volts during programming. The table below illustrates the similarities and differences.
M2708 | IM5654 | HN27C64G | |
---|---|---|---|
Package | 24 Pin Dip | 24 Pin Dip | 28 Pin Dip |
Format | 1,024 x 8 | 512 x 8 | 8,192 x 8 |
Power Req | +5, -5, and +12 volts | +5 volts | +5 volts |
Programming Voltage | +26 volts | +26 volts | +26 volts |
Data Width (D) | 8 Bits - D0-D7 | 8-Bits - D0-D7 | 8-Bits - D0-D7 |
Address Width (A) | 10 Bits - A0-A9 | 9-Bits - A0-A8 | 13-Bits - A0-A12 |
Read Enable | 20-CS/WE | 20-E1, 22-E2, 21-S | 20-CE, 22-OE |
Program Enable | 18-Prog | 18-Pgm | 27-PGM |
DEVICE OPERATION - The M2716 has 3 modes of operation in the normal system environment. These are shown in Table 3.
Read - For both of the EPROMs the read operation is very similar. As long as the basic power requirements are supplied (+5V, -5V, +12V - M2708 or +5V -M2716), the Read Enable pins (20-CS/WE - M2708 or 20-G - M2716) can be used to enable the read mode. TheM2716 has 3modes of operation in the normal system environment. These are shown in Table 3.
Programming - To burn the 2708 EPROM we need to power them as follow: -5V to the VBB pin (21), +12 V to the VDD (19) and the Not Chip Select pin (20), +5V to the VCC pin (24) and set the VSS pin (12) to ground; we also need to initially put the programming pin (18) to ground. At this point we have to simply write on the address bus (A0…A9) the address of the location to program, in the data bus (Q0….Q7) the data to be written, and set the programming pin (18) to +26 V to program it. We need to wait the correct time for the data to be burned (about 1 ms according to the datasheet) and put back to ground the programming pin (18).
We are in the process of creating the burning part needed in our circuit board, the PIC software and the corrispondent burning utility in Python. This is not a difficult task, but now we don’t need it in a hurry because, in case of necessity, we can simply change a 2704 or a 2708 with a 2716 or a 2732, just programming their first 512 or 1024 bytes, because those EPROM are pin to pin compatible.
DEVICE OPERATION - TheM2716 has 3modes of operation in the normal system environment. These are shown in Table 3.
Read Mode - The M2716 read operation requires that G = VIL, EP = VIL and that addresses A0-A10 have been stabilized. Valid data will appear on the output pins after time tAVQV, tGLQV or tELQV (see Switching Time Waveforms) depending on which is limiting.
Deselect Mode - The M2716 is deselected by making G = VIH. This mode is independent of EP and the condition of the addresses. The outputs are Hi-Z when G=VIH . This allows a Wired-OR of 2 or more M2716’s for memory expansion.
Standby Mode (Power Down) - The M2716 may be powered down to the standby mode by making EP = VIH. This is independent of G and automatically puts the outputs in the Hi-Z state. The power is reduced to 25% (132 mW max) of the normal operating power. VCC and VPP must be maintained at 5V. Access time at power up remains either tAVQV or tELQV (see Switching Time Waveforms).
Programming - The M2716 is shipped from SGS-THOMSON completely erased. All bits will be at “1” level (output high) in this initial state and after any full erasure. Table 3 shows the 3 programming modes.
Program Mode - The M2716 is programmed by introducing “0”s into the desired locations. This is done 8 bits (a byte) at a time. Any individual address, sequential addresses, or addresses chosen at random may be programmed. Any or all of the 8 bits associated with an address location may be programmed with a single program pulse applied to the EP pin. All input voltage levels including the program pulse on chip enable are TTL compatible.
The programming sequence is: with VPP = 25V, VCC = 5V, G = VIH and EP = VIL, an address is selected and the desired data word is applied to the output pins (VIL = “0” and VIH = ”1” for both address and data). After the address and data signals are stable the program pin is pulsed from VIL to VIH with a pulse width between 45ms and 55ms. Multiple pulses are not needed but will not cause device damage. No pins should be left open. A high level (VIH or higher) must not be maintained longer than tPHPL (max) on the program pin during programming. M2716’s may be programmed in parallel in this mode.
Program Verify Mode - The programming of the M2716 may be verified either one byte at a time during the programming (as shown in Figure 6) or by reading all of the bytes out at the end of the programming sequence. This can be done with VPP = 25V or 5V in either case. VPP must be at 5V for all operating modes and can be maintained at 25V for all programming modes.
Program Inhibit Mode - The program inhibit mode allows several M2716’s to be programmed simultaneously with different data for each one by controlling which ones receive the program pulse. All similar inputs of the M2716 may be paralleled. Pulsing the program pin (from VIL to VIH) will program a unit while inhibiting the program pulse to a unit will keep it from being programmed and keeping G = VIH will put its outputs in the Hi-Z state.
![]() |