《30天自制操作系统》笔记四

本文介绍如何在320x200分辨率下使用8位颜色模式实现图形界面,包括调色板初始化及矩形绘制等操作。文中详细解释了颜色配置、中断管理以及具体的C语言代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第四天我们所要做的事情是使用指针以及显示一个简单的图形界面。

对于有C语言基础的人来说,指针这一部分基本没问题,主要还是图形界面的设置上。

我们要修改的是bootpack.c以及naskfunc.nas。在naskfunc.nas中加入了一些IO相关的函数:

; io interrupt
GLOBAL		_io_hlt, _io_cli, _io_sti, _io_stihlt
; io in
GLOBAL		_io_in8, _io_in16, _io_in32
; io out
GLOBAL 	_io_out8, _io_out16, _io_out32
; about EFLAGS
GLOBAL		_io_load_eflags, _io_store_eflags

值得一提的是最后的两个函数。EFLAGS是一个存储着各种标志的寄存器。


接下来就是C语言的天地了。


关于颜色,由于这次使用的是320x200的8位颜色模式,也就是最多只能使用0~255共256种颜色了。这里我们只用16种:


先来初始化调色板:init_palette()

void init_palette (void) {
	static unsigned char table_rgb[16 * 3] = {
		/*R, G, B*/
		0x00, 0x00, 0x00,	/*  0:black*/
		0xff, 0x00, 0x00,	/*  1:light red*/
		0x00, 0xff, 0x00,	/*  2:light green*/
		0xff, 0xff, 0x00,	/*  3:light yellow*/
		0x00, 0x00, 0xff,	/*  4:light blue*/
		0xff, 0x00, 0xff,	/*  5:light purple*/
		0x00, 0xff, 0xff,	/*  6:soft light blue*/
		0xff, 0xff, 0xff,	/*  7:white*/
		0xc6, 0xc6, 0xc6,	/*  8:light grey*/
		0x84, 0x00, 0x00,	/*  9:dark red*/
		0x00, 0x84, 0x00,	/* 10:dark green*/
		0x84, 0x84, 0x00,	/* 11:dark yellow*/
		0x00, 0x00, 0x84,	/* 12:dark blue*/
		0x84, 0x00, 0x84,	/* 13:dark purple*/
		0x00, 0x84, 0x84,	/* 14:soft dark blue*/
		0x84, 0x84, 0x84	/* 15:dark grey*/
	};
	set_palette (0, 15, table_rgb);
	return ;
}
其实主要就是对“调色板”table_rgb进行声明(虽然看起来真的很恶心……),然后再用set_palette来设置:

void set_palette (int start, int end, unsigned char *rgb) {
	int i;
	int eflags = io_load_eflags();
	io_cli();
	
	io_out8(0x03c8, start);	
	for (i = start; i <= end; ++i) {
		io_out8(0x03c9, *(rgb+0) / 4);
		io_out8(0x03c9, *(rgb+1) / 4);
		io_out8(0x03c9, *(rgb+2) / 4);
		rgb += 3;
	}
	io_store_eflags(eflags);
	return ;
}
这里跟作者给的代码有一点点的不同就在于我把rgb[0]改成了*(rgb+0),主要是觉得在之前声明 的时候rgb是数组,如果第一眼看循环体内的代码可能会觉得是只用到了rgb数组的前三个。事实上,因为后面还有一句“rgb+=3”,使得代码是按照声明的部分当中一行一行的来进行io_out的。

这里我们还用到了和eflags有关的几个函数,是因为要进行防止设置调色板的这个过程被中断了。

而为什么是这样的来io_out,0x03c8以及0x03c9又是哪里来的呢?这里详情可以看:http://community.osdev.info/?VGA

书上的说法是:


完了以后我们就可以开始用色了。

这里书上的参考函数:

void boxfill8(unsigned char *vram, int xsize, unsigned char c, 
		int x0, int y0, int x1, int y1) {
	int x, y;
	for (y = y0; y <= y1; y++)
		for (x = x0; x <= x1; x++)
			vram[y * xsize + x] = c;
	return;
}
就是绘制矩形。

其中c代表的是color的编号,这里被我重新宏定义了(真不明白作者的宏定义为什么他自己可以看得懂……)

/* colors */
#define BLACK		0
#define LIGHT_RED	1
#define LIGHT_GREEN	2
#define LIGHT_YELLOW	3
#define LIGHT_BLUE	4
#define LIGHT_PURPLE	5
#define SOFT_LIGHT_BLUE	6
#define WHITE		7
#define LIGHT_GREY	8
#define DARK_RED	9
#define DARK_GREEN	10
#define DARK_YELLOW	11
#define DARK_BLUE	12
#define DARK_PURPLE	13
#define SOFT_DARK_BLUE	14
#define DARK_GREY	15
今天的也就这么多了。

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值