henesyinit from p9f47575dc5 years agoHistory
97 lines · 1.5 KB · C
RawDownload
#include	"u.h"#include	"lib.h"#include	"mem.h"#include	"dat.h"#include	"fns.h"#include	"io.h"#include	"ureg.h" /* *  8253 timer */enum{	T0cntr=	0x40,		/* counter ports */	T1cntr=	0x41,		/* ... */	T2cntr=	0x42,		/* ... */	Tmode=	0x43,		/* mode port */ 	/* commands */	Latch0=	0x00,		/* latch counter 0's value */	Load0=	0x30,		/* load counter 0 with 2 bytes */ 	/* modes */	Square=	0x36,		/* perioic square wave */ 	Freq=	1193182,	/* Real clock frequency */}; ulong delayloop = 1000; /* *  delay for l milliseconds more or less.  delayloop is set by *  clockinit() to match the actual CPU speed. */voiddelay(int l){	ulong i; 	while(l-- > 0)		for(i=0; i < delayloop; i++)			;} voidclockinit(void){	ulong x, y;	/* change in counter */ 	/*	 *  set vector for clock interrupts	 */	setvec(Clockvec, clock); 	/*	 *  make clock output a square wave with a 1/HZ period	 */	outb(Tmode, Load0|Square);	outb(T0cntr, (Freq/HZ));	/* low byte */	outb(T0cntr, (Freq/HZ)>>8);	/* high byte */ 	/*	 *  measure time for delay(10) with current delayloop count	 */	outb(Tmode, Latch0);	x = inb(T0cntr);	x |= inb(T0cntr)<<8;	delay(10);	outb(Tmode, Latch0);	y = inb(T0cntr);	y |= inb(T0cntr)<<8;	x -= y; 	/*	 *  fix count, the factor of 2 is a hack	 */	delayloop = (delayloop*1193*10)/x;	if(delayloop == 0)		delayloop = 1;} voidclock(Ureg *ur){	Proc *p; 	m->ticks++; 	checkalarms(); 	p = m->proc;	if(p){		p->pc = ur->pc;		if (p->state==Running)			p->time[p->insyscall]++;	}}