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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? keyboard.c

?? 自己動手寫操作系統(tǒng)源碼包含有各種小工具
?? C
字號:

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

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

PRIVATE	KB_INPUT	kb_in;
PRIVATE	t_bool		code_with_E0	= FALSE;
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	t_bool		caps_lock;		/* Caps Lock		*/
PRIVATE	t_bool		num_lock;		/* Num Lock		*/
PRIVATE	t_bool		scroll_lock;		/* Scroll Lock		*/
PRIVATE	int		column		= 0;	/* keyrow[column] 將是 keymap 中某一個值 */

/* 本文件內(nèi)函數(shù)聲明 */
PRIVATE t_8	get_byte_from_kb_buf();
PRIVATE void	set_leds();
PRIVATE void	kb_wait();
PRIVATE void	kb_ack();

/*======================================================================*
                            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;

	caps_lock	= 0;
	num_lock	= 1;
	scroll_lock	= 0;

	set_leds();

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


/*======================================================================*
                           keyboard_read
 *======================================================================*/
PUBLIC void keyboard_read(TTY* p_tty)
{
	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) {
			code_with_E0 = TRUE;
			scan_code = get_byte_from_kb_buf();

			/* PrintScreen 被按下 */
			if (scan_code == 0x2A) {
				code_with_E0 = FALSE;
				if ((scan_code = get_byte_from_kb_buf()) == 0xE0) {
					code_with_E0 = TRUE;
					if ((scan_code = get_byte_from_kb_buf()) == 0x37) {
						key = PRINTSCREEN;
						make = TRUE;
					}
				}
			}
			/* PrintScreen 被釋放 */
			else if (scan_code == 0xB7) {
				code_with_E0 = FALSE;
				if ((scan_code = get_byte_from_kb_buf()) == 0xE0) {
					code_with_E0 = TRUE;
					if ((scan_code = get_byte_from_kb_buf()) == 0xAA) {
						key = PRINTSCREEN;
						make = FALSE;
					}
				}
			}
		} /* 如果不是 PrintScreen。則此時 scan_code 為 0xE0 緊跟的那個值。 */
		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;

			t_bool caps = shift_l || shift_r;
			if (caps_lock) {
				if ((keyrow[0] >= 'a') && (keyrow[0] <= 'z')){
					caps = !caps;
				}
			}
			if (caps) {
				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;
			case CAPS_LOCK:
				if (make) {
					caps_lock   = !caps_lock;
					set_leds();
				}
				break;
			case NUM_LOCK:
				if (make) {
					num_lock    = !num_lock;
					set_leds();
				}
				break;
			case SCROLL_LOCK:
				if (make) {
					scroll_lock = !scroll_lock;
					set_leds();
				}
				break;
			default:
				break;
			}
		}

		if(make){ /* 忽略 Break Code */
			t_bool pad = FALSE;

			/* 首先處理小鍵盤 */
			if ((key >= PAD_SLASH) && (key <= PAD_9)) {
				pad = TRUE;
				switch(key) {	/* '/', '*', '-', '+', and 'Enter' in num pad  */
				case PAD_SLASH:
					key = '/';
					break;
				case PAD_STAR:
					key = '*';
					break;
				case PAD_MINUS:
					key = '-';
					break;
				case PAD_PLUS:
					key = '+';
					break;
				case PAD_ENTER:
					key = ENTER;
					break;
				default:	/* keys whose value depends on the NumLock */
					if (num_lock) {	/* '0' ~ '9' and '.' in num pad */
						if ((key >= PAD_0) && (key <= PAD_9)) {
							key = key - PAD_0 + '0';
						}
						else if (key == PAD_DOT) {
							key = '.';
						}
					}
					else{
						switch(key) {
						case PAD_HOME:
							key = HOME;
							break;
						case PAD_END:
							key = END;
							break;
						case PAD_PAGEUP:
							key = PAGEUP;
							break;
						case PAD_PAGEDOWN:
							key = PAGEDOWN;
							break;
						case PAD_INS:
							key = INSERT;
							break;
						case PAD_UP:
							key = UP;
							break;
						case PAD_DOWN:
							key = DOWN;
							break;
						case PAD_LEFT:
							key = LEFT;
							break;
						case PAD_RIGHT:
							key = RIGHT;
							break;
						case PAD_DOT:
							key = DELETE;
							break;
						default:
							break;
						}
					}
					break;
				}
			}
			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;
			key |= pad	? FLAG_PAD	: 0;

			in_process(p_tty, key);
		}
	}
}


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

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

	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();

