141 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
 | 
						|
#include "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 <libexec.h>
 | 
						|
#include "string.h"
 | 
						|
#include "arch_proto.h"
 | 
						|
#include "libexec.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;
 | 
						|
}
 | 
						|
 |