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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值