;***************************************************************;
;                                                               ;
;                       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

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