⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmutils.inc

📁 一套及时通讯的原码
💻 INC
字号:
{=========================================================================}
procedure _SwapSmall(var a, b: SmallInt);
{$IFDEF USEDLL}export;{$ELSE}Far;{$ENDIF}
var
   Temp: SmallInt;

begin
     Temp := a;
     a := b;
     b := Temp;
end;

{=========================================================================}
procedure _SwapInt(var a, b: integer);
{$IFDEF USEDLL}export;{$ELSE}Far;{$ENDIF}
var
   Temp: integer;

begin
     Temp := a;
     a := b;
     b := Temp;
end;

{=========================================================================}
procedure _SwapLong(var a, b: Longint);
{$IFDEF USEDLL}export;{$ELSE}Far;{$ENDIF}
var
   Temp: Longint;

begin
     Temp := a;
     a := b;
     b := Temp;
end;

{=========================================================================}
function _Min(a, b: Longint): Longint;
{$IFDEF USEDLL}export;{$ELSE}Far;{$ENDIF}
begin
     if a > b then Result := b
     else Result := a;
end;

{=========================================================================}
function _Max(a, b: Longint): Longint;
{$IFDEF USEDLL}export;{$ELSE}Far;{$ENDIF}
begin
     if a > b then Result := a
     else Result := b;
end;

{=========================================================================}
function _MinMax(X, Min, Max: Longint): Longint;
{$IFDEF USEDLL}export;{$ELSE}Far;{$ENDIF}
begin
     if (X < Min) then X := Min
     else if (X > Max) then X := Max;
     Result := X;
end;

{=========================================================================}
function _Limit(X, Min, Max: Longint): Longint;
{$IFDEF USEDLL}export;{$ELSE}Far;{$ENDIF}
begin
   if (Max >= Min) then
   begin
      if (X < Min) then X := Min
      else if (X > Max) then X := Max;
   end
   else
   begin
      if (X < Max) then X := Max
      else if (X > Min) then X := Min;
   end;
   Result := X;
end;

{=========================================================================}
function _InMinMax(X,Min,Max: Longint): Boolean;
{$IFDEF USEDLL}export;{$ELSE}Far;{$ENDIF}
begin
   { if Min > Max then Result is never true }
   if (X < Min) then Result := False
   else if (X > Max) then Result := False
   else Result := True;
end;

{=========================================================================}
function _InRange(X, Min, Max: Longint): Boolean;
{$IFDEF USEDLL}export;{$ELSE}Far;{$ENDIF}
begin
   if (Max >= Min) then
   begin
      if (X < Min) then Result := False
      else if (X > Max) then Result := False
      else Result := True;
   end
   else
   begin
      if (X < Max) then Result := False
      else if (X > Min) then Result := False
      else Result := True;
   end;
end;

{=========================================================================}
procedure _incHuge(var Pointer; nBytes: Longint);
{$IFDEF USEDLL}export;{$ELSE}Far;{$ENDIF}assembler;
asm
{$IFDEF WIN32}
      add    [eax], edx
{$ELSE}
      mov    ax, nBytes.Word[0]
      mov    dx, nBytes.Word[2]
      xor    bx, bx
      les    di, Pointer
      add    es:[di].Word[0], ax
      adc    bx, dx
      shl    bx, 3                     { inc Selector by SelectorInc = 8 }
      add    es:[di].Word[2], bx
{$ENDIF}
end;

{=========================================================================}
procedure _GlobalFillMem(var X; Cnt: Longint; Value: Byte);
{$IFDEF USEDLL}export;{$ELSE}Far;{$ENDIF}assembler;
asm
{$IFDEF WIN32}
{     ->EAX     Pointer to destination  }
{       EDX     count   }
{       CL      value   }

        test    eax, eax
        jz      @@error

        test    edx, edx
        jz      @@error

        push    edi

        mov     edi, eax { Point EDI to destination              }


        mov     ch, cl     { Fill EAX with value repeated 4 times  }
        mov     eax, ecx
        shl     eax, 16
        mov     ax, cx

        mov     ecx, edx
        sar     ecx, 2
        js      @@exit

        cld
        rep     stosd      { Fill count DIV 4 dwords       }

        mov     ecx, edx
        and     ecx, 3
        rep     stosb      { Fill count MOD 4 bytes        }

@@exit:
        pop     edi
@@error:

{$ELSE}
        db      66h
        xor     di, di
        les     di, X      { Point ES:[EDI] to destination }

        mov     cl, Value
        mov     ch, cl     { Fill EAX with value repeated 4 times  }
        mov     ax, cx
        db      66h
        shl     ax, 16
        mov     ax, cx

        db      66h
        mov     cx, word ptr Cnt
        db      66h
        sar     cx, 2
        js      @@exit

        db      66h
        rep
        db      67h
        stosw              { Fill count DIV 4 dwords       }

        db      66h
        mov     cx, word ptr Cnt
        db      66h
        db      83h
        db      0E1h
        db      03h        { and ecx, 3                    }
        rep
        db      67h
        stosb              { Fill count MOD 4 bytes        }
@@exit:
{$ENDIF}
end;

{=========================================================================}
procedure _GlobalFillLong(var X; Cnt: Longint; Value: Longint);
{$IFDEF USEDLL}export;{$ELSE}Far;{$ENDIF}assembler;
asm
{$IFDEF WIN32}
{     ->EAX     Pointer to destination  }
{       EDX     count   }
{       CL      value   }

        push    edi

        mov     edi, eax { Point EDI to destination              }


        mov     eax, ecx

        mov     ecx, edx
        sar     ecx, 2
        js      @@exit

        cld
        rep     stosd      { Fill count DIV 4 dwords       }

        mov     ecx, edx
        and     ecx, 3
        rep     stosb      { Fill count MOD 4 bytes        }

