Interdata_v6/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