Files
TempleOS-Rijn/LT/OSMain/CHARIO.ASZ
T
2018-09-08 21:45:17 +02:00

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