Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / ipxe / 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 <ipxe/io.h>
11 #include <ipxe/console.h>
12 #include <ipxe/init.h>
13 #include "vga.h"
14 #include <config/console.h>
15
16 /* Set default console usage if applicable */
17 #if ! ( defined ( CONSOLE_DIRECT_VGA ) && \
18         CONSOLE_EXPLICIT ( CONSOLE_DIRECT_VGA ) )
19 #undef CONSOLE_DIRECT_VGA
20 #define CONSOLE_DIRECT_VGA ( CONSOLE_USAGE_ALL & ~CONSOLE_USAGE_LOG )
21 #endif
22
23 struct console_driver vga_console __console_driver;
24
25 static char *vidmem;            /* The video buffer */
26 static int video_line, video_col;
27
28 #define VIDBUFFER 0xB8000       
29
30 static void memsetw(void *s, int c, unsigned int n)
31 {
32         unsigned int i;
33         u16 *ss = (u16 *) s;
34
35         for (i = 0; i < n; i++) {
36                 ss[i] = ( u16 ) c;
37         }
38 }
39
40 static void video_init(void)
41 {
42         static int inited=0;
43
44         vidmem = (char *)phys_to_virt(VIDBUFFER);
45
46         if (!inited) {
47                 video_line = 0;
48                 video_col = 0;
49         
50                 memsetw(vidmem, VGA_ATTR_CLR_WHT, 2*1024); //
51
52                 inited=1;
53         }
54 }
55
56 static void video_scroll(void)
57 {
58         int i;
59
60         memcpy(vidmem, vidmem + COLS * 2, (LINES - 1) * COLS * 2);
61         for (i = (LINES - 1) * COLS * 2; i < LINES * COLS * 2; i += 2)
62                 vidmem[i] = ' ';
63 }
64
65 static void vga_putc(int byte)
66 {
67         if (byte == '\n') {
68                 video_line++;
69                 video_col = 0;
70
71         } else if (byte == '\r') {
72                 video_col = 0;
73
74         } else if (byte == '\b') {
75                 video_col--;
76
77         } else if (byte == '\t') {
78                 video_col += 4;
79
80         } else if (byte == '\a') {
81                 //beep
82                 //beep(500);
83
84         } else {
85                 vidmem[((video_col + (video_line *COLS)) * 2)] = byte;
86                 vidmem[((video_col + (video_line *COLS)) * 2) +1] = VGA_ATTR_CLR_WHT;
87                 video_col++;
88         }
89         if (video_col < 0) {
90                 video_col = 0;
91         }
92         if (video_col >= COLS) {
93                 video_line++;
94                 video_col = 0;
95         }
96         if (video_line >= LINES) {
97                 video_scroll();
98                 video_line--;
99         }
100         // move the cursor
101         write_crtc((video_col + (video_line *COLS)) >> 8, CRTC_CURSOR_HI);
102         write_crtc((video_col + (video_line *COLS)) & 0x0ff, CRTC_CURSOR_LO);
103 }
104
105 struct console_driver vga_console __console_driver = {
106         .putchar = vga_putc,
107         .disabled = CONSOLE_DISABLED,
108         .usage = CONSOLE_DIRECT_VGA,
109 };
110
111 struct init_fn video_init_fn __init_fn ( INIT_EARLY ) = {
112         .initialise = video_init,
113 };