📄 bmd.c
字号:
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 + -