为了让程序灵活点,作者觉得把什么320X200这些数据直接写入程序,不如让程序自己获取。
所以就引入了结构体,指针。用指针直接在内存中获取这些数据
(如程序里的这句: Binfo_scrnx = (short *) 0xff4; )。
对于结构体和指针我就不细写了,有C语言基础的人都知道。
因为已经进入了32位模式,所以不能再用bios写好的中断程序给我们输出字符了,要手动了!
用像素点描出图形。
字符可以使用8X16的长方形像素点来表示,转变为16进制就是这样:
static char font_A[16] = { 0x00, 0x18, 0x18, 0x18, 0x18, 0x24, 0x24, 0x24, 0x24, 0x7e, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00 };
有了这些内容,就可以使用for循环,来描绘字符了。
二维屏幕和一维的地址换算关系如下:
addr = 0xa0000 + x + y * 320
void putfont8(char *vram, int xsize, int x, int y, char c, char *font) //vram就是0xa0000 ,xsize就是320,然后x,y就是屏幕的坐标。
for (i = 0; i < 16; i++) { p = vram + (y + i) * xsize + x; d = font[i]; if ((d & 0x80) != 0) { p[0] = c; } if ((d & 0x40) != 0) { p[1] = c; } if ((d & 0x20) != 0) { p[2] = c; } if ((d & 0x10) != 0) { p[3] = c; } if ((d & 0x08) != 0) { p[4] = c; } if ((d & 0x04) != 0) { p[5] = c; } if ((d & 0x02) != 0) { p[6] = c; } if ((d & 0x01) != 0) { p[7] = c; } }
0x80换成二进制就是10000000
0x40 就是01000000 这个循环的意思就显而易见了。
它就是判断8位到底哪几个位要打印。
比如: 11111000 先和100000000 进行与操作 那就是 10000000然后p[0]就被描绘上了颜色。
因为字符串太多,自己一个个设计过于麻烦,所以作者引入了一个字体。 hankaku.txt
他通过编译器编译会产生二进制文件,和我们之前描述A的差不多,然后一共是4096个字节。
那么就可以在C语言里使用这个文件了 :
Extern char hankaku[4096];
其中字符都是按照顺序排列的,A这个字符位于第65个位置。我们知道每个字节占了16位
所以A就在hankaku[65*16]这里开始! 也就是书上的0x41*16也就是 ‘A’*16
作者进一步封装,写了能处理字符串的函数。
接着又介绍了 sprintf。
接下来画出鼠标的过程和上面如出一辙。
对于GDT,IDT的介绍留到明天吧!
时间: 2024-10-25 16:45:50