;	NAME	PROM16
;
;
; 2716/2758 PROM PROGRAMMER CONTROL PROGRAM 
; 8/20/79 
;
; VERSION 1.01	PROM VERSION (NON—DISK I/O) 
;
;
; SYSTEM EQUATES 
;
;
;SDATA	.EQU	01H		; VIDEO DATA PORT 
;SSTAT	.EQU	00H		; VIDEO STATUS PORT 
;RXRMSK	.EQU	02H		; RX RDY MASK 
;TXRMSK	.EQU	04H		; TX RDY MASK 
;EXIT	.EQU	0E003H 

;CORRECTIONS FOR NORTHSTAR MOTHERBOARD SERIAL PORT 0
SDATA	.EQU	02H		; VIDEO DATA PORT 
SSTAT	.EQU	03H		; VIDEO STATUS PORT 
RXRMSK	.EQU	02H		; RX RDY MASK 
TXRMSK	.EQU	01H		; TX RDY MASK 
;CORRECTION FOR CP/M 2.2
EXIT	.EQU	00000H		; CP/M SYSTEM RESET 

TBASE	.EQU	100H		; BASE OF TRANSIENT AREA 
DATA	.EQU	68H		; DATA PORT 
LADD	.EQU	69H		; LOW ADDRESS PORT 
HACTL	.EQU	6AH		; HIGH ADDRESS + CONTROL PORT 
RBOUT	.EQU	0 
;
;
;
;
;
;
;	PSECT	ABS 
;
	.ORG	TBASE		; START AT 100H 
;
;
;
; PROGRAM PROM ENTRY POINT 
;
;
;
PPG	LD	SP,SPVAL 
	LD	HL,MSG1 
	CALL	PTXT		; "PROM16 VERSION 1.0" 
PPG0	LD	SP,SPVAL 
	XOR	A		; CLEAR ACC 
	OUT	(HACTL),A 
	CALL	CRLF 
	JP	READ2		; JUMP READ 
PPG10A	CALL	CRLF 
	LD	HL,MSG4 
	CALL	PTXT		; “READY TO PROG A PROM ?” 
	CALL	YORN 
	JP	NC,RENTRY 
PPG11	CALL	CRLF 
	LD	HL,MSG5 
	CALL	PTXT		; "MEM START,MEM END,PROM START" 
	CALL	SCAN 
	LD	A,(NXCHR) 
	CP	'.'		; IF '.' EXIT 
	JR	Z,PPG11
	JP	PROG
;
;
;
;
;
YORN	CALL	ECHO
	CP	'.'
	JP	Z,RENTRY
	OR	A
	CP	'N'
	RET	Z
	CP	'Y'
	JR	NZ,YORN
	SCF
	RET
;
;
RENTRY	XOR	A
	OUT	(HACTL),A
	CALL	CRLF
	JP	EXIT
;
;
PADDR	LD	A,H
	CALL	PACC
	LD	A,L
	JP	PASP
;
;
;
MSG1	.DB	"PROM16  VERSION 1.0"
	.DW	0D0AH
	.DB	03H
MSG4	.DB	"READY TO PROGRAM A PROM (Y/N)?"
	.DB	03H
MSG5	.DB	"MEMORY START,MEMORY END,"
	.DB	"PROM START: ",03H
MSG6	.DB	"READY TO READ A PROM (Y/N)?"
	.DB	03H
;
;
;
;
; PROM READ SEQUENCE
;
;
;
READ2	CALL	CRLF		; READ PROM INTO MEMORY 	
	LD 	HL,MSG6 		
	CALL 	PTXT		; "READY TO READ (Y/N)?" 	
	CALL 	YORN 		
	JP 	NC,PPG10A 	; NO, THEN PROGRAM 	