@@exit:
        pop     edi

{$ELSE}
        db      66h
        xor     di, di
        les     di, X      { Point ES:[EDI] to destination }

        db      66h
        mov     ax, word ptr Value

        db      66h
        mov     cx, word ptr Cnt
        db      66h
        sar     cx, 2
        js      @@exit

        db      66h
        rep
        db      67h
        stosw              { Fill count DIV 4 dwords       }

        db      66h
        mov     cx, word ptr Cnt
        db      66h
        db      83h
        db      0E1h
        db      03h        { and ecx, 3                    }
        rep
        db      67h
        stosb              { Fill count MOD 4 bytes        }
@@exit:
{$ENDIF}
end;

{=========================================================================}
procedure _GlobalMoveMem(const Source; var Dest; Cnt: Longint);
{$IFDEF USEDLL}export;{$ELSE}Far;{$ENDIF}assembler;
asm
{$IFDEF WIN32}
{     ->EAX     Pointer to source       }
{       EDX     Pointer to destination  }
{       ECX     Count                   }

        test    ecx, ecx
        jz      @@error

        push    esi
        push    edi

        mov     esi, eax
        mov     edi, edx

        mov     eax, ecx

        cmp     edi, esi
        jg      @@down
        je      @@exit

        sar     ecx, 2     { copy count DIV 4 dwords       }
        js      @@exit

        cld
        rep     movsd

        mov     ecx, eax
        and     ecx, 3
        rep     movsb      { copy count MOD 4 bytes        }
        jmp     @@exit

@@down:
        lea     esi, [esi+ecx-4] { point ESI to last dword of source     }
        lea     edi, [edi+ecx-4] { point EDI to last dword of dest       }

        sar     ecx, 2     { copy count DIV 4 dwords       }
        js      @@exit

        std
        rep     movsd

        mov     ecx, eax
        and     ecx, 3     { copy count MOD 4 bytes        }
        add     esi, 4-1   { point to last byte of rest    }
        add     edi, 4-1
        rep     movsb
        cld
@@exit:
        pop     edi
        pop     esi
@@error:
{$ELSE}
        mov     dx, ds     { save DS in DX }

        db      66h
        xor     si, si
        lds     si, Source { DS:[esi] point to Source }

        db      66h
        xor     di, di
        les     di, Dest   { ES:[EDI] point to destination }

        db      66h
        mov     cx, word ptr Cnt

        db      66h
        cmp     di, si
        jg      @@down

        cld

        db      66h
        sar     cx, 2
        js      @@exit

        db      66h
        rep
        db      67h
        movsw              { move count DIV 4 dwords       }

        db      66h
        mov     cx, word ptr Cnt
        db      66h
        db      83h
        db      0E1h
        db      03h        { and ecx, 3                    }

        db      66h
        rep
        db      67h
        movsb              { move count MOD 4 bytes        }

        jmp     @@exit

@@down:
        db      66h
        add     si, cx
        db      66h
        add     di, cx
        db      66h
        sub     si, 4
        db      66h
        sub     di, 4
        std

        db      66h
        sar     cx, 2
        js      @@exit

        db      66h
        rep
        db      67h
        movsw              { move count DIV 4 dwords       }

        db      66h
        mov     cx, word ptr Cnt
        db      66h
        db      83h
        db      0E1h
        db      03h        { and ecx, 3                    }

        db      66h
        add     si, 4-1   { point to last byte of rest    }
        db      66h
        add     di, 4-1

        db      66h
        rep
        db      67h
        movsb              { move count MOD 4 bytes        }

@@exit:
        cld
        mov     ds, dx     { restore DS }
{$ENDIF}
end;

{=========================================================================}
function _GlobalCmpMem(const p1, p2; Cnt: Longint): Boolean;
{$IFDEF USEDLL}export;{$ELSE}Far;{$ENDIF}assembler;
asm
{$IFDEF WIN32}
{     ->EAX     Pointer to source       }
{       EDX     Pointer to destination  }
{       ECX     Count                   }
        push	edi
        push    esi

        cld

        mov     edi, eax
        mov     esi, edx

        xor     eax, eax
        mov	edx, ecx

        shr	ecx, 2
        or	ecx, ecx
        jz	@@Rest

        repz    cmpsd
        jnz	@@NotEqual
@@Rest:
        mov     ecx, edx
        and	ecx, 3
        or	ecx, ecx
        jz	@@Equal

        repz    cmpsb
        jnz	@@NotEqual

@@Equal:
        mov	ax, True

@@NotEqual:
        pop     esi
        pop	edi
{$ELSE}
        mov     bx, ds     { save DS in BX }
        cld

        xor     ax, ax

        db      66h
        xor     si, si
        lds     si, p1     { DS:[esi] point to p1 }

        db      66h
        xor     di, di
        les     di, p2     { ES:[EDI] point to p2 }

        db      66h
        mov     cx, word ptr Cnt

        db      66h
        mov	dx, cx

        db      66h
        shr     cx, 2
        db      66h
        or      cx, cx
        jz      @@Rest

        db      66h
        repz
        db      67h
        cmpsw              { compare count DIV 4 dwords       }
        jnz	@@NotEqual
@@Rest:
        db      66h
        mov     cx, dx

        db      66h
        db      83h
        db      0E1h
        db      03h        { and ecx, 3                    }
        db      66h
        or	cx, cx
        jz	@@Equal

        repz
        db      67h
        cmpsb
        jnz	@@NotEqual

@@Equal:
        mov	ax, True

@@NotEqual:
        mov     ds, bx     { restore ds }
{$ENDIF}
end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -