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 ;
}

结果:

好了,本篇结束。

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

时间: 2024-12-24 16:23:39

20天自制操作系统(四)的相关文章

20天自制操作系统(三)

我们看\projects\03_day\harib00j中的文件 ipl10.nas: 相当于一个boot源文件,它使用int 0x13 ah=0x2加载某些扇区的文件(loader+kernel)到内存0x从c200中 asmhead.nas:相当于一个loader源文件,作用是 1.设置VGA为320x200x8bit,并把这些参数保存起来 MOV AL,0x13 ; VGA 320x200x8bit MOV AH,0x00 INT 0x10 MOV BYTE [VMODE],8 MOV W

20天自制操作系统(八)

移动鼠标并显示鼠标坐标 struct MOUSE_DEC { unsigned char buf[3], phase; int x, y, btn; }; enable_mouse(&mdec); for (;;) { io_cli(); //无数据则等待 if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == 0) { io_stihlt(); } else { if (fifo8_status(&keyfifo)

20天自制操作系统(一)

为什么博文分类以及博文名字叫"20天自制操作系统"呢? 因为6月11日到7月还有接近20天的时间,所以我取整,接近20天内学完. <30天自制操作系统> 作者  川合秀实   译者  周自恒,李黎明,曾箱江,张文旭 这本书. PS:从5月20号到6月10日,除了上班之外,下班就是吃喝玩,浪费了特别多的时间.看到BIT祝威日进千里,我深感惭愧.所以我决定"改邪归正". 好了,开始. 首先罗列出工具: ----------------------------

《30天自制操作系统》读书笔记(2)hello, world

让系统跑起来 要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是06年出版的,可惜那时候没有电脑,没想到作者用的还是软盘,现在的电脑谁有软驱?不得已我使用一张128M的SD卡来代替,而事实上你用的是U盘还是软盘对我们的操作系统没有影响,缺点是你的U盘刷入系统后容量只能是1440 MB,即当年流行的3.5英寸软盘的大小,当然不用担心,再格式化一次(用DiskGeniu),就可以恢复. 我做事情的话,总是怕自己的努力的结果白费了,害怕辛辛苦苦看完这本书但是发现做出来的东西现在根本没法用,

《30天自制操作系统》读书笔记(4) 绘图

暑假果然是滋生懒散的温床. (╯‵□′)╯︵┻━┻ 好久不动都忘记之前做到哪里了, 上次好像做到了C语言的引入, 这一节所做的东西都相当轻松, 将会绘制出操作系统的基本界面. 绘图的原理 按照书中所说, 将值写入到显存中就能在屏幕上显示相应的像素, 在asmhead.nas 中有这一段: 1 CYLS EQU 0x0ff0 ; 设定启动区 2 LEDS EQU 0x0ff1 3 VMODE EQU 0x0ff2 ; 关于颜色数目的信息,颜色的位数 4 SCRNX EQU 0x0ff4 ; 分辨率

《30自制操作系统》实现中文显示

<30天自制操作系统>最近一直再看,最近已经看到后面了,看到第28天,里面讲到可以实现对全角字符的支持,而原操作系统代码里面只是支持了日语显示,而中文版的这本书也只是讲了一个思路,具体的实现也是没有的.网上也好像没有人实现过这个吧,我是找不到.(由于书中每一章每一小节都有代码,我看书的时候就懒得去实际写代码,就简单看看.不过这次就可以写一下了,加深对这个系统的了解)反正没事做,就准备实现对这个系统的汉字全角支持. 一.了解HZK编码 在改造之前,我们先了解一下符合GB2312标准的中文点阵字库

【自制操作系统01】硬核讲解计算机的启动过程

目录 一.为什么是 BIOS 主导?    二.内存映射    三.实模式下的内存分布    四.怎么就从 BIOS 里的程序开始执行了    五.BIOS 里到底写了什么程序    六.0x7c00 是啥    七.启动区里的代码写了啥    八.操作系统内核写了啥        软硬件协同发展        历史遗留问题    九.参考资料    十.开源项目和课程规划        项目开源        课程规划 本讲只为讲明白下面一个问题: 我们按下开机键后究竟发生了什么? 好的,这似

【自制操作系统06】终于开始用 C 语言了,第一行内核代码!

一.整理下到目前为止的流程图 写到这,终于才把一些苦力活都干完了,也终于到了我们的内核代码部分,也终于开始第一次用 c 语言写代码了!为了这个阶段性的胜利,以及更好地进入内核部分,下图贴一张到目前为止的流程图.(其中黄色部分是今天准备做的事情) 二.先上代码 loader.asm ... ;加载kernel mov eax,0x9 ;kernel.bin所在的扇区号 0x9 mov ebx,0x70000 ;写入的内存地址 0x70000 mov ecx,200 ;读入的扇区数 call rd_

【自制操作系统12】熟悉而陌生的多线程

一.到目前为止的程序流程图 为了让大家清楚目前的程序进度,画了到目前为止的程序流程图,如下.红色部分是我们今天要实现的 二.进程与线程简述 相信看这篇文章的人,肯定不是对基本概念感兴趣,这也不是我的主要目的.所以这里真的是简述一下 进程和线程都是 独立的程序执行流,只不过进程有自己独立的内存空间,同一个进程里的线程共享内存空间,具体体现在 pcb 表中一个字段上,指向页表的地址值. 线程分 用户线程 和 内核线程,用户线程可以理解为就是没有线程,只是用户程序中写了一个线程调度器程序在假装切换,操