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

📄 bmd.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	volatile register u_long  *lp, *lq;	register int i;	fp = &bmdfont[c][0];	switch (col % 4) {	case 0:		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));		for (i = 0; i < FB_HIGHT; i++) {			*q = (*p & 0x000F) | (*fp & 0xFFF0);			p += 128;			q += 128;			fp++;		}		break;	case 1:		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));		for (i = 0; i < FB_HIGHT; i++) {			*lq = (*lp & 0xFFF000FF) | ((u_long)(*fp & 0xFFF0) << 4);			lp += 64;			lq += 64;			fp++;		}		break;	case 2:		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );		for (i = 0; i < FB_HIGHT; i++) {			*lq = (*lp & 0xFF000FFF) | ((u_long)(*fp & 0xFFF0) << 8);			lp += 64;			lq += 64;			fp++;		}		break;	case 3:		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );		for (i = 0; i < FB_HIGHT; i++) {			*q = (*p & 0xF000) | ((*fp & 0xFFF0) >> 4);			p += 128;			q += 128;			fp++;		}		break;	default:		break;	}}voidbmd_reverse_char(raddr, waddr, col, row)	char *raddr;	char *waddr;	int col;	int row;{	volatile register u_short  *p,  *q,  us;	volatile register u_long  *lp, *lq,  ul;	register int i;	switch (col%4) {	case 0:		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));		for (i = 0; i < FB_HIGHT; i++) {			*q = (*p & 0x000F) | (~(*p) & 0xFFF0);			p += 128;			q += 128;		}		break;	case 1:		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ));		for (i = 0; i < FB_HIGHT; i++) {			*lq = (*lp & 0xFFF000FF) | (~(*lp) & 0x000FFF00);			lp += 64;			lq += 64;		}		break;	case 2:		lp = (u_long *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );		lq = (u_long *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 2 );		for (i = 0; i < FB_HIGHT; i++) {			*lq = (*lp & 0xFF000FFF) | (~(*lp) & 0x00FFF000);			lp += 64;			lq += 64;		}		break;	case 3:		p = (u_short *) ( raddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );		q = (u_short *) ( waddr + (( row * FB_HIGHT ) << 8 ) + (( col / 4 ) * 6 ) + 4 );		for (i = 0; i < FB_HIGHT; i++) {			*q = (*p & 0xF000) | (~(*p) & 0x0FFF);			p += 128;			q += 128;		}		break;	default:		break;	}}voidbmd_erase_char(raddr, waddr, col, row)	char *raddr;	char *waddr;	int col;	int row;{	bmd_draw_char(raddr, waddr, col, row, 0);	return;}/* * screen operation routines */voidbmd_erase_screen(lp)	volatile register u_long *lp;{	register int i, j;	for (i = 0; i < SB_HIGHT; i++) {		for (j = 0; j < SL_WIDTH; j++)			*lp++ = 0;		SKIP_NEXT_LINE(lp);	}	return;}voidbmd_scroll_screen(lp, lq, xmin, xmax, ymin, ymax)	volatile register u_long *lp;	volatile register u_long *lq;	int xmin, xmax, ymin, ymax;{	register int i, j;	lp += ((PL_WIDTH * FB_HIGHT) * (ymin + 1));	lq += ((PL_WIDTH * FB_HIGHT) *  ymin);	for (i = 0; i < ((ymax - ymin -1) * FB_HIGHT); i++) {		for (j = 0; j < SL_WIDTH; j++) {			*lq++ = *lp++;		}		lp += (PL_WIDTH - SL_WIDTH);		lq += (PL_WIDTH - SL_WIDTH);	}	for (i = 0; i < FB_HIGHT; i++) {		for (j = 0; j < SL_WIDTH; j++) {			*lq++ = 0;		}		lq += (PL_WIDTH - SL_WIDTH);	}}#ifdef	BMD_PRINTF#include <machine/stdarg.h>void		bmd_kprintf();static char *	bmd_sprintn();void#ifdef __STDC__bmd_printf(const char *fmt, ...)#elsebmd_printf(fmt, va_alist)	char *fmt;#endif{	va_list ap;	va_start(ap, fmt);	bmd_kprintf(fmt, ap);	va_end(ap);}/* * Scaled down version of printf(3). * * Two additional formats: * * The format %b is supported to decode error registers. * Its usage is: * *	printf("reg=%b\n", regval, "<base><arg>*"); * * where <base> is the output base expressed as a control character, e.g. * \10 gives octal; \20 gives hex.  Each arg is a sequence of characters, * the first of which gives the bit number to be inspected (origin 1), and * the next characters (up to a control character, i.e. a character <= 32), * give the name of the register.  Thus: * *	kprintf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n"); * * would produce output: * *	reg=3<BITTWO,BITONE> * * The format %r passes an additional format string and argument list * recursively.  Its usage is: * * fn(char *fmt, ...) * { *	va_list ap; *	va_start(ap, fmt); *	printf("prefix: %r: suffix\n", fmt, ap); *	va_end(ap); * } * * Space or zero padding and a field width are supported for the numeric * formats only. */voidbmd_kprintf(fmt, ap)	register const char *fmt;	va_list ap;{	register char *p, *q;	register int ch, n;	u_long ul;	int base, lflag, tmp, width;	char padc;	for (;;) {		padc = ' ';		width = 0;		while ((ch = *(u_char *)fmt++) != '%') {			if (ch == '\0')				return;			if (ch == '\n')				bmdputc('\r');			bmdputc(ch);		}		lflag = 0;reswitch:	switch (ch = *(u_char *)fmt++) {		case '0':			padc = '0';			goto reswitch;		case '1': case '2': case '3': case '4':		case '5': case '6': case '7': case '8': case '9':			for (width = 0;; ++fmt) {				width = width * 10 + ch - '0';				ch = *fmt;				if (ch < '0' || ch > '9')					break;			}			goto reswitch;		case 'l':			lflag = 1;			goto reswitch;		case 'b':			ul = va_arg(ap, int);			p = va_arg(ap, char *);			for (q = bmd_sprintn(ul, *p++, NULL); ch = *q--;)				bmdputc(ch);			if (!ul)				break;			for (tmp = 0; n = *p++;) {				if (ul & (1 << (n - 1))) {					bmdputc(tmp ? ',' : '<');					for (; (n = *p) > ' '; ++p)						bmdputc(n);					tmp = 1;				} else					for (; *p > ' '; ++p)						continue;			}			if (tmp)				bmdputc('>');			break;		case 'c':			bmdputc(va_arg(ap, int));			break;		case 'r':			p = va_arg(ap, char *);			bmd_kprintf(p, va_arg(ap, va_list));			break;		case 's':			p = va_arg(ap, char *);			while (ch = *p++)				bmdputc(ch);			break;		case 'd':			ul = lflag ? va_arg(ap, long) : va_arg(ap, int);			if ((long)ul < 0) {				bmdputc('-');				ul = -(long)ul;			}			base = 10;			goto number;		case 'o':			ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);			base = 8;			goto number;		case 'u':			ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);			base = 10;			goto number;		case 'x':			ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);			base = 16;number:			p = bmd_sprintn(ul, base, &tmp);			if (width && (width -= tmp) > 0)				while (width--)					bmdputc(padc);			while (ch = *p--)				bmdputc(ch);			break;		default:			bmdputc('%');			if (lflag)				bmdputc('l');			/* FALLTHROUGH */		case '%':			bmdputc(ch);		}	}}/* * Put a number (base <= 16) in a buffer in reverse order; return an * optional length and a pointer to the NULL terminated (preceded?) * buffer. */static char *bmd_sprintn(ul, base, lenp)	register u_long ul;	register int base, *lenp;{					/* A long in base 8, plus NULL. */	static char buf[sizeof(long) * NBBY / 3 + 2];	register char *p;	p = buf;	do {		*++p = "0123456789abcdef"[ul % base];	} while (ul /= base);	if (lenp)		*lenp = p - buf;	return (p);}#endif

⌨️ 快捷键说明

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