1*433d6423SLionel Sambuc
2*433d6423SLionel Sambuc #include <minix/minlib.h>
3*433d6423SLionel Sambuc #include <minix/cpufeature.h>
4*433d6423SLionel Sambuc #include <machine/partition.h>
5*433d6423SLionel Sambuc #include "string.h"
6*433d6423SLionel Sambuc #include "direct_utils.h"
7*433d6423SLionel Sambuc #include "serial.h"
8*433d6423SLionel Sambuc #include "glo.h"
9*433d6423SLionel Sambuc
10*433d6423SLionel Sambuc /* Give non-zero values to avoid them in BSS */
11*433d6423SLionel Sambuc static int print_line = 1, print_col = 1;
12*433d6423SLionel Sambuc
13*433d6423SLionel Sambuc #include <sys/video.h>
14*433d6423SLionel Sambuc
15*433d6423SLionel Sambuc extern char *video_mem;
16*433d6423SLionel Sambuc #define VIDOFFSET(line, col) ((line) * MULTIBOOT_CONSOLE_COLS * 2 + (col) * 2)
17*433d6423SLionel Sambuc #define VIDSIZE VIDOFFSET(MULTIBOOT_CONSOLE_LINES-1,MULTIBOOT_CONSOLE_COLS-1)
18*433d6423SLionel Sambuc
direct_put_char(char c,int line,int col)19*433d6423SLionel Sambuc void direct_put_char(char c, int line, int col)
20*433d6423SLionel Sambuc {
21*433d6423SLionel Sambuc int offset = VIDOFFSET(line, col);
22*433d6423SLionel Sambuc video_mem[offset] = c;
23*433d6423SLionel Sambuc video_mem[offset+1] = 0x07; /* grey-on-black */
24*433d6423SLionel Sambuc }
25*433d6423SLionel Sambuc
direct_get_char(int line,int col)26*433d6423SLionel Sambuc static char direct_get_char(int line, int col)
27*433d6423SLionel Sambuc {
28*433d6423SLionel Sambuc return video_mem[VIDOFFSET(line, col)];
29*433d6423SLionel Sambuc }
30*433d6423SLionel Sambuc
direct_cls(void)31*433d6423SLionel Sambuc void direct_cls(void)
32*433d6423SLionel Sambuc {
33*433d6423SLionel Sambuc /* Clear screen */
34*433d6423SLionel Sambuc int i,j;
35*433d6423SLionel Sambuc
36*433d6423SLionel Sambuc for(i = 0; i < MULTIBOOT_CONSOLE_COLS; i++)
37*433d6423SLionel Sambuc for(j = 0; j < MULTIBOOT_CONSOLE_LINES; j++)
38*433d6423SLionel Sambuc direct_put_char(' ', j, i);
39*433d6423SLionel Sambuc
40*433d6423SLionel Sambuc print_line = print_col = 0;
41*433d6423SLionel Sambuc
42*433d6423SLionel Sambuc /* Tell video hardware origin is 0. */
43*433d6423SLionel Sambuc outb(C_6845+INDEX, VID_ORG);
44*433d6423SLionel Sambuc outb(C_6845+DATA, 0);
45*433d6423SLionel Sambuc outb(C_6845+INDEX, VID_ORG+1);
46*433d6423SLionel Sambuc outb(C_6845+DATA, 0);
47*433d6423SLionel Sambuc }
48*433d6423SLionel Sambuc
direct_scroll_up(int lines)49*433d6423SLionel Sambuc static void direct_scroll_up(int lines)
50*433d6423SLionel Sambuc {
51*433d6423SLionel Sambuc int i, j;
52*433d6423SLionel Sambuc for (i = 0; i < MULTIBOOT_CONSOLE_LINES; i++ ) {
53*433d6423SLionel Sambuc for (j = 0; j < MULTIBOOT_CONSOLE_COLS; j++ ) {
54*433d6423SLionel Sambuc char c = 0;
55*433d6423SLionel Sambuc if(i < MULTIBOOT_CONSOLE_LINES-lines)
56*433d6423SLionel Sambuc c = direct_get_char(i + lines, j);
57*433d6423SLionel Sambuc direct_put_char(c, i, j);
58*433d6423SLionel Sambuc }
59*433d6423SLionel Sambuc }
60*433d6423SLionel Sambuc print_line-= lines;
61*433d6423SLionel Sambuc }
62*433d6423SLionel Sambuc
direct_print_char(char c)63*433d6423SLionel Sambuc void direct_print_char(char c)
64*433d6423SLionel Sambuc {
65*433d6423SLionel Sambuc while (print_line >= MULTIBOOT_CONSOLE_LINES)
66*433d6423SLionel Sambuc direct_scroll_up(1);
67*433d6423SLionel Sambuc
68*433d6423SLionel Sambuc #define TABWIDTH 8
69*433d6423SLionel Sambuc if(c == '\t') {
70*433d6423SLionel Sambuc if(print_col >= MULTIBOOT_CONSOLE_COLS - TABWIDTH) {
71*433d6423SLionel Sambuc c = '\n';
72*433d6423SLionel Sambuc } else {
73*433d6423SLionel Sambuc do {
74*433d6423SLionel Sambuc direct_put_char(' ', print_line, print_col++);
75*433d6423SLionel Sambuc } while(print_col % TABWIDTH);
76*433d6423SLionel Sambuc return;
77*433d6423SLionel Sambuc }
78*433d6423SLionel Sambuc }
79*433d6423SLionel Sambuc
80*433d6423SLionel Sambuc if (c == '\n') {
81*433d6423SLionel Sambuc while (print_col < MULTIBOOT_CONSOLE_COLS)
82*433d6423SLionel Sambuc direct_put_char(' ', print_line, print_col++);
83*433d6423SLionel Sambuc print_line++;
84*433d6423SLionel Sambuc print_col = 0;
85*433d6423SLionel Sambuc return;
86*433d6423SLionel Sambuc }
87*433d6423SLionel Sambuc
88*433d6423SLionel Sambuc direct_put_char(c, print_line, print_col++);
89*433d6423SLionel Sambuc
90*433d6423SLionel Sambuc if (print_col >= MULTIBOOT_CONSOLE_COLS) {
91*433d6423SLionel Sambuc print_line++;
92*433d6423SLionel Sambuc print_col = 0;
93*433d6423SLionel Sambuc }
94*433d6423SLionel Sambuc
95*433d6423SLionel Sambuc while (print_line >= MULTIBOOT_CONSOLE_LINES)
96*433d6423SLionel Sambuc direct_scroll_up(1);
97*433d6423SLionel Sambuc }
98*433d6423SLionel Sambuc
direct_print(const char * str)99*433d6423SLionel Sambuc void direct_print(const char *str)
100*433d6423SLionel Sambuc {
101*433d6423SLionel Sambuc while (*str) {
102*433d6423SLionel Sambuc direct_print_char(*str);
103*433d6423SLionel Sambuc str++;
104*433d6423SLionel Sambuc }
105*433d6423SLionel Sambuc }
106*433d6423SLionel Sambuc
107*433d6423SLionel Sambuc /* Standard and AT keyboard. (PS/2 MCA implies AT throughout.) */
108*433d6423SLionel Sambuc #define KEYBD 0x60 /* I/O port for keyboard data */
109*433d6423SLionel Sambuc #define KB_STATUS 0x64 /* I/O port for status on AT */
110*433d6423SLionel Sambuc #define KB_OUT_FULL 0x01 /* status bit set when keypress char pending */
111*433d6423SLionel Sambuc #define KB_AUX_BYTE 0x20 /* Auxiliary Device Output Buffer Full */
112*433d6423SLionel Sambuc
direct_read_char(unsigned char * ch)113*433d6423SLionel Sambuc int direct_read_char(unsigned char *ch)
114*433d6423SLionel Sambuc {
115*433d6423SLionel Sambuc unsigned long sb;
116*433d6423SLionel Sambuc
117*433d6423SLionel Sambuc sb = inb(KB_STATUS);
118*433d6423SLionel Sambuc
119*433d6423SLionel Sambuc if (!(sb & KB_OUT_FULL)) {
120*433d6423SLionel Sambuc return 0;
121*433d6423SLionel Sambuc }
122*433d6423SLionel Sambuc
123*433d6423SLionel Sambuc inb(KEYBD);
124*433d6423SLionel Sambuc
125*433d6423SLionel Sambuc if (!(sb & KB_AUX_BYTE))
126*433d6423SLionel Sambuc return 1;
127*433d6423SLionel Sambuc
128*433d6423SLionel Sambuc return 0;
129*433d6423SLionel Sambuc }
130*433d6423SLionel Sambuc
131