Xinu7/src/serve11/sys/setclkr.s

/* setclkr.s - setclkr */

CVECTPC	=	100			/ clock interrupt vector address
CVECTPS	=	102			/  "      "         "      "
DISABLE	=	340			/ PS that disables interrupts
ENABLE	=	000			/ PS that enables interrupts
COUNT	=	32700.			/ Times to loop (in decimal)

/*------------------------------------------------------------------------
/* setclkr  --  set cklruns to 1 iff real-time clock exists, 0 otherwise
/*------------------------------------------------------------------------
	.globl	_setclkr
_setclkr:
	mov	r1,-(sp)		/ save register	used
	clr	_clkruns		/ initialize for no clock
	mov	*$CVECTPS,-(sp)		/ save clock interrupt vector
	mov	*$CVECTPC,-(sp)		/   on caller's stack
	mov	$DISABLE,*$CVECTPS	/ set up new interrupt vector
	mov	$setint,*$CVECTPC
	mov	$COUNT,r1		/ initialize counter for loop
	reset				/ clear other interrupts, if any
	mtps	$ENABLE			/ allow	interrupts
setloop:
	dec	r1			/ loop COUNT times waiting for
	bpl	setloop			/   a clock interrupt
	mtps	$DISABLE		/ no interrupt occurred, so quit
	br	setdone
setint:
	inc	_clkruns		/ clock interrupt jumps here
	add	$4,sp			/ pop pc/ps pushed by interrupt
setdone:
	mov	(sp)+,*$CVECTPC		/ restore old interrupt vector
	mov	(sp)+,*$CVECTPS
	mov	(sp)+,r1		/ restore register
	rts	pc			/ return to caller