621 lines
10 KiB
Plaintext
621 lines
10 KiB
Plaintext
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
|