READ0	CALL 	CRLF 		
	LD 	HL,MSG5 		
	CALL 	PTXT		; "MEM START,NEM END,PROM START" 
	CALL 	SCAN		; INPUT PARAMETERS 	
	LD 	A,(NXCHR) 		
	CP 	'.' 		
	JR 	Z,READ0 		
	LD 	A,40H 		
	OUT 	(HACTL),A 	; TURN ON PROM VOLTAGE 	
	LD	HL,(OPR1)	; MEM START ADDR 
	LD 	DE,(OPR3) 	; PROM START ADDR 	
READ1	CALL 	PREAD		; READ A BYTE OF PROM 	
	LD 	(HL),A		; SAVE BYTE IN MEM 	
	CALL 	ADCMP		; INC ADDR & COMPARE 	
	JR 	NZ,READ1 	; IF NOT END,THEN JUMP 	
	XOR 	A 		
	OUT 	(HACTL),A 		
	JP 	PPG10A		; WHEN COMPLETE,RETURN
;
;
;
;
; INC HL & DE THEN COMPARE HL WITH (IX)
; EXIT WITH ZERO FLAG SET IF EQUAL
;
;
ADCMP	INC	DE		; INC PROM ADDR 
	LD	A,D 
	AND	7H		; MAX PROM ADDR=7FF 
	LD	D,A 
	INC	HL 
	PUSH	DE 
	PUSH	HL		; SAVE HL & DE 
	LD	DE,(OPR2)	; GET RAM END ADDR 
	INC	DE 
	AND	A 
	SBC	HL,DE		; COMPARE 
	POP	HL 
	POP	DE
	RET
;
;
;
;
; PROGRAMMING SEQUENCE
;
;
PROG	LD	A,40H
	OUT	(HACTL),A	; TURN ON PROM VOLTAGE
	LD	HL,(OPR1)	; MEM START ADDRESS
	LD	DE,(OPR3)	; PROM START ADDRESS
PROG1	CALL	PREAD		; READ A BYTE (PROM)
	CP	0FFH		; CHECK FOR ERASED BYTES
	JR	NZ,PROG2	; IF NOT ERASED JUMP
PRG1A	CALL	ADCMP		; INC ADDR & CHECK FOR END
	JR	NZ,PROG1	; LOOP UNTIL END
	JR	PROG3	 	; GO PROGRAM PROM
PROG2	PUSH	HL
	LD	HL,MSG7
	CALL	PTXT		; "NOT ERASED"
	POP	HL
	IN	A,(DATA)
	CALL	PRTER		; PRINT BAD LOCATION
	CALL	ECHO		; READ FROM CONSOLE
	CP	'.'		; CHECK FOR PERIOD
	JR	Z,PRG2A		; EXIT
	CP	'C'		; CHECK FOR ‘C’
	JR	Z,PROG3		; CONTINUE IF ‘C’ ENTERED
	JR	PRG1A		; IF NOT ,PRINT NEXT ERROR
PRG2A	LD	A,0
	OUT	(HACTL),A
	JP	PPG0
PROG3	CALL	CRLF
PROG4	LD	HL,(OPR1)	; SET MEM START ADDR
	LD	DE,(OPR3)	; SET PROM START ADDR
PROG5	CALL	PPROG		; PROGRAM ONE BYTE
	CALL	CONST
	JR	Z,PROG5A
	CALL	CONIN
	CP	'.'
	JR	Z,PROG9	
PROG5A	CALL	ADCMP		; INC ADDR & CHECK END
	JR	NZ,PROG5	; FINISH THIS LOOP
PROG6	LD	A,0
	OUT	(HACTL),A	; TURN OFF ALL CONTROL LINES
PROG6A	LD	HL,(OPR1)	; MEM START ADDR
	LD	DE,(OPR3)	; PROM START ADDR
PROG7	CALL	PREAD		; READ PROM DATA
	CP	(HL)
	JR	NZ,PROG8	; IF NOT MATCH,JUMP
PRG7A	CALL	ADCMP		; CHECK FOR END
	JR	NZ,PROG7
	JR	PRG2A		; EXIT,COMPLETE
