diff --git a/17_day/bootpack.c b/17_day/bootpack.c index cb34fbd..36c7600 100644 --- a/17_day/bootpack.c +++ b/17_day/bootpack.c @@ -20,19 +20,31 @@ void HariMain(void) struct MOUSE_DEC mdec; struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR; struct SHTCTL *shtctl; - static char keytable[0x54] = { - 0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', 0, 0, - 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', 0, 0, 'A', 'S', - 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', ':', 0, 0, ']', 'Z', 'X', 'C', 'V', - 'B', 'N', 'M', ',', '.', '/', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', - '2', '3', '0', '.' - }; unsigned char *buf_back, buf_mouse[256], *buf_win, *buf_cons; struct SHEET *sht_back, *sht_mouse, *sht_win, *sht_cons; struct TASK *task_a, *task_cons; struct TIMER *timer; - int key_to = 0; + static char keytable0[0x80] = { + 0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', 0, 0, + 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', 0, 0, 'A', 'S', + 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', ':', 0, 0, ']', 'Z', 'X', 'C', 'V', + 'B', 'N', 'M', ',', '.', '/', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x5c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x5c, 0, 0 + }; + static char keytable1[0x80] = { + 0, 0, '!', 0x22, '#', '$', '%', '&', 0x27, '(', ')', '~', '=', '~', 0, 0, + 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '`', '{', 0, 0, 'A', 'S', + 'D', 'F', 'G', 'H', 'J', 'K', 'L', '+', '*', 0, 0, '}', 'Z', 'X', 'C', 'V', + 'B', 'N', 'M', '<', '>', '?', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, '_', 0, 0, 0, 0, 0, 0, 0, 0, 0, '|', 0, 0 + }; + int key_to = 0, key_shift = 0; init_gdtidt(); init_pic(); @@ -123,17 +135,25 @@ void HariMain(void) if (256 <= i && i <= 511) { /* 键盘数据*/ sprintf(s, "%02X", i - 256); putfonts8_asc_sht(sht_back, 0, 16, COL8_FFFFFF, COL8_008484, s, 2); - if (i < 0x54 + 256 && keytable[i - 256] != 0) { /*一般字符*/ + if (i < 0x80 + 256) { /*将按键编码转换为字符编码*/ + if (key_shift == 0) { + s[0] = keytable0[i - 256]; + } else { + s[0] = keytable1[i - 256]; + } + } else { + s[0] = 0; + } + if (s[0] != 0) { /*一般字符*/ if (key_to == 0) { /*发送给任务A */ if (cursor_x < 128) { /*显示一个字符之后将光标后移一位*/ - s[0] = keytable[i - 256]; s[1] = 0; putfonts8_asc_sht(sht_win, cursor_x, 28, COL8_000000, COL8_FFFFFF, s, 1); cursor_x += 8; - } + } } else { /*发送给命令行窗口*/ - fifo32_put(&task_cons->fifo, keytable[i - 256] + 256); + fifo32_put(&task_cons->fifo, s[0] + 256); } } if (i == 256 + 0x0e && cursor_x > 8) { /* 退格键 */ @@ -160,6 +180,18 @@ void HariMain(void) sheet_refresh(sht_win, 0, 0, sht_win->bxsize, 21); sheet_refresh(sht_cons, 0, 0, sht_cons->bxsize, 21); } + if (i == 256 + 0x2a) { /*左Shift ON */ + key_shift |= 1; + } + if (i == 256 + 0x36) { /*右Shift ON */ + key_shift |= 2; + } + if (i == 256 + 0xaa) { /*左Shift OFF */ + key_shift &= ~1; + } + if (i == 256 + 0xb6) { /*右Shift OFF */ + key_shift &= ~2; + } /*重新显示光标*/ boxfill8(sht_win->buf, sht_win->bxsize, cursor_c, cursor_x, 28, cursor_x + 7, 43); sheet_refresh(sht_win, cursor_x, 28, cursor_x + 8, 44);