9 #define TEXTBUF_SIZE 256
11 static char textbuf[TEXTBUF_SIZE][NCOLS];
12 static int tbuf_first, tbuf_last;
14 static int curx, cury, scroll;
16 #define CURSTACK_SIZE 16
17 static unsigned int savecur[CURSTACK_SIZE];
18 static int savecur_top;
21 static void newline(void);
33 curx = cury = scroll = 0;
34 tbuf_first = tbuf_last = 0;
35 memset(textbuf[0], 0, sizeof textbuf[0]);
40 void con_setcur(int x, int y)
42 curx = x < 0 ? 0 : (x >= NCOLS ? NCOLS - 1 : x);
43 cury = y < 0 ? 0 : (y >= NROWS ? NROWS - 1 : y);
46 void con_getcur(int *x, int *y)
52 void con_pushcur(void)
54 if(savecur_top >= CURSTACK_SIZE) return;
56 savecur[savecur_top++] = curx | (cury << 16);
61 if(savecur_top <= 0) return;
64 curx = savecur[savecur_top] & 0xffff;
65 cury = savecur[savecur_top] >> 16;
68 void con_putchar(int c)
72 curx = (curx + 8) & 0xfffffff8;
88 textbuf[tbuf_last][--curx] = 0;
89 vga_drawchar(curx, cury, 0);
94 textbuf[tbuf_last][curx] = c;
95 vga_drawchar(curx, cury, c);
104 vga_scroll(++scroll);
105 vga_clearline(NROWS - 1);
108 vga_setcursor(curx, cury);
111 static void newline(void)
118 num = (tbuf_last + 1) & (TEXTBUF_SIZE - 1);
120 if(tbuf_last == tbuf_first) {