30天自制操作系统
上QQ阅读APP看书,第一时间看更新

第5天 结构体、文字显示与GDT/IDT初始化

1 接收启动信息(harib02a)

我们今天从哪儿开始讲呢?现在“纸娃娃操作系统”的外观已经有了很大的进步,所以下面做些内部工作吧。

到昨天为止,在bootpack.c里的,都是将0xa0000呀,320、200等数字直接写入程序,而本来这些值应该从asmhead.nas先前保存下来的值中取。如果不这样做的话,当画面模式改变时,系统就不能正确运行。

所以我们就试着用指针来取得这些值。顺便说一下,binfo是bootinfo的缩写,scrn是screen(画面)的缩写。

本次的HariMain节选

void HariMain(void)
{
    char *vram;
    int xsize, ysize;
    short *binfo_scrnx, *binfo_scrny;
    int *binfo_vram;

    init_palette();
    binfo_scrnx = (short *) 0x0ff4;
    binfo_scrny = (short *) 0x0ff6;
    binfo_vram = (int *) 0x0ff8;
xsize = *binfo_scrnx;
ysize = *binfo_scrny;
vram = (char *) *binfo_vram;

这里出现的0x0ff4之类的地址到底是从哪里来的呢?其实这些地址仅仅是为了与asmhead. nas保持一致才出现的。

另外,我们把显示画面背景的部分独立出来,单独做成一个函数init_screen。独立的功能做成独立的函数,这样程序读起来要容易一些。

好了,做完了。执行一下吧。……嗯,暂时好像没什么问题。只是没什么意思,因为画面显示内容没有变化。