亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? keyboard.c

?? 《自己動手寫操作系統》的隨書附贈光盤
?? C
字號:

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                            keyboard.c
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                                                    Forrest Yu, 2005
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

#include "type.h"
#include "const.h"
#include "protect.h"
#include "proto.h"
#include "string.h"
#include "proc.h"
#include "global.h"
#include "keyboard.h"
#include "keymap.h"

PRIVATE	KB_INPUT	kb_in;
PRIVATE	t_bool		code_with_E0;
PRIVATE	t_bool		shift_l;		/* l shift state	*/
PRIVATE	t_bool		shift_r;		/* r shift state	*/
PRIVATE	t_bool		alt_l;			/* l alt state		*/
PRIVATE	t_bool		alt_r;			/* r left state		*/
PRIVATE	t_bool		ctrl_l;			/* l ctrl state		*/
PRIVATE	t_bool		ctrl_r;			/* l ctrl state		*/
PRIVATE	int		column		= 0;	/* keyrow[column] 將是 keymap 中某一個值 */

/* 本文件內函數聲明 */
PRIVATE t_8 get_byte_from_kb_buf();

/*======================================================================*
                            keyboard_handler
 *======================================================================*/
PUBLIC void keyboard_handler(int irq)
{
	t_8 scan_code = in_byte(KB_DATA);

	if (kb_in.count < KB_IN_BYTES) {
		*(kb_in.p_head) = scan_code;
		kb_in.p_head++;
		if (kb_in.p_head == kb_in.buf + KB_IN_BYTES) {
			kb_in.p_head = kb_in.buf;
		}
		kb_in.count++;
	}
}


/*======================================================================*
                           init_keyboard
*======================================================================*/
PUBLIC void init_keyboard()
{
	kb_in.count = 0;
	kb_in.p_head = kb_in.p_tail = kb_in.buf;

	put_irq_handler(KEYBOARD_IRQ, keyboard_handler);	/* 設定鍵盤中斷處理程序 */
	enable_irq(KEYBOARD_IRQ);				/* 開鍵盤中斷 */
}


/*======================================================================*
                           keyboard_read
*======================================================================*/
PUBLIC void keyboard_read()
{
	t_8	scan_code;
	t_bool	make;	/* TRUE : make  */
			/* FALSE: break */
	t_32	key = 0;/* 用一個整型來表示一個鍵。 */
			/* 比如,如果 Home 被按下,則 key 值將為定義在 keyboard.h 中的 'HOME'。*/
	t_32*	keyrow;	/* 指向 keymap[] 的某一行 */

	if(kb_in.count > 0){
		code_with_E0 = FALSE;

		scan_code = get_byte_from_kb_buf();

		/* 下面開始解析掃描碼 */
		if (scan_code == 0xE1) {
			int i;
			t_8 pausebreak_scan_code[] = {0xE1, 0x1D, 0x45, 0xE1, 0x9D, 0xC5};
			t_bool is_pausebreak = TRUE;
			for(i=1;i<6;i++){
				if (get_byte_from_kb_buf() != pausebreak_scan_code[i]) {
					is_pausebreak = FALSE;
					break;
				}
			}
			if (is_pausebreak) {
				key = PAUSEBREAK;
			}
		}
		else if (scan_code == 0xE0) {
			scan_code = get_byte_from_kb_buf();

			/* PrintScreen 被按下 */
			if (scan_code == 0x2A) {
				if (get_byte_from_kb_buf() == 0xE0) {
					if (get_byte_from_kb_buf() == 0x37) {
						key = PRINTSCREEN;
						make = TRUE;
					}
				}
			}

			/* PrintScreen 被釋放 */
			if (scan_code == 0xB7) {
				if (get_byte_from_kb_buf() == 0xE0) {
					if (get_byte_from_kb_buf() == 0xAA) {
						key = PRINTSCREEN;
						make = FALSE;
					}
				}
			}

			/* 不是 PrintScreen。此時 scan_code 為 0xE0 緊跟的那個值。 */
			if (key == 0) {
				code_with_E0 = TRUE;
			}
		}
		if ((key != PAUSEBREAK) && (key != PRINTSCREEN)) {
			/* 首先判斷Make Code 還是 Break Code */
			make = (scan_code & FLAG_BREAK ? FALSE : TRUE);
			
			/* 先定位到 keymap 中的行 */
			keyrow = &keymap[(scan_code & 0x7F) * MAP_COLS];

			column = 0;

			if (shift_l || shift_r) {
				column = 1;
			}

			if (code_with_E0) {
				column = 2;
			}

			key = keyrow[column];

			switch(key) {
			case SHIFT_L:
				shift_l	= make;
				break;
			case SHIFT_R:
				shift_r	= make;
				break;
			case CTRL_L:
				ctrl_l	= make;
				break;
			case CTRL_R:
				ctrl_r	= make;
				break;
			case ALT_L:
				alt_l	= make;
				break;
			case ALT_R:
				alt_l	= make;
				break;
			default:
				break;
			}
		}

		if(make){ /* 忽略 Break Code */
			key |= shift_l	? FLAG_SHIFT_L	: 0;
			key |= shift_r	? FLAG_SHIFT_R	: 0;
			key |= ctrl_l	? FLAG_CTRL_L	: 0;
			key |= ctrl_r	? FLAG_CTRL_R	: 0;
			key |= alt_l	? FLAG_ALT_L	: 0;
			key |= alt_r	? FLAG_ALT_R	: 0;

			in_process(key);
		}
	}
}


