3 * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
5 * See file CREDITS for list of people who contributed to this
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
26 #include <stdio_dev.h>
28 #include <asm/ptrace.h>
32 /* basic textmode I/O from linux kernel */
33 static char *vidmem = (char *)0xb8000;
35 static int lines, cols;
36 static int orig_x, orig_y;
38 static void beep(int dur)
43 for (i = 0; i < 10*dur; i++)
49 static void scroll(void)
53 memcpy(vidmem, vidmem + cols * 2, (lines - 1) * cols * 2);
54 for (i = (lines - 1) * cols * 2; i < lines * cols * 2; i += 2)
58 static void __video_putc(const char c, int *x, int *y)
62 if (++(*y) >= lines) {
66 } else if (c == '\b') {
69 vidmem[((*x) + cols * (*y)) * 2] = ' ';
71 } else if (c == '\r') {
74 } else if (c == '\a') {
77 } else if (c == '\t') {
78 __video_putc(' ', x, y);
79 __video_putc(' ', x, y);
80 __video_putc(' ', x, y);
81 __video_putc(' ', x, y);
82 __video_putc(' ', x, y);
83 __video_putc(' ', x, y);
84 __video_putc(' ', x, y);
85 __video_putc(' ', x, y);
86 } else if (c == '\v') {
89 __video_putc(' ', x, y);
91 __video_putc(' ', x, y);
93 __video_putc(' ', x, y);
95 __video_putc(' ', x, y);
97 __video_putc(' ', x, y);
99 __video_putc(' ', x, y);
101 __video_putc(' ', x, y);
103 __video_putc(' ', x, y);
105 } else if (c == '\f') {
107 for (i = 0; i < lines * cols * 2; i += 2)
112 vidmem[((*x) + cols * (*y)) * 2] = c;
113 if (++(*x) >= cols) {
115 if (++(*y) >= lines) {
123 static void video_putc(const char c)
130 __video_putc(c, &x, &y);
135 pos = (x + cols * y) * 2; /* Update cursor position */
137 outb_p(0xff & (pos >> 9), vidport+1);
139 outb_p(0xff & (pos >> 1), vidport+1);
142 static void video_puts(const char *s)
150 while ((c = *s++) != '\0')
151 __video_putc(c, &x, &y);
156 pos = (x + cols * y) * 2; /* Update cursor position */
158 outb_p(0xff & (pos >> 9), vidport+1);
160 outb_p(0xff & (pos >> 1), vidport+1);
167 static struct stdio_dev vga_dev;
168 static struct stdio_dev kbd_dev;
170 vidmem = (char *) 0xb8000;
177 pos = inb_p(vidport+1);
180 pos |= inb_p(vidport+1);
186 printf("pos %x %d %d\n", pos, orig_x, orig_y);
191 memset(&vga_dev, 0, sizeof(vga_dev));
192 strcpy(vga_dev.name, "vga");
194 vga_dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_SYSTEM;
195 vga_dev.putc = video_putc; /* 'putc' function */
196 vga_dev.puts = video_puts; /* 'puts' function */
197 vga_dev.tstc = NULL; /* 'tstc' function */
198 vga_dev.getc = NULL; /* 'getc' function */
200 if (stdio_register(&vga_dev) == 0)
203 if (i8042_kbd_init())
206 memset(&kbd_dev, 0, sizeof(kbd_dev));
207 strcpy(kbd_dev.name, "kbd");
209 kbd_dev.flags = DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;
210 kbd_dev.putc = NULL; /* 'putc' function */
211 kbd_dev.puts = NULL; /* 'puts' function */
212 kbd_dev.tstc = i8042_tstc; /* 'tstc' function */
213 kbd_dev.getc = i8042_getc; /* 'getc' function */
215 if (stdio_register(&kbd_dev) == 0)
222 int drv_video_init(void)