;	Initialization program for Televideo 801/802
;		    written by Les Freed
;		    Version 1.0 3/17/82
;
;07/25/82 Corrected error which had SIO initialization code going to data port
;	  rather than status/control port and inserted code using Z80 block
;	  output instruction from a program I had written previously. Actually
;	  the Televideo seems to initialize the SIO somewhere in the system
;	  software and for the most part only needs the CTC initialized to set
;	  the baud rate, which is why this program worked before. (Bob Clyne)
;
bdos	equ	5		;CP/M entry point
;
udta	equ	20h		;usart data port
usta	equ	22h		;usart status port
;
cr	equ	0dh		;carriage return
lf	equ	0ah		;line feed
;
	org	100h
;
start:	lxi	d,signon	;print table
	call	print
;
	lxi	d,msg1		;print message
	call	print
i1:	call	input		;get input
	call	check		;check range
	jc	i1		;try again if carry set
	sui	30h		;remove ASCii bias
	sta	baud		;store divisor
;
show:	lxi	d,clear		; clear screen
	call	print
	lxi	d,msg1		;print 'baud rate:'
	call	print
	lda	baud		;get a's divisor
	call	prbaud		;print a's baud rate
	lxi	d,crmsg		;ask user if okay
	call	print
	call	input
	cpi	cr
	jnz	start		;if not CR, then start over
;

;			 SIO-INIT.ASM
;			  Version 02
;		 Originally written by Bob Clyne
;		      November 22, 1981
;
;This code initializes a Z80-SIO or Z80-DART IC for asynchronous communication.
;It uses Z80 instructions and therefore will only run on a Z80 CPU. This
;program can be run prior to using the I/O port or this code may be transferred
;to the initialization section of another program such as one of the MODEM
;programs. The status/control port number will need to be set for each
;application.
;
;01/21/82 Changed introduction and added equates for XEROX 820 Channel A.
;
FALSE	EQU	0
TRUE	EQU	NOT FALSE
;
;Only one of the following equates should be set true.
;
XEROX	EQU	FALSE
ALTOS	EQU	FALSE
TELEVID	EQU	TRUE	;Added 07/25/82
;
	IF	ALTOS	;ALTOS 2nd printer port
DPORT	EQU	28H	;DATA PORT (Included for information only, not used.)
CTRLPT	EQU	29H	;Status/control port.
	ENDIF
;
	IF	XEROX	;XEROX 820 Channel A serial port.
CTRLPT	EQU	06H	;Status/control port.
	ENDIF
;
	IF TELEVID
CTRLPT	EQU	usta	;Use port equate from begining of pgm. (RAC 07/25/82)
	ENDIF
;
;	MACLIB	Z80	;To assemble using ASM comment out this line and make
			;the change noted below.
;
;	ORG	100H
;

SIO:	MVI	B,07H	;NUMBER OF BYTES NEEDED TO INITIALIZE THE SERIAL PORT
	MVI	C,CTRLPT;PORT TO SEND INITIALIZATION BYTES TO
	LXI	H,INITBL;ADDRESS OF TABLE OF BYTES TO SEND
;	OUTIR		;OUTPUT THE BLOCK
	DB	0EDH,0B3H;To assemble on ASM, comment out the above instruction
			 ;and remove the ';' from in front of 'DB'
;	RET		;RETURN TO CPM
	JMP	CTC	;Jump to old code to set the CTC (RAC 07/25/82)
;
INITBL:	DB	18H	;CHANNEL RESET
	DB	04H	;WRITE REGISTER 4
	DB	44H	;SET X16 CLOCK, 1 STOP BIT, NO PARITY
	DB	05H	;WRITE REGISTER 5
	DB	0EAH	;SET DTR & RTS ACTIVE & ENABLE 8 BIT TRANSMIT
	DB	03H	;WRITE REGISTER 3
	DB	0E1H	;ENABLE 8 BIT RECEIVE & AUTO ENABLES
;	DB	0C1H	;Enable 8 bit receive without AUTO ENABLES.
			;Comment out whichever of the above 2 lines you don't
			;... want.
 
;	END
;
CTC:	mvi	a,47h		; counter mode follows (Lable added RAC)
	out	08h		; send
	lda	baud		; get baud rate divisor
	out	08h		; send to port
;
	lxi	d,msg		;tell user we're done
	call	print
	ret			;& return to CP/M	
;
print:	mvi	c,9		;CP/M print string call
	call	bdos
	ret
;
input:	mvi	c,1		;CP/M get char. call
	call	bdos
	ret
;
check:	cpi	30h		;at least '0'
	jc	notok
	cpi	37h		;& not >'6'
	jnc	notok
	stc			;reset carry
	cmc
	ret
;
notok:	lxi	d,badmsg	;print message, move back up screen
	call	print
	stc ! ret		;return w/ carry set
;
prbaud:	cpi	0		;find divisor, convert & print baud rate 
	jnz	pr1
	lxi	d,m19
	mvi	a,2
	jmp	pr8
;
pr1:	cpi	1
	jnz	pr2
	lxi	d,m96
	mvi	a,4
	jmp	pr8
;
pr2:	cpi	2
	jnz	pr3
	lxi	d,m48
	mvi	a,8
	jmp	pr8
;
pr3:	cpi	3
 	jnz	pr4
	lxi	d,m24
	mvi	a,10h
	jmp	pr8
;
pr4:	cpi	4
	jnz	pr5
	lxi	d,m12
	mvi	a,20h
	jmp	pr8
;
pr5:	cpi	5
	jnz	pr6
	lxi	d,m6
	mvi	a,40h
	jmp	pr8
;
pr6:	cpi	6
	jnz	pr8
	lxi	d,m3
	mvi	a,80h
;
pr8:	sta	baud
	jmp	print
;

;
signon:	db	1ah,'INIT v 1.0      3-18-82',cr,lf,lf,lf
	db	'Select Baud Rate: ',cr,lf,lf
;
	db	'Speed',cr,lf
	db	'19200 0',cr,lf
	db	' 9600 1',cr,lf
	db	' 4800 2',cr,lf
	db	' 2400 3',cr,lf
	db	' 1200 4',cr,lf
	db	'  600 5',cr,lf
	db	'  300 6',cr,lf
	db	lf,lf,lf,'$'
;
m19:	db	'  19200$'
m96:	db	'   9600$'
m48:	db	'   4800$'
m24:	db	'   2400$'
m12:	db	'   1200$'
m6:	db	'    600$'
m3:	db	'    300$'
;
badmsg:	db	cr,lf,7,'Re-enter',cr
	db	11,12,12,12,12,12,12
	db	12,12,12,12,12,'$'	;move cursor back to entry
;
clear:	db	1ah,'$'
;
crmsg:	db	cr,lf,lf,lf,lf,'Press RETURN to set baud rate :','$'
;
msg:	db	cr,lf,'Port initialized',0dh,0ah,'$'
msg1:	db	cr,lf,'Baud rate :$'
;
baud	ds	1
;
	end
