发布于 

30天自制操作系统(23)

DAY23_图形处理相关

1.编写malloc

如果api_malloc只是调用操作系统中的memman_alloc,并将分配到的内存空间地址返回给应用程序的话,是行不通的,因为通过memman_alloc所获得的内存空间并不位于应用程序的数据段范围内,应用程序是无法进行读写操作的。如果应用程序在不知情的情况下执行了读写操作,将会产生异常并强制结束。

memman初始化
EDX=8
EBX=memman的地址
EAX=memman所管理的内存空间的起始地址
ECX=memman所管理的内存空间的字节数
malloc
EDX=9
EBX=memman的地址
ECX=需要请求的字节数
EAX=分配到的内存空间地址
free
EDX=10
EBX=memman的地址
EAX=需要释放的内存空间地址
ECX=需要释放的字节数

2.画点

在窗口中画点
EDX =11
EBX =窗口句柄
ESI =显示位置的x坐标
EDI =显示位置的y坐标
EAX =色号

画星星

int api_openwin(char *buf, int xsiz, int ysiz, int col_inv, char *title); 
void api_boxfilwin(int win, int x0, int y0, int x1, int y1, int col);
void api_initmalloc(void);
char *api_malloc(int size);
void api_point(int win, int x, int y, int col);
void api_end(void);
int rand(void); /*产生0~32767之间的随机数*/
void HariMain(void)
{
char *buf;
int win, i, x, y;
api_initmalloc();
buf = api_malloc(150 * 100);
win = api_openwin(buf, 150, 100, -1, "stars");
api_boxfilwin(win, 6, 26, 143, 93, 0 /*黑色*/);
for (i = 0; i < 50; i++) {
x = (rand() % 137) + 6;
y = (rand() % 67) + 26;
api_point(win, x, y, 3 /*黄色*/);
}
api_end();
}

3.刷新窗口

在所有的窗口绘图命令中设置一个“不自动刷新”的选项,然后再编写一个仅用来刷新的API

刷新窗口
EDX = 12
EBX = 窗口句柄
EAX = x0
ECX = y0
ESI = x1
EDI = y1

4.画直线

for (i = 0; i < len; i++) { 
api_point(win, x, y, col);
x += dx;
y += dy;
}

5.关闭窗口

关闭窗口
EDX=14
EBX=窗口句柄

6.键盘输入API

键盘输入
EDX = 15
EAX = 0……没有键盘输入时返回1,不休眠
= 1……休眠直到发生键盘输入
EAX = 输入的字符编码

8.强制结束并关闭窗口

问题:在运行walk.hrb和lines.hrb时,如果不按回车键结束,而是按Shift+F1强制结束程序的话,窗口就会残留在画面上。
解决方法:在struct SHEET中添加一个用来存放task的成员,当应用程序结束时,查询所有的图层,如果图层的task为将要结束的应用程序任务,则关闭该图层。