video_subr.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #include "stddef.h"
00009 #include "string.h"
00010 #include <gpxe/io.h>
00011 #include "console.h"
00012 #include <gpxe/init.h>
00013 #include "vga.h"
00014
00015 struct console_driver vga_console;
00016
00017 static char *vidmem;
00018 static int video_line, video_col;
00019
00020 #define VIDBUFFER 0xB8000
00021
00022 static void memsetw(void *s, int c, unsigned int n)
00023 {
00024 unsigned int i;
00025 u16 *ss = (u16 *) s;
00026
00027 for (i = 0; i < n; i++) {
00028 ss[i] = ( u16 ) c;
00029 }
00030 }
00031
00032 static void video_init(void)
00033 {
00034 static int inited=0;
00035
00036 vidmem = (char *)phys_to_virt(VIDBUFFER);
00037
00038 if (!inited) {
00039 video_line = 0;
00040 video_col = 0;
00041
00042 memsetw(vidmem, VGA_ATTR_CLR_WHT, 2*1024);
00043
00044 inited=1;
00045 }
00046 }
00047
00048 static void video_scroll(void)
00049 {
00050 int i;
00051
00052 memcpy(vidmem, vidmem + COLS * 2, (LINES - 1) * COLS * 2);
00053 for (i = (LINES - 1) * COLS * 2; i < LINES * COLS * 2; i += 2)
00054 vidmem[i] = ' ';
00055 }
00056
00057 static void vga_putc(int byte)
00058 {
00059 if (byte == '\n') {
00060 video_line++;
00061 video_col = 0;
00062
00063 } else if (byte == '\r') {
00064 video_col = 0;
00065
00066 } else if (byte == '\b') {
00067 video_col--;
00068
00069 } else if (byte == '\t') {
00070 video_col += 4;
00071
00072 } else if (byte == '\a') {
00073
00074
00075
00076 } else {
00077 vidmem[((video_col + (video_line *COLS)) * 2)] = byte;
00078 vidmem[((video_col + (video_line *COLS)) * 2) +1] = VGA_ATTR_CLR_WHT;
00079 video_col++;
00080 }
00081 if (video_col < 0) {
00082 video_col = 0;
00083 }
00084 if (video_col >= COLS) {
00085 video_line++;
00086 video_col = 0;
00087 }
00088 if (video_line >= LINES) {
00089 video_scroll();
00090 video_line--;
00091 }
00092
00093 write_crtc((video_col + (video_line *COLS)) >> 8, CRTC_CURSOR_HI);
00094 write_crtc((video_col + (video_line *COLS)) & 0x0ff, CRTC_CURSOR_LO);
00095 }
00096
00097 struct console_driver vga_console __console_driver = {
00098 .putchar = vga_putc,
00099 .disabled = 1,
00100 };
00101
00102 struct init_fn video_init_fn __init_fn ( INIT_EARLY ) = {
00103 .initialise = video_init,
00104 };