keyboard_handler.asm~

来自「jserv写的orz小内核 有详细的注释」· ASM~ 代码 · 共 179 行

ASM~
179
字号
%include "orzmicro.inc"%include "keyboard_handler.inc"%include "keytabs/keycodes.inc"%define MAX_KBUF_LEN	32		db "ORZEXE.0"		; Executable file revision 0 id		dd 0x1000		; Stack size		dd _DATA_LEN		; Data size[ORG -0x10][BITS 32]		mov [DAT+currTable],DWORD (ktab+9)Start:		mov edi,DAT+msg		mov edx,msgE-msg		int i_GetMessage		jnz Process		xor ebx,ebx		xor ecx,ecx		xor edx,edx		mov eax,msg_GetScanCode		int i_SendMessageW		jc Start0		call ScanToASCII		and ax,ax		jz Start0		movzx ecx,BYTE [DAT+bufLen]		cmp cl,MAX_KBUF_LEN		jnc Start0		mov edi,DAT+KBuf		add edi,ecx		add edi,ecx		stosw		inc cl		mov [DAT+bufLen],clStart0:		xor ebx,ebx		xor ecx,ecx		xor edx,edx		mov eax,msg_Sleep		int i_SendMessageW		jmp StartProcess:	cmp eax,kbd_GetASCII		jnz Process0		jmp MSG_GetASCIIProcess0:		mov eax,1		xor ecx,ecx		int i_ProcessMessage		jmp Start;-------------------------------------------------------------------------------MSG_GetASCII:	and ecx,ecx		jnz StdParamsErr		movzx ecx,BYTE [DAT+bufLen]		and cl,cl		jnz MSG_GetASCII0		jmp StdProcessMsgMSG_GetASCII0:	movzx eax,WORD [DAT+KBuf]		push eax		dec cl		mov [DAT+bufLen],cl		jecxz MSG_GetASCII1		mov edi,DAT+KBuf		mov esi,DAT+KBuf+2		rep movswMSG_GetASCII1:	pop eax		jmp StdProcessMsgEax;-------------------------------------------------------------------------------StdParamsErr:	mov eax,2		xor ecx,ecx		int i_ProcessMessage		jmp StartStdProcessMsg:	xor eax,eaxStdProcessMsgEax:		xor ecx,ecx		int i_ProcessMessage		jmp Start;-------------------------------------------------------------------------------ScanToASCII:	and ah,ah		jnz ScanToASCII0		xor cl,cl		jmp ScanToASCII2ScanToASCII0:	cmp ah,0xE0		jnz ScanToASCII1		mov cl,2		jmp ScanToASCII2ScanToASCII1:	mov cl,al		and al,0x7F		cmp ax,0xE145		jnz ScanToASCII5		xor ax,ax		mov al,cl		and al,0x80		xor cl,clScanToASCII2:	test al,0x80		jz ScanToASCII3		inc cl		and al,0x7FScanToASCII3:	movzx ecx,cl		movzx eax,al		shl eax,3		add eax,ecx		add eax,ecx		add eax,[DAT+currTable]		mov ax,[eax]		mov cl,ah		and cl,0xF0		cmp cl,0x70		jz ScanToASCII4		retScanToASCII4:	mov bl,ah		movzx eax,al		shl eax,(3+7)		add eax,ktab+9		mov [DAT+currTable],eax;		mov al,bl;		shl al,1;		and al,0110b;		shr bl,2;		and bl,0001b;		or bl,al;		mov al,0xED	;		out 0x60,al;		jmp short $+2;		mov al,ah;		out 0x60,alScanToASCII5:	xor ax,ax		ret;-------------------------------------------------------------------------------ktab:%include "keytabs/keytab1.inc";-------------------------------------------------------------------------------DAT:		struc _DATAcurrTable: 	resd 1bufLen:		resb 1KBuf:		resw MAX_KBUF_LENmsg:		resb 0x100msgE:_DATA_LEN:		endstruc

⌨️ 快捷键说明

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