1175 lines
21 KiB
Plaintext
1175 lines
21 KiB
Plaintext
ALIGN 8,0x90
|
|
|
|
ALPHA_BITMAP:: DU4 0x0000000,0x00000000,0x87FFFFFF,0x07FFFFFE;
|
|
DU4 0,0,0,0;
|
|
ALPHA_NUMERIC_BITMAP:: DU4 0x0000000,0x03FF0000,0x87FFFFFF,0x07FFFFFE;
|
|
DU4 0,0,0,0;
|
|
FILENAME_CHARS_BITMAP:: DU4 0x0000000,0x03FF6001,0x87FFFFFF,0x07FFFFFE;
|
|
DU4 0,0,0,0;
|
|
DEC_NUMERIC_BITMAP:: DU4 0x0000000,0x03FF0000,0,0;
|
|
DU4 0,0,0,0;
|
|
HEX_NUMERIC_BITMAP:: DU4 0x0000000,0x03FF0000,0x7E,0x7E;
|
|
DU4 0,0,0,0;
|
|
PRINTABLE_CHARS_BITMAP::
|
|
DU4 0x80002200,0xFFFFFFFF,0xFFFFFFFF,0x7FFFFFFF;
|
|
DU4 0,0,0,0;
|
|
SAFE_DOLLAR_CHARS_BITMAP::
|
|
DU4 0x80000000,0xFFFFFFEF,0xFFFFFFFF,0x7FFFFFFF;
|
|
DU4 0,0,0,0;
|
|
DISPLAYABLE_CHARS_BITMAP::
|
|
DU4 0x80000000,0xFFFFFFFF,0xFFFFFFFF,0x7FFFFFFF;
|
|
DU4 0x00001FFF,0,0,0;
|
|
|
|
////**************************PROCEDURE*************************
|
|
CP_RUN_STATEMENT::
|
|
PUSHAD
|
|
MOV EBP,ESP
|
|
MOV ESI,U4 SP_PARAM1[EBP]
|
|
OR ESI,ESI
|
|
JZ @@100
|
|
CALL ESI
|
|
MOV EBP,ESP
|
|
MOV SP_EAX[EBP],EAX
|
|
MOV SP_EDX[EBP],EDX
|
|
POPAD
|
|
RET
|
|
@@100: POPAD
|
|
XOR EDX,EDX
|
|
XOR EAX,EAX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
DEBUG_SPIN_WAIT::
|
|
PUSH ECX
|
|
MOV ECX,0x8FFFFFFF
|
|
@@1: LOOP @@1
|
|
POP ECX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
OR_U2_BIT_FIELD::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
MOV EBX,U4 SF_PARAM2[EBP]
|
|
MOV EDX,U4 SF_PARAM2+4[EBP]
|
|
MOV CL,3
|
|
SHRD EBX,EDX
|
|
ADD EBX,U4 SF_PARAM1[EBP]
|
|
MOV EAX,U4 SF_PARAM3[EBP]
|
|
MOV ECX,U4 SF_PARAM2[EBP]
|
|
AND ECX,7
|
|
SHL EAX,CL
|
|
OR U4 [EBX],EAX
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
EWBP_MASKTABLE:
|
|
DU4 0,1,3,7,15,31,63,127,255;
|
|
DU4 0x1FF,0x3FF,0x7FF,0x0FFF;
|
|
DU4 0x1FFF,0x3FFF,0x7FFF,0x0FFFF;
|
|
|
|
EXTRACT_U2_BIT_FIELD::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
MOV EBX,U4 SF_PARAM2[EBP]
|
|
MOV EDX,U4 SF_PARAM2+4[EBP]
|
|
MOV CL,3
|
|
SHRD EBX,EDX
|
|
ADD EBX,U4 SF_PARAM1[EBP]
|
|
MOV EAX,U4 [EBX]
|
|
MOV ECX,U4 SF_PARAM2[EBP]
|
|
AND ECX,7
|
|
SHR EAX,CL
|
|
MOV EBX,U4 SF_PARAM3[EBP]
|
|
AND EAX,U4 EWBP_MASKTABLE[EBX*4]
|
|
XOR EDX,EDX
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
U64_MUL::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
MOV EAX,U4 SF_PARAM1[EBP]
|
|
MUL U4 SF_PARAM2+4[EBP]
|
|
MOV EBX,EAX
|
|
MOV EAX,U4 SF_PARAM1+4[EBP]
|
|
MUL U4 SF_PARAM2[EBP]
|
|
ADD EBX,EAX
|
|
MOV EAX,U4 SF_PARAM1[EBP]
|
|
MUL U4 SF_PARAM2[EBP]
|
|
ADD EDX,EBX
|
|
POP EBP
|
|
RET
|
|
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
I64_MUL::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
MOV EAX,U4 SF_PARAM1+4[EBP]
|
|
OR EAX,EAX
|
|
JS @@40
|
|
|
|
MOV EAX,U4 SF_PARAM2+4[EBP]
|
|
OR EAX,EAX
|
|
JS @@20
|
|
|
|
@@10: MOV EAX,U4 SF_PARAM1[EBP]
|
|
MUL U4 SF_PARAM2+4[EBP]
|
|
MOV EBX,EAX
|
|
MOV EAX,U4 SF_PARAM1+4[EBP]
|
|
MUL U4 SF_PARAM2[EBP]
|
|
ADD EBX,EAX
|
|
MOV EAX,U4 SF_PARAM1[EBP]
|
|
MUL U4 SF_PARAM2[EBP]
|
|
ADD EDX,EBX
|
|
POP EBP
|
|
RET
|
|
|
|
@@20: NEG U4 SF_PARAM2[EBP]
|
|
JC @@21
|
|
DEC U4 SF_PARAM2+4[EBP]
|
|
@@21: NOT U4 SF_PARAM2+4[EBP]
|
|
@@30: MOV EAX,U4 SF_PARAM1[EBP]
|
|
MUL U4 SF_PARAM2+4[EBP]
|
|
MOV EBX,EAX
|
|
MOV EAX,U4 SF_PARAM1+4[EBP]
|
|
MUL U4 SF_PARAM2[EBP]
|
|
ADD EBX,EAX
|
|
MOV EAX,U4 SF_PARAM1[EBP]
|
|
MUL U4 SF_PARAM2[EBP]
|
|
ADD EDX,EBX
|
|
NEG EAX
|
|
JC @@31
|
|
DEC EDX
|
|
@@31: NOT EDX
|
|
POP EBP
|
|
RET
|
|
|
|
@@40: NEG U4 SF_PARAM1[EBP]
|
|
JC @@41
|
|
DEC U4 SF_PARAM1+4[EBP]
|
|
@@41: NOT U4 SF_PARAM1+4[EBP]
|
|
|
|
MOV EAX,U4 SF_PARAM2+4[EBP]
|
|
OR EAX,EAX
|
|
JNS @@30
|
|
|
|
NEG U4 SF_PARAM2[EBP]
|
|
JC @@42
|
|
DEC U4 SF_PARAM2+4[EBP]
|
|
@@42: NOT U4 SF_PARAM2+4[EBP]
|
|
JMP @@10
|
|
////**************************PROCEDURE*************************
|
|
// IN: ESI=STRUCT TO INSERT
|
|
// EDI=PREDECESSOR
|
|
ALIGN 8,0x90
|
|
INSQUE::
|
|
PUSH EBX
|
|
MOV EBX,[EDI]
|
|
MOV [EDI],ESI
|
|
MOV [ESI],EBX
|
|
MOV 4[ESI],EDI
|
|
MOV 4[EBX],ESI
|
|
POP EBX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
// IN: ESI=STRUCT TO INSERT
|
|
// EDI=SUCCESSOR
|
|
ALIGN 8,0x90
|
|
INSQUE_REV::
|
|
PUSH EBX
|
|
MOV EBX,4[EDI]
|
|
MOV [EBX],ESI
|
|
MOV [ESI],EDI
|
|
MOV 4[ESI],EBX
|
|
MOV 4[EDI],ESI
|
|
POP EBX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
// IN: ESI=STRUCT TO REMOVE
|
|
ALIGN 8,0x90
|
|
REMQUE::
|
|
PUSH EBX
|
|
PUSH EDI
|
|
MOV EBX,[ESI]
|
|
MOV EDI,4[ESI]
|
|
MOV [EDI],EBX
|
|
MOV 4[EBX],EDI
|
|
POP EDI
|
|
POP EBX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
PUT_I1::
|
|
PUSHAD
|
|
PUSH 0
|
|
PUSH EAX
|
|
CALL CP_PUT_I1+4
|
|
ADD ESP,8
|
|
POPAD
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
PUT_STRING::
|
|
PUSHAD
|
|
PUSH 0
|
|
PUSH ESI
|
|
CALL CP_PUT_STRING+4
|
|
ADD ESP,8
|
|
POPAD
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
// IN: EAX=BINARY
|
|
// ES:[EDI]=@FIELD
|
|
// ECX=LENGTH (IF THE HEX_FIELD ENTRY IS USED)
|
|
//
|
|
// OUT: EAX PRESERVED
|
|
// ECX=0
|
|
// [EDI] POINTS PAST DESTINATION
|
|
|
|
ALIGN 8,0x90
|
|
BINARY_TO_HEX::
|
|
MOV ECX,8
|
|
BINARY_TO_FIXED_HEX:
|
|
PUSHFD //-****
|
|
CLI //because of STD
|
|
PUSH EAX //-****
|
|
PUSH EDX //-****
|
|
ADD EDI,ECX
|
|
PUSH EDI //-**** EDI WE WANT TO RETURN
|
|
DEC EDI
|
|
MOV EDX,EAX
|
|
STD
|
|
|
|
@@1: MOV AL,DL
|
|
AND AL,0xF
|
|
ADD AL,0x90
|
|
DAA
|
|
ADC AL,0x40
|
|
DAA
|
|
STOSB
|
|
SHR EDX,4
|
|
LOOP @@1
|
|
|
|
POP EDI //+****
|
|
POP EDX //+****
|
|
POP EAX //+****
|
|
POPFD //+****
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
//IN: [ESI] = @FIELD
|
|
// ECX = LENGTH
|
|
//OUT: EAX = VALUE
|
|
// ECX = 0
|
|
ALIGN 8,0x90
|
|
HEX_TO_BINARY::
|
|
PUSH EDX
|
|
XOR EDX,EDX
|
|
OR ECX,ECX
|
|
JZ @@9
|
|
@@1: SHL EDX,4
|
|
LODSB
|
|
SUB AL,0x30
|
|
CMP AL,9
|
|
JA @@2
|
|
SUB AL,7
|
|
@@2: MOVZX EAX,AL
|
|
ADD EDX,EAX
|
|
LOOP @@1
|
|
|
|
@@9: MOV EAX,EDX
|
|
POP EDX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
MONTH_START_DAYS1::
|
|
DU2 0,31,59,90,120,151,181,212,243,273,304,334;
|
|
MONTH_START_DAYS2::
|
|
DU2 0,31,60,91,121,152,182,213,244,274,305,335;
|
|
|
|
MSG_GETCHAR: DU1 "GetChar",0;
|
|
MSG_PEEK_MSG: DU1 "PeekMsg",0;
|
|
MSG_GET_MSG: DU1 "GetMsg",0;
|
|
MSG_GET_MSG_NO_WAIT: DU1 "GetMsgNoWait",0;
|
|
MSG_FLUSH_MSGS: DU1 "FlushMsgs",0;
|
|
MSG_GET_CHAR_NO_ECHO: DU1 "GetCharNoEcho",0;
|
|
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_REP_INSW::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH EDI
|
|
MOV EDI,SF_PARAM1[EBP]
|
|
MOV EDX,SF_PARAM3[EBP]
|
|
MOV ECX,SF_PARAM2[EBP]
|
|
REP_INSW
|
|
POP EDI
|
|
POP EBP
|
|
RET
|
|
ALIGN 8,0x90
|
|
CP_REP_INSB::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH EDI
|
|
MOV EDI,SF_PARAM1[EBP]
|
|
MOV EDX,SF_PARAM3[EBP]
|
|
MOV ECX,SF_PARAM2[EBP]
|
|
REP_INSB
|
|
POP EDI
|
|
POP EBP
|
|
RET
|
|
CP_REP_OUTSW::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH ESI
|
|
MOV ESI,SF_PARAM1[EBP]
|
|
MOV EDX,SF_PARAM3[EBP]
|
|
MOV ECX,SF_PARAM2[EBP]
|
|
REP_OUTSW
|
|
POP ESI
|
|
POP EBP
|
|
RET
|
|
CP_REP_OUTSB::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH ESI
|
|
MOV ESI,SF_PARAM1[EBP]
|
|
MOV EDX,SF_PARAM3[EBP]
|
|
MOV ECX,SF_PARAM2[EBP]
|
|
REP_OUTSB
|
|
POP ESI
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_STRCAT::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH ESI
|
|
PUSH EDI
|
|
MOV ESI,U4 SF_PARAM1[EBP]
|
|
@@2: LODSB
|
|
OR AL,AL
|
|
JNZ @@2
|
|
MOV EDI,ESI
|
|
DEC EDI
|
|
MOV ESI,U4 SF_PARAM2[EBP]
|
|
@@1: LODSB
|
|
STOSB
|
|
OR AL,AL
|
|
JNZ @@1
|
|
POP EDI
|
|
POP ESI
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_STRCPY::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH ESI
|
|
PUSH EDI
|
|
MOV ESI,U4 SF_PARAM2[EBP]
|
|
MOV EDI,U4 SF_PARAM1[EBP]
|
|
@@1: LODSB
|
|
STOSB
|
|
OR AL,AL
|
|
JNZ @@1
|
|
POP EDI
|
|
POP ESI
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_STRCMP::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH ESI
|
|
PUSH EDI
|
|
MOV ESI,U4 SF_PARAM2[EBP]
|
|
MOV EDI,U4 SF_PARAM1[EBP]
|
|
@@1: LODSB
|
|
OR AL,AL
|
|
JZ @@100
|
|
SCASB
|
|
JE @@1
|
|
JA @@90
|
|
@@80: MOV EAX,1
|
|
JMP @@101
|
|
@@90: MOV EAX,-1
|
|
JMP @@101
|
|
@@100: SCASB
|
|
JNE @@80
|
|
XOR EAX,EAX
|
|
@@101: CDQ
|
|
POP EDI
|
|
POP ESI
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_STRNCMP::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH ESI
|
|
PUSH EDI
|
|
MOV ECX,U4 SF_PARAM3[EBP]
|
|
MOV ESI,U4 SF_PARAM2[EBP]
|
|
MOV EDI,U4 SF_PARAM1[EBP]
|
|
@@1: OR ECX,ECX
|
|
JZ @@102
|
|
DEC ECX
|
|
LODSB
|
|
OR AL,AL
|
|
JZ @@100
|
|
SCASB
|
|
JE @@1
|
|
JA @@90
|
|
@@80: MOV EAX,1
|
|
JMP @@101
|
|
@@90: MOV EAX,-1
|
|
JMP @@101
|
|
@@100: SCASB
|
|
JNE @@80
|
|
@@102: XOR EAX,EAX
|
|
@@101: CDQ
|
|
POP EDI
|
|
POP ESI
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_STRSTR::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH ESI
|
|
PUSH EDI
|
|
MOV ESI,U4 SF_PARAM1[EBP]
|
|
MOV EDI,U4 SF_PARAM2[EBP]
|
|
MOV AH,U1 [EDI]
|
|
OR AH,AH
|
|
JZ @@90
|
|
JMP @@5
|
|
@@1: INC ESI
|
|
@@5: LODSB
|
|
OR AL,AL
|
|
JZ @@100
|
|
CMP AL,AH
|
|
JNE @@5
|
|
DEC ESI
|
|
MOV ECX,1
|
|
@@10: MOV AL,U1 [EDI+ECX]
|
|
OR AL,AL
|
|
JZ @@90
|
|
CMP AL,U1 [ESI+ECX]
|
|
JNE @@1
|
|
INC ECX
|
|
JMP @@10
|
|
|
|
@@80: DEC ESI
|
|
@@90: MOV EAX,ESI
|
|
JMP @@101
|
|
@@100: XOR EAX,EAX
|
|
@@101: XOR EDX,EDX
|
|
POP EDI
|
|
POP ESI
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
TO_UPPER::
|
|
CMP AL,'a'
|
|
JB @@100
|
|
CMP AL,'z'
|
|
JA @@100
|
|
ADD AL,'A'-'a'
|
|
@@100: RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_STRISTR::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH ESI
|
|
PUSH EDI
|
|
MOV ESI,U4 SF_PARAM1[EBP]
|
|
MOV EDI,U4 SF_PARAM2[EBP]
|
|
MOV AL,U1 [EDI]
|
|
CALL TO_UPPER
|
|
MOV AH,AL
|
|
OR AH,AH
|
|
JZ @@90
|
|
JMP @@5
|
|
@@1: INC ESI
|
|
@@5: LODSB
|
|
CALL TO_UPPER
|
|
OR AL,AL
|
|
JZ @@100
|
|
CMP AL,AH
|
|
JNE @@5
|
|
DEC ESI
|
|
MOV ECX,1
|
|
@@10: MOV AL,U1 [EDI+ECX]
|
|
CALL TO_UPPER
|
|
OR AL,AL
|
|
JZ @@90
|
|
MOV BL,U1 [ESI+ECX]
|
|
XCHG AL,BL
|
|
CALL TO_UPPER
|
|
CMP AL,BL
|
|
JNE @@1
|
|
INC ECX
|
|
JMP @@10
|
|
|
|
@@80: DEC ESI
|
|
@@90: MOV EAX,ESI
|
|
JMP @@101
|
|
@@100: XOR EAX,EAX
|
|
@@101: XOR EDX,EDX
|
|
POP EDI
|
|
POP ESI
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
// IN: [ESI]
|
|
// OUT: EAX
|
|
ALIGN 8,0x90
|
|
HASH_STRING::
|
|
PUSH ESI //-****
|
|
PUSH EBX //-****
|
|
PUSH ECX //-****
|
|
XOR EAX,EAX
|
|
XOR EBX,EBX
|
|
@@1: LODSB
|
|
OR AL,AL
|
|
JZ @@100
|
|
SHL EBX,1
|
|
ADC EBX,EAX
|
|
JMP @@1
|
|
|
|
@@100: MOV CL,16
|
|
MOV EAX,EBX
|
|
SHR EBX,CL
|
|
ADC EAX,EBX
|
|
POP ECX //+****
|
|
POP EBX //+****
|
|
POP ESI //+****
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
// IN: [ESI]=STRING
|
|
// EBX=TYPE MASK
|
|
// [EDI]=TABLE
|
|
// OUT: [ESI]=ENTRY OR ZERO NOT FOUND
|
|
// ZERO FLAG SET NOT FOUND
|
|
// EAX=INDEX
|
|
ALIGN 8,0x90
|
|
FIND_HASH_ENTRY::
|
|
PUSH EDX //-****
|
|
PUSH EDI //-****
|
|
MOV EDX,ESI
|
|
CALL HASH_STRING
|
|
@@4: PUSH EAX //-****
|
|
AND EAX,U4 HT_MASK[EDI]
|
|
LEA ESI,U4 HT_BODY[EDI]
|
|
MOV ESI,U4[ESI+EAX*4]
|
|
@@1: OR ESI,ESI
|
|
JNZ @@3
|
|
MOV EDI,U4 HT_NEXT[EDI]
|
|
OR EDI,EDI
|
|
JZ @@100
|
|
POP EAX
|
|
JMP @@4
|
|
|
|
@@3: MOV EAX,U4 HTE_TYPE[ESI]
|
|
AND EAX,EBX
|
|
JE @@90
|
|
PUSH ESI //-****
|
|
PUSH EDI //-****
|
|
MOV EDI,U4 HTE_STRING[ESI]
|
|
MOV ESI,EDX
|
|
@@2: LODSB
|
|
MOV AH,U1 [EDI]
|
|
INC EDI
|
|
CMP AL,AH
|
|
JNE @@80
|
|
OR AL,AL
|
|
JNZ @@2
|
|
POP EDI //+****
|
|
POP ESI //+****
|
|
INC U4 HTE_USE_CNT[ESI]
|
|
JMP @@100
|
|
|
|
@@80: POP EDI //+****
|
|
POP ESI //+****
|
|
|
|
@@90: MOV ESI,U4 HTE_NEXT[ESI]
|
|
JMP @@1
|
|
|
|
@@100: POP EAX //+****
|
|
AND EAX,U4 HT_MASK[EDI]
|
|
POP EDI //+****
|
|
POP EDX //+****
|
|
OR ESI,ESI
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
// IN: ES:[ESI]=STRING
|
|
// [EDI]=TABLE
|
|
// OUT: [ESI]=BUCKET
|
|
ALIGN 8,0x90
|
|
FIND_HASH_BUCKET::
|
|
PUSH EAX
|
|
CALL HASH_STRING
|
|
AND EAX,U4 HT_MASK[EDI]
|
|
LEA ESI,U4 HT_BODY[EDI+EAX*4]
|
|
POP EAX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
FIND_EXTERN::
|
|
//IN: ESI
|
|
//OUT: ESI
|
|
PUSH EAX
|
|
PUSH EDI
|
|
PUSH EBX
|
|
MOV EDI,U4 FS:[TSS_HASH_TABLE]
|
|
MOV EBX,HTT_FUNCTION|HTT_SYS_SYMBOL
|
|
CALL FIND_HASH_ENTRY
|
|
JNZ @@1
|
|
XOR ESI,ESI
|
|
JMP @@3
|
|
@@1: MOV EAX,U4 HTE_USER0[ESI]
|
|
TEST U4 HTE_TYPE[ESI],HTT_FUNCTION
|
|
JZ @@2
|
|
MOV EAX,U4 C_STATEMENTS[ESI]
|
|
@@2: MOV ESI,EAX
|
|
@@3: POP EBX
|
|
POP EDI
|
|
POP EAX
|
|
OR ESI,ESI
|
|
RET
|
|
CP_FIND_EXTERN::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH ESI
|
|
PUSH EDI
|
|
MOV EDI,U4 FS:[TSS_HASH_TABLE]
|
|
MOV ESI,U4 SF_PARAM1[EBP]
|
|
MOV EBX,HTT_FUNCTION|HTT_SYS_SYMBOL
|
|
CALL FIND_HASH_ENTRY
|
|
JZ @@1
|
|
MOV EAX,U4 HTE_USER0[ESI]
|
|
TEST U4 HTE_TYPE[ESI],HTT_FUNCTION
|
|
JZ @@2
|
|
MOV EAX,U4 C_STATEMENTS[ESI]
|
|
JMP @@2
|
|
@@1: XOR EAX,EAX
|
|
@@2: XOR EDX,EDX
|
|
POP EDI
|
|
POP ESI
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CRLF::
|
|
PUSH EAX
|
|
PUSH EDX
|
|
XOR EDX,EDX
|
|
MOV EAX,13
|
|
INT I_PUT_I1
|
|
XOR EDX,EDX
|
|
MOV EAX,10
|
|
INT I_PUT_I1
|
|
POP EDX
|
|
POP EAX
|
|
RET
|
|
ALIGN 8,0x90
|
|
////**************************PROCEDURE*************************
|
|
CP_HASH_STRING::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH ESI
|
|
MOV ESI,U4 SF_PARAM1[EBP]
|
|
CALL HASH_STRING
|
|
XOR EDX,EDX
|
|
POP ESI
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_FIND_HASH_ENTRY::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH EDI
|
|
PUSH ESI
|
|
MOV ESI,U4 SF_PARAM1[EBP]
|
|
MOV EDI,U4 SF_PARAM2[EBP]
|
|
MOV EBX,U4 SF_PARAM3[EBP]
|
|
CALL FIND_HASH_ENTRY
|
|
MOV EAX,ESI
|
|
XOR EDX,EDX
|
|
POP ESI
|
|
POP EDI
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_FIND_HASH_BUCKET::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH EDI
|
|
PUSH ESI
|
|
MOV ESI,U4 SF_PARAM1[EBP]
|
|
MOV EDI,U4 SF_PARAM2[EBP]
|
|
CALL FIND_HASH_BUCKET
|
|
MOV EAX,ESI
|
|
XOR EDX,EDX
|
|
POP ESI
|
|
POP EDI
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_FSQRT::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FSQRT
|
|
FSTP U4 SF_PARAM1[EBP]
|
|
MOV EAX,SF_PARAM1[EBP]
|
|
MOV EDX,SF_PARAM1+4[EBP]
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_FSIN::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FSIN
|
|
FSTP U4 SF_PARAM1[EBP]
|
|
MOV EAX,SF_PARAM1[EBP]
|
|
MOV EDX,SF_PARAM1+4[EBP]
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_FCOS::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FCOS
|
|
FSTP U4 SF_PARAM1[EBP]
|
|
MOV EAX,SF_PARAM1[EBP]
|
|
MOV EDX,SF_PARAM1+4[EBP]
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_FTAN::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
FLD U4 SF_PARAM1[EBP]
|
|
@@1: FPTAN
|
|
FSTSW
|
|
TEST AX,0x400
|
|
JNZ @@1
|
|
FFREE
|
|
FINCSTP
|
|
FSTP U4 SF_PARAM1[EBP]
|
|
MOV EAX,SF_PARAM1[EBP]
|
|
MOV EDX,SF_PARAM1+4[EBP]
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_FATAN::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FLD1
|
|
@@1: FPATAN
|
|
FSTSW
|
|
TEST AX,0x400
|
|
JNZ @@1
|
|
FSTP U4 SF_PARAM1[EBP]
|
|
MOV EAX,SF_PARAM1[EBP]
|
|
MOV EDX,SF_PARAM1+4[EBP]
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_ARG::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
FLD U4 SF_PARAM2[EBP]
|
|
FLD U4 SF_PARAM1[EBP]
|
|
@@1: FPATAN
|
|
FSTSW
|
|
TEST AX,0x400
|
|
JNZ @@1
|
|
FSTP U4 SF_PARAM1[EBP]
|
|
MOV EAX,SF_PARAM1[EBP]
|
|
MOV EDX,SF_PARAM1+4[EBP]
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_FRNDINT::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FRNDINT
|
|
FSTP U4 SF_PARAM1[EBP]
|
|
MOV EAX,SF_PARAM1[EBP]
|
|
MOV EDX,SF_PARAM1+4[EBP]
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_FLOOR::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
|
|
SUB ESP,4
|
|
FSTCW U4 -4[EBP]
|
|
MOV AX,U2 -4[EBP]
|
|
MOV U2 -2[EBP],AX
|
|
OR AX,0x0C00
|
|
MOV U2 -4[EBP],AX
|
|
FLDCW U4 -4[EBP]
|
|
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FRNDINT
|
|
FSTP U4 SF_PARAM1[EBP]
|
|
MOV EAX,SF_PARAM1[EBP]
|
|
MOV EDX,SF_PARAM1+4[EBP]
|
|
|
|
FLDCW U4 -2[EBP]
|
|
ADD ESP,4
|
|
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_POW10::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
SUB ESP,12
|
|
FSTCW U4 -4[EBP]
|
|
MOV AX,U2 -4[EBP]
|
|
MOV U2 -2[EBP],AX
|
|
OR AX,0x0C00
|
|
MOV U2 -4[EBP],AX
|
|
FLDCW U4 -4[EBP]
|
|
|
|
FLDL2T
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FMULP
|
|
FST U4 SF_PARAM1[EBP]
|
|
FRNDINT
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FSUBRP
|
|
F2XM1
|
|
FLD1
|
|
FADDP
|
|
FSTP U4 -12[EBP]
|
|
FFREE
|
|
FINCSTP
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FLD U4 -12[EBP]
|
|
FSCALE // ST0<<ST1
|
|
FSTP U4 -12[EBP]
|
|
FFREE
|
|
FINCSTP
|
|
|
|
FLDCW U4 -2[EBP]
|
|
|
|
POP EAX
|
|
POP EDX
|
|
ADD ESP,4
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_EXP::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
SUB ESP,12
|
|
FSTCW U4 -4[EBP]
|
|
MOV AX,U2 -4[EBP]
|
|
MOV U2 -2[EBP],AX
|
|
OR AX,0x0C00
|
|
MOV U2 -4[EBP],AX
|
|
FLDCW U4 -4[EBP]
|
|
|
|
FLDL2E
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FMULP
|
|
FST U4 SF_PARAM1[EBP]
|
|
FRNDINT
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FSUBRP
|
|
F2XM1
|
|
FLD1
|
|
FADDP
|
|
FSTP U4 -12[EBP]
|
|
FFREE
|
|
FINCSTP
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FLD U4 -12[EBP]
|
|
FSCALE // ST0<<ST1
|
|
FSTP U4 -12[EBP]
|
|
FFREE
|
|
FINCSTP
|
|
|
|
FLDCW U4 -2[EBP]
|
|
|
|
POP EAX
|
|
POP EDX
|
|
ADD ESP,4
|
|
POP EBP
|
|
RET
|
|
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_LOG10::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
SUB ESP,8
|
|
|
|
FLDLG2
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FYL2X // y*log2(x)
|
|
FSTP U4 -8[EBP]
|
|
FFREE
|
|
FINCSTP
|
|
|
|
POP EAX
|
|
POP EDX
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_LOG2::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
SUB ESP,8
|
|
|
|
FLD1
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FYL2X // y*log2(x)
|
|
FSTP U4 -8[EBP]
|
|
FFREE
|
|
FINCSTP
|
|
|
|
POP EAX
|
|
POP EDX
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_LN::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
SUB ESP,8
|
|
|
|
FLDLN2
|
|
FLD U4 SF_PARAM1[EBP]
|
|
FYL2X // y*log2(x)
|
|
FSTP U4 -8[EBP]
|
|
FFREE
|
|
FINCSTP
|
|
|
|
POP EAX
|
|
POP EDX
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_FLDCW::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
FLDCW U4 SF_PARAM1[EBP]
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_FSTCW::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
SUB ESP,4
|
|
FSTCW U4 -4[EBP]
|
|
MOVZX EAX,U2 -4[EBP]
|
|
ADD ESP,4
|
|
XOR EDX,EDX
|
|
POP EBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_FSTSW::
|
|
XOR EAX,EAX
|
|
FSTSW
|
|
XOR EDX,EDX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,0x90
|
|
CP_FCLEX::
|
|
FCLEX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
/*
|
|
I8 ArcDetermineCompressionType(U1 *src,U8 size)
|
|
{
|
|
U8 i,j=0;
|
|
for (i=0;i<size;i++)
|
|
j|=src[i];
|
|
if (j & 0x80)
|
|
return CT_8_BIT;
|
|
else
|
|
return CT_7_BIT;
|
|
}
|
|
*/
|
|
ALIGN 8,0x90
|
|
CP_ARC_DETERMINE_COMPRESSION_TYPE::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH ESI
|
|
MOV ESI,SF_PARAM1[EBP]
|
|
MOV ECX,SF_PARAM2[EBP]
|
|
OR ECX,ECX
|
|
JZ @@100
|
|
XOR EBX,EBX
|
|
@@1: LODSB
|
|
OR BL,AL
|
|
LOOP @@1
|
|
OR BL,BL
|
|
JNS @@100
|
|
MOV EAX,CT_8_BIT
|
|
JMP @@110
|
|
@@100: MOV EAX,CT_7_BIT
|
|
@@110: POP ESI
|
|
POP EBP
|
|
XOR EDX,EDX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
/*
|
|
U8 ArcCheckSum(U1 *buf,U8 size)
|
|
{
|
|
U4 *ptr=buf;
|
|
U8 result=0,i,l=size>>2;
|
|
for (i=0;i<l;i++)
|
|
result^=ptr[i];
|
|
return result;
|
|
}
|
|
*/
|
|
ALIGN 8,0x90
|
|
CP_ARC_CHECK_SUM::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH ESI
|
|
MOV ESI,SF_PARAM1[EBP]
|
|
MOV ECX,SF_PARAM2[EBP]
|
|
XOR EBX,EBX
|
|
SHR ECX,2
|
|
JZ @@100
|
|
@@1: LODSD
|
|
XOR EBX,EAX
|
|
LOOP @@1
|
|
@@100: MOV EAX,EBX
|
|
POP ESI
|
|
POP EBP
|
|
XOR EDX,EDX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
|
|
/*
|
|
void ArcGetTableEntry(ArcCs *c)
|
|
{
|
|
U8 i;
|
|
ArcTableEntry *temp,*temp1;
|
|
|
|
if (c->entry_used) {
|
|
i=c->free_index;
|
|
|
|
c->entry_used=FALSE;
|
|
c->cur_entry=c->next_entry;
|
|
c->cur_bits_in_use=c->next_bits_in_use;
|
|
if (c->next_bits_in_use<ARC_MAX_BITS) {
|
|
c->next_entry = &c->compress[i++];
|
|
if (i==c->free_limit) {
|
|
c->next_bits_in_use++;
|
|
c->free_limit=1<<c->next_bits_in_use;
|
|
}
|
|
} else {
|
|
do if (++i==c->free_limit)
|
|
i=c->min_table_entry;
|
|
while (c->hash[i]);
|
|
temp=&c->compress[i];
|
|
c->next_entry=temp;
|
|
temp1=&c->hash[temp->basecode];
|
|
while (temp1) {
|
|
if (temp1->next==temp) {
|
|
temp1->next=temp->next;
|
|
break;
|
|
} else
|
|
temp1=temp1->next;
|
|
}
|
|
}
|
|
c->free_index=i;
|
|
}
|
|
}
|
|
*/
|
|
ALIGN 8,0x90
|
|
CP_ARC_GET_TABLE_ENTRY::
|
|
PUSH EBP
|
|
MOV EBP,ESP
|
|
PUSH ESI
|
|
PUSH EDI
|
|
MOV ESI,U4 SF_PARAM1[EBP]
|
|
BTR U4 ACS_ENTRY_USED[ESI],0
|
|
JNC @@100
|
|
MOV EDX,U4 ACS_FREE_INDEX[ESI]
|
|
MOV EAX,U4 ACS_NEXT_ENTRY[ESI]
|
|
MOV U4 ACS_CUR_ENTRY[ESI],EAX
|
|
MOV ECX,U4 ACS_NEXT_BITS_IN_USE[ESI]
|
|
MOV U4 ACS_CUR_BITS_IN_USE[ESI],ECX
|
|
CMP ECX,ARC_MAX_BITS
|
|
JAE @@20
|
|
LEA EAX,U4 ACS_COMPRESS[ESI+EDX*8]
|
|
MOV U4 ACS_NEXT_ENTRY[ESI],EAX
|
|
INC EDX
|
|
CMP U4 ACS_FREE_LIMIT[ESI],EDX
|
|
JNE @@90
|
|
INC ECX
|
|
MOV U4 ACS_NEXT_BITS_IN_USE[ESI],ECX
|
|
MOV EAX,1
|
|
SHL EAX,CL
|
|
MOV U4 ACS_FREE_LIMIT[ESI],EAX
|
|
JMP @@90
|
|
@@20: INC EDX
|
|
CMP U4 ACS_FREE_LIMIT[ESI],EDX
|
|
JNE @@25
|
|
MOV EDX,U4 ACS_MIN_TABLE_ENTRY[ESI]
|
|
@@25: MOV EAX,U4 ACS_HASH[ESI+EDX*4]
|
|
OR EAX,EAX
|
|
JNZ @@20
|
|
LEA EDI,U4 ACS_COMPRESS[ESI+EDX*8]
|
|
MOV U4 ACS_NEXT_ENTRY[ESI],EDI
|
|
MOVZX EBX,U2 ATE_BASECODE[EDI]
|
|
LEA ECX,U4 ACS_HASH[ESI+EBX*4]
|
|
@@50: OR ECX,ECX
|
|
JZ @@90
|
|
MOV EAX,U4 ATE_NEXT[ECX]
|
|
CMP EDI,EAX
|
|
JNE @@55
|
|
MOV EAX,U4 ATE_NEXT[EDI]
|
|
MOV U4 ATE_NEXT[ECX],EAX
|
|
JMP @@90
|
|
@@55: MOV ECX,EAX
|
|
JMP @@50
|
|
@@90: MOV U4 ACS_FREE_INDEX[ESI],EDX
|
|
@@100: POP EDI
|
|
POP ESI
|
|
POP EBP
|
|
RET
|
|
|