⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 屏幕显示.htm

📁 现在我们将试着在屏幕上显示点东西。为此
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0073)http://rammaker.cosoft.org.cn/store/bkerndev_zh_CN_beta/Docs/printing.htm -->
<HTML><HEAD><TITLE>Bran的内核开发指南:屏幕显示</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META content="MSHTML 6.00.2900.3199" name=GENERATOR></HEAD>
<BODY>
<H2><FONT face=Tahoma>屏幕显示</FONT></H2>
<P><FONT 
face=Tahoma>现在我们将试着在屏幕上显示点东西。为此,我们需要一种管理屏幕滚动的方法。同时,能在屏幕上显示不同的颜色也是一件美妙的事情。 
幸运的是,VGA显卡使这很容易实现:为了在显示器上显示内容,显卡给定了一个内存块,我们只需向内存中写入字符和属性对。 
VGA控制器会自动地把更新的内容画到屏幕上。滚动屏幕是由我们的内核软件来维护的。从技术上说,这是我们的第一个驱动程序,现在我们就开始编写。 
</FONT></P>
<P><FONT face=Tahoma>如上面所提到的,字符缓存只是在我们地址空间中的一块内存。这块缓存在0xB8000的物理内存位置上。 
缓存的类型为“short”,这意味着缓存中的每一项内容都是由16位组成的,而不是我们通常认为的8位。 
缓存中的每一个16位元素,都可以被分为“高8位”和“低8位”。低8位代表需要显示的字符。高8位通常定义了这个字符的前景色和背景色。 </FONT></P>
<TABLE>
  <TBODY>
  <TR>
    <TD>
      <TABLE cols=50>
        <TBODY>
        <TR>
          <TD align=left width=50><FONT face=Tahoma>15 </FONT></TD>
          <TD align=right width=50><FONT face=Tahoma>12 </FONT></TD>
          <TD align=left width=50><FONT face=Tahoma>11 </FONT></TD>
          <TD align=right width=50><FONT face=Tahoma>8 </FONT></TD>
          <TD align=left width=100><FONT face=Tahoma>7 </FONT></TD>
          <TD align=right width=100><FONT face=Tahoma>0 
      </FONT></TD></TR></TBODY></TABLE></TD></TR>
  <TR>
    <TD>
      <TABLE borderColor=#808080 cols=100 border=1>
        <TBODY>
        <TR>
          <TD align=middle width=100><FONT face=Tahoma>背景色 </FONT></TD>
          <TD align=middle width=100><FONT face=Tahoma>前景色 </FONT></TD>
          <TD align=middle width=200><FONT face=Tahoma>字符 
      </FONT></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<P><FONT 
face=Tahoma>16位中的高8位被称为“属性位”,低8位被称为“字符位”。正如你在上面的表格中看到的,每一个16位元素中,属性位又被分为2个4位的块:一个代表背景色,另一个代表前景色。 
现在因为只用4位来表示颜色的原因,最多只可能有16种不同的颜色可供选择,(使用公式:(位数 ^ 2) - 4^2 = 16 )。以下是16种颜色表。 
</FONT></P>
<TABLE cols=50>
  <TBODY>
  <TR>
    <TH align=left width=50><FONT face=Tahoma>值</FONT></TH>
    <TH align=left width=200><FONT face=Tahoma>颜色</FONT></TH>
    <TH align=left width=50><FONT face=Tahoma>值</FONT></TH>
    <TH align=left width=200><FONT face=Tahoma>颜色</FONT></TH></TR>
  <TR>
    <TD width=50><FONT face=Tahoma>0 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=black>黑</FONT> </FONT></TD>
    <TD width=50><FONT face=Tahoma>8 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=#444444>深灰</FONT> 
</FONT></TD></TR>
  <TR>
    <TD width=50><FONT face=Tahoma>1 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=#0000ff>蓝</FONT> </FONT></TD>
    <TD width=50><FONT face=Tahoma>9 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=#3399ff>淡蓝</FONT> 
