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