📄 console.c
字号:
}
static void lf(int currcons)
{
if (y+1<bottom) {
y++;
pos += video_size_row;
return;
} else
scrup(currcons,top,bottom);
need_wrap = 0;
}
static void ri(int currcons)
{
if (y>top) {
y--;
pos -= video_size_row;
return;
} else
scrdown(currcons,top,bottom);
need_wrap = 0;
}
static inline void cr(int currcons)
{
pos -= x<<1;
need_wrap = x = 0;
}
static inline void bs(int currcons)
{
if (x) {
pos -= 2;
x--;
need_wrap = 0;
}
}
static inline void del(int currcons)
{
#if 0
if (x) {
if (!need_wrap) { /* this is not the right condition */
pos -= 2;
x--;
}
*(unsigned short *)pos = video_erase_char;
need_wrap = 0;
}
#endif
}
static void csi_J(int currcons, int vpar)
{
unsigned long count;
unsigned long start;
switch (vpar) {
case 0: /* erase from cursor to end of display */
count = (scr_end-pos)>>1;
start = pos;
break;
case 1: /* erase from start to cursor */
count = ((pos-origin)>>1)+1;
start = origin;
break;
case 2: /* erase whole display */
count = video_num_columns * video_num_lines;
start = origin;
break;
default:
return;
}
__asm__("cld\n\t"
"rep\n\t"
"stosw\n\t"
: /* no output */
:"c" (count),
"D" (start),"a" (video_erase_char)
:"cx","di");
need_wrap = 0;
}
static void csi_K(int currcons, int vpar)
{
long count;
long start;
switch (vpar) {
case 0: /* erase from cursor to end of line */
count = video_num_columns-x;
start = pos;
break;
case 1: /* erase from start of line to cursor */
start = pos - (x<<1);
count = x+1;
break;
case 2: /* erase whole line */
start = pos - (x<<1);
count = video_num_columns;
break;
default:
return;
}
__asm__("cld\n\t"
"rep\n\t"
"stosw\n\t"
: /* no output */
:"c" (count),
"D" (start),"a" (video_erase_char)
:"cx","di");
need_wrap = 0;
}
/*
* I hope this works. The monochrome part is untested.
*/
static void update_attr(int currcons)
{
attr = color;
if (can_do_color) {
if (underline)
attr = (attr & 0xf0) | ulcolor;
else if (intensity == 0)
attr = (attr & 0xf0) | halfcolor;
}
if (reverse ^ decscnm)
attr = (attr & 0x88) | (((attr >> 4) | (attr << 4)) & 0x77);
if (blink)
attr ^= 0x80;
if (intensity == 2)
attr ^= 0x08;
if (!can_do_color) {
if (underline)
attr = (attr & 0xf8) | 0x01;
else if (intensity == 0)
attr = (attr & 0xf0) | 0x08;
}
if (decscnm)
video_erase_char = (((color & 0x88) | (((color >> 4) | (color << 4)) & 0x77)) << 8) | ' ';
else
video_erase_char = (color << 8) | ' ';
}
static void default_attr(int currcons)
{
intensity = 1;
underline = 0;
reverse = 0;
blink = 0;
color = def_color;
}
static void csi_m(int currcons)
{
int i;
for (i=0;i<=npar;i++)
switch (par[i]) {
case 0: /* all attributes off */
default_attr(currcons);
break;
case 1:
intensity = 2;
break;
case 2:
intensity = 0;
break;
case 4:
underline = 1;
break;
case 5:
blink = 1;
break;
case 7:
reverse = 1;
break;
case 21:
case 22:
intensity = 1;
break;
case 24:
underline = 0;
break;
case 25:
blink = 0;
break;
case 27:
reverse = 0;
break;
case 39:
color = (def_color & 0x0f) | background;
break;
case 49:
color = (def_color & 0xf0) | foreground;
break;
default:
if (par[i] >= 30 && par[i] <= 37)
color = color_table[par[i]-30]
| background;
else if (par[i] >= 40 && par[i] <= 47)
color = (color_table[par[i]-40]<<4)
| foreground;
break;
}
update_attr(currcons);
}
static void respond_string(char * p, int currcons, struct tty_struct * tty)
{
while (*p) {
put_tty_queue(*p, &tty->read_q);
p++;
}
TTY_READ_FLUSH(tty);
}
static void respond_num(unsigned int n, int currcons, struct tty_struct * tty)
{
char buff[3];
int i = 0;
do {
buff[i++] = (n%10)+'0';
n /= 10;
} while(n && i < 3); /* We'll take no chances */
while (i--) {
put_tty_queue(buff[i], &tty->read_q);
}
/* caller must flush */
}
static void cursor_report(int currcons, struct tty_struct * tty)
{
put_tty_queue('\033', &tty->read_q);
put_tty_queue('[', &tty->read_q);
respond_num(y + (decom ? top+1 : 1), currcons, tty);
put_tty_queue(';', &tty->read_q);
respond_num(x+1, currcons, tty);
put_tty_queue('R', &tty->read_q);
TTY_READ_FLUSH(tty);
}
static inline void status_report(int currcons, struct tty_struct * tty)
{
respond_string("\033[0n", currcons, tty); /* Terminal ok */
}
static inline void respond_ID(int currcons, struct tty_struct * tty)
{
respond_string(VT102ID, currcons, tty);
}
static void invert_screen(int currcons) {
unsigned char *p;
if (can_do_color)
for (p = (unsigned char *)origin+1; p < (unsigned char *)scr_end; p+=2)
*p = (*p & 0x88) | (((*p >> 4) | (*p << 4)) & 0x77);
else
for (p = (unsigned char *)origin+1; p < (unsigned char *)scr_end; p+=2)
*p ^= *p & 0x07 == 1 ? 0x70 : 0x77;
}
static void set_mode(int currcons, int on_off)
{
int i;
for (i=0; i<=npar; i++)
if (ques) switch(par[i]) { /* DEC private modes set/reset */
case 1: /* Cursor keys send ^[Ox/^[[x */
if (on_off)
set_kbd(decckm);
else
clr_kbd(decckm);
break;
case 3: /* 80/132 mode switch unimplemented */
csi_J(currcons,2);
gotoxy(currcons,0,0);
break;
case 5: /* Inverted screen on/off */
if (decscnm != on_off) {
decscnm = on_off;
invert_screen(currcons);
update_attr(currcons);
}
break;
case 6: /* Origin relative/absolute */
decom = on_off;
gotoxy(currcons,0,0);
break;
case 7: /* Autowrap on/off */
decawm = on_off;
break;
case 8: /* Autorepeat on/off */
if (on_off)
set_kbd(decarm);
else
clr_kbd(decarm);
break;
case 25: /* Cursor on/off */
deccm = on_off;
set_cursor(currcons);
break;
} else switch(par[i]) { /* ANSI modes set/reset */
case 4: /* Insert Mode on/off */
decim = on_off;
break;
case 20: /* Lf, Enter == CrLf/Lf */
if (on_off)
set_kbd(lnm);
else
clr_kbd(lnm);
break;
}
}
static void setterm_command(int currcons)
{
switch(par[0]) {
case 1: /* set color for underline mode */
if (can_do_color && par[1] < 16) {
ulcolor = color_table[par[1]];
if (underline)
update_attr(currcons);
}
break;
case 2: /* set color for half intensity mode */
if (can_do_color && par[1] < 16) {
halfcolor = color_table[par[1]];
if (intensity == 0)
update_attr(currcons);
}
break;
case 8: /* store colors as defaults */
def_color = attr;
default_attr(currcons);
update_attr(currcons);
break;
case 9: /* set blanking interval */
blankinterval = ((par[1] < 60) ? par[1] : 60) * 60 * HZ;
break;
}
}
static void insert_char(int currcons)
{
unsigned int i = x;
unsigned short tmp, old = video_erase_char;
unsigned short * p = (unsigned short *) pos;
while (i++ < video_num_columns) {
tmp = *p;
*p = old;
old = tmp;
p++;
}
need_wrap = 0;
}
static void insert_line(int currcons)
{
scrdown(currcons,y,bottom);
need_wrap = 0;
}
static void delete_char(int currcons)
{
unsigned int i = x;
unsigned short * p = (unsigned short *) pos;
while (++i < video_num_columns) {
*p = *(p+1);
p++;
}
*p = video_erase_char;
need_wrap = 0;
}
static void delete_line(int currcons)
{
scrup(currcons,y,bottom);
need_wrap = 0;
}
static void csi_at(int currcons, unsigned int nr)
{
if (nr > video_num_columns)
nr = video_num_columns;
else if (!nr)
nr = 1;
while (nr--)
insert_char(currcons);
}
static void csi_L(int currcons, unsigned int nr)
{
if (nr > video_num_lines)
nr = video_num_lines;
else if (!nr)
nr = 1;
while (nr--)
insert_line(currcons);
}
static void csi_P(int currcons, unsigned int nr)
{
if (nr > video_num_columns)
nr = video_num_columns;
else if (!nr)
nr = 1;
while (nr--)
delete_char(currcons);
}
static void csi_M(int currcons, unsigned int nr)
{
if (nr > video_num_lines)
nr = video_num_lines;
else if (!nr)
nr=1;
while (nr--)
delete_line(currcons);
}
static void save_cur(int currcons)
{
saved_x = x;
saved_y = y;
s_intensity = intensity;
s_underline = underline;
s_blink = blink;
s_reverse = reverse;
s_charset = charset;
s_color = color;
saved_G0 = G0_charset;
saved_G1 = G1_charset;
}
static void restore_cur(int currcons)
{
gotoxy(currcons,saved_x,saved_y);
intensity = s_intensity;
underline = s_underline;
blink = s_blink;
reverse = s_reverse;
charset = s_charset;
color = s_color;
G0_charset = saved_G0;
G1_charset = saved_G1;
translate = charset ? G1_charset : G0_charset;
update_attr(currcons);
need_wrap = 0;
}
enum { ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey,
EShash, ESsetG0, ESsetG1, ESignore };
static void reset_terminal(int currcons, int do_clear)
{
top = 0;
bottom = video_num_lines;
state = ESnormal;
ques = 0;
translate = NORM_TRANS;
G0_charset = NORM_TRANS;
G1_charset = GRAF_TRANS;
charset = 0;
need_wrap = 0;
decscnm = 0;
decom = 0;
decawm = 1;
deccm = 1;
decim = 0;
set_kbd(decarm);
clr_kbd(decckm);
clr_kbd(kbdapplic);
clr_kbd(lnm);
kbd_table[currcons].lockstate = 0;
kbd_table[currcons].ledstate = kbd_table[currcons].default_ledstate;
set_leds();
default_attr(currcons);
update_attr(currcons);
tab_stop[0] = 0x01010100;
tab_stop[1] =
tab_stop[2] =
tab_stop[3] =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -