📄 mmutils.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 + -