From 041e2a4b5282f90e811de3b86c87e61e3230b26a Mon Sep 17 00:00:00 2001 From: Yourtion Date: Tue, 10 May 2016 15:36:01 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=AE=E7=9B=98=E8=BE=93=E5=85=A5API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 23_day/a_nask.nas | 7 +++++++ 23_day/bootpack.h | 1 + 23_day/console.c | 32 ++++++++++++++++++++++++++++++++ 23_day/lines.c | 6 ++++++ 4 files changed, 46 insertions(+) diff --git a/23_day/a_nask.nas b/23_day/a_nask.nas index 7d87957..bce3b4a 100644 --- a/23_day/a_nask.nas +++ b/23_day/a_nask.nas @@ -16,6 +16,7 @@ GLOBAL _api_refreshwin GLOBAL _api_linewin GLOBAL _api_closewin + GLOBAL _api_getkey [SECTION .text] @@ -179,3 +180,9 @@ _api_closewin: ; void api_closewin(int win); INT 0x40 POP EBX RET + +_api_getkey: ; int api_getkey(int mode); + MOV EDX,15 + MOV EAX,[ESP+4] ; mode + INT 0x40 + RET diff --git a/23_day/bootpack.h b/23_day/bootpack.h index 99eb7a1..5b86aa0 100644 --- a/23_day/bootpack.h +++ b/23_day/bootpack.h @@ -237,6 +237,7 @@ void make_wtitle8(unsigned char *buf, int xsize, char *title, char act); struct CONSOLE { struct SHEET *sht; int cur_x, cur_y, cur_c; + struct TIMER *timer; }; void console_task(struct SHEET *sheet, unsigned int memtotal); void cons_putchar(struct CONSOLE *cons, int chr, char move); diff --git a/23_day/console.c b/23_day/console.c index dbc9b30..70daf72 100644 --- a/23_day/console.c +++ b/23_day/console.c @@ -321,6 +321,8 @@ int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int /*强行改写通过PUSHAD保存的值*/ /* reg[0] : EDI, reg[1] : ESI, reg[2] : EBP, reg[3] : ESP */ /* reg[4] : EBX, reg[5] : EDX, reg[6] : ECX, reg[7] : EAX */ + int i; + if (edx == 1) { cons_putchar(cons, eax & 0xff, 1); } else if (edx == 2) { @@ -375,6 +377,36 @@ int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int } } else if (edx == 14) { sheet_free((struct SHEET *) ebx); + } else if (edx == 15) { + for (;;) { + io_cli(); + if (fifo32_status(&task->fifo) == 0) { + if (eax != 0) { + task_sleep(task); /* FIFO为空,休眠并等待*/ + } else { + io_sti(); + reg[7] = -1; + return 0; + } + } + i = fifo32_get(&task->fifo); + io_sti(); + if (i <= 1) { /*光标用定时器*/ + /*应用程序运行时不需要显示光标,因此总是将下次显示用的值置为1*/ + timer_init(cons->timer, &task->fifo, 1); /*下次置为1*/ + timer_settime(cons->timer, 50); + } + if (i == 2) { /*光标ON */ + cons->cur_c = COL8_FFFFFF; + } + if (i == 3) { /*光标OFF */ + cons->cur_c = -1; + } + if (256 <= i && i <= 511) { /*键盘数据(通过任务A)*/ + reg[7] = i - 256; + return 0; + } + } } return 0; } diff --git a/23_day/lines.c b/23_day/lines.c index 1b5d926..83e7ceb 100644 --- a/23_day/lines.c +++ b/23_day/lines.c @@ -4,6 +4,7 @@ char *api_malloc(int size); void api_refreshwin(int win, int x0, int y0, int x1, int y1); void api_linewin(int win, int x0, int y0, int x1, int y1, int col); void api_closewin(int win); +int api_getkey(int mode); void api_end(void); void HariMain(void) @@ -18,6 +19,11 @@ void HariMain(void) api_linewin(win + 1, 88, 26, i * 9 + 88, 89, i); } api_refreshwin(win, 6, 26, 154, 90); + for (;;) { + if (api_getkey(1) == 0x0a) { + break; /*按下回车键则break; */ + } + } api_closewin(win); api_end(); }