PROG8	PUSH	AF
	PUSH	HL
	LD	HL,MSG8
	CALL	PTXT		; "BAD LOCATION"
	POP	HL
	CALL	CONST
	JR	Z,PROG8A
	CALL	CONIN
	CP	'.'
	JR	Z,PRG2A
PROG8A	POP	AF
	CALL	PRTER		; PRINT ERROR MESSAGE
	JR	PRG7A		; PRINT ALL BAD LOCATIONS
PROG9	LD	HL,MSG9
	CALL	PTXT		; ABORTED
	JR	PRG2A	
;
;
;
; PULSE ONE PROM LOCATION
;
;
PPROG	CALL	PADD		; LATCH LSB OF ADDRESS
	LD	A,D
	OR	0C0H
	OUT	(HACTL),A
	LD	A,(HL)		; FETCH DATA
	OUT	(DATA),A	; OUTPUT DATA
	LD	A,D
	OR	0E0H		; TURN ON PROG PULSE
	OUT	(HACTL),A
	LD	A,50
	CALL	DELAY		; 50 MILLISEC DELAY
	LD	A,D
	OR	0C0H
	AND	0C7H		; PROG PULSE OFF
	OUT	(HACTL),A
	RET
;
DELAY	LD	B,191
DELAY1	DJNZ	DELAY1
	DEC	A
	JR	NZ,DELAY
	RET
;
;
;
;
; READ ONE LOCATION OF PROM
;
;
PREAD	CALL	PADD		; LATCH LSB OF ADDRESS
	LD	A,D
	OR	40H
	OUT	(HACTL),A
	IN	A,(DATA)
	RET
;
;
; LATCH LOWER 8 BITS OF PROM ADDRESS
;
;
PADD	LD	A,E
	OUT	(LADD),A
	RET
;
;
;
;
;
; PRINTS ADDR/BAD DATA/GOOD DATA
; OF ERROR LOCATION
;
;
PRTER	LD	B,A
	LD	A,D
	CALL	PACC		; PRINT MSB OF ADDR
	LD	A,E
	CALL	PACC		; PRINT LSB OF ADDR
	LD	C,20H
	CALL	CONOUT
	LD	A,B
	CALL	PACC		; PRINT BAD DATA
	LD	C,20H
	CALL	CONOUT
	LD	A,(HL)
	CALL	PACC		; PRINT GOOD DATA
	CALL	CRLF
	RET
;
;
;
;
MSG7	.DB	"NOT ERASED  "
	.DB	03H
MSG8	.DB	"BAD LOC  "
	.DB	03H
MSG9	.DB	"ABORTED"
	.DB	03H
;
;
;
; TWDG-READ AND CONVERT 2 DIGITS TO BINARY
;
;
;
;
;
;
; ASCII TO BINARY CONVERSION
;
;
ASBIN	SUB	030H
	CP	10
	RET	M
	SUB	7
	RET
;
;
;
;
;
;
;
;
PASP	PUSH 	BC
	CALL	PACC
	CALL	SPACE
	POP	BC
	RET
;
;
;
CRLF	LD	C,0DH
	CALL	CONOUT
	LD	C,0AH
	JP	CONOUT
;
;
SPACE	LD C,' '
	JP CONOUT
;
;
;
;
;
; PRINT TEXT
;
;
PTXT	LD	A,(HL)		; FETCH A BYTE
	CP	3
	RET	Z
	LD	C,A
	CALL	CONOUT
	INC	HL
	JP	PTXT
;
;
; PRINT ACCUMULATOR
;
;
PACC	PUSH	AF
	RRCA
	RRCA
	RRCA
	RRCA
	CALL	PRVAL
	POP	AF
;
;
PRVAL	AND	0FH
	ADD	A,90H
	DAA
	ADC	A,40H
	DAA
	LD	C,A
	JP	CONOUT		; PRINT IT
;
;
;
;
; CHECK FOR VALID HEX CHARACTER
;
;
AORN	CP	'0'
	JR	C,AORN2		; JUMP IF < 30H
	CP	'9'+1
	JR	C,AORN1		; JUMP IF < 3AH
	CP	'A'-1
	JR	C,AORN2		; JUMP IF < 'A'
	CP	'F'+1
	JP	NC,AORN2	; JUMP IF < 'G'