/*======================================================================*
                           get_byte_from_kb_buf
*======================================================================*/
PRIVATE t_8 get_byte_from_kb_buf()	/* 從鍵盤緩沖區中讀取下一個字節 */
{
	t_8	scan_code;

	while (kb_in.count <= 0) {}	/* 等待下一個字節到來 */

	disable_int();
	scan_code = *(kb_in.p_tail);
	kb_in.p_tail++;
	if (kb_in.p_tail == kb_in.buf + KB_IN_BYTES) {
		kb_in.p_tail = kb_in.buf;
	}
	kb_in.count--;
	enable_int();

	return scan_code;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久一留热品黄| 久久视频一区二区| 波波电影院一区二区三区| 久久不见久久见中文字幕免费| 夜色激情一区二区| 亚洲一区日韩精品中文字幕| 亚洲人成7777| 香蕉乱码成人久久天堂爱免费| 亚洲综合无码一区二区| 亚洲最新在线观看| 午夜欧美一区二区三区在线播放| 午夜视频一区二区三区| 一区二区在线看| 亚洲成人av电影在线| 五月天亚洲精品| 青青国产91久久久久久| 精品无码三级在线观看视频| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品自在在线| caoporm超碰国产精品| 91国偷自产一区二区三区观看 | 欧美三区免费完整视频在线观看| 日本丰满少妇一区二区三区| 欧美日韩在线综合| 日韩一区二区视频在线观看| 国产婷婷一区二区| 亚洲视频在线一区| 亚洲成人午夜电影| 国产乱人伦偷精品视频免下载| 国产91色综合久久免费分享| 欧洲av一区二区嗯嗯嗯啊| 日韩午夜激情视频| 国产精品久久毛片av大全日韩| 亚洲欧美日韩久久| 精品在线免费视频| 一本久久精品一区二区| 91精品国产91热久久久做人人| 久久久久久一二三区| 亚洲视频网在线直播| 蜜桃av噜噜一区二区三区小说| 国产成人精品1024| 欧美三级视频在线播放| 久久久久久久综合日本| 亚洲第一成年网| 国产69精品久久99不卡| 91精品久久久久久久91蜜桃| 中文一区二区在线观看| 麻豆一区二区三区| 欧美午夜片在线观看| 国产午夜亚洲精品不卡| 五月天网站亚洲| 99久久国产免费看| 久久久久久免费毛片精品| 日本aⅴ精品一区二区三区| 色8久久人人97超碰香蕉987| 欧美mv日韩mv国产| 午夜伊人狠狠久久| 一本一本大道香蕉久在线精品| 精品黑人一区二区三区久久 | 欧美一卡在线观看| 亚洲精品videosex极品| 粉嫩一区二区三区性色av| 日韩亚洲欧美在线| 日韩成人dvd| 欧美日韩色一区| 一区二区在线观看视频| 丁香一区二区三区| 欧美成人伊人久久综合网| 日韩中文欧美在线| 在线成人高清不卡| 天天综合天天综合色| 欧美性生活久久| 一区二区三区丝袜| 91成人免费在线| 夜夜嗨av一区二区三区四季av| 成人免费毛片aaaaa**| 久久精品视频一区二区| 国产麻豆成人传媒免费观看| 欧美mv日韩mv国产网站| 国产综合一区二区| 国产亚洲综合色| 成人做爰69片免费看网站| 国产精品美女久久久久久| 波多野结衣中文字幕一区二区三区| 久久久久国产精品人| 国产高清亚洲一区| 国产精品电影一区二区三区| 99久久伊人久久99| 亚洲激情图片小说视频| 欧美巨大另类极品videosbest | 欧美在线观看禁18| 五月天国产精品| 日韩欧美一级在线播放| 国产美女精品在线| 国产欧美日韩亚州综合| 91麻豆蜜桃一区二区三区| 亚洲国产色一区| 精品免费视频.| 波多野结衣欧美| 亚洲自拍另类综合| 欧美xxx久久| 99久久精品国产网站| 亚洲成人av在线电影| 精品国产a毛片| 99久久精品免费| 日韩综合小视频| 欧美国产精品专区| 欧美日韩精品一区二区三区| 国产一区二区三区精品视频| 成人免费一区二区三区在线观看| 欧美性受xxxx黑人xyx性爽| 久草在线在线精品观看| 亚洲日本乱码在线观看| 日韩精品一区二区三区在线| 成人亚洲精品久久久久软件| 亚洲午夜视频在线观看| 久久精品亚洲麻豆av一区二区| 91成人免费在线| 国产福利一区二区| 午夜电影一区二区| 国产精品人人做人人爽人人添| 欧美日韩视频在线第一区| jiyouzz国产精品久久| 日本中文一区二区三区| 椎名由奈av一区二区三区| 久久久久久亚洲综合| 欧美一区二区三区系列电影| 色偷偷一区二区三区| 久久精品国产亚洲高清剧情介绍| 一区二区三区免费| 国产精品妹子av| 精品福利视频一区二区三区| 欧洲激情一区二区| 91日韩一区二区三区| 国产成人丝袜美腿| 韩国v欧美v日本v亚洲v| 喷白浆一区二区| 亚洲高清三级视频| 一区二区在线观看免费视频播放| 国产精品视频一二三区| 亚洲精品一区二区三区四区高清| 欧美日韩高清一区二区三区| 在线欧美小视频| 91九色最新地址| 色综合网站在线| fc2成人免费人成在线观看播放| 久久99精品久久久久婷婷| 天堂久久久久va久久久久| 亚洲v精品v日韩v欧美v专区| 亚洲成人中文在线| 亚洲国产欧美日韩另类综合| 亚洲国产裸拍裸体视频在线观看乱了| 欧美国产精品v| 国产精品三级久久久久三级| 欧美经典一区二区| 国产精品美女一区二区| 中文一区在线播放| 亚洲色图都市小说| 亚洲线精品一区二区三区八戒| 亚洲成精国产精品女| 亚洲成人av一区| 蜜臀99久久精品久久久久久软件 | 久久精品二区亚洲w码| 日韩中文字幕麻豆| 欧美aⅴ一区二区三区视频| 精品一区二区三区在线播放| 美女看a上一区| 国产成人在线观看| 99re热这里只有精品视频| 91一区二区在线| 欧美日韩在线不卡| 欧美mv日韩mv| 国产精品久线观看视频| 亚洲狠狠爱一区二区三区| 日韩电影在线免费观看| 国产精品一级在线| 色婷婷综合久久久中文字幕| 欧美三级韩国三级日本三斤| 日韩一区二区三区电影| 中文字幕av资源一区| 亚洲一区二区三区四区五区黄 | 国产精品亚洲人在线观看| 成人黄色av网站在线| 欧美色视频在线观看| 久久免费国产精品| 亚洲精品视频免费看| 丝袜美腿亚洲色图| 国产成人午夜精品5599| 色婷婷亚洲精品| 精品国产3级a| 亚洲激情在线播放| 国产一区二区影院| 在线欧美一区二区| 久久午夜免费电影| 一区二区免费在线播放| 国产成人免费9x9x人网站视频| 在线一区二区三区| 国产午夜三级一区二区三| 日韩黄色在线观看| 91片黄在线观看|