首页 > 代码库 > 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 ;
}

结果:

好了,本篇结束。