;***************************************************************; ; ; ; 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 ; ; ; ;***************************************************************; ; <<<>>> PROM EQU 0E000H ;SELECTED LOCATION OF SOCKETS CPORT EQU 70H ; " " " CONTROL PORT CR EQU 0DH ;CARRIGE RETURN LF EQU 0AH ;LINE FEED BELL EQU 7 ;***** DING TERM EQU '$' RST7 EQU 38H ORG 100H JMP START DS 4000H-$ ; RAM WORKSPACE 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 ;**************************** ; MISCELLANEOUS SUBROUTINES ;**************************** ; CPHL ;ROUTINE TO COMPARE HL VS DE CPHL: MOV A,H CMP D RNZ MOV A,L CMP E RET ; GETVAL ;ROUTINE TO LOAD A 16 BIT ;VALUE FROM A HEX INPUT 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 PRNMSG: MVI C,PRINT JMP BDOS ; VARIABLE STORAGE SIZE: DS 1 CODE: DS 1 NCYC: DS 1 OPTION: DS 2 RAM: DS 2 ; * * * * * * * * * * * * * * * * * * * * * * * * ; * ;BDOS/CBIOS EQUATES (VERSION 7) * ; * RDCON EQU 1 ; * WRCON EQU 2 ; * PRINT EQU 9 ; * OPEN EQU 15 ;0FFH=NOT FOUND * CLOSE EQU 16 ; " " * SRCHF EQU 17 ; " " * SRCHN EQU 18 ; " " * ERASE EQU 19 ;NO RET CODE * DELT EQU ERASE ; * READ EQU 20 ;0=OK, 1=EOF * WRITE EQU 21 ;0=OK, 1=ERR, 2=?, * ; 0FFH=NO DIR SPC * MAKE EQU 22 ;0FFH=BAD * REN EQU 23 ;0FFH=BAD * STDMA EQU 26 ; * ; * ; * BOOT EQU 0 ;WARM BOOT * BDOS EQU 5 ; * FCB EQU 5CH ; * SYSSIZ EQU 32 ;SYSTEM SIZE * CBIOS EQU SYSSIZ*1024-512 ; * SELDSK EQU CBIOS+1BH ; * SETTRK EQU SELDSK+3 ; * SETSEC EQU SETTRK+3 ; * SETDMA EQU SETSEC+3 ; * RDSEC EQU SETDMA+3 ; * WRSEC EQU RDSEC+3 ; * ; * * * * * * * * * * * * * * * * * * * * * * * * END