.pabs
.phex
.xlink
.xsym
; INPUT-OUTPUT EQUATES
CRTD	==	0E0H
CRTS	==	CRTD+1
LPTD	==	0E2H
LPTS	==	LPTD+1
; ascii characters
STX=2
ESC=1BH
EOT=4
CR=0dh
LF=0ah
ACK=6
NAK=15h
ETX=3
	.loc	100h
	LXI	SP,STACK
	CALL	PRINTF
	.ASCIS	/
Tinkerbell Prom Programmer Program/
BRESET:
	IN	LPTD
	IN	LPTD
	MVI	A,'X'
	MVI	A,'X'
	CALL	LPTOUT
	CALL	LPTGET
	CALL	LPTGET
	CALL	LPTGET
	CALL	WASTE4
	IN	LPTD
	CALL	PRINTF
	.ASCIS	/
Baud rate reset/
COMLOOP:
	CALL	PRINTF
	.ASCIS	/
Reset the prom programmer, then type:
P-program, L-list, R-reset, Q-quit - /
	CALL	INCHAR
	CALL	CRLF
	CPI	'P'
	JZ	PROGRAM
	CPI	'L'
	JZ	LIST
	CPI	'R'
	JZ	BRESET
	CPI	'Q'
	JZ	0
	CALL	PRINTF
	.ASCIS	/Nasty Command Error!!
/
	JMP	COMLOOP
ABORT:
	LXI	SP,STACK
	IN	CRTD
	MVI	A,ESC
	CALL	LPTOUT
	CALL	LPTGET
	CALL	LPTGET
	CALL	LPTGET
	CALL	PRINTF
	.ASCIS	/
Command Aborted!/
	JMP	COMLOOP
; PROGRAM COMMAND
PROGRAM:
	CALL	SENDADDR
	CALL	PRINTF
	.ASCIS	/Ram address: /
	CALL	INHEX
	MVI	A,'P'
	CALL	PSEND
	CALL	LPTGET
	CPI	NAK
	JRNZ	..POK
	CALL	PRINTF
	.ASCIS	/WARNING! Prom not clear. Type Y to proceed,
anything else to abort. - /
	CALL	INCHAR
	CPI	'Y'
	JNZ	ABORT
	CALL	CRLF
..POK:
	CALL	LPTGET
	CPI	CR
	JRNZ	..POK	; AWAIT CR CHAR
	LXI	D,2048
..PLOOP:
	MOV	A,M
	CALL	SENDHEX
	CALL	LPTGET
	CPI	NAK
	JRNZ	..BOK
	CALL	PRINTF
	.ASCIS	/Programming error at /
	MOV	A,H
	CALL	HEXBYT
	MOV	A,L
	CALL	HEXBYT
	CALL	PRINTF
	.ASCIS	/
type Y to proceed, anything else to abort -/
	CALL	INCHAR
	CPI	'Y'
	JNZ	ABORT
	CALL	CRLF
..BOK:
	INX	H
	DCX	D
	MOV	A,D
	ORA	E
	JRNZ	..PLOOP
	CALL	LPTGET	; GET EOT
	JMP	COMLOOP
; LIST COMMAND
LIST:
	CALL	SENDADDR
	MVI	A,'L'
	CALL	PSEND
..LOOP:
	CALL	LPTGET
	CPI	EOT
	JZ	COMLOOP
	CPI	'*'
	JZ	COMLOOP
	CALL	CRTOUT
	JMPR	..LOOP
; ROUTINE TO SEND ADDRESSES TO PROM PROGRAMMER
SENDADDR:
	MVI	A,'0'
	CALL	PSEND
	CALL	WASTE4
	MVI	A,'0'
	CALL	PSEND
	CALL	WASTE4
	MVI	A,'0'
	CALL	PSEND
	CALL	WASTE4
	MVI	A,'7'
	CALL	PSEND
	CALL	WASTE4
	MVI	A,'F'
	CALL	PSEND
	CALL	WASTE4
	MVI	A,'F'
	CALL	PSEND
	CALL	WASTE4
	RET
PSEND:
	CALL	LPTOUT
	CALL	LPTGET
	RET
; GET 16 BIT HEX NUMBER FROM USER
INHEX:
	PUSH	B
..FIX:	LXI	H,0
..LOOP:	CALL	INCHAR
	CPI	CR
	JRZ	..DONE	; YEP-QUIT
	CPI	'0'	; <0?
	JRC	..BAD	; YES
	CPI	'9'+1	; <=9?
	JRC	..GOOD	; YES
	CPI	'A'	; <A?
	JRC	..BAD
	CPI	'G'	; <=F?
	JRNC	..BAD
	SUI	'A'-10
	JMPR	..GOD1
