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

📄 misc.c

📁 freebsd v4.4内核源码
💻 C
字号:
/**************************************************************************MISC Support Routines**************************************************************************/#include "netboot.h"#ifdef	PC98#include "../../pc98/pc98.h"void putchar(int c);void putc(int c);#endif#define NO_SWITCH		/* saves space *//**************************************************************************TWIDDLE**************************************************************************/twiddle(){	static int count=0;	char tiddles[]="-\\|/";	putchar(tiddles[(count++)&3]);	putchar('\b');}/**************************************************************************BCOPY**************************************************************************/bcopy(s,d,n)	char *s, *d;	int n;{	while ((n--) > 0) {		*(d++) = *(s++);	}}/**************************************************************************BZERO**************************************************************************/bzero(d,n)	char *d;	int n;{	while ((n--) > 0) {		*(d++) = 0;	}}/**************************************************************************BCOMPARE**************************************************************************/bcompare(d,s,n)	char *d,*s;	int n;{	while ((n--) > 0) {		if (*(d++) != *(s++)) return(0);	}	return(1);}/**************************************************************************SUBSTR (slightly wacky but functional)**************************************************************************/char *substr(a,b)char *a,*b;{char *loc1;char *loc2;        while (*a != '\0') {                loc1 = a;                loc2 = b;                while (*loc1 == *loc2++) {                        if (*loc1 == '\0') return (0);                        loc1++;                        if (*loc2 == '\0') return (loc1);                }        a++;        }        return (0);}/**************************************************************************PRINTF and friends	Formats:		%X	- 4 byte ASCII (8 hex digits)		%x	- 2 byte ASCII (4 hex digits)		%b	- 1 byte ASCII (2 hex digits)		%d	- decimal		%c	- ASCII char		%s	- ASCII string		%I	- Internet address in x.x.x.x notation		%L	- Binary long		%S	- String (multiple of 4 bytes) preceded with 4 byte			  binary length		%M	- Copy memory.  Takes two args, len and ptr**************************************************************************/static char hex[]="0123456789ABCDEF";char *do_printf(buf, fmt, dp)	char *buf, *fmt;	int  *dp;{	register char *p;	char tmp[16];	while (*fmt) {		if (*fmt == '%') {	/* switch() uses more space */			fmt++;			if (*fmt == 'L') {				register int h = *(dp++);				*(buf++) = h>>24;				*(buf++) = h>>16;				*(buf++) = h>>8;				*(buf++) = h;			}			if (*fmt == 'S') {				register int len = 0;				char *lenptr = buf;				p = (char *)*dp++;				buf += 4;				while (*p) {					*(buf++) = *p++;					len ++;				}				*(lenptr++) = len>>24;				*(lenptr++) = len>>16;				*(lenptr++) = len>>8;				*lenptr = len;				while (len & 3) {					*(buf++) = 0;					len ++;				}			}			if (*fmt == 'M') {				register int len = *(dp++);				bcopy((char *)*dp++, buf, len);				buf += len;			}			if (*fmt == 'X') {				register int h = *(dp++);				*(buf++) = hex[(h>>28)& 0x0F];				*(buf++) = hex[(h>>24)& 0x0F];				*(buf++) = hex[(h>>20)& 0x0F];				*(buf++) = hex[(h>>16)& 0x0F];				*(buf++) = hex[(h>>12)& 0x0F];				*(buf++) = hex[(h>>8)& 0x0F];				*(buf++) = hex[(h>>4)& 0x0F];				*(buf++) = hex[h& 0x0F];			}			if (*fmt == 'x') {				register int h = *(dp++);				*(buf++) = hex[(h>>12)& 0x0F];				*(buf++) = hex[(h>>8)& 0x0F];				*(buf++) = hex[(h>>4)& 0x0F];				*(buf++) = hex[h& 0x0F];			}			if (*fmt == 'b') {				register int h = *(dp++);				*(buf++) = hex[(h>>4)& 0x0F];				*(buf++) = hex[h& 0x0F];			}			if (*fmt == 'd') {				register int dec = *(dp++);				p = tmp;				if (dec < 0) {					*(buf++) = '-';					dec = -dec;				}				do {					*(p++) = '0' + (dec%10);					dec = dec/10;				} while(dec);				while ((--p) >= tmp) *(buf++) = *p;			}			if (*fmt == 'I') {				buf = sprintf(buf,"%d.%d.%d.%d",					(*(dp)>>24) & 0x00FF,					(*(dp)>>16) & 0x00FF,					(*(dp)>>8) & 0x00FF,					*dp & 0x00FF);				dp++;			}			if (*fmt == 'c')				*(buf++) = *(dp++);			if (*fmt == 's') {				p = (char *)*dp++;				while (*p) *(buf++) = *p++;			}		} else *(buf++) = *fmt;		fmt++;	}	*buf = 0;	return(buf);}char *sprintf(buf, fmt, data)	char *fmt, *buf;	int data;{	return(do_printf(buf,fmt, &data));}printf(fmt,data)	char *fmt;	int data;{	char buf[1024],*p;	p = buf;	do_printf(buf,fmt,&data);	while (*p) {		if (*p=='\n') putchar('\r');		putchar(*p++);	}}/**************************************************************************SETIP - Convert an ascii x.x.x.x to binary form**************************************************************************/setip(p, i)	char *p;	unsigned *i;{	unsigned ip = 0;	int val;	if (((val = getdec(&p)) < 0) || (val > 255)) return(0);	if (*p != '.') return(0);	p++;	ip = val;	if (((val = getdec(&p)) < 0) || (val > 255)) return(0);	if (*p != '.') return(0);	p++;	ip = (ip << 8) | val;	if (((val = getdec(&p)) < 0) || (val > 255)) return(0);	if (*p != '.') return(0);	p++;	ip = (ip << 8) | val;	if (((val = getdec(&p)) < 0) || (val > 255)) return(0);	*i = (ip << 8) | val;	return(1);}getdec(ptr)	char **ptr;{	char *p = *ptr;	int ret=0;	if ((*p < '0') || (*p > '9')) return(-1);	while ((*p >= '0') && (*p <= '9')) {		ret = ret*10 + (*p - '0');		p++;	}	*ptr = p;	return(ret);}#define K_RDWR 		0x60		/* keyboard data & cmds (read/write) */#define K_STATUS 	0x64		/* keyboard status */#define K_CMD	 	0x64		/* keybd ctlr command (write-only) */#define K_OBUF_FUL 	0x01		/* output buffer full */#define K_IBUF_FUL 	0x02		/* input buffer full */#define KC_CMD_WIN	0xd0		/* read  output port */#define KC_CMD_WOUT	0xd1		/* write output port */#define KB_A20		0x9f		/* enable A20,					   enable output buffer full interrupt					   enable data line					   disable clock line *//* * Gate A20 for high memory */unsigned char	x_20 = KB_A20;gateA20(){#ifdef PC98	outb(0xf2, 0x00);	outb(0xf6, 0x02);#else#ifdef	IBM_L40	outb(0x92, 0x2);#else	IBM_L40	while (inb(K_STATUS) & K_IBUF_FUL);	while (inb(K_STATUS) & K_OBUF_FUL)		(void)inb(K_RDWR);	outb(K_CMD, KC_CMD_WOUT);	while (inb(K_STATUS) & K_IBUF_FUL);	outb(K_RDWR, x_20);	while (inb(K_STATUS) & K_IBUF_FUL);#endif	IBM_L40#endif}#ifdef	PC98voidputchar(int c){	if (c == '\n')		putc('\r');	putc(c);}static unsigned short *Crtat = (unsigned short *)0;static int row;static int col;void putc(int c){	static unsigned short *crtat;	unsigned char sys_type;	unsigned short *cp;	int i, pos;	if (Crtat == 0) {		sys_type = *(unsigned char *)0x0a1501/*0x11501*/;		if (sys_type & 0x08) {			Crtat = (unsigned short *)0x0e0000/*0x50000*/;			crtat = Crtat;			row = 31;			col = 80;		} else {			Crtat = (unsigned short *)0x0a0000/*0x10000*/;			crtat = Crtat;			row = 25;			col = 80;		}	}	switch(c) {	case '\t':		do {			putc(' ');		} while ((int)crtat % 16);		break;	case '\b':		crtat--;		break;	case '\r':		crtat -= (crtat - Crtat) % col;		break;	case '\n':		crtat += col;		break;	default:		*crtat = (c == 0x5c ? 0xfc : c);		*(crtat++ + 0x1000) = 0xe1;		break;	}	if (crtat >= Crtat + col * row) {		for (i = 1; i < row; i++)			bcopy(Crtat+col*i, Crtat+col*(i-1), col*2);		for (i = 0, cp = Crtat + col * (row - 1); i < col*2; i++) {			*cp++ = ' ';		}		crtat -= col;	}	pos = crtat - Crtat;	while((inb(0x60) & 0x04) == 0) {}	outb(0x62, 0x49);	outb(0x60, pos & 0xff);	outb(0x60, pos >> 8);}unsigned int bios98getdate();unsigned int currticks() {	unsigned int biostime = bios98getdate() >> 8;	unsigned int time;	static unsigned int oldtime;	time = ((   (biostime >> 4)  & 0x0f)*10		+   (biostime        & 0x0f))*3600	/*  hour    */		+ (((biostime >> 12) & 0x0f)*10		+  ((biostime >>  8) & 0x0f))*60	/*  minute  */		+ (((biostime >> 20) & 0x0f)*10		+  ((biostime >> 16) & 0x0f));		/*  second  */	while(oldtime > time)		time += 24*3600;	oldtime = time;	return time*20;}void machine_check(void){	int	ret;	int	i;	int	data = 0;	u_char epson_machine_id = *(unsigned char *)(0x0a1624/*0x11624*/);		/* PC98_SYSTEM_PARAMETER(0x501) */	ret = ((*(unsigned char*)0x0a1501/*0x11501*/) & 0x08) >> 3;	/* wait V-SYNC */	while (inb(0x60) & 0x20) {}	while (!(inb(0x60) & 0x20)) {}	/* ANK 'A' font */	outb(0xa1, 0x00);	outb(0xa3, 0x41);	if (ret & M_NORMAL) {		/* M_NORMAL, use CG window (all NEC OK)  */		/* sum */		for (i = 0; i < 4; i++) {			data += *((unsigned long*)0x0a4000/*0x14000*/ + i);/* 0xa4000 */		}		if (data == 0x6efc58fc) { /* DA data */			ret |= M_NEC_PC98;		} else {			ret |= M_EPSON_PC98;		}		ret |= (inb(0x42) & 0x20) ? M_8M : 0;	} else {		/* M_HIGHRESO, use CG window */		/* sum */		for (i = 0; i < 12; i++) {			data += *((unsigned long*)0x0e4000/*0x54000*/ + i); /* 0xe4000 */		}		if ( data == 0x50154624) { /* XA data */			ret |= M_NEC_PC98;		} else {			ret |= M_EPSON_PC98;		}		ret |= (inb(0x63) & 0x01) ? M_8M : 0;	}	/* PC98_SYSTEM_PARAMETER(0x400) */	if ((*(unsigned char*)0xa1400/*0x11400*/) & 0x80) {		ret |= M_NOTE;	}	if (ret & M_NEC_PC98) {		/* PC98_SYSTEM_PARAMETER(0x458) */		if ((*(unsigned char*)0x0a1458/*0x11458*/) & 0x80) {			ret |= M_H98;		} else {			ret |= M_NOT_H98;		}	} else {		ret |= M_NOT_H98;		switch (epson_machine_id) {		case 0x20:	/* note A */		case 0x22:	/* note W */		case 0x27:	/* note AE */		case 0x2a:	/* note WR */		/*case 0x2:	/* note AR */			ret |= M_NOTE;			break;		default:			    break;		}	}	(*(unsigned long *)(0x0a1620/*0x11620*/)) = ret;}#endif

⌨️ 快捷键说明

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