?? 屏幕顯示.htm
字號:
?<!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的內(nèi)核開發(fā)指南:屏幕顯示</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>現(xiàn)在我們將試著在屏幕上顯示點(diǎn)東西。為此,我們需要一種管理屏幕滾動的方法。同時,能在屏幕上顯示不同的顏色也是一件美妙的事情。
幸運(yùn)的是,VGA顯卡使這很容易實(shí)現(xiàn):為了在顯示器上顯示內(nèi)容,顯卡給定了一個內(nèi)存塊,我們只需向內(nèi)存中寫入字符和屬性對。
VGA控制器會自動地把更新的內(nèi)容畫到屏幕上。滾動屏幕是由我們的內(nèi)核軟件來維護(hù)的。從技術(shù)上說,這是我們的第一個驅(qū)動程序,現(xiàn)在我們就開始編寫。
</FONT></P>
<P><FONT face=Tahoma>如上面所提到的,字符緩存只是在我們地址空間中的一塊內(nèi)存。這塊緩存在0xB8000的物理內(nèi)存位置上。
緩存的類型為“short”,這意味著緩存中的每一項(xiàng)內(nèi)容都是由16位組成的,而不是我們通常認(rèn)為的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位的塊:一個代表背景色,另一個代表前景色。
現(xiàn)在因?yàn)橹挥?位來表示顏色的原因,最多只可能有16種不同的顏色可供選擇,(使用公式:(位數(shù) ^ 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>藍(lán)</FONT> </FONT></TD>
<TD width=50><FONT face=Tahoma>9 </FONT></TD>
<TD width=200><FONT face=Tahoma><FONT color=#3399ff>淡藍(lán)</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>最后,為了能處理內(nèi)存中特定的索引內(nèi)容,我們需要使用有一個公式。
字符型的內(nèi)存是一個簡單的“線性”(或平坦)的內(nèi)存區(qū)域,但是顯示控制器使它看起來像一個80x25的16位矩陣。 在內(nèi)存中,文字的每一行都是相等的;前后相互連接。
因此我們試著把屏幕變?yōu)槠叫械木€。完成這個過程的最好方法是用公式:</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
<< 8); </FONT></TD></TR></TBODY></TABLE>
<P><FONT face=Tahoma>以下內(nèi)容是'scrn.c'文件,這個文件中包含了我們處理屏幕顯示時要用到的函數(shù)。
我們include了'system.h'文件,這樣我們就能使用outportb,memcpy,memset,memsets和strlen了。
我們使用的滾動屏幕功能是十分有趣的:
我們從第1行開始操作字符緩存(而不是第0行),然后把它復(fù)制到第0行上去,實(shí)際上就是把整個屏幕向上移動了一行。最后,我們用一行帶有屬性的空格寫滿最后一行。
這個文件中的putch函數(shù)可能是最復(fù)雜的一個了,同樣也是最大的一個。 因?yàn)樗枰幚頁Q行("\n"),回車("\r")和退格("\b")。
如果你想要的話,你可以接著處理警告字符("\a" - ASCII 7), 處理時應(yīng)該會發(fā)出一聲短beep。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -