Interdata732/usr/sys/sdev.s

	title	7/32 unix special device routines
	entry	putchar
	entry	display
	entry	clkstart
	extrn	csw
	extrn consaddr,conscmd2
*
r0	equ	0
r1	equ	1
r2	equ	2
r3	equ	3
r4	equ	4
r5	equ	5
r6	equ	6
sp	equ	7
re	equ	14
rf	equ	15
rdev	equ	1
rchar	equ	2
*
* putchar(c)
*
*  - write character <c> on the system console using sense-status i/o
*
putchar	equ	*
	lb	rdev,consaddr	device address of console
	ohi	rdev,1		use write side 
	oc	rdev,conscmd2	set up baud rate, etc.
	oc	rdev,cmddiswr	disarm write interrupts
bsyloop ssr	rdev,r0		wait till not busy
	btc	8,bsyloop
	l	rchar,0(sp)	get character to be written
	bz	done		zero - don't write anything
write	equ	*
	wdr	rdev,rchar	write the character
bsyloop1 ssr	rdev,r0		wait for bsy -> 0
	btc	8,bsyloop1
*
* if character was a newline, write a carriage return after it
*
	chi	rchar,x'0a'	nl?
	bne	done		no - return
	lhi	rchar,x'0d'	add a cr
	b	write
*
* finished -- try to restore previous status
*
done	equ	*
	oc	rdev,cmdenwr	enable write interrupts
	br	rf
*
* device commands
*
cmddiswr db	x'a3'	dis + wrt + dtr
cmdenwr db	x'63'	enb + wrt + dtr
	align	adc
*
*	display -- display panel driver
*
* called by clock() at each lfc interrupt to read console switch
*  register, and display value addressed by csw on display panel
*
display	equ	*
*
* read console switch register into csw
*
	lis	r1,1		display address always 01
	oc	r1,dis.norm	set 'normal' mode
	rhr	r1,r2		read halfword
	exbr	r2,r2		reverse bytes
	st	r2,csw		save in csw
*
* if switches are zero, display pc
*
	lr	r2,r2		zero?
	bnz	disp.ad		no - use as address
	l	r2,0(sp)	yes - display parm (pc)
	b	disp.wr
*
* use switch contents as an address in kernel space
*
disp.ad equ	*
	thi	r2,1		odd address ?
	bz	disp.ev		no - skip
	ai	r2,y'10000'	yes - use segment 1
disp.ev equ	*
	ni	r2,-4		make sure of word boundary
	l	r2,0(r2)	load value
*
* display *(csw) on display panel
*
disp.wr equ	*
	oc	r1,dis.incr	set 'incremental' mode
	exbr	r2,r2		reverse first two bytes
	whr	r1,r2		write lower two bytes
	exhr	r2,r2		get upper two bytes
	exbr	r2,r2		reverse them
	whr	r1,r2		write upper two bytes
	br	rf		return
*
* commands for display panel
*
dis.norm	db	x'80'	set normal mode
dis.incr	db	x'40'	set incremental mode
*
*	clkstart -- line-frequency clock initialization
*
* called only once, by main(), to enable interrupts from the
*  line frequency clock, which generates interrupts at twice the
*  line frequency.
*
clkstart	equ	*
	lhi	r1,x'6d'	clock address
	oc	r1,clk.enab	enable clock interrupts
	br	rf	return
clk.enab	db	x'40',0
	end