2 条纹图案(harib01b)
所以,为了在印成书后能看出效果,我们就显示成有条纹的图案吧。修改也很简单,只要稍微改动一下bootpack.c就可以了。
for (i = 0xa0000; i <= 0xaffff; i++) { write_mem8(i, i & 0x0f); }
哪儿变了呢?是write_mem8那里。地址部分虽然和之前一样,但写入的值由15变成了i &0x0f。
在这里&是“与”运算,是数学中没有的一种运算。很久以前,CPU就不仅能处理数值数据,还能处理图形数据。在处理图形数据的时候,加减乘除这种数学上的计算功能几乎没什么用。因为所处理的数据虽然是二进制数,但它们并不是作为数字来使用的,重点是0和1的排列方式,对于图形来说,这种排列方式本身更重要。
那么对于图形数据应该进行什么样的运算呢?可以将某些特定的位变为1,某些特定的位变为0,或者是反转特定的位等,做这样的运算。
■■■■■
先来看看让特定位变成1的功能。这可以通过“或”(OR)运算来实现。
0100 OR 0010 → 0110 1010 OR 0010 → 1010
计算“A OR B”的时候,每一位分别计算,对于某一位,A和B的该位只要有一个是1, “或”运算的结果,该位就是1。否则(A和B的该位都是0)结果就是0。也就是说,如果某个图像数据放在变量i里,让i与0010进行或运算,1所在的那一位(从右往左第2位)就一定会变为1。对于其他的位则没有任何影响。如果i的该位(从右往左第2位)原本就是1,则i不变。
下面说说让特定位变成0的功能。这可以通过“与”(AND)运算来实现。
0100 AND 1101 → 0100 1010 AND 1101 → 1000
计算“A AND B”的时候,也是每一位分别计算,对于某一位,A和B的该位都是1的时候,“与”运算的结果,该位才是1,否则结果就是0。也就是说,如果某个图像数据放在变量i里,让i与1101进行“与”运算,则0所在的那一位(从右往左第2位)就一定会变为0。如果i的该位(从右往左第2位)原本就是0,则i不变。跟“或”运算不同,“与”运算中不想改变的部分要设为1,想改为0的部分要设为0(也就是说,一个是i与0010进行“或”运算,一个是i与1101进行“与”运算)。这一点需要我们注意。
最后我们来看让特定位反转的功能。这可以通过“异或”(XOR)运算来实现。
0100 XOR 0010 → 0110 1010 XOR 0010 → 1000
计算“A XOR B”的时候,同样也是每一位分别计算,对于某一位,A和B该位的值如果不相同,“异或”运算的结果,该位是1,否则就是0。也就是说,如果某个图像数据放在变量i里,让i与0010进行“异或”运算,就可以对该位进行反转,而别的位不受影响。如果i与所有位都是1(即0xffffffff)的数进行“异或”,则全部位都反转。
■■■■■
这次我们用的是“与”(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个像素,色号就反复一次。会出现什么效果呢?运行一下“make run”就知道了。
出现了下面这种条纹图案。
印成书之后也能看得很清楚,成功啦!