10 #define TEXTBUF_SIZE 256
12 static char textbuf[TEXTBUF_SIZE][NCOLS];
13 static int tbuf_first, tbuf_last;
15 static int curx, cury, scroll;
17 #define CURSTACK_SIZE 16
18 static unsigned int savecur[CURSTACK_SIZE];
19 static int savecur_top;
22 static void newline(void);
34 curx = cury = scroll = 0;
35 tbuf_first = tbuf_last = 0;
36 memset(textbuf[0], 0, sizeof textbuf[0]);
41 void con_setcur(int x, int y)
43 curx = x < 0 ? 0 : (x >= NCOLS ? NCOLS - 1 : x);
44 cury = y < 0 ? 0 : (y >= NROWS ? NROWS - 1 : y);
47 void con_getcur(int *x, int *y)
53 void con_pushcur(void)
55 if(savecur_top >= CURSTACK_SIZE) return;
57 savecur[savecur_top++] = curx | (cury << 16);
62 if(savecur_top <= 0) return;
65 curx = savecur[savecur_top] & 0xffff;
66 cury = savecur[savecur_top] >> 16;
69 void con_putchar(int c)
73 curx = (curx + 8) & 0xfffffff8;
89 textbuf[tbuf_last][--curx] = 0;
90 vga_drawchar(curx, cury, 0);
95 textbuf[tbuf_last][curx] = c;
96 vga_drawchar(curx, cury, c);
105 vga_scroll(++scroll);
106 vga_clearline(NROWS - 1);
109 vid_set_cursor(curx, cury);
112 static void newline(void)
119 num = (tbuf_last + 1) & (TEXTBUF_SIZE - 1);
121 if(tbuf_last == tbuf_first) {