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