30天自制操作系统日志第5天

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验日志

一、实验主要内容

1、接收启动信息和结构体

在上一章中,xsize和ysize的值都是直接赋值为320*200,但实际上我们需要从asmhead.nas 先前保存下来的值中去。即:

不然的话,当画面模式改变时系统就不能正确运行。所以试着用指针取得图像模式: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;

for(;;) {

io_hlt(); /*執行naskfunc里的_io_hlt*/

}

}

诶这样是不是说就可以改变画面模式了?于是天真的我:

保存运行一下,以为画面会显示坐标在左上角的320*200,结果发现画面显示错误,forget about it。诶然后发现结构体里这个在汇编里没有定义,可能作者以后讲?

哦先说结构体

可以看做结构体是将一堆变量集中声明,然后作为新的变量用于其他场合。

结构体的运用:

(1)先声明结构体:

如上图

(2)后定义结构体变量:struct BOOTINFO abc; 或者定义结构体指针变量:struct BOOTINFO *binfo; 这里binfo表示指针变量后应该首先给指针赋值,可写成:Binfo = (struct

BOOTINFP *)0x0ff0;加上(struct BOOTINFP *)是对数字进行强制类型转换,告诉编译器这个数字是一个BOOTINFO类型的指针变量。

info指针指向地址0x0ff0是结构体的起始地址,结构体内的地址则依次按其类型增加。所以可以不用直接使用内存地址,而是使用*binfo来表示这个内存地址上12个字节的结构体。

在表示结构体内变量的时候,使用“.”表示:xsize = (*binfo).scrnx;

因为binfo是指向结构体地址的指针变量,它表示其内部变量的形式很多,可以用箭头表示:Xsieze = binfo->scrnx,或者用binfo->scrnx直接代替xsize

2、显示字符

终于到写字了,诶果然有定义好的哪个字母让具体哪个像素指定颜色,比如A的显示如下:

用8x16的长方形像素点阵来表示,8位是一个字节,1个字符是16个字节,然后将字体主句写入主程序:

static char font_A[16] = {

0x00, 0x18, 0x18, 0x18, 0x18, 0x24, 0x24, 0x24,

0x24, 0x7e, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00

};

程序里就会有A的信息了,当然放在程序里总是不好的,后面就有改了。显示字符的函数是这样:

void putfont8(char *vram, int xsize, int x, int y, char c, char *font)

{

int i;

char *p, d; /* data */

for (i = 0; i < 16; i++)

{

p = vram + (y + i) * xsize + x;

d = font[i];

if ((d & 0x80) != 0) { p[0] = c; } //第i行的第1个像素,如果信息里存储

的是1,就显示颜色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; }

}

return;

}

这里就是将这个字符的16个字节用for循环逐个位判断,修改像素颜色,最终显示字符。然后再主函数中调用:

putfont8(binfo->vram, binfo->scrnx, 10, 10, COL8_FFFFFF, font_A);

运行结果如下:

3、增加字体

刚刚程序里只有字符A的信息,只能方便地显示A,那其他字符当然也要存啊,将平木敬太郎和圣人先生编辑好了的OSAKA字体(hankaku.txt)加入到源程序中,然后用工具(makefont.exe)将此文本读进来输出成16x256=4096字节的文件。编译后生成hankaku.bin 文件,加上连接所必须的接口信息变成目标文件(bin2obj.exe来完成)。翻译之后相当于增加了此汇编语言:

_hankaku:

DB 各种数据(共4096字节)

然后像以前编译C语言写Makefile一样修改Makefile,加上相关代码。

如果要在C语言中使用这种字体数据,只需要写上:

Extern char hankaku[4096];

像这种在源程序以外准备的数据,都需要加上externa属性。让编译器知道它是外部数据,并在编译时做出相应调整。OSASK 的字体数据,依照一般的ASCⅡ字符编码,含有256 个字符。A 的字符编码是0x41, 所以 A 的字体数据,放在“hankaku + 0x41 * 16 ”开始的16 字节里。C 语言中 A 的字符编码

相关文档
最新文档