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