ALIGN 8,OC_NOP SYS_ALPHA_BITMAP:: DU4 0x0000000,0x00000000,0x87FFFFFF,0x07FFFFFE; DU4 0,0,0,0; SYS_ALPHA_NUMERIC_BITMAP:: DU4 0x0000000,0x03FF0000,0x87FFFFFF,0x07FFFFFE; DU4 0,0,0,0; SYS_FILENAME_CHARS_BITMAP:: DU4 0x0000000,0x03FF6001,0x87FFFFFF,0x07FFFFFE; DU4 0,0,0,0; SYS_DEC_NUMERIC_BITMAP:: DU4 0x0000000,0x03FF0000,0,0; DU4 0,0,0,0; SYS_HEX_NUMERIC_BITMAP:: DU4 0x0000000,0x03FF0000,0x7E,0x7E; DU4 0,0,0,0; SYS_PRINTABLE_CHARS_BITMAP:: DU4 0x80002200,0xFFFFFFFF,0xFFFFFFFF,0x7FFFFFFF; DU4 0,0,0,0; SYS_SAFE_DOLLAR_CHARS_BITMAP:: DU4 0x80000000,0xFFFFFFEF,0xFFFFFFFF,0x7FFFFFFF; DU4 0,0,0,0; SYS_DISPLAYABLE_CHARS_BITMAP:: DU4 0x80000000,0xFFFFFFFF,0xFFFFFFFF,0x7FFFFFFF; DU4 0x00001FFF,0,0,0; ////**************************PROCEDURE************************* // IN: RAX=NUMBER TO PRINT ALIGN 8,OC_NOP PUT_HEX_U8:: PUSH RCX MOV RCX,16 CALL FIXED_PUT_HEX POP RCX RET PUT_HEX:: PUT_HEX_U4:: PUSH RCX MOV RCX,8 CALL FIXED_PUT_HEX POP RCX RET PUT_HEX_U2:: PUSH RCX MOV RCX,4 CALL FIXED_PUT_HEX POP RCX RET PUT_HEX_U1:: PUSH RCX MOV RCX,2 CALL FIXED_PUT_HEX POP RCX RET FIXED_PUT_HEX:: PUSH_C_REGS PUSH RSI PUSH RDI SUB RSP,32 MOV RDI,RSP CALL BINARY_TO_FIXED_HEX XOR EAX,EAX STOSB MOV RSI,RSP CALL PUT_STR ADD RSP,32 POP RDI POP RSI POP_C_REGS RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP PUT_CHAR:: PUSH_C_REGS PUSH RAX CALL CP_PUT_CHAR ADD RSP,8 POP_C_REGS RET ALIGN 8,OC_NOP PUT_STR:: PUSH_C_REGS PUSH RSI CALL CP_PUT_STR ADD RSP,8 POP_C_REGS RET ////**************************PROCEDURE************************* // IN: RAX=BINARY // [RDI]=@FIELD // RCX=LENGTH (IF THE HEX_FIELD ENTRY IS USED) // // OUT: RAX PRESERVED // RCX=0 // [RDI] POINTS PAST DESTINATION ALIGN 8,OC_NOP BINARY_TO_HEX:: MOV RCX,8 BINARY_TO_FIXED_HEX: PUSHFD //-**** CLI //because of STD PUSH RAX //-**** PUSH RDX //-**** ADD RDI,RCX PUSH RDI //-**** EDI WE WANT TO RETURN DEC RDI MOV RDX,RAX STD @@1: MOV AL,DL AND AL,0xF ADD AL,'0' CMP AL,'9' JBE @@2 ADD AL,'A'-'0'-10 @@2: STOSB SHR RDX,4 LOOP @@1 POP RDI //+**** POP RDX //+**** POP RAX //+**** POPFD //+**** RET ////**************************PROCEDURE************************* //IN: [RSI] = @FIELD // RCX = LENGTH //OUT: RAX = VALUE // RCX = 0 ALIGN 8,OC_NOP HEX_TO_BINARY:: PUSH RDX XOR EDX,EDX OR RCX,RCX JZ @@9 @@1: SHL RDX,4 LODSB SUB AL,0x30 CMP AL,9 JA @@2 SUB AL,7 @@2: MOVZX RAX,AL ADD RDX,RAX LOOP @@1 @@9: MOV RAX,RDX POP RDX RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CRLF:: PUSH RAX MOV RAX,13 CALL PUT_CHAR MOV RAX,10 CALL PUT_CHAR POP RAX RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_STRCAT:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI MOV RSI,U8 SF_PARAM1[RBP] @@2: LODSB OR AL,AL JNZ @@2 MOV RDI,RSI DEC RDI MOV RSI,U8 SF_PARAM2[RBP] @@1: LODSB STOSB OR AL,AL JNZ @@1 POP RDI POP RSI POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_STRCPY:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI MOV RSI,U8 SF_PARAM2[RBP] MOV RDI,U8 SF_PARAM1[RBP] @@1: LODSB STOSB OR AL,AL JNZ @@1 POP RDI POP RSI POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_STRCMP:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI MOV RSI,U8 SF_PARAM2[RBP] MOV RDI,U8 SF_PARAM1[RBP] @@1: LODSB OR AL,AL JZ @@100 SCASB JE @@1 JA @@90 @@80: MOV RAX,1 JMP @@101 @@90: MOV RAX,-1 JMP @@101 @@100: SCASB JNE @@80 XOR EAX,EAX @@101: POP RDI POP RSI POP RBP RET ////**************************PROCEDURE************************* TO_UPPER:: CMP AL,'a' JB @@100 CMP AL,'z' JA @@100 ADD AL,'A'-'a' @@100: RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_STRICMP:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI MOV RSI,U8 SF_PARAM2[RBP] MOV RDI,U8 SF_PARAM1[RBP] @@1: LODSB OR AL,AL JZ @@100 CMP AL,'a' JB @@2 CMP AL,'z' JA @@2 ADD AL,'A'-'a' @@2: MOV BL,U1 [RDI] INC RDI CMP BL,'a' JB @@3 CMP BL,'z' JA @@3 ADD BL,'A'-'a' @@3: CMP AL,BL JE @@1 JA @@90 @@80: MOV RAX,1 JMP @@101 @@90: MOV RAX,-1 JMP @@101 @@100: MOV BL,U1 [RDI] OR BL,BL JNE @@80 XOR EAX,EAX @@101: POP RDI POP RSI POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_STRNCMP:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI MOV RCX,U8 SF_PARAM3[RBP] MOV RSI,U8 SF_PARAM2[RBP] MOV RDI,U8 SF_PARAM1[RBP] @@1: OR RCX,RCX JZ @@102 DEC RCX LODSB OR AL,AL JZ @@100 SCASB JE @@1 JA @@90 @@80: MOV RAX,1 JMP @@101 @@90: MOV RAX,-1 JMP @@101 @@100: MOV BL,U1 [RDI] OR BL,BL JNE @@80 @@102: XOR EAX,EAX @@101: POP RDI POP RSI POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_STRNICMP:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI MOV RCX,U8 SF_PARAM3[RBP] MOV RSI,U8 SF_PARAM2[RBP] MOV RDI,U8 SF_PARAM1[RBP] @@1: OR RCX,RCX JZ @@102 DEC RCX LODSB OR AL,AL JZ @@100 CMP AL,'a' JB @@2 CMP AL,'z' JA @@2 ADD AL,'A'-'a' @@2: MOV BL,U1 [RDI] INC RDI CMP BL,'a' JB @@3 CMP BL,'z' JA @@3 ADD BL,'A'-'a' @@3: CMP AL,BL JE @@1 JA @@90 @@80: MOV RAX,1 JMP @@101 @@90: MOV RAX,-1 JMP @@101 @@100: SCASB JNE @@80 @@102: XOR EAX,EAX @@101: POP RDI POP RSI POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_STRSTR:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI MOV RSI,U8 SF_PARAM1[RBP] MOV RDI,U8 SF_PARAM2[RBP] MOV DL,U1 [RDI] OR DL,DL JZ @@90 JMP @@5 @@1: INC RSI @@5: LODSB OR AL,AL JZ @@100 CMP AL,DL JNE @@5 DEC RSI MOV RCX,1 @@10: MOV AL,U1 [RDI+RCX] OR AL,AL JZ @@90 CMP AL,U1 [RSI+RCX] JNE @@1 INC RCX JMP @@10 @@80: DEC RSI @@90: MOV RAX,RSI JMP @@101 @@100: XOR EAX,EAX @@101: POP RDI POP RSI POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_STRISTR:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI MOV RSI,U8 SF_PARAM1[RBP] MOV RDI,U8 SF_PARAM2[RBP] MOV AL,U1 [RDI] CALL TO_UPPER MOV DL,AL OR DL,DL JZ @@90 JMP @@5 @@1: INC RSI @@5: LODSB CALL TO_UPPER OR AL,AL JZ @@100 CMP AL,DL JNE @@5 DEC RSI MOV RCX,1 @@10: MOV AL,U1 [RDI+RCX] CALL TO_UPPER OR AL,AL JZ @@90 MOV BL,U1 [RSI+RCX] XCHG AL,BL CALL TO_UPPER CMP AL,BL JNE @@1 INC RCX JMP @@10 @@80: DEC RSI @@90: MOV RAX,RSI JMP @@101 @@100: XOR EAX,EAX @@101: POP RDI POP RSI POP RBP RET ////**************************PROCEDURE************************* // IN: [RSI] // OUT: RAX ALIGN 8,OC_NOP HASH_STR:: PUSH RSI //-**** PUSH RBX //-**** XOR EAX,EAX XOR EBX,EBX JMP @@10 @@1: SHL RBX,1 ADC RBX,RAX @@10: LODSB OR AL,AL JNZ @@1 @@100: MOV RAX,RBX SHR RBX,16 ADC RAX,RBX POP RBX //+**** POP RSI //+**** RET ////**************************PROCEDURE************************* // IN: [RSI]=STR // RBX=TYPE MASK // [RDI]=TABLE // OUT: [RSI]=ENTRY OR ZERO NOT FOUND // ZERO FLAG SET NOT FOUND ALIGN 8,OC_NOP FIND_HASH_ENTRY:: PUSH RDX //-**** PUSH RDI //-**** MOV RDX,RSI CALL HASH_STR @@4: PUSH RAX //-**** AND RAX,U8 HT_MASK[RDI] MOV RSI,U8 HT_BODY[RDI+RAX*8] @@1: OR RSI,RSI JNZ @@3 MOV RDI,U8 HT_NEXT[RDI] OR RDI,RDI JZ @@100 POP RAX JMP @@4 @@3: TEST U4 HTE_TYPE[RSI],EBX JZ @@90 PUSH RSI //-**** PUSH RDI //-**** MOV RDI,U8 HTE_STR[RSI] MOV RSI,RDX @@2: LODSB CMP U1 [RDI],AL JNE @@80 INC RDI OR AL,AL JNZ @@2 POP RDI //+**** POP RSI //+**** INC U4 HTE_USE_CNT[RSI] JMP @@100 @@80: POP RDI //+**** POP RSI //+**** @@90: MOV RSI,U8 HTE_NEXT[RSI] JMP @@1 @@100: POP RAX //+**** POP RDI //+**** POP RDX //+**** OR RSI,RSI RET ////**************************PROCEDURE************************* // IN: [RSI]=STR // [RDI]=TABLE // OUT: [RSI]=BUCKET ALIGN 8,OC_NOP FIND_HASH_BUCKET:: PUSH RAX PUSH RDX CALL HASH_STR AND RAX,U8 HT_MASK[RDI] LEA RSI,U8 HT_BODY[RDI+RAX*8] POP RDX POP RAX RET ////**************************PROCEDURE************************* FIND_EXTERN:: //IN: RSI //OUT: RSI PUSH RAX PUSH RDI PUSH RBX XOR EAX,EAX MOV RAX,FS:TSS_ABSOLUTE_ADDRESS[RAX] MOV RDI,U8 TSS_HASH_TABLE[RAX] MOV RBX,HTT_FUNCTION|HTT_SYS_SYMBOL CALL FIND_HASH_ENTRY JNZ @@1 XOR ESI,ESI JMP @@3 @@1: MOV RAX,U8 HTE_USER_DATA0[RSI] TEST U4 HTE_TYPE[RSI],HTT_FUNCTION JZ @@2 MOV RAX,U8 C_STATEMENTS[RSI] @@2: MOV RSI,RAX @@3: POP RBX POP RDI POP RAX OR RSI,RSI RET CP_FIND_EXTERN:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI XOR EAX,EAX MOV RAX,FS:TSS_ABSOLUTE_ADDRESS[RAX] MOV RDI,U8 TSS_HASH_TABLE[RAX] MOV RSI,U8 SF_PARAM1[RBP] MOV RBX,HTT_FUNCTION|HTT_SYS_SYMBOL CALL FIND_HASH_ENTRY JZ @@1 MOV RAX,U8 HTE_USER_DATA0[RSI] TEST U4 HTE_TYPE[RSI],HTT_FUNCTION JZ @@2 MOV RAX,U8 C_STATEMENTS[RSI] JMP @@2 @@1: XOR EAX,EAX @@2: POP RDI POP RSI POP RBP RET ALIGN 8,OC_NOP ////**************************PROCEDURE************************* CP_HASH_STR:: PUSH RBP MOV RBP,RSP PUSH RSI MOV RSI,U8 SF_PARAM1[RBP] CALL HASH_STR POP RSI POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_FIND_HASH_ENTRY:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI MOV RSI,U8 SF_PARAM1[RBP] MOV RDI,U8 SF_PARAM2[RBP] MOV RBX,U8 SF_PARAM3[RBP] CALL FIND_HASH_ENTRY MOV RAX,RSI POP RDI POP RSI POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_FIND_HASH_BUCKET:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI MOV RSI,U8 SF_PARAM1[RBP] MOV RDI,U8 SF_PARAM2[RBP] CALL FIND_HASH_BUCKET MOV RAX,RSI POP RDI POP RSI POP RBP RET ////**************************PROCEDURE************************* ALIGN 8,OC_NOP CP_ADD_SYS_HASH_ENTRY:: PUSH RBP MOV RBP,RSP PUSH RSI PUSH RDI MOV RSI,U8 SF_PARAM1[RBP] MOV RSI,U8 HTE_STR[RSI] MOV RDI,U8 SF_PARAM2[RBP] CALL FIND_HASH_BUCKET MOV RDI,U8 SF_PARAM1[RBP] PUSHFD CLI MOV RAX,U8 [RSI] MOV U8 HTE_NEXT[RDI],RAX MOV U8 [RSI],RDI POPFD POP RDI POP RSI POP RBP RET