Charles.Forsyth20060303644188019 years agoHistory
71 lines · 992 B · C
RawDownload
#include	"u.h"#include	"lib.h"#include	"mem.h"#include	"dat.h"#include	"fns.h"#include	"io.h"#include	"ureg.h" enum {	Timebase = 4,	/* system clock cycles per time base cycle */}; void	(*archclocktick)(void);	/* set by arch*.c when desired */ static	ulong	clkreload; voiddelay(int l){	ulong i, j; 	j = m->delayloop;	while(l-- > 0)		for(i=0; i < j; i++)			;} voidmicrodelay(int l){	ulong i; 	l *= m->delayloop;	l /= 1000;	if(l <= 0)		l = 1;	for(i = 0; i < l; i++)		;} voidclockintr(Ureg*, void*){	putdec(clkreload);	m->ticks++;	checkalarms();	if(archclocktick != nil)		archclocktick();} voidclockinit(void){	long x; 	m->delayloop = m->cpuhz/1000;	/* initial estimate */	do {		x = gettbl();		delay(10);		x = gettbl() - x;	} while(x < 0); 	/*	 *  fix count	 */	m->delayloop = ((vlong)m->delayloop*(10*m->clockgen/1000))/(x*Timebase);	if(m->delayloop == 0)		m->delayloop = 1;	clkreload = (m->clockgen/Timebase)/HZ-1;	putdec(clkreload);}