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 ;
}
结果:
好了,本篇结束。