60.html
来自「linux 0.11中文版 有注释」· HTML 代码 · 共 725 行 · 第 1/5 页
HTML
725 行
<a name='L538'>
<a name='L539'><i><font color='green'>//// 在光标位置处插入nr 行。</font></i>
<a name='L540'><i><font color='green'>// ANSI 转义字符序列'ESC [nL'。</font></i>
<a name='L541'><b>static</b> <b>void</b>
<a name='L542'><a href='../S/60.html#L808' title='Refered from 808 in kernel/chr_drv/console.c.'>csi_L</a> (<b>unsigned</b> <b>int</b> nr)
<a name='L543'><font color='red'>{</font>
<a name='L544'><i><font color='green'>// 如果插入的行数大于屏幕最多行数,则截为屏幕显示行数;若插入行数nr 为0,则插入1 行。</font></i>
<a name='L545'> <b>if</b> (nr > video_num_lines)
<a name='L546'> nr = video_num_lines;
<a name='L547'> <b>else</b> <b>if</b> (!nr)
<a name='L548'> nr = 1;
<a name='L549'><i><font color='green'>// 循环插入指定行数nr。</font></i>
<a name='L550'> <b>while</b> (nr--)
<a name='L551'> <a href='../S/60.html#L473' title='Defined at 473 in kernel/chr_drv/console.c.'>insert_line</a> ();
<a name='L552'><font color='red'>}</font>
<a name='L553'>
<a name='L554'><i><font color='green'>//// 删除光标处的nr 个字符。</font></i>
<a name='L555'><i><font color='green'>// ANSI 转义序列:'ESC [nP'。</font></i>
<a name='L556'><b>static</b> <b>void</b>
<a name='L557'><a href='../S/60.html#L816' title='Refered from 816 in kernel/chr_drv/console.c.'>csi_P</a> (<b>unsigned</b> <b>int</b> nr)
<a name='L558'><font color='red'>{</font>
<a name='L559'><i><font color='green'>// 如果删除的字符数大于一行字符数,则截为一行字符数;若删除字符数nr 为0,则删除1 个字符。</font></i>
<a name='L560'> <b>if</b> (nr > video_num_columns)
<a name='L561'> nr = video_num_columns;
<a name='L562'> <b>else</b> <b>if</b> (!nr)
<a name='L563'> nr = 1;
<a name='L564'><i><font color='green'>// 循环删除指定字符数nr。</font></i>
<a name='L565'> <b>while</b> (nr--)
<a name='L566'> <a href='../S/60.html#L488' title='Defined at 488 in kernel/chr_drv/console.c.'>delete_char</a> ();
<a name='L567'><font color='red'>}</font>
<a name='L568'>
<a name='L569'><i><font color='green'>//// 删除光标处的nr 行。</font></i>
<a name='L570'><i><font color='green'>// ANSI 转义序列:'ESC [nM'。</font></i>
<a name='L571'><b>static</b> <b>void</b>
<a name='L572'><a href='../S/60.html#L812' title='Refered from 812 in kernel/chr_drv/console.c.'>csi_M</a> (<b>unsigned</b> <b>int</b> nr)
<a name='L573'><font color='red'>{</font>
<a name='L574'><i><font color='green'>// 如果删除的行数大于屏幕最多行数,则截为屏幕显示行数;若删除的行数nr 为0,则删除1 行。</font></i>
<a name='L575'> <b>if</b> (nr > video_num_lines)
<a name='L576'> nr = video_num_lines;
<a name='L577'> <b>else</b> <b>if</b> (!nr)
<a name='L578'> nr = 1;
<a name='L579'><i><font color='green'>// 循环删除指定行数nr。</font></i>
<a name='L580'> <b>while</b> (nr--)
<a name='L581'> <a href='../S/60.html#L510' title='Defined at 510 in kernel/chr_drv/console.c.'>delete_line</a> ();
<a name='L582'><font color='red'>}</font>
<a name='L583'>
<a name='L584'><b>static</b> <b>int</b> saved_x = 0; <i><font color='green'>// 保存的光标列号。</font></i>
<a name='L585'><b>static</b> <b>int</b> saved_y = 0; <i><font color='green'>// 保存的光标行号。</font></i>
<a name='L586'>
<a name='L587'><i><font color='green'>//// 保存当前光标位置。</font></i>
<a name='L588'><b>static</b> <b>void</b>
<a name='L589'><a href='../R/583.html' title='Multiple refered from 2 places.'>save_cur</a> (<b>void</b>)
<a name='L590'><font color='red'>{</font>
<a name='L591'> saved_x = x;
<a name='L592'> saved_y = y;
<a name='L593'><font color='red'>}</font>
<a name='L594'>
<a name='L595'><i><font color='green'>//// 恢复保存的光标位置。</font></i>
<a name='L596'><b>static</b> <b>void</b>
<a name='L597'><a href='../R/576.html' title='Multiple refered from 2 places.'>restore_cur</a> (<b>void</b>)
<a name='L598'><font color='red'>{</font>
<a name='L599'> <a href='../S/60.html#L134' title='Defined at 134 in kernel/chr_drv/console.c.'>gotoxy</a> (saved_x, saved_y);
<a name='L600'><font color='red'>}</font>
<a name='L601'>
<a name='L602'><i><font color='green'>//// 控制台写函数。</font></i>
<a name='L603'><i><font color='green'>// 从终端对应的tty 写缓冲队列中取字符,并显示在屏幕上。</font></i>
<a name='L604'><b>void</b>
<a name='L605'><a href='../R/405.html' title='Multiple refered from 2 places.'>con_write</a> (<b>struct</b> tty_struct *tty)
<a name='L606'><font color='red'>{</font>
<a name='L607'> <b>int</b> nr;
<a name='L608'> <b>char</b> c;
<a name='L609'>
<a name='L610'><i><font color='green'>// 首先取得写缓冲队列中现有字符数nr,然后针对每个字符进行处理。</font></i>
<a name='L611'> nr = <a href='../S/38.html#L47' title='Defined at 47 in include/linux/tty.h.'>CHARS</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->write_q);
<a name='L612'> <b>while</b> (nr--)
<a name='L613'> <font color='red'>{</font>
<a name='L614'><i><font color='green'>// 从写队列中取一字符c,根据前面所处理字符的状态state 分别处理。状态之间的转换关系为:</font></i>
<a name='L615'><i><font color='green'>// state = 0:初始状态;或者原是状态4;或者原是状态1,但字符不是'[';</font></i>
<a name='L616'><i><font color='green'>// 1:原是状态0,并且字符是转义字符ESC(0x1b = 033 = 27);</font></i>
<a name='L617'><i><font color='green'>// 2:原是状态1,并且字符是'[';</font></i>
<a name='L618'><i><font color='green'>// 3:原是状态2;或者原是状态3,并且字符是';'或数字。</font></i>
<a name='L619'><i><font color='green'>// 4:原是状态3,并且字符不是';'或数字;</font></i>
<a name='L620'> <a href='../S/38.html#L49' title='Defined at 49 in include/linux/tty.h.'>GETCH</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->write_q, c);
<a name='L621'> <b>switch</b> (state)
<a name='L622'> <font color='red'>{</font>
<a name='L623'> <b>case</b> 0:
<a name='L624'><i><font color='green'>// 如果字符不是控制字符(c>31),并且也不是扩展字符(c<127),则</font></i>
<a name='L625'> <b>if</b> (c > 31 && c < 127)
<a name='L626'> <font color='red'>{</font>
<a name='L627'><i><font color='green'>// 若当前光标处在行末端或末端以外,则将光标移到下行头列。并调整光标位置对应的内存指针pos。</font></i>
<a name='L628'> <b>if</b> (x >= video_num_columns)
<a name='L629'> <font color='red'>{</font>
<a name='L630'> x -= video_num_columns;
<a name='L631'> <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> -= video_size_row;
<a name='L632'> <a href='../S/60.html#L271' title='Defined at 271 in kernel/chr_drv/console.c.'>lf</a> ();
<a name='L633'> <font color='red'>}</font>
<a name='L634'><i><font color='green'>// 将字符c 写到显示内存中pos 处,并将光标右移1 列,同时也将pos 对应地移动2 个字节。</font></i>
<a name='L635'> <b>__asm__</b> ("movb _attr,%%ah\n\t" "movw %%ax,%1\n\t"::"a" (c), "m" (*(<b>short</b> *) <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a>):"ax");
<a name='L636'> <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> += 2;
<a name='L637'> x++;
<a name='L638'><i><font color='green'>// 如果字符c 是转义字符ESC,则转换状态state 到1。</font></i>
<a name='L639'> <font color='red'>}</font>
<a name='L640'> <b>else</b> <b>if</b> (c == 27)
<a name='L641'> state = 1;
<a name='L642'><i><font color='green'>// 如果字符c 是换行符(10),或是垂直制表符VT(11),或者是换页符FF(12),则移动光标到下一行。</font></i>
<a name='L643'> <b>else</b> <b>if</b> (c == 10 || c == 11 || c == 12)
<a name='L644'> <a href='../S/60.html#L271' title='Defined at 271 in kernel/chr_drv/console.c.'>lf</a> ();
<a name='L645'><i><font color='green'>// 如果字符c 是回车符CR(13),则将光标移动到头列(0 列)。</font></i>
<a name='L646'> <b>else</b> <b>if</b> (c == 13)
<a name='L647'> <a href='../S/60.html#L303' title='Defined at 303 in kernel/chr_drv/console.c.'>cr</a> ();
<a name='L648'><i><font color='green'>// 如果字符c 是DEL(127),则将光标右边一字符擦除(用空格字符替代),并将光标移到被擦除位置。</font></i>
<a name='L649'> <b>else</b> <b>if</b> (c == <a href='../S/38.html#L58' title='Defined at 58 in include/linux/tty.h.'>ERASE_CHAR</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>))
<a name='L650'> <a href='../S/60.html#L312' title='Defined at 312 in kernel/chr_drv/console.c.'>del</a> ();
<a name='L651'><i><font color='green'>// 如果字符c 是BS(backspace,8),则将光标右移1 格,并相应调整光标对应内存位置指针pos。</font></i>
<a name='L652'> <b>else</b> <b>if</b> (c == 8)
<a name='L653'> <font color='red'>{</font>
<a name='L654'> <b>if</b> (x)
<a name='L655'> <font color='red'>{</font>
<a name='L656'> x--;
<a name='L657'> <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> -= 2;
<a name='L658'> <font color='red'>}</font>
<a name='L659'><i><font color='green'>// 如果字符c 是水平制表符TAB(9),则将光标移到8 的倍数列上。若此时光标列数超出屏幕最大列数,</font></i>
<a name='L660'><i><font color='green'>// 则将光标移到下一行上。</font></i>
<a name='L661'> <font color='red'>}</font>
<a name='L662'> <b>else</b> <b>if</b> (c == 9)
<a name='L663'> <font color='red'>{</font>
<a name='L664'> c = 8 - (x & 7);
<a name='L665'> x += c;
<a name='L666'> <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> += c << 1;
<a name='L667'> <b>if</b> (x > video_num_columns)
<a name='L668'> <font color='red'>{</font>
<a name='L669'> x -= video_num_columns;
<a name='L670'> <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> -= video_size_row;
<a name='L671'> <a href='../S/60.html#L271' title='Defined at 271 in kernel/chr_drv/console.c.'>lf</a> ();
<a name='L672'> <font color='red'>}</font>
<a name='L673'> c = 9;
<a name='L674'><i><font color='green'>// 如果字符c 是响铃符BEL(7),则调用蜂鸣函数,是扬声器发声。</font></i>
<a name='L675'> <font color='red'>}</font>
<a name='L676'> <b>else</b> <b>if</b> (c == 7)
<a name='L677'> <a href='../S/60.html#L978' title='Defined at 978 in kernel/chr_drv/console.c.'>sysbeep</a> ();
<a name='L678'> <b>break</b>;
<a name='L679'><i><font color='green'>// 如果原状态是0,并且字符是转义字符ESC(0x1b = 033 = 27),则转到状态1 处理。</font></i>
<a name='L680'> <b>case</b> 1:
<a name='L681'> state = 0;
<a name='L682'><i><font color='green'>// 如果字符c 是'[',则将状态state 转到2。</font></i>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?