码迷,mamicode.com
首页 > 其他好文 > 详细

20天自制操作系统(四)

时间:2014-06-16 08:21:31      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   code   java   http   

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 结果:

bubuko.com,布布扣

颜色为0-f,0-f...如此循环。

这是使用了默认调色板的颜色,如果我们想自己设置0-f号颜色怎么办呢?

那需要自己设置调色板:

bubuko.com,布布扣
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;
}
bubuko.com,布布扣

然后我们看 第7小节/绘制矩形/harib01g

看到这个题目,我想的是自己绘制一个矩形。试试看

首先我复制了一份harib01b名字为copy-harib01b

bubuko.com,布布扣
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();
    }
}
bubuko.com,布布扣

先看看屏幕背景是不是黑色,结果是肯定的。然后我们写一个画线函数试试。

bubuko.com,布布扣
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 ;
}
bubuko.com,布布扣

结果:bubuko.com,布布扣

然后改改主函数,画个矩形试试:

bubuko.com,布布扣

good。

继续写一个画矩形块的函数:

bubuko.com,布布扣
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 ;
}
bubuko.com,布布扣

结果:

bubuko.com,布布扣

好了,本篇结束。

 

 

 

20天自制操作系统(四),布布扣,bubuko.com

20天自制操作系统(四)

标签:style   class   blog   code   java   http   

原文地址:http://www.cnblogs.com/qiangua/p/3783746.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!