#ifdef __TINIX_DEBUG__
	disp_color_str("[", MAKE_COLOR(WHITE,BLUE));
	disp_int(scan_code);
	disp_color_str("]", MAKE_COLOR(WHITE,BLUE));
#endif

	return scan_code;
}


/*======================================================================*
                                 kb_wait
 *======================================================================*/
PRIVATE void kb_wait()	/* 等待 8042 的輸入緩沖區(qū)空 */
{
	t_8 kb_stat;

	do {
		kb_stat = in_byte(KB_CMD);
	} while (kb_stat & 0x02);
}


/*======================================================================*
                                 kb_ack
 *======================================================================*/
PRIVATE void kb_ack()
{
	t_8 kb_read;

	do {
		kb_read = in_byte(KB_DATA);
	} while (kb_read =! KB_ACK);
}


/*======================================================================*
                                 set_leds
 *======================================================================*/
PRIVATE void set_leds()
{
	t_8 leds = (caps_lock << 2) | (num_lock << 1) | scroll_lock;

	kb_wait();
	out_byte(KB_DATA, LED_CODE);
	kb_ack();

	kb_wait();
	out_byte(KB_DATA, leds);
	kb_ack();
}



?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产剧情一区在线| 亚洲观看高清完整版在线观看 | 欧美三级蜜桃2在线观看| 亚洲免费在线视频一区 二区| 成人18视频在线播放| 亚洲视频一二区| 欧美福利视频一区| 免费美女久久99| 国产亚洲一区二区在线观看| 成人午夜短视频| 尤物在线观看一区| 欧美一区二区三区男人的天堂| 激情成人午夜视频| 国产精品免费丝袜| 欧美日韩国产影片| 国产精品综合在线视频| 亚洲日本一区二区| 欧美一区二区三区四区高清| 国产成人av影院| 亚洲国产精品一区二区久久恐怖片| 日韩丝袜美女视频| 本田岬高潮一区二区三区| 亚洲国产精品一区二区久久 | 亚洲免费观看高清| 欧美丰满一区二区免费视频| 激情综合网天天干| 一区二区三区中文字幕精品精品 | 日韩美女一区二区三区| 成人av在线影院| 亚洲va国产va欧美va观看| 久久婷婷久久一区二区三区| 94色蜜桃网一区二区三区| 蜜臀av一级做a爰片久久| 国产精品福利一区| 日韩视频一区二区三区| 91视频免费播放| 久草这里只有精品视频| 一区二区三区在线视频免费观看| 日韩欧美成人午夜| 色综合久久久久网| 国产传媒久久文化传媒| 亚洲一区二区三区激情| 精品99999| 欧美日韩亚州综合| 成人av片在线观看| 久久9热精品视频| 亚洲成人免费观看| 亚洲欧美怡红院| 国产丝袜美腿一区二区三区| 欧美精品黑人性xxxx| 972aa.com艺术欧美| 九九精品视频在线看| 五月婷婷欧美视频| 亚洲精品久久7777| 亚洲天堂a在线| 欧美韩国日本一区| 欧美精品一区在线观看| 91精品国产一区二区三区蜜臀| 日本韩国一区二区三区视频| 国产99精品国产| 麻豆精品视频在线观看免费| 午夜精彩视频在线观看不卡| 亚洲美女免费在线| 亚洲免费观看在线视频| 国产精品不卡在线观看| 中文字幕av一区 二区| 日本一区二区三区dvd视频在线| 日韩欧美一级二级三级久久久| 欧美三级中文字幕在线观看| 欧美性色aⅴ视频一区日韩精品| 99久久久久久| 91麻豆6部合集magnet| 91网上在线视频| 91丨porny丨最新| 成人av网站免费| 97se亚洲国产综合自在线观| 99久久er热在这里只有精品66| 成人a区在线观看| 97久久精品人人做人人爽50路| 成人精品国产免费网站| 99re这里只有精品6| 91免费看视频| 欧美三级一区二区| 91精品婷婷国产综合久久| 日韩欧美国产综合在线一区二区三区| 4438x成人网最大色成网站| 91精品国产aⅴ一区二区| 日韩一区二区电影在线| 久久久一区二区| 国产精品女主播av| 亚洲日韩欧美一区二区在线| 亚洲在线视频一区| 男女激情视频一区| 国产成人综合视频| 91麻豆精品视频| 欧美日本一区二区| 亚洲精品一区在线观看| 中文av一区二区| 艳妇臀荡乳欲伦亚洲一区| 亚洲国产中文字幕| 国模少妇一区二区三区| 成人网页在线观看| 欧美精三区欧美精三区| 337p粉嫩大胆色噜噜噜噜亚洲| 国产欧美日韩精品一区| 亚洲欧美一区二区三区孕妇| 视频一区在线播放| 成人小视频免费在线观看| 在线免费观看视频一区| 久久综合99re88久久爱| 1区2区3区精品视频| 蜜臀av性久久久久av蜜臀妖精| 国产成人av一区二区| 欧美自拍偷拍一区| 国产婷婷色一区二区三区四区| 亚洲精品乱码久久久久久久久| 久久国内精品视频| 色综合久久久网| 2017欧美狠狠色| 亚洲另类春色校园小说| 国产在线精品免费av| 欧洲一区二区av| 日本一区二区三区高清不卡| 图片区小说区区亚洲影院| 国产91精品久久久久久久网曝门 | 欧美r级电影在线观看| 国产精品福利影院| 精品一区精品二区高清| 在线观看av一区二区| 欧美国产一区视频在线观看| 亚洲gay无套男同| 成人午夜看片网址| 欧美电视剧在线看免费| 亚洲自拍另类综合| 成年人网站91| 欧美v日韩v国产v| 亚洲大片免费看| 99久久婷婷国产综合精品| 日韩精品一区二区三区视频在线观看 | 免费人成在线不卡| 色嗨嗨av一区二区三区| 国产嫩草影院久久久久| 91豆麻精品91久久久久久| 亚洲精品一区二区三区四区高清| 亚洲日本一区二区| 国产一区二区三区久久久| 91精品国产91久久久久久一区二区| 国产精品免费av| 国产乱色国产精品免费视频| 91精品国产黑色紧身裤美女| 亚洲一区av在线| 在线观看视频一区二区欧美日韩| 国产精品白丝在线| k8久久久一区二区三区| 亚洲国产精品成人综合| 国产精品中文有码| 久久综合久色欧美综合狠狠| 日本aⅴ免费视频一区二区三区 | 日韩一区二区在线播放| 亚洲一区二区欧美日韩| 欧美亚洲免费在线一区| 亚洲色图欧美偷拍| 色婷婷精品大视频在线蜜桃视频| 国产精品久久看| 91亚洲精华国产精华精华液| 亚洲天天做日日做天天谢日日欢 | 国产乱码精品一区二区三区五月婷 | 99精品欧美一区二区三区小说| 日本一区二区三区dvd视频在线| 国产成人亚洲综合a∨婷婷 | 国产综合久久久久久鬼色 | 天堂在线亚洲视频| 欧美日本高清视频在线观看| 日本在线不卡视频一二三区| 在线播放一区二区三区| 免费观看成人av| 久久久www成人免费毛片麻豆 | 亚洲视频一二区| 欧美体内she精视频| 偷拍一区二区三区| 精品电影一区二区三区 | 色悠久久久久综合欧美99| 亚洲一区二区不卡免费| 91精品福利在线一区二区三区| 老司机精品视频导航| 国产欧美一区二区在线| 99久久久国产精品| 亚洲国产日韩av| 亚洲精品在线电影| 97久久超碰精品国产| 欧美sm美女调教| 99久久婷婷国产| 日韩专区在线视频| 久久久精品国产免大香伊 | 日韩成人伦理电影在线观看| 久久久亚洲国产美女国产盗摄 | 日韩欧美123| 成人美女视频在线观看18| 亚洲美女电影在线| 日韩欧美中文字幕公布|