</FONT></TD></TR>
  <TR>
    <TD width=50><FONT face=Tahoma>2 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=#00ff00>绿</FONT> </FONT></TD>
    <TD width=50><FONT face=Tahoma>10 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=#99ff66>淡绿</FONT> 
</FONT></TD></TR>
  <TR>
    <TD width=50><FONT face=Tahoma>3 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=#00ffff>青绿</FONT> </FONT></TD>
    <TD width=50><FONT face=Tahoma>11 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=#ccffff>淡青绿</FONT> 
  </FONT></TD></TR>
  <TR>
    <TD width=50><FONT face=Tahoma>4 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=#ff0000>红</FONT> </FONT></TD>
    <TD width=50><FONT face=Tahoma>12 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=#ff6600>淡红</FONT> 
</FONT></TD></TR>
  <TR>
    <TD width=50><FONT face=Tahoma>5 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=#cc0099>品红</FONT> </FONT></TD>
    <TD width=50><FONT face=Tahoma>13 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=#ff66ff>淡品红</FONT> 
  </FONT></TD></TR>
  <TR>
    <TD width=50><FONT face=Tahoma>6 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=#663300>棕</FONT> </FONT></TD>
    <TD width=50><FONT face=Tahoma>14 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=#cc6600>淡棕</FONT> 
</FONT></TD></TR>
  <TR>
    <TD width=50><FONT face=Tahoma>7 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=#cccccc>淡灰</FONT> </FONT></TD>
    <TD width=50><FONT face=Tahoma>15 </FONT></TD>
    <TD width=200><FONT face=Tahoma><FONT color=black>白</FONT> 
  </FONT></TD></TR></TBODY></TABLE>
<P><FONT face=Tahoma>最后,为了能处理内存中特定的索引内容,我们需要使用有一个公式。 
字符型的内存是一个简单的“线性”(或平坦)的内存区域,但是显示控制器使它看起来像一个80x25的16位矩阵。 在内存中,文字的每一行都是相等的;前后相互连接。 
因此我们试着把屏幕变为平行的线。完成这个过程的最好方法是用公式:</FONT></P>
<TABLE id=table1 style="BORDER-COLLAPSE: collapse" width="100%" border=1>
  <TBODY>
  <TR>
    <TD><FONT face=Tahoma color=#800000 size=2>index = (y_value * 
      width_of_screen) + x_value;</FONT></TD></TR></TBODY></TABLE>
<P><FONT face=Tahoma>如果我们要控制(3,4)位置上的字符,使用这个公式,就得到 4 * 80 + 3 = 323。 
也就是说,在屏幕(3,4)位置上操作,就等同于如下操作:</FONT></P>
<TABLE id=table2 style="BORDER-COLLAPSE: collapse" width="100%" border=1>
  <TBODY>
  <TR>
    <TD><FONT face=Tahoma color=#800000 size=2>unsigned short *where = 
      (unsigned short *)0xB8000 + 323;<BR>*where = character | (attribute 
      &lt;&lt; 8); </FONT></TD></TR></TBODY></TABLE>
<P><FONT face=Tahoma>以下内容是'scrn.c'文件,这个文件中包含了我们处理屏幕显示时要用到的函数。 
我们include了'system.h'文件,这样我们就能使用outportb,memcpy,memset,memsets和strlen了。 
我们使用的滚动屏幕功能是十分有趣的: 
我们从第1行开始操作字符缓存(而不是第0行),然后把它复制到第0行上去,实际上就是把整个屏幕向上移动了一行。最后,我们用一行带有属性的空格写满最后一行。 
这个文件中的putch函数可能是最复杂的一个了,同样也是最大的一个。 因为它需要处理换行("\n"),回车("\r")和退格("\b")。 
如果你想要的话,你可以接着处理警告字符("\a" - ASCII 7), 处理时应该会发出一声短beep。 

⌨️ 快捷键说明

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