139 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #include "kernel/kernel.h"
 | |
| #include <minix/minlib.h>
 | |
| #include <minix/const.h>
 | |
| #include <minix/cpufeature.h>
 | |
| #include <minix/type.h>
 | |
| #include <minix/com.h>
 | |
| #include <sys/types.h>
 | |
| #include <sys/param.h>
 | |
| #include <machine/partition.h>
 | |
| #include "string.h"
 | |
| #include "arch_proto.h"
 | |
| #include "direct_utils.h"
 | |
| #include "serial.h"
 | |
| #include "glo.h"
 | |
| #include <machine/multiboot.h>
 | |
| 
 | |
| /* Give non-zero values to avoid them in BSS */
 | |
| static int print_line = 1, print_col = 1;
 | |
| 
 | |
| #include <sys/video.h>
 | |
| 
 | |
| extern char *video_mem;
 | |
| #define VIDOFFSET(line, col) ((line) * MULTIBOOT_CONSOLE_COLS * 2 + (col) * 2)
 | |
| #define VIDSIZE VIDOFFSET(MULTIBOOT_CONSOLE_LINES-1,MULTIBOOT_CONSOLE_COLS-1)
 | |
| 
 | |
| void direct_put_char(char c, int line, int col) 
 | |
| {
 | |
| 	int offset = VIDOFFSET(line, col);
 | |
| 	video_mem[offset] = c;
 | |
| 	video_mem[offset+1] = 0x07;	/* grey-on-black */
 | |
| }
 | |
| 
 | |
| static char direct_get_char(int line, int col) 
 | |
| {
 | |
| 	return video_mem[VIDOFFSET(line, col)];
 | |
| }
 | |
| 
 | |
| void direct_cls(void)
 | |
| {
 | |
| 	/* Clear screen */
 | |
| 	int i,j;
 | |
| 
 | |
| 	for(i = 0; i < MULTIBOOT_CONSOLE_COLS; i++)
 | |
| 		for(j = 0; j < MULTIBOOT_CONSOLE_LINES; j++)
 | |
| 			direct_put_char(' ', j, i);
 | |
| 
 | |
| 	print_line = print_col = 0;
 | |
| 
 | |
| 	/* Tell video hardware origin is 0. */
 | |
| 	outb(C_6845+INDEX, VID_ORG);
 | |
| 	outb(C_6845+DATA, 0);
 | |
| 	outb(C_6845+INDEX, VID_ORG+1);
 | |
| 	outb(C_6845+DATA, 0);
 | |
| }
 | |
| 
 | |
| static void direct_scroll_up(int lines) 
 | |
| {
 | |
| 	int i, j;
 | |
| 	for (i = 0; i < MULTIBOOT_CONSOLE_LINES; i++ ) {
 | |
| 		for (j = 0; j < MULTIBOOT_CONSOLE_COLS; j++ ) {
 | |
| 			char c = 0;
 | |
| 			if(i < MULTIBOOT_CONSOLE_LINES-lines)
 | |
| 				c = direct_get_char(i + lines, j);
 | |
| 			direct_put_char(c, i, j);
 | |
| 		}
 | |
| 	}
 | |
| 	print_line-= lines;
 | |
| }
 | |
| 
 | |
| void direct_print_char(char c)
 | |
| {
 | |
| 	while (print_line >= MULTIBOOT_CONSOLE_LINES)
 | |
| 		direct_scroll_up(1);
 | |
| 
 | |
| #define TABWIDTH 8
 | |
| 	if(c == '\t') {
 | |
| 		if(print_col >= MULTIBOOT_CONSOLE_COLS - TABWIDTH) {
 | |
| 			c = '\n';
 | |
| 		} else {
 | |
| 			do {
 | |
| 				direct_put_char(' ', print_line, print_col++);
 | |
| 			} while(print_col % TABWIDTH);
 | |
| 			return;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if (c == '\n') {
 | |
| 		while (print_col < MULTIBOOT_CONSOLE_COLS)
 | |
| 			direct_put_char(' ', print_line, print_col++);
 | |
| 		print_line++;
 | |
| 		print_col = 0;
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	direct_put_char(c, print_line, print_col++);
 | |
| 
 | |
| 	if (print_col >= MULTIBOOT_CONSOLE_COLS) {
 | |
| 		print_line++;
 | |
| 		print_col = 0;
 | |
| 	}
 | |
| 
 | |
| 	while (print_line >= MULTIBOOT_CONSOLE_LINES)
 | |
| 		direct_scroll_up(1);
 | |
| }
 | |
| 
 | |
| void direct_print(const char *str)
 | |
| {
 | |
| 	while (*str) {
 | |
| 		direct_print_char(*str);
 | |
| 		str++;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /* Standard and AT keyboard.  (PS/2 MCA implies AT throughout.) */
 | |
| #define KEYBD		0x60	/* I/O port for keyboard data */
 | |
| #define KB_STATUS	0x64	/* I/O port for status on AT */
 | |
| #define KB_OUT_FULL	0x01	/* status bit set when keypress char pending */
 | |
| #define KB_AUX_BYTE	0x20	/* Auxiliary Device Output Buffer Full */
 | |
| 
 | |
| int direct_read_char(unsigned char *ch)
 | |
| {
 | |
| 	unsigned long sb;
 | |
| 
 | |
| 	sb = inb(KB_STATUS);
 | |
| 
 | |
| 	if (!(sb & KB_OUT_FULL)) {
 | |
| 		return 0;
 | |
| 	}
 | |
| 
 | |
| 	inb(KEYBD);
 | |
| 
 | |
| 	if (!(sb & KB_AUX_BYTE))
 | |
| 		return 1;
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | 