AORN1	XOR	A
	RET			; VALID DATA RET
AORN2	XOR	A
	INC	A
	RET			; NOT HEX CHAR
;
;
; CHECK FOR TERMINATOR
;
; SPACE, COMMA, OR CARRIAGE RETURN
;
;
TERMCK	CP	' '
	RET	Z
	CP	','
	RET	Z
	CP	'.'
	JP	Z,TCHKO
	CP	0DH
	RET	NZ
TCHKO	PUSH	BC
	CALL	CRLF
	POP	BC
	XOR	A
	RET
;
;
; SCAN FOR OPERAND FROM KEYBOARD
;
;
; EXIT WITH DATA IN HL, AND TERMINATOR
; IN C. IF VALID DATA, RETURN WITH
; 2ERO FLAG SET. B CONTAINS # OF CHARACTERS ENTERED.
;
;
KEYIN	LD	HL,0
	LD	B,L
KEY1	CALL	ECHO
	INC	B		; INC CHAR COUNT
	CALL	TERMCK
	RET	Z		; IF TERMINATOR, RETURN
	CALL	AORN		; VALID DATA CHECK
	RET	NZ		; IF NOT RETURN
	LD	A,C
	CALL	ASBIN		; CONVERT TO BINARY
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL		;p SHIFT 4 BITS
	ADD	A,L
	LD	L,A
	JP	KEY1
;
;
;
ECHO	CALL	CONIN
	LD	C,A
	JP	CONOUT
;
;
;
INVCMD	LD	C,'?'
	CALL	CONOUT
	LD	A,'.'
	LD	(NXCHR),A
	RET
;
;
;
;
;SCAN —— SCANS THE OPERANDS INPUT FROM THE
; CONSOLE. THE OPERANDS ARE SAVED IN OP1,
; AS THE ARGUMENTS TO EXECUTE THEIR COMMANDS.
;
SCAN	XOR	A		;INITIALIZE
	LD	HL,OPRS		;CLEAR OPERANDS
	PUSH	HL
	POP	IX		;IX=POINTER TO OPERANDS
	LD	(HL),A
	LD	BC,9
	LD	DE,OPRS+1
	LDIR
	LD	(OPCNT),A
SCAN1	CALL	KEYIN		; GET ONE OPERAND
	JP	NZ,INVCMD
	LD	A,C
	LD	(NXCHR),A
	CP	' '
	JR	Z,SCAN2
	CP	','
	JR	Z,SCAN2
	DEC	B
	RET	Z		; IF NO DATA, RET
SCAN2	LD	(IX),L
	LD	(IX+1),H
	LD	A,(OPCNT)
	INC	A
	LD	(OPCNT),A
	INC	IX
	INC	IX		; POINT TO NEXT OPR
	LD	A,C
	CP	' '
	JR	Z,SCAN1
	CP	','
	JR	Z,SCAN1
	RET
;
;
CONST	IN	A,(SSTAT)	; CONSOLE STATUS
	AND	RXRMSK
	RET	Z
	LD	A,0FFH
	RET
; 
CONIN	CALL	CONST		; CONSOLE INPUT
	JP	Z,CONIN
	IN	A,(SDATA)
	AND	7FH
	RET
; 
CONOUT	IN	A,(SSTAT)	; CONSOLE OUTPUT 
	AND	TXRMSK		; TX BFR EMPTY
	JP	Z,CONOUT
	LD	A,C
	OUT	(SDATA),A
	RET
;
;
;
OPCNT	.DS	0	1
NXCHR	.DS	0	1
OPRS	.DS	0	6
OPR1	.EQU	OPRS
OPR2	.EQU	OPRS+2
OPR3	.EQU	OPRS+4
SPVAL	.EQU	OPRS+100H
; 
;
;
	.END


