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