..GOOD:	SUI	'0'
..GOD1:	MOV	C,A
	MVI	B,0
	DAD	H	; AC=AC*16
	DAD	H
	DAD	H
	DAD	H
	DAD	B
	JMPR	..LOOP
..BAD:	CALL	PRINTF
	.ASCIS	/??
 - /
	JMPR	..FIX
..DONE:	POP	B
	RET
CRLF:
	PUSH	PSW
	MVI	A,CR
	CALL	CRTOUT
	MVI	A,LF
	CALL	CRTOUT
	POP	PSW
	RET
; **
; **  CRTOUT - SEND A CHARACTER TO THE CRT
; **
; ** ENTRY -  A -> CHARACTER
; **
; ** EXIT  -  EVERYTHING RESTORED
; **
PUNCH:
CONOUT:	MOV	A,C
CRTOUT:	PUSH    B
	MVI	C,CRTS
	JMPR	UART


; **************************************************
; **
; **  LPTOUT - SEND CHARACTER TO PRINTER, EAT CR'S
; **	WAIT FOR DATASET READY.
; **
; **  ENTRY -  A -> CHARACTER
; **
; **  EXIT  -  ALL RESTORED
; **
; **************************************************
LPTOUT:
	PUSH	B
	MVI	C,LPTS
..LPT:	INP	B
	BIT	7,B	; DATA SET READY
	JRZ	..LPT
UART:	INP	B
	BIT	0,B
	JRZ	UART
	DCR	C
	OUTP	A
	POP	B
	RET
; TYPE MESSAGE FOLLOWING INLINE AFTER CALL
PRINTF:
	XTHL
	CALL	CONOMSG
	INX	H
	XTHL
	RET
; ***********************************
; **
; **  CONOMSG  -  PRINT MESSAGE ON CONSOLE
; **
; **  ENTRY  -  HL -> STRING ENDD BY BYTE WITH SIGN BIT ON
; **
; **  EXIT  -   A -> ZORKED
; **H -> ZORKED
; **
; ***********************************
CONOMSG:MOV	A,M
	CALL	CRTOUT
	BIT	7,A	; TERMINATED BY BIT 7 ON
	RNZ
	INX	H
	JMPR	CONOMSG
; INPUT CHARACTER AND ECHO
INCHAR:
	CALL	GETCHR
	CALL	CRTOUT
	RET
; *********************************
; **
; **  GETCHR - GET A CHARACTER FROM THE CRT AND
; **	FORCE TO UPPER CASE
; **
; **  EXIT -  A -> CHARACTER
; **
; *********************************
GETCHR:	CALL	CRTIN
	CPI	060H	;IS CHAR LOWER CASE???
	RM		;RETURN IF CHAR OK
	ANI	05FH	;FORCE IT TO UPPER CASE
	RET

CONIN:
READER:
CRTIN:	CALL	CRTSTAT
	JRZ	CRTIN
	IN	CRTD
	ANI	7FH
	CPI	5FH
	RNZ
	MVI	A,7FH
	RET


LPTGET:
	CALL	LPTSTAT
	JRNZ	LPTGT1
	CALL	CRTSTAT
	JNZ	ABORT
	JMPR	LPTGET
LPTIN:	CALL	LPTSTAT
	JRZ	LPTIN
LPTGT1:
	IN	LPTD
	ANI	7FH
	RET


CONSTAT:
CRTSTAT:	PUSH	B
	MVI	C,CRTS
	JMPR	UARTSTAT


LPTSTAT:	PUSH	B
	MVI	C,LPTS
UARTSTAT:	INP	A
	POP	B
	ANI	2	; DATA READY?
	RZ	
	MVI	A,0FFH	; TRUE FOR CP\M
	RET
; TYPE OUT BYTE IN A IN HEX FORMAT
HEXBYT:
	PUSH	H
	LXI	H,CRTOUT
	CALL	XMITHEX
	POP	H
	RET
PFUCK:
	CALL	LPTOUT
	CALL	LPTIN
	RET
SENDHEX:
	PUSH	H
	LXI	H,PFUCK
	CALL	XMITHEX
	POP	H
	RET
XMITHEX:
	PUSH	PSW
	RRC
	RRC
	RRC
	RRC
	CALL	..HNIB
	POP	PSW
..HNIB:	ANI	0FH
	CPI	10
	JRC	..LT10
	ADI	'A'-'9'-1
..LT10:	ADI	'0'
	PCHL
; WASTE 4 MILLIES
WASTE4:
	MVI	A,0
..TIT1:	DCR	A
	JRNZ	..TIT1
..TIT2:	DCR	A
	JRNZ	..TIT2
	RET
	.BLKW	64
STACK:
.END
                                   