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<>2; for (i=0;ientry_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_usenext_entry = &c->compress[i++]; if (i==c->free_limit) { c->next_bits_in_use++; c->free_limit=1<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