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

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