void console_task(layer_t* layer, unsigned int memtotal) { #define INPUT_BEG_POS_X (16) #define INPUT_BEG_POS_Y (28) timer_t* timer; task_t* task = task_now(); mem_mgr_t* memmgr = (mem_mgr_t*)MEMMGR_ADDR; int data, fifobuf[128]; int* fat = (int*)mem_mgr_alloc_4k(memmgr, 4 * 2880); char cmdline[32]; console_t console; console.layer = layer; console.cur_x = 8; console.cur_y = INPUT_BEG_POS_Y; console.cur_c = -1; *((int*)0x0fec) = (int)&console; fifo_init(&task->fifo, fifobuf, 128, task); timer = timer_alloc(); timer_init(timer, &task->fifo, 1); timer_settimer(timer, 50); file_readfat(fat, (unsigned char*)(ADR_DISKIMG + 0x000200)); /* display the prompt of console window */ console_putchar(&console, '>', 1); for ( ; ; ) { io_cli(); if (0 == fifo_size(&task->fifo)) { task_sleep(task); io_sti(); } else { data = fifo_get(&task->fifo); io_sti(); if (data <= 1) { /* timer for cursor */ if (0 != data) { timer_init(timer, &task->fifo, 0); if (console.cur_c >= 0) console.cur_c = COLOR8_FFFFFF; } else { timer_init(timer, &task->fifo, 1); if (console.cur_c >= 0) console.cur_c = COLOR8_000000; } timer_settimer(timer, 50); } if (2 == data) /* cursor ON */ console.cur_c = COLOR8_FFFFFF; if (3 == data) { /* cursor OFF */ fill_box8(layer->buf, layer->w_size, COLOR8_000000, console.cur_x, console.cur_y, console.cur_x + 7, console.cur_y + 15); console.cur_c = -1; } if (256 <= data && data <= 511) { /* keyboard data */ if ((8 + 256) == data) { /* backspace */ if (console.cur_x > INPUT_BEG_POS_X) { /* erase the cursor and move forward one character */ console_putchar(&console, ' ', 0); console.cur_x -= 8; } } else if ((10 + 256) == data) { /* Enter Key */ /* erase cursor by space */ console_putchar(&console, ' ', 0); cmdline[console.cur_x / 8 - 2] = 0; console_newline(&console); console_runcmd(&console, cmdline, fat, memtotal); /* show the prompt */ console_putchar(&console, '>', 1); } else { /* general character */ if (console.cur_x < 240) { /* display one character and move backward one character */ cmdline[console.cur_x / 8 - 2] = data - 256; console_putchar(&console, data - 256, 1); } } } /* show the cursor again */ if (console.cur_c >= 0) { fill_box8(layer->buf, layer->w_size, console.cur_c, console.cur_x, console.cur_y, console.cur_x + 7, console.cur_y + 15); } layers_refresh(layer, console.cur_x, console.cur_y, console.cur_x + 8, console.cur_y + 16); } } }
//命令行窗口任务 void console_task(LAYER *layer, unsigned int mem_total) { TIMER *timer; TASK *task = task_now(); int i, fifobuf[128]; MEMMANAGE *memmanage = (MEMMANAGE *)MEMMANAGE_ADDR; int *fat = (int *)memmanage_alloc_4K(memmanage, 4 * 2880); //用来存储FAT表的内存地址 char cmdline[30]; //cmdline用来记录在命令行中输入的命令 CONSOLE console; console.layer = layer; console.cursor_x = 16; console.cursor_y = 28; console.cursor_color = -1; *((int *) 0x0fec) = (int)&console; file_readfat(fat, (unsigned char *)(ADR_DISKIMG + 0x000200)); //FAT表从第3个扇区开始,占用了共9个扇区 init_fifo(&task->fifo, 128, fifobuf, task); timer = timer_alloc(); timer_init(timer, &task->fifo, 1); timer_set(timer, 50); //显示提示字符 displayStrings_atLayer(layer, 8, 28, COL8_FFFFFF, COL8_000000, ">"); for(;;) { io_cli(); if(0 == fifo_status(&task->fifo)) { task_sleep(task); io_sti(); } else { //这里传出来的i直接就是键盘的对应键的字符加上一个键盘偏移量,不需要再转化了,只需要减去偏移量即可 i = fifo_get(&task->fifo); io_sti(); //计时器的中断数据处理(在这里就是光标的闪烁) if(1 == i || 0 == i) //等于1或者0 { if(1 == i) { if(console.cursor_color >= 0) { console.cursor_color = COL8_FFFFFF; } timer_init(timer, &task->fifo, 0); } else { if(console.cursor_color >= 0) { console.cursor_color = COL8_000000; } timer_init(timer, &task->fifo, 1); } timer_set(timer, 50); } //光标ON if(2 == i) { console.cursor_color = COL8_FFFFFF; } //光标OFF if(3 == i) { drawRectangle(layer->buffer, layer->length, COL8_000000, console.cursor_x, console.cursor_y, 2, 15); console.cursor_color = -1; } //键盘数据的处理(主要是命令的处理) if(keyboard_offset <= i && i <= keyboard_offset + 255) { //如果是“退格键”的情况 if(8 + keyboard_offset == i) { //不能删除最前面的提示符,而且只能在有字符的时候才能删除 if(console.cursor_x > 16) { //首先用空格擦除光标,光标横坐标减8之后,再把要删除的那个字符用空格擦除 console_putchar(&console, ' ', 0); console.cursor_x -= 8; console_putchar(&console, ' ', 0); } } //如果是“回车键”的情况 else if(10 + keyboard_offset == i) { console_putchar(&console, ' ', 0); cmdline[console.cursor_x / 8 - 2] = 0; console_newline(&console); //运行命令 console_runcmd(cmdline, &console, fat, mem_total); //显示提示字符 console_putchar(&console, '>', 1); } //如果是一般字符的情况 else { if(console.cursor_x < 240) { cmdline[console.cursor_x / 8 - 2] = i - keyboard_offset; console_putchar(&console, i - keyboard_offset, 1); } } } //重新显示光标 if(console.cursor_color >= 0) { drawRectangle(layer->buffer, layer->length, console.cursor_color, console.cursor_x, console.cursor_y, 2, 15); } layer_part_refresh(layer, console.cursor_x, console.cursor_y, console.cursor_x + 8, console.cursor_y + 16); } } }