30天自制操作系统读书笔记(五)

为了让程序灵活点,作者觉得把什么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的介绍留到明天吧!

原文地址:https://www.cnblogs.com/You0/p/4442372.html