📄 usbkbd.asm
字号:
ccbf_2:
inc bx
cmp bx,offset ch_buff_end
jnz ccbf_1 ; if head pointer reached buffer end
mov bx,offset ch_buff_start; then initialize to buffer start
ccbf_1:
cmp bx,ch_buff_tail
jz ccbf_4 ; yes, character buffer full
dec al
jnz ccbf_2 ; continue
ccbf_4:
xor bx,ch_buff_tail ; (zf) = x
pop bx
ret
;-------------------------------;
; PUT CHAR BUFFER ;
;-------------------------------;
; register used (none). ;
; input: ;
; (al) = character ;
; output: ;
; (zf) = 0:ok ;
; character buffer ptr updated ;
;-------------------------------;
put_char_buffer:
push bx
mov bx,ch_buff_head
mov [bx],al ; put character in buffer
inc bx ; advance buffer pointer
cmp bx,offset ch_buff_end
jnz pcb_1 ; if buff end, back to buff start
mov bx,offset ch_buff_start
pcb_1:
mov ch_buff_head,bx ; advance head pointer
call EnablePeriodicInterrupt
pop bx
or sp,sp ; (zf) = 0
ret
;-------------------------------;
; GET CHAR BUFFER ;
;-------------------------------;
; register used (none). ;
; input: ;
; none. ;
; output: ;
; (al) = character. ;
; character buffer ptr updated ;
;-------------------------------;
get_char_buffer:
push bx
mov bx,ch_buff_tail
mov al,[bx] ; get character from character buffer
inc bx ; advance buffer tail pointer
cmp bx,offset ch_buff_end
jnz gcb_1 ; if buff end, back to buff start
mov bx,offset ch_buff_start
gcb_1:
mov ch_buff_tail,bx ; advance character buffer tail pointer
pop bx
ret
;-------------------------------;
; Interrupt comes every 2 milisec
;-------------------------------;
trd_table: ; typematic rate delay 250/500/750/1000 milisec
%out periodic interrupt every 16 milisec
;;;; dw 125,250,375,500
dw 16,32,48,64
tr_table: ; typematic rate 2..30 characters/sec
%out repeat rate is always 30 char/sec
;;;; dw 016,020,025,031,038,046,055,064, 072,080,088,096,104,112,120,128
;;;; dw 136,144,152,160,168,176,184,192, 200,208,216,224,232,240,248,256
dw 2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2
dw 2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2
;-------------------------------;
key_pad_scan_2_table:
db endx, left, home, insr, del, down, rght, up, pgdn, pgup
key_pad_scan_2_table_end:
key_pad_scan_3_table:
db 65h, 61h, 6eh, 67h, 64h, 60h, 6ah, 63h, 6dh, 6fh
key_pad_scan_3_table_end:
;-------------------------------;
extd_key_scan_2_table:
db ralt, rctl, renter, lmsft, rmsft, amsft
extd_key_scan_2_table_end:
extd_key_scan_3_table:
db 39h, 58h, 79h, 8bh, 8ch, 8dh
extd_key_scan_3_table_end:
;-------------------------------;
extd_scan_3_data:
db 84h,85h,86h,87h
db 8bh,8ch,8dh
extd_scan_3_data_end:
extd_scan_3_new:
db 0,1,2,3,4,5,6
extd_scan_3_new_end:
;-------------------------------;
modifier_key_table:
db 0e0h,0e1h,0e2h,0e3h,0e4h,0e5h,0e6h,0e7h
;-------------------------------;
scan_3_table_data:
db 000h,015h,000h,028h,094h,029h,0a4h,02ah
db 0a8h,02ah,0a8h,02ah,0a8h,02ah,0a0h,02ah
db 0a8h,02ah,0a8h,02ah,0a8h,00ah,0a4h,00ah
db 08ah,022h,020h,000h,000h,000h,000h,002h
;-------------------------------;
t2223:
db 2,2,2,3
t6800:
db 6,8,0,0
t4500:
db 4,5,0,0
t4545:
db 4,5,4,5
t4446:
db 4,4,4,6
t1112:
db 1,1,1,2
;===============================;
USBKeyCode_to_Scan_2_table:
;------ USA ENGLISH keyboard -------; USBKeyCode to ScanCodeSet-2
db 00h,00h,00h,00h,1ch,32h,21h,23h, 24h,2bh,34h,33h,43h,3bh,42h,4bh
db 3ah,31h,44h,4dh,15h,2dh,1bh,2ch, 3ch,2ah,1dh,22h,35h,1ah,16h,1eh
db 26h,25h,2eh,36h,3dh,3eh,46h,45h, 5ah,76h,66h,0dh,29h,4eh,55h,54h
db 5bh,5dh,5dh,4ch,52h,0eh,41h,49h, 4ah,58h,05h,06h,04h,0ch,03h,0bh
db 83h,0ah,01h,09h,78h,07h,prtsc,7eh, pause,insr,home,pgup,del,endx,pgdn,rght
db left,down,up,77h,slash,7ch,7bh,79h, renter,69h,72h,7ah,6bh,73h,74h,6ch
db 75h,7dh,70h,71h,61h,amsft,00h,00h, 00h,00h,00h,00h,00h,00h,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,00h, 00h,00h,00h,00h,00h,00h,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,51h, 13h,6ah,64h,67h,00h,00h,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,00h, 00h,00h,00h,00h,00h,00h,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,00h, 00h,00h,00h,00h,00h,00h,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,00h, 00h,00h,00h,00h,00h,00h,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,00h, 00h,00h,00h,00h,00h,00h,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,00h, 00h,00h,00h,00h,00h,00h,00h,00h
db 14h,12h,11h,lmsft,rctl,59h,ralt,rmsft, 00h,00h,00h,00h,00h,00h,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,00h, 00h,00h,00h,00h,00h,00h,00h,00h
;===============================;
;-------------------------------;
set_2_to_1:
;-------------------------------;
KEY0 db 000h ;
KEY1 db 0E5h ;
KEY2 db 0F5h ;
KEY3 db 006h ;
KEY4 db 016h ;
KEY5 db 026h ;
KEY6 db 01Eh ;
KEY7 db 03Dh ;
KEY8 db 0DCh ;
KEY9 db 0DDh ;
KEYA db 0EDh ;
KEYB db 0FDh ;
KEYC db 00Eh ;
KEYD db 087h ;
KEYE db 0B6h ;
KEYF db 035h ;
KEY10 db 0D4h ;
KEY11 db 03Eh ;
KEY12 db 0AEh ;
KEY13 db 07Ch ;
KEY14 db 017h ;
KEY15 db 07Fh ;
KEY16 db 0EFh ;
KEY17 db 02Dh ;
KEY18 db 0CCh ;
KEY19 db 074h ;
KEY1A db 09Eh ;
KEY1B db 007h ;
KEY1C db 00Fh ;
KEY1D db 077h ;
KEY1E db 0E7h ;
KEY1F db 025h ;
KEY20 db 0C4h ;
KEY21 db 08Eh ;
KEY22 db 096h ;
KEY23 db 0FEh ;
KEY24 db 06Fh ;
KEY25 db 0D7h ;
KEY26 db 0DFh ;
KEY27 db 01Dh ;
KEY28 db 0BCh ;
KEY29 db 036h ;
KEY2A db 086h ;
KEY2B db 0F6h ;
KEY2C db 05Fh ;
KEY2D db 067h ;
KEY2E db 0CFh ;
KEY2F db 015h ;
KEY30 db 0B4h ;
KEY31 db 076h ;
KEY32 db 07Eh ;
KEY33 db 0E6h ;
KEY34 db 0EEh ;
KEY35 db 057h ;
KEY36 db 0C7h ;
KEY37 db 00Dh ;
KEY38 db 0ACh ;
KEY39 db 06Ch ;
KEY3A db 06Eh ;
KEY3B db 0DEh ;
KEY3C db 04Fh ;
KEY3D db 0BFh ;
KEY3E db 0B7h ;
KEY3F db 005h ;
KEY40 db 0A4h ;
KEY41 db 066h ;
KEY42 db 0D6h ;
KEY43 db 047h ;
KEY44 db 03Fh ;
KEY45 db 0A7h ;
KEY46 db 0AFh ;
KEY47 db 0FCh ;
KEY48 db 09Ch ;
KEY49 db 05Eh ;
KEY4A db 056h ;
KEY4B db 0CEh ;
KEY4C db 0C6h ;
KEY4D db 037h ;
KEY4E db 09Fh ;
KEY4F db 0F4h ;
KEY50 db 094h ;
KEY51 db 064h ;
KEY52 db 0BEh ;
KEY53 db 05Ch ;
KEY54 db 02Fh ;
KEY55 db 097h ;
KEY56 db 0ECh ;
KEY57 db 08Ch ;
KEY58 db 02Eh ;
KEY59 db 04Eh ;
KEY5A db 01Fh ;
KEY5B db 027h ;
KEY5C db 054h ;
KEY5D db 0A6h ;
KEY5E db 0E4h ;
KEY5F db 04Ch ;
KEY60 db 055h ;
KEY61 db 04Dh ;
KEY62 db 044h ;
KEY63 db 03Ch ;
KEY64 db 034h ;
KEY65 db 02Ch ;
KEY66 db 08Fh ;
KEY67 db 024h ;
KEY68 db 01Ch ;
KEY69 db 085h ;
KEY6A db 014h ;
KEY6B db 0A5h ;
KEY6C db 0C5h ;
KEY6D db 00Ch ;
KEY6E db 004h ;
KEY6F db 084h ;
KEY70 db 06Dh ;
KEY71 db 065h ;
KEY72 db 07Dh ;
KEY73 db 09Dh ;
KEY74 db 095h ;
KEY75 db 0BDh ;
KEY76 db 0F7h ;
KEY77 db 0D5h ;
KEY78 db 045h ;
KEY79 db 08Dh ;
KEY7A db 075h ;
KEY7B db 0ADh ;
KEY7C db 046h ;
KEY7D db 0B5h ;
KEY7E db 0CDh ;
KEY7F db 05Dh ;
KEY80 db 0FBh ;
KEY81 db 0F3h ;
KEY82 db 0EBh ;
KEY83 db 0F5h ;
KEY84 db 05Dh ;
;-------------------------------;
set_2_to_3:
;-------------------------------;
YKEY0 db 000h ;
YKEY1 db 0C5h ;
YKEY2 db 046h ;
YKEY3 db 0C6h ;
YKEY4 db 047h ;
YKEY5 db 0C7h ;
YKEY6 db 087h ;
YKEY7 db 00Dh ;
YKEY8 db 0BFh ;
YKEY9 db 085h ;
YKEYA db 006h ;
YKEYB db 086h ;
YKEYC db 007h ;
YKEYD db 097h ;
YKEYE db 08Fh ;
YKEYF db 087h ;
YKEY10 db 07Fh ;
YKEY11 db 037h ;
YKEY12 db 06Fh ;
YKEY13 db 0C3h ;
YKEY14 db 077h ;
YKEY15 db 057h ;
YKEY16 db 04Fh ;
YKEY17 db 047h ;
YKEY18 db 03Fh ;
YKEY19 db 037h ;
YKEY1A db 02Fh ;
YKEY1B db 027h ;
YKEY1C db 01Fh ;
YKEY1D db 017h ;
YKEY1E db 00Fh ;
YKEY1F db 0A3h ;
YKEY20 db 0FEh ;
YKEY21 db 0F6h ;
YKEY22 db 0EEh ;
YKEY23 db 0E6h ;
YKEY24 db 0DEh ;
YKEY25 db 0D6h ;
YKEY26 db 0CEh ;
YKEY27 db 09Bh ;
YKEY28 db 0BEh ;
YKEY29 db 0B6h ;
YKEY2A db 0AEh ;
YKEY2B db 0A6h ;
YKEY2C db 09Eh ;
YKEY2D db 096h ;
YKEY2E db 08Eh ;
YKEY2F db 093h ;
YKEY30 db 07Eh ;
YKEY31 db 076h ;
YKEY32 db 06Eh ;
YKEY33 db 066h ;
YKEY34 db 05Eh ;
YKEY35 db 056h ;
YKEY36 db 04Eh ;
YKEY37 db 046h ;
YKEY38 db 03Eh ;
YKEY39 db 036h ;
YKEY3A db 02Eh ;
YKEY3B db 026h ;
YKEY3C db 01Eh ;
YKEY3D db 016h ;
YKEY3E db 00Eh ;
YKEY3F db 006h ;
YKEY40 db 0FDh ;
YKEY41 db 0F5h ;
YKEY42 db 0EDh ;
YKEY43 db 0E5h ;
YKEY44 db 0DDh ;
YKEY45 db 0D5h ;
YKEY46 db 0CDh ;
YKEY47 db 0C5h ;
YKEY48 db 0BDh ;
YKEY49 db 0B5h ;
YKEY4A db 0ADh ;
YKEY4B db 0A5h ;
YKEY4C db 09Dh ;
YKEY4D db 095h ;
YKEY4E db 08Dh ;
YKEY4F db 085h ;
YKEY50 db 07Dh ;
YKEY51 db 075h ;
YKEY52 db 06Dh ;
YKEY53 db 065h ;
YKEY54 db 05Dh ;
YKEY55 db 055h ;
YKEY56 db 04Dh ;
YKEY57 db 045h ;
YKEY58 db 05Fh ;
YKEY59 db 035h ;
YKEY5A db 02Dh ;
YKEY5B db 025h ;
YKEY5C db 01Dh ;
YKEY5D db 065h ;
YKEY5E db 00Dh ;
YKEY5F db 005h ;
YKEY60 db 0FCh ;
YKEY61 db 067h ;
YKEY62 db 0ECh ;
YKEY63 db 0E4h ;
YKEY64 db 0CBh ;
YKEY65 db 0D4h ;
YKEY66 db 0CCh ;
YKEY67 db 0D3h ;
YKEY68 db 0BCh ;
YKEY69 db 0B4h ;
YKEY6A db 015h ;
YKEY6B db 0A4h ;
YKEY6C db 09Ch ;
YKEY6D db 094h ;
YKEY6E db 08Ch ;
YKEY6F db 084h ;
YKEY70 db 07Ch ;
YKEY71 db 074h ;
YKEY72 db 06Ch ;
YKEY73 db 064h ;
YKEY74 db 05Ch ;
YKEY75 db 054h ;
YKEY76 db 0BFh ;
YKEY77 db 04Ch ;
YKEY78 db 04Dh ;
YKEY79 db 01Ch ;
YKEY7A db 02Ch ;
YKEY7B db 0DBh ;
YKEY7C db 00Ch ;
YKEY7D db 014h ;
YKEY7E db 005h ;
YKEY7F db 05Dh ;
YKEY80 db 0FBh ;
YKEY81 db 0F3h ;
YKEY82 db 0EBh ;
YKEY83 db 046h ;
YKEY84 db 045h ;
;===============================;
;*****************************************************************;
;*****************************************************************;
;** **;
;** (C)Copyright 1985-1996, American Megatrends, Inc. **;
;** **;
;** All Rights Reserved. **;
;** **;
;** 6145-F Northbelt Pkwy, Norcross, GA 30071 **;
;** **;
;** Phone (770)-246-8600 **;
;** **;
;*****************************************************************;
;*****************************************************************;
;*****************************************************************;
;*****************************************************************;
;** **;
;** (C)Copyright 1985-1996, American Megatrends, Inc. **;
;** **;
;** All Rights Reserved. **;
;** **;
;** 6145-F Northbelt Pkwy, Norcross, GA 30071 **;
;** **;
;** Phone (770)-246-8600 **;
;** **;
;*****************************************************************;
;*****************************************************************;
;-------------------------------;
;-------------------------------;
;===============================;
;-------------------------------;
; 00..1F READ RAM ;
; 20..3F READ RAM ;
; 40..5F WRITE RAM ;
; 60..7F WRITE RAM ;
; 80..9F INVALID ;
; A0..FF COMMAND ;
;-------------------------------;
out_64:
or flag_byte_1,80h ; 1=64/60 emulation active
mov flag_60,0000h ; clear flag
or al,al
js o64_0 ; 80..FF
cmp al,40h
jae o64_1 ; 40..7F write RAM
;===============================;
; WindowsNT gets timeout error ;
; since data is returned after ;
; 1 to 2 milisec inside periodic;
; interrupt. so send call to
; 8042 now, we will see later ;
; what can be done when 8042 is ;
; not there in the mother board.;
;===============================;
;;;; and al,1fh
;;;; mov bx,offset ccb
;;;; xlat ; read RAM
;;;; jmp kb_sys ; output to system as keyboard data
;===============================;
call out_to_64 ; send command to 8042
ret ; exit
o64_1:
call out_to_64 ; send command to 8042
and al,1fh
mov ram_address,al ; save RAM address
mov flag_60,offset cgroup:o64_2+orgbase
ret ; exit
o
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -