kern

annotate src/term.c @ 22:7ece008f09c5

writing the vm
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 03 Apr 2011 18:42:19 +0300
parents 86781ef20689
children 06172322fb76
rev   line source
nuclear@4 1 #include <ctype.h>
nuclear@1 2 #include "term.h"
nuclear@1 3 #include "vid.h"
nuclear@1 4
nuclear@2 5 static int bg, fg = LTGRAY;
nuclear@1 6 static int cursor_x, cursor_y;
nuclear@1 7
nuclear@2 8 /* sets the active text color and returns previous value */
nuclear@2 9 int set_text_color(int c)
nuclear@1 10 {
nuclear@2 11 int prev = fg;
nuclear@2 12
nuclear@1 13 if(c >= 0 && c < 16) {
nuclear@1 14 fg = c;
nuclear@1 15 }
nuclear@2 16 return prev;
nuclear@1 17 }
nuclear@1 18
nuclear@2 19 /* sets the active background color and returns the current value */
nuclear@2 20 int set_back_color(int c)
nuclear@1 21 {
nuclear@2 22 int prev = bg;
nuclear@2 23
nuclear@1 24 if(c >= 0 && c < 16) {
nuclear@1 25 bg = c;
nuclear@1 26 }
nuclear@2 27 return prev;
nuclear@1 28 }
nuclear@1 29
nuclear@2 30 /* output a single character, handles formatting, cursor advancement
nuclear@2 31 * and scrolling the screen when we reach the bottom.
nuclear@2 32 * TODO make visible cursor actually move.
nuclear@2 33 */
nuclear@1 34 int putchar(int c)
nuclear@1 35 {
nuclear@1 36 switch(c) {
nuclear@1 37 case '\n':
nuclear@1 38 cursor_y++;
nuclear@1 39
nuclear@1 40 case '\r':
nuclear@1 41 cursor_x = 0;
nuclear@1 42 break;
nuclear@1 43
nuclear@1 44 case '\b':
nuclear@1 45 cursor_x--;
nuclear@1 46 set_char(' ', cursor_x, cursor_y, fg, bg);
nuclear@1 47 break;
nuclear@1 48
nuclear@1 49 case '\t':
nuclear@1 50 cursor_x = ((cursor_x >> 3) + 1) << 3;
nuclear@1 51 break;
nuclear@1 52
nuclear@1 53 default:
nuclear@2 54 if(isprint(c)) {
nuclear@2 55 set_char(c, cursor_x, cursor_y, fg, bg);
nuclear@2 56 if(++cursor_x >= WIDTH) {
nuclear@2 57 cursor_x = 0;
nuclear@2 58 cursor_y++;
nuclear@2 59 }
nuclear@1 60 }
nuclear@1 61 }
nuclear@1 62
nuclear@1 63 if(cursor_y >= HEIGHT) {
nuclear@1 64 scroll_scr();
nuclear@1 65 cursor_y--;
nuclear@1 66 }
nuclear@2 67
nuclear@2 68 set_cursor(cursor_x, cursor_y);
nuclear@1 69 return c;
nuclear@1 70 }