132 lines
2.5 KiB
Plaintext
132 lines
2.5 KiB
Plaintext
ALIGN 8,0x90
|
|
NORMAL_KEY_SCAN_DECODE_TABLE:
|
|
DU1 0,CH_ESC,"1234567890-=",8,9;
|
|
DU1 "qwertyuiop[]",CH_CR,0,"as";
|
|
DU1 "dfghjkl;'\`",0,"\\zxcv";
|
|
DU1 "bnm,./",0,'*',0,CH_SPACE,0,0,0,0,0,0;
|
|
DU1 0,0,0,0,0,0,0,0,0,0,'-',0,0,0,'+',0;
|
|
SHIFT_KEY_SCAN_DECODE_TABLE:
|
|
DU1 0,CH_ESC,"!@#$$%^&*()_+",8,9;
|
|
DU1 "QWERTYUIOP{}",CH_CR,0,"AS";
|
|
DU1 "DFGHJKL:\"~",0,"|ZXCV";
|
|
DU1 "BNM<>?",0,'*',0,CH_SHIFT_SPACE,0,0,0,0,0,0;
|
|
DU1 0,0,0,0,0,0,0,0,0,0,'-',0,0,0,'+',0;
|
|
CTRL_KEY_SCAN_DECODE_TABLE:
|
|
DU1 0,CH_ESC,"1234567890-=",8,9;
|
|
DU1 17,23,5,18,20,25,21,9,15,16,"[]",CH_CR,0,1,19;
|
|
DU1 4,6,7,8,CH_LINE_FEED,11,12,";'\`",0,"\\",26,24,3,22;
|
|
DU1 2,14,13,",./",0,'*',0,CH_SPACE,0,0,0,0,0,0;
|
|
DU1 0,0,0,0,0,0,0,0,0,0,'-',0,0,0,'+',0;
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
TRANSLATE_SCAN_CODE::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH EBX
|
|
MOV EAX,U4 SF_PARAM1[EBP]
|
|
TEST EAX,SCF_E0_PREFIX
|
|
JNZ @@100
|
|
TEST EAX,SCF_CTRL
|
|
JZ @@2
|
|
MOV EBX,CTRL_KEY_SCAN_DECODE_TABLE
|
|
JMP @@10
|
|
|
|
@@2: MOV EBX,NORMAL_KEY_SCAN_DECODE_TABLE
|
|
TEST EAX,SCF_SHIFT
|
|
JZ @@4
|
|
TEST EAX,SCF_CAPS
|
|
JNZ @@10
|
|
@@3: MOV EBX,SHIFT_KEY_SCAN_DECODE_TABLE
|
|
JMP @@10
|
|
@@4: TEST EAX,SCF_CAPS
|
|
JNZ @@3
|
|
|
|
@@10: AND EAX,0x7F
|
|
CMP EAX,0x50
|
|
JAE @@100
|
|
MOVZX EAX,U1 [EBX+EAX]
|
|
XOR EDX,EDX
|
|
POP EBX
|
|
POP EBP
|
|
RET
|
|
@@100: XOR EAX,EAX
|
|
XOR EDX,EDX
|
|
POP EBX
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
GET_KEY::
|
|
JMP @@2
|
|
@@1: CALL SWAP_IN_NEXT
|
|
@@2: MOV EAX,U4 FS:[TSS_ABSOLUTE_ADDRESS]
|
|
CMP U4 [SYS_CUR_FOCUS_TASK],EAX
|
|
JNE @@1
|
|
BTR U4 [SYS_CUR_SCAN_CODE],SCf_NEW_KEY
|
|
JNC @@1
|
|
BT U4 [SYS_CUR_SCAN_CODE],SCf_KEY_UP
|
|
JC @@1
|
|
PUSH 0
|
|
PUSH U4 [SYS_CUR_SCAN_CODE]
|
|
CALL TRANSLATE_SCAN_CODE
|
|
ADD ESP,8
|
|
OR AL,AL
|
|
JZ @@1
|
|
RET
|
|
|
|
CP_GET_KEY::
|
|
PUSHAD
|
|
MOV ESI,MSG_GET_CHAR_NO_ECHO
|
|
CALL FIND_EXTERN
|
|
JNZ @@10
|
|
CALL GET_KEY
|
|
JMP @@20
|
|
@@10: PUSH 0
|
|
PUSH 0
|
|
CALL ESI
|
|
ADD ESP,8
|
|
@@20: MOV EBP,ESP
|
|
MOV U4 SP_EAX[EBP],EAX
|
|
MOV U4 SP_EDX[EBP],0
|
|
POPAD
|
|
RET
|
|
|
|
CP_GET_CHAR::
|
|
INT I_GET_CHAR
|
|
XOR EDX,EDX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
// IN: EAX=NUMBER TO PRINT
|
|
ALIGN 8,0x90
|
|
PUT_HEX::
|
|
PUSH ECX
|
|
MOV ECX,8
|
|
CALL FIXED_PUT_HEX
|
|
POP ECX
|
|
RET
|
|
PUT_HEX_U2::
|
|
PUSH ECX
|
|
MOV ECX,4
|
|
CALL FIXED_PUT_HEX
|
|
POP ECX
|
|
RET
|
|
PUT_HEX_U1::
|
|
PUSH ECX
|
|
MOV ECX,2
|
|
CALL FIXED_PUT_HEX
|
|
POP ECX
|
|
RET
|
|
FIXED_PUT_HEX::
|
|
PUSHAD
|
|
SUB ESP,16
|
|
MOV EDI,ESP
|
|
CALL BINARY_TO_FIXED_HEX
|
|
XOR EAX,EAX
|
|
ADD EDI,ECX
|
|
STOSB
|
|
MOV ESI,ESP
|
|
INT I_PUT_STRING
|
|
ADD ESP,16
|
|
POPAD
|
|
RET
|
|
|