⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.s

📁 linux内核
💻 S
📖 第 1 页 / 共 2 页
字号:
/* *  linux/kernel/keyboard.S * *  (C) 1991  Linus Torvalds *//* *	Thanks to Alfred Leung for US keyboard patches *		Wolfgang Thiel for German keyboard patches *		Marc Corsini for the French keyboard *		LeBlanc@mcc.ac.uk for the UK keyboard *		Tommy Thorn (tthorn@daimi.aau.dk) for Danish keyboard *//* KBD_FINNISH for Finnish keyboards * KBD_US for US-type * KBD_GR for German keyboards * KBD_FR for Frech keyboard * KBD_UK for British extended keyboard * KBD_DK for Danish keyboard */#define KBD_FINNISH.text.globl _hard_reset_now.globl _keyboard_interrupt.globl _kapplic.globl _kmode.globl _kleds.globl _set_leds/* * these are for the keyboard read functions */size	= 1024		/* must be a power of two ! And MUST be the same			   as in tty_io.c !!!! */head = 4tail = 8proc_list = 12buf = 16_kapplic:	.byte 0_kmode:	.byte 0		/* caps, alt, ctrl and shift mode */_kleds:	.byte 2		/* num-lock, caps, scroll-lock mode (nom-lock on) */e0:	.byte 0/* *  con_int is the real interrupt routine that reads the *  keyboard scan-code and converts it into the appropriate *  ascii character(s). */_keyboard_interrupt:	cld	pushl %eax	pushl %ebx	pushl %ecx	pushl %edx	push %ds	push %es	movl $0x10,%eax	mov %ax,%ds	mov %ax,%es	xorl %eax,%eax		/* %eax is scan code */	inb $0x60,%al	pushl %eax	inb $0x61,%al	jmp 1f1:	jmp 1f1:	orb $0x80,%al	jmp 1f1:	jmp 1f1:	outb %al,$0x61	jmp 1f1:	jmp 1f1:	andb $0x7F,%al	outb %al,$0x61	jmp 1f1:	jmp 1f1:	movb $0x20,%al	outb %al,$0x20	popl %eax	movl $1,%ebx	cmpb $0xE0,%al	je end_intr	movl $2,%ebx	cmpb $0xE1,%al	je end_intr	sti	call key_table(,%eax,4)	call _do_keyboard_interrupt	movl $0,%ebxend_intr:	movb %bl,e0	pop %es	pop %ds	popl %edx	popl %ecx	popl %ebx	popl %eax	iret/* * This routine fills the buffer with max 8 bytes, taken from * %ebx:%eax. (%edx is high). The bytes are written in the * order %al,%ah,%eal,%eah,%bl,%bh ... until %eax is zero. */put_queue:	pushl %ecx	pushl %edx	movl _table_list,%edx		# read-queue for console	movl head(%edx),%ecx1:	movb %al,buf(%edx,%ecx)	incl %ecx	andl $size-1,%ecx	cmpl tail(%edx),%ecx		# buffer full - discard everything	je 3f	shrdl $8,%ebx,%eax	je 2f	shrl $8,%ebx	jmp 1b2:	movl %ecx,head(%edx)	movl proc_list(%edx),%ecx	testl %ecx,%ecx	je 3f	movl $0,(%ecx)3:	popl %edx	popl %ecx	retctrl:	movb $0x04,%al	jmp 1falt:	movb $0x10,%al1:	cmpb $0,e0	je 2f	addb %al,%al2:	orb %al,_kmode	retunctrl:	movb $0x04,%al	jmp 1funalt:	movb $0x10,%al1:	cmpb $0,e0	je 2f	addb %al,%al2:	notb %al	andb %al,_kmode	retlshift:	orb $0x01,_kmode	retunlshift:	andb $0xfe,_kmode	retrshift:	orb $0x02,_kmode	retunrshift:	andb $0xfd,_kmode	retold_leds:	.byte 2caps:	testb $0x80,_kmode	jne 1f	xorb $4,_kleds	xorb $0x40,_kmode	orb $0x80,_kmode_set_leds:	movb _kleds,%al	cmpb old_leds,%al	je 1f	movb %al,old_leds	call kb_wait	movb $0xed,%al		/* set leds command */	outb %al,$0x60	call kb_wait	movb _kleds,%al	outb %al,$0x601:	retuncaps:	andb $0x7f,_kmode	retscroll:	testb $0x03,_kmode	je 1f	call _show_mem	jmp 2f1:	call _show_state2:	xorb $1,_kleds	jmp _set_leds	num:	cmpb $0x01,_kapplic	jne notappl	movw $0x0050,%axapplkey:	shll $16,%eax	movw $0x4f1b,%ax	xorl %ebx,%ebx	jmp put_queue notappl:	xorb $2,_kleds	jmp _set_leds/* *  cursor-key/numeric keypad cursor keys are handled here. *  checking for numeric keypad etc. */cursor:	subb $0x47,%al	jb 1f	cmpb $12,%al	ja 1f	jne cur2		/* check for ctrl-alt-del */	testb $0x0c,_kmode	je cur2	testb $0x30,_kmode	jne _ctrl_alt_delcur2:	cmpb $0x01,e0		/* e0 forces cursor movement */	je cur	testb $0x03,_kmode	/* shift forces cursor */	jne cur	cmpb $0x01,_kapplic	jne notcappl	movb appl_table(%eax),%al	jmp applkeynotcappl:	testb $0x02,_kleds	/* not num-lock forces cursor */	je cur	xorl %ebx,%ebx	movb num_table(%eax),%al	jmp put_queue1:	ret/* * cursor keys send ^[ [ x if normal, ^[ O x if application mode */cur:	movb cur_table(%eax),%al	cmpb $'9,%al	ja ok_cur	movb $'~,%ahok_cur:	shll $16,%eax	movw $0x5b1b,%ax	xorl %ebx,%ebx	cmpb $0x01,_kapplic	jne put_queue	movb $0x4f,%ah	jmp put_queue#if defined(KBD_FR) /* || defined(KBD_DK) correct, but .. */num_table:	.ascii "789-456+1230."#elsenum_table:	.ascii "789-456+1230,"#endifcur_table:	.ascii "HA5-DGC+YB623"	/*	    Keypad /         		35	B7	Q    Keypad *  (PrtSc)		37	B7	R    Keypad NumLock     		45	??	P    Keypad 7  (Home)		47	C7	w    Keypad 8  (Up arrow)	48	C8	x    Keypad 9  (PgUp)		49	C9	y    Keypad -			4A	CA	S    Keypad 4  (Left arrow)	4B	CB	t    Keypad 5			4C	CC	u    Keypad 6  (Right arrow)	4D	CD	v    Keypad +			4E	CE	l    Keypad 1  (End) 		4F	CF	q    Keypad 2  (Down arrow)	50	D0	r    Keypad 3  (PgDn)		51	D1	s    Keypad 0  (Ins)		52	D2	p    Keypad .  (Del) 		53	D3	n*/     appl_table:	.ascii "wxyStuvlqrspn"/* * this routine handles function keys */func:	subb $0x3B,%al	jb end_func	cmpb $9,%al	jbe ok_func	subb $18,%al	cmpb $10,%al	jb end_func	cmpb $11,%al	ja end_funcok_func:	testb $0x10,_kmode	jne alt_func	cmpl $4,%ecx		/* check that there is enough room */	jl end_func	movl func_table(,%eax,4),%eax	xorl %ebx,%ebx	jmp put_queuealt_func:	pushl %eax	call _change_console	popl %eaxend_func:	ret/* * function keys send F1:'esc [ [ A' F2:'esc [ [ B' etc. */func_table:	.long 0x415b5b1b,0x425b5b1b,0x435b5b1b,0x445b5b1b	.long 0x455b5b1b,0x465b5b1b,0x475b5b1b,0x485b5b1b	.long 0x495b5b1b,0x4a5b5b1b,0x4b5b5b1b,0x4c5b5b1b#if	defined(KBD_FINNISH)key_map:	.byte 0,27	.ascii "1234567890+'"	.byte 127,9	.ascii "qwertyuiop}"	.byte 0,13,0	.ascii "asdfghjkl|{"	.byte 0,0	.ascii "'zxcvbnm,.-"	.byte 0,'*,0,32		/* 36-39 */	.fill 16,1,0		/* 3A-49 */	.byte '-,0,0,0,'+	/* 4A-4E */	.byte 0,0,0,0,0,0,0	/* 4F-55 */	.byte '<	.fill 10,1,0shift_map:	.byte 0,27	.ascii "!\"#$%&/()=?`"	.byte 127,9	.ascii "QWERTYUIOP]^"	.byte 13,0	.ascii "ASDFGHJKL\\["	.byte 0,0	.ascii "*ZXCVBNM;:_"	.byte 0,'*,0,32		/* 36-39 */	.fill 16,1,0		/* 3A-49 */	.byte '-,0,0,0,'+	/* 4A-4E */	.byte 0,0,0,0,0,0,0	/* 4F-55 */	.byte '>	.fill 10,1,0alt_map:	.byte 0,0	.ascii "\0@\0$\0\0{[]}\\\0"	.byte 0,0	.byte 0,0,0,0,0,0,0,0,0,0,0	.byte '~,13,0	.byte 0,0,0,0,0,0,0,0,0,0,0	.byte 0,0	.byte 0,0,0,0,0,0,0,0,0,0,0	.byte 0,0,0,0		/* 36-39 */	.fill 16,1,0		/* 3A-49 */	.byte 0,0,0,0,0		/* 4A-4E */	.byte 0,0,0,0,0,0,0	/* 4F-55 */	.byte '|	.fill 10,1,0#elif defined(KBD_US)key_map:	.byte 0,27	.ascii "1234567890-="	.byte 127,9	.ascii "qwertyuiop[]"	.byte 13,0	.ascii "asdfghjkl;'"	.byte '`,0	.ascii "\\zxcvbnm,./"	.byte 0,'*,0,32		/* 36-39 */	.fill 16,1,0		/* 3A-49 */	.byte '-,0,0,0,'+	/* 4A-4E */	.byte 0,0,0,0,0,0,0	/* 4F-55 */	.byte '<	.fill 10,1,0shift_map:	.byte 0,27	.ascii "!@#$%^&*()_+"	.byte 127,9	.ascii "QWERTYUIOP{}"	.byte 13,0	.ascii "ASDFGHJKL:\""	.byte '~,0	.ascii "|ZXCVBNM<>?"	.byte 0,'*,0,32		/* 36-39 */	.fill 16,1,0		/* 3A-49 */	.byte '-,0,0,0,'+	/* 4A-4E */	.byte 0,0,0,0,0,0,0	/* 4F-55 */	.byte '>	.fill 10,1,0alt_map:	.byte 0,0	.ascii "\0@\0$\0\0{[]}\\\0"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -