⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 toy.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "all.h"#include "io.h"#include "mem.h"enum {	Paddr=		0x70,	/* address port */	Pdata=		0x71,	/* data port */	Seconds=	0x00,	Minutes=	0x02,	Hours=		0x04, 	Mday=		0x07,	Month=		0x08,	Year=		0x09,	Status=		0x0A,	Nbcd=		6,};#define GETBCD(o)	((bcdclock[o]&0xf) + 10*(bcdclock[o]>>4))#define PUTBCD(n,o)	bcdclock[o] = (n % 10) | (((n / 10) % 10)<<4)static Lock rtclock;voidsetrtc(Timet secs){	Rtc rtc;	uchar bcdclock[Nbcd];	sec2rtc(secs, &rtc);	PUTBCD(rtc.sec, 0);	PUTBCD(rtc.min, 1);	PUTBCD(rtc.hour, 2);	PUTBCD(rtc.mday, 3);	PUTBCD(rtc.mon, 4);	PUTBCD(rtc.year, 5);	ilock(&rtclock);	outb(Paddr, Seconds);	outb(Pdata, bcdclock[0]);	outb(Paddr, Minutes);	outb(Pdata, bcdclock[1]);	outb(Paddr, Hours);	outb(Pdata, bcdclock[2]);	outb(Paddr, Mday);	outb(Pdata, bcdclock[3]);	outb(Paddr, Month);	outb(Pdata, bcdclock[4]);	outb(Paddr, Year);	outb(Pdata, bcdclock[5]);	iunlock(&rtclock);}static ulong	 _rtctime(void){	uchar bcdclock[Nbcd];	Rtc rtc;	int i;	/* don't do the read until the clock is no longer busy */	for(i = 0; i < 10000; i++){		outb(Paddr, Status);		if(inb(Pdata) & 0x80)			continue;		/* read clock values */		outb(Paddr, Seconds);	bcdclock[0] = inb(Pdata);		outb(Paddr, Minutes);	bcdclock[1] = inb(Pdata);		outb(Paddr, Hours);	bcdclock[2] = inb(Pdata);		outb(Paddr, Mday);	bcdclock[3] = inb(Pdata);		outb(Paddr, Month);	bcdclock[4] = inb(Pdata);		outb(Paddr, Year);	bcdclock[5] = inb(Pdata);		outb(Paddr, Status);		if((inb(Pdata) & 0x80) == 0)			break;	}	/*	 *  convert from BCD	 */	rtc.sec = GETBCD(0);	rtc.min = GETBCD(1);	rtc.hour = GETBCD(2);	rtc.mday = GETBCD(3);	rtc.mon = GETBCD(4);	rtc.year = GETBCD(5);	/*	 *  the world starts jan 1 1970	 */	if(rtc.year < 70)		rtc.year += 2000;	else		rtc.year += 1900;	return rtc2sec(&rtc);}Timetrtctime(void){	int i;	Timet t, ot;	ilock(&rtclock);	/* loop till we get two reads in a row the same */	t = _rtctime();	for(i = 0; i < 100; i++){		ot = t;		t = _rtctime();		if(ot == t)			break;	}	iunlock(&rtclock);	return t;}ucharnvramread(int offset){	outb(Paddr, offset);	return inb(Pdata);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -