;***************************************************************;
; ;
; EPROM.ASM ;
; ;
; LAST MODIFIED 9/27/80 ;
; ;
; EPROM PROGRAMMER SOFTWARE FOR RUNNING AN SSM - PB1 ;
; 2708/2716 PROGRAMMER WITH CP/M UNDER DDT ;
; ;
; TO RUN THIS PROGRAM, TYPE: ;
; ;
;DDT EPROM.COM(CR) ;
; ;
; THE CONSOLE WILL RESPOND WITH: ;
; ;
;DDT VERS #.# ;
;NEXT PC ;
;#### 0100 ;
;- ;
; ;
; INSERT A HEX FILE TO BE PLACED IN EPROM BY ENTERING: ;
; ;
;IFILENAME.HEX(CR) ;
;R[BIAS](CR) ;
; ;
; (NOTE THAT BIAS WILL ALLOW THE ENTERED PROGRAM TO RESIDE ;
; WITHIN 103H TO 'START' AS REQUIRED EVEN THOUGH THE PROGRAM ;
; WAS ASSEMBLED FOR EXECUTION OUTSIDE THIS RANGE) ;
; ;
; TO START THE PROGRAM FROM DDT, ENTER EITHER 'G(START:)' ;
; OR 'G100'. THE PROGRAM WILL ASK FOR EPROM TYPE SO AS ;
; TO SET THE PROPER SIZE (1K FOR 2708 AND 2K FOR 2716/2516) ;
; AND PROGRAMMING ROUTINE. ;
; ;
; SUPPORTED FUNCTIONS ARE COPY, PROGRAM AND VERIFY WHICH ARE ;
; SELF EXPLANATORY. THE AUTOMATIC SEQUENCE FOR PROGRAMMING ;
; AN EPROM IS TO FIRST CHECK FOR FULL ERASURE, THEN THE ;
; PROGRAM CYCLE, FOLLOWED BY THE VERIFY ROUTINE. ;
; (ANY FAILURE RESULTS IN AN ERROR MESSAGE AND A BELL ;
; SO AS TO NOT GO UNNOTICED.) ;
; ;
; AS CONTROL IS PASSED TO DDT AND YOU WISH TO ;
; RETURN TO THE PROGRAMMER, JUST ENTER 'G' AGAIN. ;
; ;
; EXIT FROM THE PROGRAM BY ENTERING A CONTROL C ;
; ;
;***************************************************************;
; <<<<SET PROM AND CPORT TO AGREE WITH PB1 SWITCHES>>>>
PROM EQU 0E000H ;SELECTED LOCATION OF SOCKETS
CPORT EQU 70H ; " " " CONTROL PORT
START: CALL HELLO
DB CR,LF,'CP/M EPROM PROGRAMMER - VER 1.0',CR,LF,CR,LF,TERM
HELLO: POP D
CALL PRNMSG
TYPE: CALL TYPE1
DB CR,LF,'ENTER EPROM TYPE (2516,2716 OR 2708) ',TERM
TYPE1: POP D
CALL PRNMSG
CALL GETVAL
POP H
LXI D,2708H
CALL CPHL
JZ X2708
LXI D,2516H
CALL CPHL
JZ X2716
LXI D,2716H
CALL CPHL
JZ X2716
JMP TYPE ;WRONG TYPE
X2708: MVI A,3 ;PAGE COUNT - 1
STA SIZE
MVI A,1 ;HARDWARE CODE
STA CODE
MVI A,250 ;# OF PROGRAMMING CYCLES
STA NCYC
JMP DIRECT
X2716: MVI A,7 ;PAGE COUNT - 1
STA SIZE
MVI A,2 ;HARDWARE CODE
STA CODE
MVI A,1 ;# OF PROGRAMMING CYCLES
STA NCYC
DIRECT: CALL DIR1
DB CR,LF,'DO YOU WISH (D)DT, (C)OPY, '
DB '(P)ROGRAM, (V)ERIFY ? ',TERM
DIR1: POP D
CALL PRNMSG
CALL CI
CPI 'C'
LXI H,COPY
JZ DIR2
CPI 'P'
LXI H,PROG
JZ DIR2
CPI 'V'
LXI H,VERIFY
JZ DIR2
CPI 'D'
JNZ DIRECT
LXI H,DIRECT
PUSH H ;SET RETURN ADDRESS
JMP RST7 ;DDT BREAKPOINT ENTRY
DIR2: SHLD OPTION
ADDR: CALL ADD1
DB CR,LF,'ENTER STARTING ADDRESS '
DB 'OF MEMORY BLOCK IN HEX ',TERM
ADD1: POP D
CALL PRNMSG
CALL GETVAL
POP H
SHLD RAM
GO: LDA PROM ;CLEAR PROGRAMMER
CALL GO1
DB CR,LF,'PLACE EPROM IN PROPER SOCKET '
DB 'AND STRIKE ANY KEY',CR,LF,TERM
GO1: POP D
CALL PRNMSG
CALL CI
LHLD OPTION
PCHL
VERIFY: CALL VERIF
JMP DIRECT
COPY: CALL CPY
JMP DIRECT
PROG: CALL ERACHK ;SEE IF EPROM IS ERASED
JNZ DIRECT ;ABORT IF NOT-
CALL PRG ;NOW PROGRAM
CALL VERIF ;AND VERIFY
JMP DIRECT ;THEN CHECK WHAT'S NEXT
;***********************
; MAIN SUBROUTINES
;***********************
; ERACHK
;ROUTINE TO TEST FOR COMPLETE
;ERASURE OF EPROM BEFORE PROG.
ERACHK: LXI H,SIZE
MOV C,M
LXI D,PROM
ERACH1: LDAX D ;GET BYTE FROM EPROM
INX D
CPI 0FFH ;TEST FOR ERASE PATTERN
JNZ NERASE
MOV A,D
ANA C
ORA E ;CHECK FOR END
JNZ ERACH1
RET
NERASE: PUSH PSW ;SAVE FLAGS
CALL NER1
DB CR,LF,'EPROM NOT ERASED',CR,LF,BELL,TERM
NER1: POP D
CALL PRNMSG
POP PSW
RET
; PRG
;ROUTINE TO PROGRAM EITHER
;A 2708 OR 2716 EROM
PRG: LDA CODE ;SET HARDWARE FOR TYPE
OUT CPORT
LXI H,NCYC ;# OF PROG. CYCLES
MOV B,M
LXI H,SIZE
MOV C,M ;# OF PAGES -1
PRG1: LXI D,PROM
LHLD RAM
;PROGRAM THE EPROM
PRG2: MOV A,M
STAX D ;THIS STEP DOES IT
INX D
INX H
MOV A,D
ANA C
ORA E
JNZ PRG2 ;GET NEXT ADDRESS
DCR B
JNZ PRG1 ;LOOP FOR N CYCLES
DCX D
LDAX D ;RESET THE HARDWARE
RET
; VERIF
;ROUTINE TO VERIFY CONTENTS
;OF AN EPROM WITH MEMORY
VERIF: LXI H,SIZE
MOV C,M
LXI D,PROM ;ADDRESS OF EPROM
LHLD RAM ;RAM TO BE COMPARED
VERF1: MOV B,M ;GET ORIGINAL
LDAX D ;THEN ROM
INX D
INX H
CMP B ;BETTER BE THE SAME.
JNZ DIFF
MOV A,D
ANA C
ORA E
JNZ VERF1 ;OK SO FAR, GET NEXT
PUSH PSW
CALL VERF2
DB CR,LF,CR,LF,CR,LF,'<<<<<<<<<< EPROM '
DB 'VERIFIED GOOD >>>>>>>>>>',CR,LF,TERM
VERF2: POP D
CALL PRNMSG
POP PSW
RET
DIFF: PUSH PSW ;SAVE FLAGS
CALL DIFF1
DB CR,LF,'EPROM DOES NOT VERIFY',CR,LF,BELL,TERM
DIFF1: POP D
CALL PRNMSG
POP PSW
RET
; CPY
;ROUTINE TO COPY AN EPROM
;FROM THE SOCKET TO RAM
CPY: LXI H,SIZE
MOV C,M
LXI D,PROM ;SOCKET ADDRESS OF MASTER
LHLD RAM ;POINT TO TARGET RAM
CPY1: LDAX D ;GET ROM DATA
MOV M,A ;LOAD TO RAM
INX D
INX H
MOV A,D
ANA C
ORA E
JNZ CPY1 ;GO BACK FOR NEXT BYTE
CALL CPY2
DB CR,LF,CR,LF,'COPY COMPLETE',CR,LF,CR,LF,TERM
CPY2: POP D
CALL PRNMSG
RET
GETVAL: CALL CI ;GET KEYBOARD BYTE
LXI H,0 ;INITIALIZE HL
GET1: MOV B,A ;SAVE KEYBOARD
CALL NIBBLE ;CONVERT ASCII TO HEX
JC GET2 ;NOT LEGAL
DAD H ;HL*16
DAD H
DAD H
DAD H
ORA L ;ADD IN NIBBLE
MOV L,A
CALL CI ;GET NEXT KEYBOARD BYTE
JMP GET1
GET2: XTHL ;STICK PRAMETER ON STACK
PUSH H ;REPLACE RETURN
MOV A,B ;TEST CHARACTER
CALL ECHK ;FOR JUNK
JNZ ERROR ;JUNK OR ILLEGAL
RET
NIBBLE: SUI '0'
RC
CPI 'G'-'0'
CMC
RC
CPI 10
CMC
RNC
SUI 'A'-'9'-1
CPI 10
RET
ECHK: CPI ' '
RZ
CPI ','
RZ
CPI CR
STC
RZ
CMC
RET
ERROR: POP H ;DUMP DATA
POP D
PUSH H
CALL ER1
DB CR,LF,'ENTER VALUE(CR)',CR,LF,TERM
ER1: POP D
CALL PRNMSG
JMP GETVAL
; CONSOLE IN
;ROUTINE TO GET A CHARACTER
;THROUGH CP/M FROM THE CONSOLE
CI: PUSH B! PUSH D! PUSH H
MVI C,RDCON
CALL BDOS
POP H! POP D! POP B
CPI 3 ;CHECK FOR ^C
JZ BOOT ;ABORT
RET
; PRNMSG
;ROUTINE TO PRINT A
;MESSAGE TO THE CONSOLE
;THROUGH CP/M