9 变得更像真正的操作系统(1)(harib22i)

做到这里,我们的系统看上去已经非常像那么回事了。不过,大家回忆一下一般操作系统的样子,再看看我们的画面,是不是有什么奇怪的东西混进去了?一般的操作系统中哪有这玩意儿啊?笔者所说的,就是taks_a的窗口。

一般的操作系统不会一上来就弹出这么一个窗口来吧?话说回来,这个窗口貌似是14.6节中我们为了让画面看上去更酷更有操作系统范儿而做出来的,也就是说,它只是个花瓶,摆着好看罢了(14.6节已经是差不多两周之前讲的了呢)。之后,我们在练习多任务等部分时这个窗口也还派上过用场,不过现在它看起来确实有点碍手碍脚了——它不是应用程序而是操作系统的一部分,所以连关都关不掉。

因此,我们还是把它从操作系统中删掉吧,如果哪天我们又想念它了,只要再写一个应用程序出来就好了。而且应用程序的话,不需要的时候就可以关掉,(如果需要)还可以同时运行多个副本呢。

其实,在bootpack.c中,只有这个task_a的窗口是搞特殊化的,如果删掉task_a的部分程序就变得清爽多了。对了,task_a的处理全部是在bootpack.c中完成的,因此不需要修改其他的程序。

■■■■■

本次的bootpack.c节选

  1. void HariMain(void)
  2. {
  3. (中略)
  4. int mx, my, i; /*删掉了cursor_x和cursor_c */
  5. unsigned int memtotal;
  6. struct MOUSE_DEC mdec;
  7. struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
  8. unsigned char *buf_back, buf_mouse[256], *buf_cons[2]; /*删掉了buf_win */
  9. struct SHEET *sht_back, *sht_mouse, *sht_cons[2];
  10. struct TASK *task_a, *task_cons[2], *task;
  11. /*删掉了用于光标闪烁的timer */
  12. static char keytable0[0x80] = { /*向keytable0、keytable1中追加退格键和回车键的编码*/
  13. 0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', 0x08, 0,
  14. 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', 0x0a, 0, 'A', 'S',
  15. (中略)
  16. };
  17. static char keytable1[0x80] = {
  18. 0, 0, '!', 0x22, '#', '$', '%', '&', 0x27, '(', ')', '~', '=', '~', 0x08, 0,
  19. 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '`', '{', 0x0a, 0, 'A', 'S',
  20. (中略)
  21. };
  22. (中略)
  23. /* sht_back */
  24. (中略)
  25. /* sht_cons */
  26. (中略)
  27. /*删掉了关于sht_win的部分*/
  28. /* sht_mouse */
  29. (中略)
  30. sheet_slide(sht_back, 0, 0);
  31. sheet_slide(sht_cons[1], 56, 6);
  32. sheet_slide(sht_cons[0], 8, 2);
  33. /*删掉了sht_win */
  34. sheet_slide(sht_mouse, mx, my);
  35. sheet_updown(sht_back, 0);
  36. sheet_updown(sht_cons[1], 1);
  37. sheet_updown(sht_cons[0], 2);
  38. sheet_updown(sht_mouse, 3); /*从此开始*/
  39. key_win = sht_cons[0];
  40. keywin_on(key_win); /*到此结束*/
  41. (中略)
  42. for (;;) {
  43. (中略)
  44. if (fifo32_status(&fifo) == 0) {
  45. (中略)
  46. } else {
  47. (中略)
  48. if (256 <= i && i <= 511) { /*键盘数据*/
  49. (中略)
  50. /*从此开始*/ if (s[0] != 0) { /*一般字符、退格键、回车键*/
  51. fifo32_put(&key_win->task->fifo, s[0] + 256);
  52. }
  53. if (i == 256 + 0x0f) { /* Tab键*/
  54. keywin_off(key_win);
  55. j = key_win->height - 1;
  56. if (j == 0) {
  57. j = shtctl->top - 1;
  58. }
  59. key_win = shtctl->sheets[j];
  60. /*到此结束*/ keywin_on(key_win);
  61. }
  62. (中略)
  63. /*删掉了“重新显示光标”的部分*/
  64. } else if (512 <= i && i <= 767) { /*鼠标数据*/
  65. if (mouse_decode(&mdec, i - 512) != 0) {
  66. (中略)
  67. if ((mdec.btn & 0x01) != 0) {
  68. /*按下左键*/
  69. if (mmx < 0) {
  70. (中略)
  71. for (j = shtctl->top - 1; j > 0; j--) {
  72. (中略)
  73. if (0 <= x && x < sht->bxsize && 0 <= y && y < sht->bysize) {
  74. if (sht->buf[y * sht->bxsize + x] != sht->col_inv) {
  75. sheet_updown(sht, shtctl->top - 1);
  76. if (sht != key_win) {
  77. keywin_off(key_win); /*这里!*/
  78. key_win = sht;
  79. keywin_on(key_win); /*这里!*/
  80. }
  81. (中略)
  82. }
  83. }
  84. }
  85. } else {
  86. (中略)
  87. }
  88. } else {
  89. (中略)
  90. }
  91. }
  92. }
  93. /*删掉了“光标用定时器”的部分*/
  94. }
  95. }
  96. }
  97. void keywin_off(struct SHEET *key_win) /*从此开始*/
  98. {
  99. change_wtitle8(key_win, 0);
  100. if ((key_win->flags & 0x20) != 0) {
  101. fifo32_put(&key_win->task->fifo, 3); /*命令行窗口光标OFF */
  102. }
  103. return; /*到此结束*/
  104. }
  105. void keywin_on(struct SHEET *key_win) /*从此开始*/
  106. {
  107. change_wtitle8(key_win, 1);
  108. if ((key_win->flags & 0x20) != 0) {
  109. fifo32_put(&key_win->task->fifo, 2); /*命令行窗口光标ON */
  110. }
  111. return; /*到此结束*/
  112. }

大功告成,看上去清爽多了。修改前的bootpack.c一共有374行代码,修改后只剩下304行,居然减掉了70行呢。

我们还是来“make run”吧,不知道能不能成功呢。哎呀?

9 变得更像真正的操作系统(1)(harib22i) - 图1

一直重复这个画面

貌似系统在不断重启,当然,任何操作都没有反应,看来是失败了……