nuclear@4: #include nuclear@1: #include "term.h" nuclear@1: #include "vid.h" nuclear@52: #include "intr.h" nuclear@1: nuclear@2: static int bg, fg = LTGRAY; nuclear@1: static int cursor_x, cursor_y; nuclear@1: nuclear@2: /* sets the active text color and returns previous value */ nuclear@2: int set_text_color(int c) nuclear@1: { nuclear@2: int prev = fg; nuclear@2: nuclear@1: if(c >= 0 && c < 16) { nuclear@1: fg = c; nuclear@1: } nuclear@2: return prev; nuclear@1: } nuclear@1: nuclear@2: /* sets the active background color and returns the current value */ nuclear@2: int set_back_color(int c) nuclear@1: { nuclear@2: int prev = bg; nuclear@2: nuclear@1: if(c >= 0 && c < 16) { nuclear@1: bg = c; nuclear@1: } nuclear@2: return prev; nuclear@1: } nuclear@1: nuclear@2: /* output a single character, handles formatting, cursor advancement nuclear@2: * and scrolling the screen when we reach the bottom. nuclear@2: */ nuclear@1: int putchar(int c) nuclear@1: { nuclear@52: int istate = get_intr_state(); nuclear@52: disable_intr(); nuclear@52: nuclear@1: switch(c) { nuclear@1: case '\n': nuclear@1: cursor_y++; nuclear@1: nuclear@1: case '\r': nuclear@1: cursor_x = 0; nuclear@1: break; nuclear@1: nuclear@1: case '\b': nuclear@1: cursor_x--; nuclear@1: set_char(' ', cursor_x, cursor_y, fg, bg); nuclear@1: break; nuclear@1: nuclear@1: case '\t': nuclear@1: cursor_x = ((cursor_x >> 3) + 1) << 3; nuclear@1: break; nuclear@1: nuclear@1: default: nuclear@2: if(isprint(c)) { nuclear@2: set_char(c, cursor_x, cursor_y, fg, bg); nuclear@2: if(++cursor_x >= WIDTH) { nuclear@2: cursor_x = 0; nuclear@2: cursor_y++; nuclear@2: } nuclear@1: } nuclear@1: } nuclear@1: nuclear@1: if(cursor_y >= HEIGHT) { nuclear@1: scroll_scr(); nuclear@1: cursor_y--; nuclear@1: } nuclear@2: nuclear@2: set_cursor(cursor_x, cursor_y); nuclear@52: nuclear@52: set_intr_state(istate); nuclear@1: return c; nuclear@1: }