diff --git a/27_day/bootpack.c b/27_day/bootpack.c index d4ee11f..d4f821a 100644 --- a/27_day/bootpack.c +++ b/27_day/bootpack.c @@ -46,7 +46,7 @@ void HariMain(void) }; int key_shift = 0, key_leds = (binfo->leds >> 4) & 7, keycmd_wait = -1; int j, x, y, mmx = -1, mmy = -1, mmx2 = 0; - struct SHEET *sht = 0, *key_win; + struct SHEET *sht = 0, *key_win, *sht2; init_gdtidt(); init_pic(); @@ -195,8 +195,8 @@ void HariMain(void) io_cli(); /*强制结束处理时禁止任务切换*/ task->tss.eax = (int) &(task->tss.esp0); task->tss.eip = (int) asm_end_app; - task_run(task, -1, 0); /*为了确实执行结束处理,如果处于休眠状态则唤醒*/ io_sti(); + task_run(task, -1, 0); /*为了确实执行结束处理,如果处于休眠状态则唤醒*/ } } if (i == 256 + 0x3c && key_shift != 0) { /* Shift+F2 */ @@ -267,10 +267,14 @@ void HariMain(void) io_cli(); /*强制结束处理时禁止任务切换*/ task->tss.eax = (int) &(task->tss.esp0); task->tss.eip = (int) asm_end_app; - task_run(task, -1, 0); io_sti(); + task_run(task, -1, 0); } else { /*命令行窗口*/ task = sht->task; + sheet_updown(sht, -1); /*暂且隐藏该图层*/ + keywin_off(key_win); + key_win = shtctl->sheets[shtctl->top - 1]; + keywin_on(key_win); io_cli(); fifo32_put(&task->fifo, 4); io_sti(); @@ -301,6 +305,10 @@ void HariMain(void) close_console(shtctl->sheets0 + (i - 768)); } else if (1024 <= i && i <= 2023) { close_constask(taskctl->tasks0 + (i - 1024)); + } else if (2024 <= i && i <= 2279) { /*只关闭命令行窗口*/ + sht2 = shtctl->sheets0 + (i - 2024); + memman_free_4k(memman, (int) sht2->buf, 256 * 165); + sheet_free(sht2); } } } diff --git a/27_day/console.c b/27_day/console.c index f85ec8c..536aa8f 100644 --- a/27_day/console.c +++ b/27_day/console.c @@ -17,7 +17,7 @@ void console_task(struct SHEET *sheet, int memtotal) cons.cur_c = -1; task->cons = &cons; - if (sheet != 0) { + if (cons.sht != 0) { cons.timer = timer_alloc(); timer_init(cons.timer, &task->fifo, 1); timer_settime(cons.timer, 50); @@ -35,7 +35,7 @@ void console_task(struct SHEET *sheet, int memtotal) } else { i = fifo32_get(&task->fifo); io_sti(); - if (i <= 1) { /*光标用定时器*/ + if (i <= 1 && cons.sht != 0) { /*光标用定时器*/ if (i != 0) { timer_init(cons.timer, &task->fifo, 0); /*下次置0 */ if (cons.cur_c >= 0) { @@ -53,7 +53,10 @@ void console_task(struct SHEET *sheet, int memtotal) cons.cur_c = COL8_FFFFFF; } if (i == 3) { /*光标OFF */ - boxfill8(sheet->buf, sheet->bxsize, COL8_000000, cons.cur_x, cons.cur_y, cons.cur_x + 7, cons.cur_y + 15); + if (cons.sht != 0) { + boxfill8(cons.sht->buf, cons.sht->bxsize, COL8_000000, + cons.cur_x, cons.cur_y, cons.cur_x + 7, cons.cur_y + 15); + } cons.cur_c = -1; } if (i == 4) { /*点击命令行窗口的“×”按钮*/ @@ -74,7 +77,7 @@ void console_task(struct SHEET *sheet, int memtotal) cmdline[cons.cur_x / 8 - 2] = 0; cons_newline(&cons); cons_runcmd(cmdline, &cons, fat, memtotal); /*运行命令*/ - if (sheet == 0) { + if (cons.sht == 0) { cmd_exit(&cons, fat); } /*显示提示符*/ @@ -89,11 +92,12 @@ void console_task(struct SHEET *sheet, int memtotal) } } /*重新显示光标*/ - if (sheet != 0) { + if (cons.sht != 0) { if (cons.cur_c >= 0) { - boxfill8(sheet->buf, sheet->bxsize, cons.cur_c, cons.cur_x, cons.cur_y, cons.cur_x + 7, cons.cur_y + 15); + boxfill8(cons.sht->buf, cons.sht->bxsize, cons.cur_c, + cons.cur_x, cons.cur_y, cons.cur_x + 7, cons.cur_y + 15); } - sheet_refresh(sheet, cons.cur_x, cons.cur_y, cons.cur_x + 8, cons.cur_y + 16); + sheet_refresh(cons.sht, cons.cur_x, cons.cur_y, cons.cur_x + 8, cons.cur_y + 16); } } } @@ -108,8 +112,8 @@ void cons_putchar(struct CONSOLE *cons, int chr, char move) for (;;) { if (cons->sht != 0) { putfonts8_asc_sht(cons->sht, cons->cur_x, cons->cur_y, COL8_FFFFFF, COL8_000000, " ", 1); - cons->cur_x += 8; } + cons->cur_x += 8; if (cons->cur_x == 8 + 240) { cons_newline(cons); } @@ -194,8 +198,8 @@ void cons_runcmd(char *cmdline, struct CONSOLE *cons, int *fat, int memtotal) } else if (strncmp(cmdline, "start ", 6) == 0) { cmd_start(cons, cmdline, memtotal); } else if (strncmp(cmdline, "ncst ", 5) == 0) { - cmd_ncst(cons, cmdline, memtotal); - }else if (cmdline[0] != 0) { + cmd_ncst(cons, cmdline, memtotal); + } else if (cmdline[0] != 0) { if (cmd_app(cons, fat, cmdline) == 0) { /*不是命令,不是应用程序,也不是空行*/ cons_putstr0(cons, "Bad command.\n\n"); @@ -403,6 +407,7 @@ int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int struct CONSOLE *cons = task->cons; struct SHTCTL *shtctl = (struct SHTCTL *) *((int *) 0x0fe4); struct SHEET *sht; + struct FIFO32 *sys_fifo = (struct FIFO32 *) *((int *) 0x0fec); int *reg = &eax + 1; /* eax后面的地址*/ /*强行改写通过PUSHAD保存的值*/ /* reg[0] : EDI, reg[1] : ESI, reg[2] : EBP, reg[3] : ESP */ @@ -490,6 +495,13 @@ int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int if (i == 3) { /*光标OFF */ cons->cur_c = -1; } + if (i == 4) { /*只关闭命令行窗口*/ + timer_cancel(cons->timer); + io_cli(); + fifo32_put(sys_fifo, cons->sht - shtctl->sheets0 + 2024); /*2024~2279*/ + cons->sht = 0; + io_sti(); + } if (i >= 256) { /*键盘数据(通过任务A)等*/ reg[7] = i - 256; return 0;