首页 > 代码库 > 20天自制操作系统(四)
20天自制操作系统(四)
D:\30day\projects\04_day\harib01b下代码如何编译运行。
把z_tools复制到04_day下,然后修改Makefile文件的run:
run :
$(MAKE) img
$(COPY) haribote.img ..\..\qemu\a.img
$(MAKE) -C ../../qemu/
make run 结果:
颜色为0-f,0-f...如此循环。
这是使用了默认调色板的颜色,如果我们想自己设置0-f号颜色怎么办呢?
那需要自己设置调色板:
void init_palette(void) { //首先定义我们想要的颜色 static unsigned char table_rgb[16 * 3] = { 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0xc6, 0xc6, 0x84, 0x00, 0x00, 0x00, 0x84, 0x00, 0x84, 0x84, 0x00, 0x00, 0x00, 0x84, 0x84, 0x00, 0x84, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84 }; //设置颜色表 设置完成后 以后我们用x(0-f)号颜色就变成我们自己设定的了 set_palette(0, 15, table_rgb); return; } //写端口来设置颜色表(调色板) //需要注意的是开关中断 void set_palette(int start, int end, unsigned char *rgb) { int i, eflags; eflags = io_load_eflags(); io_cli(); io_out8(0x03c8, start); for (i = start; i <= end; i++) { io_out8(0x03c9, rgb[0] / 4); // R io_out8(0x03c9, rgb[1] / 4); // G io_out8(0x03c9, rgb[2] / 4); // B rgb += 3; } io_store_eflags(eflags); return; }
然后我们看 第7小节/绘制矩形/harib01g
看到这个题目,我想的是自己绘制一个矩形。试试看
首先我复制了一份harib01b名字为copy-harib01b
void io_hlt(void); void write_mem8(int addr, int data); void HariMain(void) { int i; char *p; p = (char *)0xa0000; // for (i = 0; i <= 0xffff; i++) // { //write_mem8(i, i & 0x0f); // p[i] = 0; // } for (;;) { io_hlt(); } }
先看看屏幕背景是不是黑色,结果是肯定的。然后我们写一个画线函数试试。
void io_hlt(void); void write_mem8(int addr, int data); //我们只要在0xa0000+x+y*320写入颜色号就是画 void drawline(int x1,int y1,int x2,int y2,int x); //画直线 参数为端点坐标 void drawrectblock(int x1,int y1,int x2, int y2, int x); //画矩形块 参数为左上角 右下角坐标 void HariMain(void) { int i; char *p; drawline(20,5,100,5,6); for (;;) { io_hlt(); } } void drawline(int x1,int y1,int x2,int y2,int x) { char *p; p = (char *)0xa0000; if(x1<x2) //画横线 { for(;x1<x2;x1++) { *(p+x1+y1*320) = x; //使用x号颜色 } } else //画竖线或者画点 { for(;y1<y2;y1++) { *(p+x1+y1*320) = x; } } return ; }
结果:
然后改改主函数,画个矩形试试:
good。
继续写一个画矩形块的函数:
void drawrectblock(int x1,int y1,int x2, int y2, int x) { int i,j; char *p; p = (char *)0xa0000; for(j=y1;j<=y2;j++) { for(i=x1;i<=x2;i++) { *(p+i+j*320) = x; } } return ; }
结果:
好了,本篇结束。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。