kern
annotate src/term.c @ 80:4db99a52863e
fixed the "endianess" of the text messages in the ATA identify info block. this
is the first time I've seen wrong byteorder in ascii text, the ATA committee
should be commended.
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Tue, 06 Dec 2011 13:35:39 +0200 |
parents | 06172322fb76 |
children |
rev | line source |
---|---|
nuclear@4 | 1 #include <ctype.h> |
nuclear@1 | 2 #include "term.h" |
nuclear@1 | 3 #include "vid.h" |
nuclear@52 | 4 #include "intr.h" |
nuclear@1 | 5 |
nuclear@2 | 6 static int bg, fg = LTGRAY; |
nuclear@1 | 7 static int cursor_x, cursor_y; |
nuclear@1 | 8 |
nuclear@2 | 9 /* sets the active text color and returns previous value */ |
nuclear@2 | 10 int set_text_color(int c) |
nuclear@1 | 11 { |
nuclear@2 | 12 int prev = fg; |
nuclear@2 | 13 |
nuclear@1 | 14 if(c >= 0 && c < 16) { |
nuclear@1 | 15 fg = c; |
nuclear@1 | 16 } |
nuclear@2 | 17 return prev; |
nuclear@1 | 18 } |
nuclear@1 | 19 |
nuclear@2 | 20 /* sets the active background color and returns the current value */ |
nuclear@2 | 21 int set_back_color(int c) |
nuclear@1 | 22 { |
nuclear@2 | 23 int prev = bg; |
nuclear@2 | 24 |
nuclear@1 | 25 if(c >= 0 && c < 16) { |
nuclear@1 | 26 bg = c; |
nuclear@1 | 27 } |
nuclear@2 | 28 return prev; |
nuclear@1 | 29 } |
nuclear@1 | 30 |
nuclear@2 | 31 /* output a single character, handles formatting, cursor advancement |
nuclear@2 | 32 * and scrolling the screen when we reach the bottom. |
nuclear@2 | 33 */ |
nuclear@1 | 34 int putchar(int c) |
nuclear@1 | 35 { |
nuclear@52 | 36 int istate = get_intr_state(); |
nuclear@52 | 37 disable_intr(); |
nuclear@52 | 38 |
nuclear@1 | 39 switch(c) { |
nuclear@1 | 40 case '\n': |
nuclear@1 | 41 cursor_y++; |
nuclear@1 | 42 |
nuclear@1 | 43 case '\r': |
nuclear@1 | 44 cursor_x = 0; |
nuclear@1 | 45 break; |
nuclear@1 | 46 |
nuclear@1 | 47 case '\b': |
nuclear@1 | 48 cursor_x--; |
nuclear@1 | 49 set_char(' ', cursor_x, cursor_y, fg, bg); |
nuclear@1 | 50 break; |
nuclear@1 | 51 |
nuclear@1 | 52 case '\t': |
nuclear@1 | 53 cursor_x = ((cursor_x >> 3) + 1) << 3; |
nuclear@1 | 54 break; |
nuclear@1 | 55 |
nuclear@1 | 56 default: |
nuclear@2 | 57 if(isprint(c)) { |
nuclear@2 | 58 set_char(c, cursor_x, cursor_y, fg, bg); |
nuclear@2 | 59 if(++cursor_x >= WIDTH) { |
nuclear@2 | 60 cursor_x = 0; |
nuclear@2 | 61 cursor_y++; |
nuclear@2 | 62 } |
nuclear@1 | 63 } |
nuclear@1 | 64 } |
nuclear@1 | 65 |
nuclear@1 | 66 if(cursor_y >= HEIGHT) { |
nuclear@1 | 67 scroll_scr(); |
nuclear@1 | 68 cursor_y--; |
nuclear@1 | 69 } |
nuclear@2 | 70 |
nuclear@2 | 71 set_cursor(cursor_x, cursor_y); |
nuclear@52 | 72 |
nuclear@52 | 73 set_intr_state(istate); |
nuclear@1 | 74 return c; |
nuclear@1 | 75 } |