60.html

来自「linux 0.11中文版 有注释」· HTML 代码 · 共 725 行 · 第 1/5 页

HTML
725
字号
<a name='L248'><i><font color='green'>// %2-edi(屏幕右下角最后一个长字位置);%3-esi(屏幕倒数第2 行最后一个长字位置)。</font></i>
<a name='L249'><i><font color='green'>// 移动方向:[esi]??[edi],移动ecx 个长字。</font></i>
<a name='L250'>      <b>__asm__</b> ("std\n\t"        <i><font color='green'>// 置方向位。</font></i>
<a name='L251'>               "rep\n\t"        <i><font color='green'>// 重复操作,向下移动从top 行到bottom-1 行</font></i>
<a name='L252'>               "movsl\n\t"      <i><font color='green'>// 对应的内存数据。</font></i>
<a name='L253'>               "addl $2,%%edi\n\t"      <i><font color='green'>/* %edi has been decremented by 4 */</font></i>
<a name='L254'><i><font color='green'>/* %edi 已经减4,因为也是方向填擦除字符 */</font></i>
<a name='L255'>               "movl _video_num_columns,%%ecx\n\t"      <i><font color='green'>// 置ecx=1 行字符数。</font></i>
<a name='L256'>               "rep\n\t"        <i><font color='green'>// 将擦除字符填入上方新行中。</font></i>
<a name='L257'>    "stosw"::"a" (video_erase_char), "c" ((bottom - top - 1) * video_num_columns &gt;&gt; 1), "D" (origin + video_size_row * bottom - 4), "S" (origin + video_size_row * (bottom - 1) - 4):"ax", "cx", "di",
<a name='L258'>               "si");
<a name='L259'>    <font color='red'>}</font>
<a name='L260'><i><font color='green'>// 如果不是EGA 显示类型,则执行以下操作(目前与上面完全一样)。</font></i>
<a name='L261'>  <b>else</b>                          <i><font color='green'>/* Not EGA/VGA */</font></i>
<a name='L262'>    <font color='red'>{</font>
<a name='L263'>      <b>__asm__</b> ("std\n\t" "rep\n\t" "movsl\n\t" "addl $2,%%edi\n\t"      <i><font color='green'>/* %edi has been decremented by 4 */</font></i>
<a name='L264'>    "movl _video_num_columns,%%ecx\n\t" "rep\n\t" "stosw"::"a" (video_erase_char), "c" ((bottom - top - 1) * video_num_columns &gt;&gt; 1), "D" (origin + video_size_row * bottom - 4), "S" (origin + video_size_row * (bottom - 1) - 4):"ax", "cx", "di",
<a name='L265'>               "si");
<a name='L266'>    <font color='red'>}</font>
<a name='L267'><font color='red'>}</font>
<a name='L268'>
<a name='L269'><i><font color='green'>//// 光标位置下移一行(lf - line feed 换行)。</font></i>
<a name='L270'><b>static</b> <b>void</b>
<a name='L271'><a href='../R/517.html' title='Multiple refered from 4 places.'>lf</a> (<b>void</b>)
<a name='L272'><font color='red'>{</font>
<a name='L273'><i><font color='green'>// 如果光标没有处在倒数第2 行之后,则直接修改光标当前行变量y++,并调整光标对应显示内存位置</font></i>
<a name='L274'><i><font color='green'>// pos(加上屏幕一行字符所对应的内存长度)。</font></i>
<a name='L275'>  <b>if</b> (y + 1 &lt; bottom)
<a name='L276'>    <font color='red'>{</font>
<a name='L277'>      y++;
<a name='L278'>      <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> += video_size_row;
<a name='L279'>      <b>return</b>;
<a name='L280'>    <font color='red'>}</font>
<a name='L281'><i><font color='green'>// 否则需要将屏幕内容上移一行。</font></i>
<a name='L282'>  <a href='../S/60.html#L163' title='Defined at 163 in kernel/chr_drv/console.c.'>scrup</a> ();
<a name='L283'><font color='red'>}</font>
<a name='L284'>
<a name='L285'><i><font color='green'>//// 光标上移一行(ri - reverse line feed 反向换行)。</font></i>
<a name='L286'><b>static</b> <b>void</b>
<a name='L287'><a href='../S/60.html#L690' title='Refered from 690 in kernel/chr_drv/console.c.'>ri</a> (<b>void</b>)
<a name='L288'><font color='red'>{</font>
<a name='L289'><i><font color='green'>// 如果光标不在第1 行上,则直接修改光标当前行标量y--,并调整光标对应显示内存位置pos,减去</font></i>
<a name='L290'><i><font color='green'>// 屏幕上一行字符所对应的内存长度字节数。</font></i>
<a name='L291'>  <b>if</b> (y &gt; top)
<a name='L292'>    <font color='red'>{</font>
<a name='L293'>      y--;
<a name='L294'>      <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> -= video_size_row;
<a name='L295'>      <b>return</b>;
<a name='L296'>    <font color='red'>}</font>
<a name='L297'><i><font color='green'>// 否则需要将屏幕内容下移一行。</font></i>
<a name='L298'>  <a href='../S/60.html#L241' title='Defined at 241 in kernel/chr_drv/console.c.'>scrdown</a> ();
<a name='L299'><font color='red'>}</font>
<a name='L300'>
<a name='L301'><i><font color='green'>// 光标回到第1 列(0 列)左端(cr - carriage return 回车)。</font></i>
<a name='L302'><b>static</b> <b>void</b>
<a name='L303'><a href='../S/60.html#L647' title='Refered from 647 in kernel/chr_drv/console.c.'>cr</a> (<b>void</b>)
<a name='L304'><font color='red'>{</font>
<a name='L305'><i><font color='green'>// 光标所在的列号*2 即0 列到光标所在列对应的内存字节长度。</font></i>
<a name='L306'>  <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> -= x &lt;&lt; 1;
<a name='L307'>  x = 0;
<a name='L308'><font color='red'>}</font>
<a name='L309'>
<a name='L310'><i><font color='green'>// 擦除光标前一字符(用空格替代)(del - delete 删除)。</font></i>
<a name='L311'><b>static</b> <b>void</b>
<a name='L312'><a href='../S/60.html#L650' title='Refered from 650 in kernel/chr_drv/console.c.'>del</a> (<b>void</b>)
<a name='L313'><font color='red'>{</font>
<a name='L314'><i><font color='green'>// 如果光标没有处在0 列,则将光标对应内存位置指针pos 后退2 字节(对应屏幕上一个字符),然后</font></i>
<a name='L315'><i><font color='green'>// 将当前光标变量列值减1,并将光标所在位置字符擦除。</font></i>
<a name='L316'>  <b>if</b> (x)
<a name='L317'>    <font color='red'>{</font>
<a name='L318'>      <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> -= 2;
<a name='L319'>      x--;
<a name='L320'>      *(<b>unsigned</b> <b>short</b> *) <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> = video_erase_char;
<a name='L321'>    <font color='red'>}</font>
<a name='L322'><font color='red'>}</font>
<a name='L323'>
<a name='L324'><i><font color='green'>//// 删除屏幕上与光标位置相关的部分,以屏幕为单位。csi - 控制序列引导码(Control Sequence</font></i>
<a name='L325'><i><font color='green'>// Introducer)。</font></i>
<a name='L326'><i><font color='green'>// ANSI 转义序列:'ESC [sJ'(s = 0 删除光标到屏幕底端;1 删除屏幕开始到光标处;2 整屏删除)。</font></i>
<a name='L327'><i><font color='green'>// 参数:par - 对应上面s。</font></i>
<a name='L328'><b>static</b> <b>void</b>
<a name='L329'><a href='../S/60.html#L799' title='Refered from 799 in kernel/chr_drv/console.c.'>csi_J</a> (<b>int</b> par)
<a name='L330'><font color='red'>{</font>
<a name='L331'>  <b>long</b> <a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> <b>__asm__</b> ("cx");    <i><font color='green'>// 设为寄存器变量。</font></i>
<a name='L332'>  <b>long</b> start <b>__asm__</b> ("di");
<a name='L333'>
<a name='L334'><i><font color='green'>// 首先根据三种情况分别设置需要删除的字符数和删除开始的显示内存位置。</font></i>
<a name='L335'>  <b>switch</b> (par)
<a name='L336'>    <font color='red'>{</font>
<a name='L337'>    <b>case</b> 0:                     <i><font color='green'>/* erase from cursor to end of display */</font></i><i><font color='green'>/* 擦除光标到屏幕底端 */</font></i>
<a name='L338'>      <a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> = (scr_end - <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a>) &gt;&gt; 1;
<a name='L339'>      start = <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a>;
<a name='L340'>      <b>break</b>;
<a name='L341'>    <b>case</b> 1:                     <i><font color='green'>/* erase from start to cursor */</font></i><i><font color='green'>/* 删除从屏幕开始到光标处的字符 */</font></i>
<a name='L342'>      <a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> = (<a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> - origin) &gt;&gt; 1;
<a name='L343'>      start = origin;
<a name='L344'>      <b>break</b>;
<a name='L345'>    <b>case</b> 2:                     <i><font color='green'>/* erase whole display */</font></i><i><font color='green'>/* 删除整个屏幕上的字符 */</font></i>
<a name='L346'>      <a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> = video_num_columns * video_num_lines;
<a name='L347'>      start = origin;
<a name='L348'>      <b>break</b>;
<a name='L349'>    <b>default</b>:
<a name='L350'>      <b>return</b>;
<a name='L351'>    <font color='red'>}</font>
<a name='L352'><i><font color='green'>// 然后使用擦除字符填写删除字符的地方。</font></i>
<a name='L353'><i><font color='green'>// %0 - ecx(要删除的字符数count);%1 - edi(删除操作开始地址);%2 - eax(填入的擦除字符)。</font></i>
<a name='L354'><b>__asm__</b> ("cld\n\t" "rep\n\t" "stosw\n\t"::"c" (<a href='../D/738.html' title='Multiple defined in 17 places.'>count</a>), "D" (start), "a" (video_erase_char):"cx", "di");
<a name='L355'><font color='red'>}</font>
<a name='L356'>
<a name='L357'><i><font color='green'>//// 删除行内与光标位置相关的部分,以一行为单位。</font></i>
<a name='L358'><i><font color='green'>// ANSI 转义字符序列:'ESC [sK'(s = 0 删除到行尾;1 从开始删除;2 整行都删除)。</font></i>
<a name='L359'><b>static</b> <b>void</b>
<a name='L360'><a href='../S/60.html#L804' title='Refered from 804 in kernel/chr_drv/console.c.'>csi_K</a> (<b>int</b> par)
<a name='L361'><font color='red'>{</font>
<a name='L362'>  <b>long</b> <a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> <b>__asm__</b> ("cx");    <i><font color='green'>// 设置寄存器变量。</font></i>
<a name='L363'>  <b>long</b> start <b>__asm__</b> ("di");
<a name='L364'>
<a name='L365'><i><font color='green'>// 首先根据三种情况分别设置需要删除的字符数和删除开始的显示内存位置。</font></i>
<a name='L366'>  <b>switch</b> (par)
<a name='L367'>    <font color='red'>{</font>
<a name='L368'>    <b>case</b> 0:                     <i><font color='green'>/* erase from cursor to end of line */</font></i><i><font color='green'>/* 删除光标到行尾字符 */</font></i>
<a name='L369'>      <b>if</b> (x &gt;= video_num_columns)
<a name='L370'>        <b>return</b>;
<a name='L371'>      <a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> = video_num_columns - x;
<a name='L372'>      start = <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a>;
<a name='L373'>      <b>break</b>;
<a name='L374'>    <b>case</b> 1:                     <i><font color='green'>/* erase from start of line to cursor */</font></i><i><font color='green'>/* 删除从行开始到光标处 */</font></i>
<a name='L375'>      start = <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> - (x &lt;&lt; 1);
<a name='L376'>      <a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> = (x &lt; video_num_columns) ? x : video_num_columns;
<a name='L377'>      <b>break</b>;
<a name='L378'>    <b>case</b> 2:                     <i><font color='green'>/* erase whole line */</font></i><i><font color='green'>/* 将整行字符全删除 */</font></i>
<a name='L379'>      start = <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> - (x &lt;&lt; 1);
<a name='L380'>      <a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> = video_num_columns;
<a name='L381'>      <b>break</b>;
<a name='L382'>    <b>default</b>:
<a name='L383'>      <b>return</b>;
<a name='L384'>    <font color='red'>}</font>
<a name='L385'><i><font color='green'>// 然后使用擦除字符填写删除字符的地方。</font></i>
<a name='L386'><i><font color='green'>// %0 - ecx(要删除的字符数count);%1 - edi(删除操作开始地址);%2 - eax(填入的擦除字符)。</font></i>
<a name='L387'><b>__asm__</b> ("cld\n\t" "rep\n\t" "stosw\n\t"::"c" (<a href='../D/738.html' title='Multiple defined in 17 places.'>count</a>), "D" (start), "a" (video_erase_char):"cx", "di");
<a name='L388'><font color='red'>}</font>
<a name='L389'>
<a name='L390'><i><font color='green'>//// 允许翻译(重显)(允许重新设置字符显示方式,比如加粗、加下划线、闪烁、反显等)。</font></i>
<a name='L391'><i><font color='green'>// ANSI 转义字符序列:'ESC [nm'。n = 0 正常显示;1 加粗;4 加下划线;7 反显;27 正常显示。</font></i>
<a name='L392'><b>void</b>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?