9 变得更像真正的操作系统(1)(harib22i)
做到这里,我们的系统看上去已经非常像那么回事了。不过,大家回忆一下一般操作系统的样子,再看看我们的画面,是不是有什么奇怪的东西混进去了?一般的操作系统中哪有这玩意儿啊?笔者所说的,就是taks_a的窗口。
一般的操作系统不会一上来就弹出这么一个窗口来吧?话说回来,这个窗口貌似是14.6节中我们为了让画面看上去更酷更有操作系统范儿而做出来的,也就是说,它只是个花瓶,摆着好看罢了(14.6节已经是差不多两周之前讲的了呢)。之后,我们在练习多任务等部分时这个窗口也还派上过用场,不过现在它看起来确实有点碍手碍脚了——它不是应用程序而是操作系统的一部分,所以连关都关不掉。
因此,我们还是把它从操作系统中删掉吧,如果哪天我们又想念它了,只要再写一个应用程序出来就好了。而且应用程序的话,不需要的时候就可以关掉,(如果需要)还可以同时运行多个副本呢。
其实,在bootpack.c中,只有这个task_a的窗口是搞特殊化的,如果删掉task_a的部分程序就变得清爽多了。对了,task_a的处理全部是在bootpack.c中完成的,因此不需要修改其他的程序。
■■■■■
本次的bootpack.c节选
void HariMain(void)
{
(中略)
int mx, my, i; /*删掉了cursor_x和cursor_c */
unsigned int memtotal;
struct MOUSE_DEC mdec;
struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
unsigned char *buf_back, buf_mouse[256], *buf_cons[2]; /*删掉了buf_win */
struct SHEET *sht_back, *sht_mouse, *sht_cons[2];
struct TASK *task_a, *task_cons[2], *task;
/*删掉了用于光标闪烁的timer */
static char keytable0[0x80] = { /*向keytable0、keytable1中追加退格键和回车键的编码*/
0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', 0x08, 0,
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', 0x0a, 0, 'A', 'S',
(中略)
};
static char keytable1[0x80] = {
0, 0, '!', 0x22, '#', '$', '%', '&', 0x27, '(', ')', '~', '=', '~', 0x08, 0,
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '`', '{', 0x0a, 0, 'A', 'S',
(中略)
};
(中略)
/* sht_back */
(中略)
/* sht_cons */
(中略)
/*删掉了关于sht_win的部分*/
/* sht_mouse */
(中略)
sheet_slide(sht_back, 0, 0);
sheet_slide(sht_cons[1], 56, 6);
sheet_slide(sht_cons[0], 8, 2);
/*删掉了sht_win */
sheet_slide(sht_mouse, mx, my);
sheet_updown(sht_back, 0);
sheet_updown(sht_cons[1], 1);
sheet_updown(sht_cons[0], 2);
sheet_updown(sht_mouse, 3); /*从此开始*/
key_win = sht_cons[0];
keywin_on(key_win); /*到此结束*/
(中略)
for (;;) {
(中略)
if (fifo32_status(&fifo) == 0) {
(中略)
} else {
(中略)
if (256 <= i && i <= 511) { /*键盘数据*/
(中略)
/*从此开始*/ if (s[0] != 0) { /*一般字符、退格键、回车键*/
fifo32_put(&key_win->task->fifo, s[0] + 256);
}
if (i == 256 + 0x0f) { /* Tab键*/
keywin_off(key_win);
j = key_win->height - 1;
if (j == 0) {
j = shtctl->top - 1;
}
key_win = shtctl->sheets[j];
/*到此结束*/ keywin_on(key_win);
}
(中略)
/*删掉了“重新显示光标”的部分*/
} else if (512 <= i && i <= 767) { /*鼠标数据*/
if (mouse_decode(&mdec, i - 512) != 0) {
(中略)
if ((mdec.btn & 0x01) != 0) {
/*按下左键*/
if (mmx < 0) {
(中略)
for (j = shtctl->top - 1; j > 0; j--) {
(中略)
if (0 <= x && x < sht->bxsize && 0 <= y && y < sht->bysize) {
if (sht->buf[y * sht->bxsize + x] != sht->col_inv) {
sheet_updown(sht, shtctl->top - 1);
if (sht != key_win) {
keywin_off(key_win); /*这里!*/
key_win = sht;
keywin_on(key_win); /*这里!*/
}
(中略)
}
}
}
} else {
(中略)
}
} else {
(中略)
}
}
}
/*删掉了“光标用定时器”的部分*/
}
}
}
void keywin_off(struct SHEET *key_win) /*从此开始*/
{
change_wtitle8(key_win, 0);
if ((key_win->flags & 0x20) != 0) {
fifo32_put(&key_win->task->fifo, 3); /*命令行窗口光标OFF */
}
return; /*到此结束*/
}
void keywin_on(struct SHEET *key_win) /*从此开始*/
{
change_wtitle8(key_win, 1);
if ((key_win->flags & 0x20) != 0) {
fifo32_put(&key_win->task->fifo, 2); /*命令行窗口光标ON */
}
return; /*到此结束*/
}
大功告成,看上去清爽多了。修改前的bootpack.c一共有374行代码,修改后只剩下304行,居然减掉了70行呢。
我们还是来“make run”吧,不知道能不能成功呢。哎呀?
一直重复这个画面
貌似系统在不断重启,当然,任何操作都没有反应,看来是失败了……