📄 keyboard.s
字号:
/* * 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 + -