Interdata732/usr/sys/trace.s

	title	trace -- unix log/trace routine
	entry	dtrace
	extrn	trmask,trbuff
	extrn	printf
*
* trace(mask, label, value)
* char *label;
*
*	- log message label (first 4 chars) & value in 
*	  circular trace buffer "trbuff".
*	- if any bits in the mask are on in the trace-control word
*	  "trmask", display message on the system console
*
r0	equ	0
r1	equ	1
r2	equ	2
r3	equ	3
r4	equ	4
r5	equ	5
r6	equ	6
sp	equ	7
r8	equ	8
rf	equ	15
*
* structure of arguments
*
args	struc
mask	ds	adc
label	ds	adc
value	ds	adc
	ends
	pure
dtrace	equ	*
*
* get first 4 chars of message label
*
	l	r1,label(sp)	message pointer
	lb	r2,0(r1)	first byte
	exbr	r2,r2
	lb	r0,1(r1)	second byte
	stbr	r0,r2
	exhr	r2,r2		move to upper half of word
	lb	r0,2(r1)	third byte
	stbr	r0,r2
	exbr	r2,r2
	lb	r0,3(r1)	fourth byte
	stbr	r0,r2
*
* put message & value in trace buffer
*
	la	r4,trbuff	point to trace buffer
tr.abl	equ	*
	abl	r2,0(r4)	add to bottom of list
	bfc	4,tr.ablok	no overflow - continue
	lis	r0,0		else reset buffer to 'empty'
	sth	r0,2(r4)
	st	r0,4(r4)
	b	tr.abl		try again
tr.ablok	equ	*
	l	3,value(sp)	value
	abl	r3,0(r4)	add to bottom of list
*
* test whether this trace is masked on
*
	l	r0,mask(sp)	get mask
	n	r0,trmask	check with trace control word
	bzr	rf		no bits on - return
*
* display message on system console
*
	shi	sp,32+12	save regs first
	stm	r8,12(sp)
	la	r0,tr.fmt	message format
	st	r0,0(sp)
	st	r1,4(sp)	message
	st	r3,8(sp)	value
	bal	rf,printf	display it on console
	lm	r8,12(sp)	restore regs
	ahi	sp,32+12
	br	rf		return
*
* format for display
*
tr.fmt	equ	*
	db	c'%s %x',x'0a',0
	db	*
	end