;
;VERSION UH89 	(revised JANUARY 30, 1981)
;
;User routines for BSTAM version 4.3, for use with
;Heath H8 with H8-4 or H89 with H-3 serial port.
;TBE=20H, RDA=01H.  By Keith Petersen, W8SDZ
;
;BASE ADDRESS OF CP/M
;USE:	4200H FOR CP/M VERSION 1.43 AND BELOW.
;	0000H FOR CP/M VERSION 2.0 AND ABOVE.
;
BASE	EQU	0000H	;OFFSET OF CP/M FROM 0H
;
;DEFINE PORT
;
PORT	EQU	330Q	;8250 PORT BASE ADDRESS
;
;DEFINE BAUD RATE DIVISORS
;
B75	EQU	0600H	;75 BAUD
B110	EQU	041FH	;110 BAUD
B150	EQU	0300H	;150 BAUD
B300	EQU	0180H	;300 BAUD
B600	EQU	00A0H	;600 BAUD
B1200	EQU	0060H	;1200 BAUD
B2400	EQU	0030H	;2400 BAUD
B4800	EQU	0018H	;4800 BAUD
B9600	EQU	000AH	;9600 BAUD
B19200	EQU	0006H	;19200 BAUD
;
;DEFINE ASCII CHARACTERS USED
;
CR	EQU	0DH
LF	EQU	0AH
;
;	IF YOU WISH TO USE OTHER REGISTERS SUCH AS HL,BC,DE
;	(NOT INCLUDING  SP  REGISTER)
;	BE SURE TO PUSH BSTAM'S REGISTERS ON TO STACK AND POP
;	THEM BACK OFF BEFORE RETURNING TO BSTAM.
;	THERE IS AMPLE ROOM TO PUSH ALL REGISTERS ONTO BSTAM'S
;	STACK, PLUS ROOM FOR 10 LEVELS OF CALL'S.
;
;	THERE ARE 300 BYTES OF USER SPACE AVAILABLE TO YOU.
;
;	THE JUMP'S CODED AT THE BEGINNING OF THIS PROGRAM
;	CANNOT BE MOVED IN ANY WAY.
;
BEGIN	ORG	103H
;
INITIL	JMP	INITIU	;UART/USART INITIALATION ENTRY POINT
INSPORT	JMP	INSPRU	;STATUS PORT READ ENTRY POINT
ERRSET	JMP	ERRSTU	;UART/USART ERROR RESET ENTRY POINT
INPORT	JMP	INPRTU	;READ DATA PORT ENTRY POINT
OUTPORT	JMP	OUTPRU	;WRITE DATA PORT ENTRY POINT
;
INITIU	EQU	$
;	THIS IS THE UART/USART INITIALATION ROUTINE.
;	TO BE COMPATIBLE WITH MOST BSTAM USERS USE FOLLOWING
;	INITIALATION GUIDE LINES:
;	1. USE 1 STOP BIT	(OPTIONAL - 2)
;	2. USE 8 DATA BITS	(MUST)
;	3. USE 1 START BIT	(MUST)
;	4. USE 16X FOR CLOCK RATE 	(MUST)
;	5. USE ASYNCHRONOUS MODE ONLY	(MUST)
;
	MVI	A,0	;CLEAR
	OUT	PORT+1	;TO INTERRUPT ENABLE REGISTER
	MVI	A,80H	;OPEN DIVISOR LATCHES (DLAB BIT = 80H)
	OUT	PORT+3	;TO LINE CONTROL REGISTER
	LXI	H,B300	;BAUD RATE DIVISOR (300 BAUD)
	MOV	A,L	;LEAST SIGNIFIGENT BYTE
	OUT	PORT	;TO DIVISOR LATCH (LS)
	MOV	A,H	;MOST SIGNIFIGENT BYTE
	OUT	PORT+1	;TO DIVISOR LATCH (MS)
	MVI	A,3	;8 BITS, NO PARITY, 1 STOP BIT
	OUT	PORT+3	;TO LINE CONTROL REGISTER
	MVI	A,0	;CLEAR
	OUT	PORT+4	;TO MODEM CONTROL REGISTER
	CALL	SIGNON	;TELL USER WHAT'S IMPLEMENTED
	RET		;RETURN TO BSTAM
;
INSPRU	EQU	$
;	THIS IS THE STATUS READ PORT ROUTINE.
;	WHEN EXITING THIS ROUTINE BSTAM EXPECTS IN REGISTER A
;	THE FOLLOWING BITS TO BE SET IF NEEDED:
;	1. 20 BIT SET IF FRAMING ERROR
;	2. 10 BIT SET IF OVERRUN ERROR
;	3. 08 BIT SET IF PARITY  ERROR
;	4. 04 BIT SET IF TRANSMITTER EMPTY
;		IF YOUR UART/USART DOES NOT HAVE TRANSMITTER
;		EMPTY FEATURE, THEN ALLWAYS SET THIS BIT ON.
;	5. 02 BIT SET IF RECEIVER READY
;	6. 01 BIT SET IF TRANSMITTER READY
;	7. DO NOT SET THE 80 BIT OR 40 BIT
;
	PUSH	B
	IN	PORT+5	;TBE = 20H, RDA = 01H
	ANI	01H	;ISOLATE RDA BIT
	RAL		;MOVE TO 02 BIT
	MOV	B,A	;SAVE RDA IN B REGISTER
	IN	PORT+5	;GET STATUS AGAIN
	ANI	20H	;ISOLATE TBE BIT
	RAR		;MOVE TO 04 BIT
	RAR
	RAR
	ORA	B	;COMBINE TBE AND RDA BITS
	POP	B
	ORI	1	;PRESET TRANSMIT READY BIT
	RET
;
ERRSTU	EQU	$
;	THIS IS THE ERROR RESET FOR UART/USART ROUTINE.
;	YOUR UART/USART MAY NOT NEED TO BE RESET IF FRAMING,
;	OVERRUN, OR PARITY ERROR IS FOUND. IF THIS IS YOUR
;	CASE, JUST DO A RETURN.
;
	RET		;RETURN TO BSTAM
;
INPRTU	EQU	$
;	THIS IS THE READ DATA PORT ROUTINE.
;	BEFORE THIS ROUTINE IS ENTERED THE 02 BIT OF
;	STATUS READ ROUTINE MUST HAVE BEEN SET.
;	DO NOT CLEAR THE 80 BIT FROM THE DATA INPUT PORT.
;	RETURN WITH REGISTER A LOADED WITH INPUT DATA.
;
	IN	PORT+0	;GET DATA FROM PORT
	RET		;RETURN TO BSTAM
;
OUTPRU	EQU	$
;	THIS IS THE WRITE DATA PORT ROUTINE.
;	BEFORE THIS ROUTINE IS ENTERED THE 04 BIT AND 01 BIT
;	OF STATUS READ MUST BE SET.
;	DO NOT CLEAR THE 80 BIT FROM THE DATA OUTPUT PORT.
;	REGISTER A CONTAINS THE OUTPUT DATA.
;
	OUT	PORT+0	;SEND DATA TO REMOTE CPU
	RET		;RETURN TO BSTAM
;
MESSGE:	DB	CR,LF,CR,LF
	DB	'Version 1.0 for H8/H89 as of 1/30/81',CR,LF
	DB	'$'
;
SIGNON:	PUSH	B
	PUSH	D
	PUSH	H
	LXI	D,MESSGE
	MVI	C,9
	CALL	BASE+5		;ANNOUNCE VERSION TO USER
	POP	H
	POP	D
	POP	B
	RET
;
	END
