第4天,明显就简单了很多。作者讲了C语言指针的知识,然后用指针操作内存来设定画面。简单方便。不过今天也学到很多东西。
VGA设定:
进入保护模式后,画面模式也改变了,采用VGA。查询之后发现BIOS的0x10号向量是用来设定VGA模式的。其中AH为0,代表Video模式,就是非text。AL为0x13就是所谓的Mode 13h, 即标准的VGA模式。还有很多AL设置选项,可以参考Ralf Brown’s Interrupt List. 以下就是设定VGA的汇编代码,顺便把设定数据存在内存里。可以看到操作VGA的内存地址从0xa0000开始,到0x000BFFFF,一共640kb,实际我们用的是320*200 = 64 kb。为什么从0xa0000开始, 有很多资料都有说明。0xa0000是mode 13h的地址, 0xb8000是text mode的地址。
1 2 3 4 5 6 7 8 9 10 | ;set VIDEO ;see http://www.ctyme.com/rbrown.htm mov al, 0x13 mov ah, 0x00 int 0x10 ; call interrupt to set graphic mode mov byte [VMODE],8 mov word [SCRNX],320 mov word [SCRNY],200 mov dword [VRAM],0x000a0000 |
C指针:
作者先用了汇编来操作内存,控制显示,就是上一天的样子。今天就直接用C指针操作。比如下面那样。神奇的是,无论 2[p] 还是i[p], 还是p[i],编译器都会解释为 *(p+i)。以前还没有注意过。又可以装b了,不知道是不是所有编译器都支持这么写。。
1 2 3 4 5 6 7 8 | char *p; // char* p,q <===> char *p,q p = (char *) 0xa0000; for (i = 0; i <= 0xffff; i++){ // p = (char *) i; // *(p + i) = i & 0x1f; i[p] = i & 0x0f; //2[p] all ok!!!!!!!!!!!!!! // p[i] = i & 0x2f; } |
色号设定:
VGA默认是256色,8位。但是作者认为我们只要用16种颜色,然后就用一段比较蛋疼的程序修改了默认颜色。不重要,我就先不管了。下图分别是默认的256种颜色,和修改后的16种颜色。
绘制矩形:
能操作内存,那么绘制图形也不再话下。用指针操作简直方便。代码见github,下图为效果。分别为测试矩形和假的任务栏。
链接:
近期评论