官术网_书友最值得收藏!

2 條紋圖案(harib01b)

所以,為了在印成書后能看出效果,我們就顯示成有條紋的圖案吧。修改也很簡單,只要稍微改動一下bootpack.c就可以了。

for (i = 0xa0000; i <= 0xaffff; i++) {
    write_mem8(i, i & 0x0f);
}

哪兒變了呢?是write_mem8那里。地址部分雖然和之前一樣,但寫入的值由15變成了i &0x0f。

在這里&是“與”運算,是數(shù)學(xué)中沒有的一種運算。很久以前,CPU就不僅能處理數(shù)值數(shù)據(jù),還能處理圖形數(shù)據(jù)。在處理圖形數(shù)據(jù)的時候,加減乘除這種數(shù)學(xué)上的計算功能幾乎沒什么用。因為所處理的數(shù)據(jù)雖然是二進制數(shù),但它們并不是作為數(shù)字來使用的,重點是0和1的排列方式,對于圖形來說,這種排列方式本身更重要。

那么對于圖形數(shù)據(jù)應(yīng)該進行什么樣的運算呢?可以將某些特定的位變?yōu)?,某些特定的位變?yōu)?,或者是反轉(zhuǎn)反轉(zhuǎn)指讓0變?yōu)?、1變?yōu)?的操作,形象地來說就好比照片的底片一樣。特定的位等,做這樣的運算。

■■■■■

先來看看讓特定位變成1的功能。這可以通過“或”(OR)運算來實現(xiàn)。

0100 OR 0010 → 0110
1010 OR 0010 → 1010

計算“A OR B”的時候,每一位分別計算,對于某一位,A和B的該位只要有一個是1, “或”運算的結(jié)果,該位就是1。否則(A和B的該位都是0)結(jié)果就是0。也就是說,如果某個圖像數(shù)據(jù)放在變量i里,讓i與0010進行或運算,1所在的那一位(從右往左第2位)就一定會變?yōu)?。對于其他的位則沒有任何影響。如果i的該位(從右往左第2位)原本就是1,則i不變。

下面說說讓特定位變成0的功能。這可以通過“與”(AND)運算來實現(xiàn)。

0100 AND 1101 → 0100
1010 AND 1101 → 1000

計算“A AND B”的時候,也是每一位分別計算,對于某一位,A和B的該位都是1的時候,“與”運算的結(jié)果,該位才是1,否則結(jié)果就是0。也就是說,如果某個圖像數(shù)據(jù)放在變量i里,讓i與1101進行“與”運算,則0所在的那一位(從右往左第2位)就一定會變?yōu)?。如果i的該位(從右往左第2位)原本就是0,則i不變。跟“或”運算不同,“與”運算中不想改變的部分要設(shè)為1,想改為0的部分要設(shè)為0(也就是說,一個是i與0010進行“或”運算,一個是i與1101進行“與”運算)。這一點需要我們注意。

最后我們來看讓特定位反轉(zhuǎn)的功能。這可以通過“異或”(XOR)運算來實現(xiàn)。

0100 XOR 0010 → 0110
1010 XOR 0010 → 1000

計算“A XOR B”的時候,同樣也是每一位分別計算,對于某一位,A和B該位的值如果不相同,“異或”運算的結(jié)果,該位是1,否則就是0。也就是說,如果某個圖像數(shù)據(jù)放在變量i里,讓i與0010進行“異或”運算,就可以對該位進行反轉(zhuǎn),而別的位不受影響。如果i與所有位都是1(即0xffffffff)的數(shù)進行“異或”,則全部位都反轉(zhuǎn)。

■■■■■

這次我們用的是“與”(AND)運算。將地址值與0x0f進行“與”運算會怎么樣呢?低4位原封保留,而高4位全部都變成0。所以,寫入的值是:

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 …

就像這樣,每隔16個像素,色號就反復(fù)一次。會出現(xiàn)什么效果呢?運行一下“make run”就知道了。

出現(xiàn)了下面這種條紋圖案。

印成書之后也能看得很清楚,成功啦!

主站蜘蛛池模板: 长葛市| 满洲里市| 巫溪县| 册亨县| 芮城县| 乐平市| 油尖旺区| 无棣县| 乐山市| 灵川县| 澳门| 石泉县| 朝阳市| 汉沽区| 尚义县| 治多县| 广南县| 黄冈市| 兴化市| 马关县| 信宜市| 全州县| 松原市| 兰州市| 昌乐县| 灵武市| 龙山县| 绥滨县| 武功县| 无锡市| 静宁县| 韶山市| 长治市| 阳江市| 鄄城县| 察隅县| 扎赉特旗| 烟台市| 文昌市| 米脂县| 大邑县|