I had a requirement to program 2764 eproms. I have written a program to do this using 'TeraTerm', a terminal program similar to HyperTerminal. The EPROM is programmed by sending an intel hex file via the serial port. My program parses the serial data to remove all the unwanted stuff from the hex file. Vpp is applied manually prior to burning the eprom.

The program is a work in progress and will be improved in future to make it more flexible. With minor modifications I have used it to program 2864 EEPROMs and battery backed SRAM devices. PIC is a 16F73 with a 4mhz xtal.

Apologies for the poor layout of the program, hopefully you can follow what is going on via the remarks.

Regards,
John

'************************************************* ***************
'* Name : UV EPROM PROGRAMMER.BAS *
'* Author : JOHN CUNNINGHAM *
'* Notice : Copyright (c) 2017 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 15/09/2017 *
'* Version : 1.0 *
'* Notes : PROGRAMS 2764 EPROMS VIA TERMINAL PROGRAM. USE *
'* : 4800 BAUD, HARDWARE FLOW CONTROL *
'************************************************* ***************
include "modedefs.bas"
ADCON0=7
ADCON1=7 'MESSES UP SERIAL COMMS IF OMITTED
B VAR BYTE
B0 VAR BYTE
B1 VAR BYTE
DLENGTH VAR BYTE'NUMBER OF BYTES OF DATA PER LINE OF THE INTEL HEX FILE
D VAR BYTE'BINARY DATA TRANSLATED FORM ASCII
ADDRESS VAR WORD
DATACOUNT VAR WORD'COUNT BYTES RECEIVED PER LINE OF THE INTEL HEX FILE
LINECOUNT VAR BYTE'PROVIDES A LINEFEED AND CARRIAGE RETURN AFTER WRITING 32 BYTES OF DATA TO TERMINAL


OE VAR PORTC.0'EPROM OUTPUT ENABLE PIN
WE VAR PORTC.1'EPROM WRITE ENABLE PIN
CLOCK VAR PORTC.2'CLOCKS ADDRESS COUNTERS
RST VAR PORTC.3'RESET 74HC4040 ADDRESS COUNTERS
CE VAR PORTC.4'CHIP ENABLE. EPROM PIN 20
CTS VAR PORTC.5'CLEAR TO SEND. ACTIVE LOW.

DEFINE HSER_RCSTA 90h
define HSER_TXSTA 20h
define HSER_BAUD 4800


RESET:
PAUSE 1000
ADDRESS=0
DATACOUNT=0
HIGH CTS

TRISB=$00'PORT B ALL OUTPUTS

HIGH CE'EPROM CHIP ENABLE ACTIVE LOW
HIGH CLOCK'CLOCK IDLES HIGH
HIGH WE'WRITE DISABLE
HIGH OE'OUTPUT DISABLE
HIGH RST:PAUSE 10:LOW RST'RESET 74HC4040 ADDRESS COUNTER


HSEROUT ["PRESS SPACE BAR TWICE WHEN READY TO SEND FILE",10,13]
HSEROUT ["PRESS SPACE BAR THEN R TO READ BACK FILE",10,13]
LOW CTS:HSERIN [WAIT (" "),B]:HIGH CTS
IF B=$20 THEN HSEROUT ["READY TO RECEIVE INTEL HEX FILE",10,13,10,13]
IF B=$52 OR B=$72 THEN GOTO READBACK'R OR r TYPED
GOTO START


START:

LOW CTS:HSERIN [B]:HIGH CTS'EXPECT ":"
IF B<>$3A THEN GOTO ERROR'":" NOT RECEIVED AS NEW LINE MARKER
LOW CTS:HSERIN [B0,B1]:HIGH CTS'EXPECT "20"

GOSUB ASCII_TO_HEX
IF D=$00 THEN GOTO RECEIVE_COMPLETE'END OF DATA MARKER RECEIVED (DATATYPE=$00)
IF D<>$20 THEN GOTO ERROR
DLENGTH=D

LOW CTS:HSERIN [B,B,B,B,B,B]:HIGH CTS'RECEIVE ADDRESS (4 BYTES) AND DATA TYPE (2 BYTES) AND IGNORE IT
hserout [hex4 address,":"]

DATARECEIVE:'RECEIVE 64 ASCII CHARACTERS REPRESENTING THE 32 BYTES OF DATA TO BE WRITTEN
LOW CTS:HSERIN [B0,B1]:HIGH CTS

GOSUB ASCII_TO_HEX
HSEROUT [HEX2 D]'

GOSUB MEMWRITE'SUBROUTINE TO WRITE DATA TO SRAM

address=address+1'INCREMENT ADDRESS
DATACOUNT=DATACOUNT+1
IF DATACOUNT=DLENGTH THEN GOTO NEWLINE

GOTO DATARECEIVE

NEWLINE:
DATACOUNT=0:LOW CTS:HSERIN [B,B,B]:HIGH CTS:HSEROUT [10,13]'END OF DATA BLOCK. RECEIVE CHECKSUM, CARRIAGE RETURN AND IGNORE IT.BEGIN NEW LINE
GOTO START

ERROR:
HSEROUT ["ERROR",10,13]
GOTO RESET

RECEIVE_COMPLETE:
HSEROUT ["TRANSFER COMPLETE: ",DEC4 ADDRESS," BYTES RECEIVED",10,13]

READBACK:
LOW CE
TRISB=$FF'PORT B ALL INPUTS
HIGH RST:LOW RST'RESET ADDRESS COUNTER TO 0
ADDRESS=0
LINECOUNT=0

MEMREAD:
LOW OE
HSEROUT [HEX2 PORTB]
LINECOUNT=LINECOUNT+1
IF LINECOUNT=$20 THEN LINECOUNT=0:HSEROUT [10,13]
HIGH OE
LOW CLOCK:HIGH CLOCK
ADDRESS=ADDRESS+1
IF ADDRESS=$2000 THEN GOTO RESET
GOTO MEMREAD


ASCII_TO_HEX:'CONVERT 2 ASCII CHARACTERS TO 1 BYTE OF BINARY DATA
IF B0<$3A THEN B0=B0-$30
IF B0>$40 THEN B0=B0-$37
IF B1<$3A THEN B1=B1-$30
IF B1>$40 THEN B1=B1-$37
D=(b0<<4)+B1
RETURN


MEMWRITE:
PORTB=D
pause 1
LOW WE:LOW CE
pause 20
HIGH WE:HIGH CE
pause 1
LOW CLOCKause 1:HIGH CLOCKause 1
RETURN
END