Warnings purge: src/arch/i386, src/core/disk.c, ramdisk, autoboot
[people/xl0/gpxe.git] / src / arch / i386 / core / video_subr.c
1 /*
2  *
3  * modified from linuxbios code
4  * by Cai Qiang <rimy2000@hotmail.com>
5  *
6  */
7
8 #include "stddef.h"
9 #include "string.h"
10 #include "io.h"
11 #include "console.h"
12 #include <gpxe/init.h>
13 #include "vga.h"
14
15 struct console_driver vga_console;
16
17 static char *vidmem;            /* The video buffer */
18 static int video_line, video_col;
19
20 #define VIDBUFFER 0xB8000       
21
22 static void memsetw(void *s, int c, unsigned int n)
23 {
24         unsigned int i;
25         u16 *ss = (u16 *) s;
26
27         for (i = 0; i < n; i++) {
28                 ss[i] = ( u16 ) c;
29         }
30 }
31
32 static void video_init(void)
33 {
34         static int inited=0;
35
36         vidmem = (char *)phys_to_virt(VIDBUFFER);
37
38         if (!inited) {
39                 video_line = 0;
40                 video_col = 0;
41         
42                 memsetw(vidmem, VGA_ATTR_CLR_WHT, 2*1024); //
43
44                 inited=1;
45         }
46 }
47
48 static void video_scroll(void)
49 {
50         int i;
51
52         memcpy(vidmem, vidmem + COLS * 2, (LINES - 1) * COLS * 2);
53         for (i = (LINES - 1) * COLS * 2; i < LINES * COLS * 2; i += 2)
54                 vidmem[i] = ' ';
55 }
56
57 static void vga_putc(int byte)
58 {
59         if (byte == '\n') {
60                 video_line++;
61                 video_col = 0;
62
63         } else if (byte == '\r') {
64                 video_col = 0;
65
66         } else if (byte == '\b') {
67                 video_col--;
68
69         } else if (byte == '\t') {
70                 video_col += 4;
71
72         } else if (byte == '\a') {
73                 //beep
74                 //beep(500);
75
76         } else {
77                 vidmem[((video_col + (video_line *COLS)) * 2)] = byte;
78                 vidmem[((video_col + (video_line *COLS)) * 2) +1] = VGA_ATTR_CLR_WHT;
79                 video_col++;
80         }
81         if (video_col < 0) {
82                 video_col = 0;
83         }
84         if (video_col >= COLS) {
85                 video_line++;
86                 video_col = 0;
87         }
88         if (video_line >= LINES) {
89                 video_scroll();
90                 video_line--;
91         }
92         // move the cursor
93         write_crtc((video_col + (video_line *COLS)) >> 8, CRTC_CURSOR_HI);
94         write_crtc((video_col + (video_line *COLS)) & 0x0ff, CRTC_CURSOR_LO);
95 }
96
97 struct console_driver vga_console __console_driver = {
98         .putchar = vga_putc,
99         .disabled = 1,
100 };
101
102 INIT_FN ( INIT_CONSOLE, video_init, NULL, NULL );