/* * Copyright (c) 2008, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include <boot/boot.h> #include <boot/font5x12.h> static unsigned short BGCOLOR = 0x001F; static unsigned short FGCOLOR = 0xFFFF; static void drawglyph(unsigned short *pixels, unsigned short paint, unsigned stride, unsigned *glyph) { unsigned x, y, data; stride -= 5; data = glyph[0]; for(y = 0; y < 6; y++) { for(x = 0; x < 5; x++) { if(data & 1) *pixels = paint; data >>= 1; pixels++; } pixels += stride; } data = glyph[1]; for(y = 0; y < 6; y++) { for(x = 0; x < 5; x++) { if(data & 1) *pixels = paint; data >>= 1; pixels++; } pixels += stride; } } #if 0 static void drawtext(unsigned x, unsigned y, unsigned paint, const char *text) { unsigned short *pixels = mddi_framebuffer(); unsigned stride = fb_width; char c; while((c = *text++)) { if((c < ' ') || (c > 127)) continue; c = (c - 32) * 2; drawglyph(pixels + y*stride + x, paint, stride, font5x12 + c); x += 6; } } #endif static int cx, cy, cmaxx, cmaxy; void console_clear(void) { unsigned short *dst = mddi_framebuffer(); unsigned count = fb_width * fb_height; cx = 0; cy = 0; while(count--) *dst++ = BGCOLOR; } static void scroll_up(void) { unsigned short *dst = mddi_framebuffer(); unsigned short *src = dst + (fb_width * 12); unsigned count = fb_height * (fb_width - 12); while(count--) { *dst++ = *src++; } count = fb_width * 12; while(count--) { *dst++ = BGCOLOR; } } void console_putc(unsigned c) { unsigned short *pixels; if(c > 127) return; if(c < 32) { if(c == '\n') goto newline; return; } pixels = mddi_framebuffer(); drawglyph(pixels + cy * 12 * fb_width + cx * 6, FGCOLOR, fb_width, font5x12 + (c - 32) * 2); cx++; if(cx < cmaxx) return; newline: cy++; cx = 0; if(cy >= cmaxy) { cy = cmaxy - 1; scroll_up(); } } void console_flush(void) { mddi_start_update(); while(!mddi_update_done()) ; } void console_set_colors(unsigned bg, unsigned fg) { BGCOLOR = bg; FGCOLOR = fg; } void console_init(void) { mddi_init(); cmaxx = fb_width / 6; cmaxy = (fb_height-1) / 12; cx = 0; cy = 0; console_clear(); console_flush(); }