NMS_Huge.pas
上传用户:szzdds
上传日期:2013-09-18
资源大小:293k
文件大小:4k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit NMS_Huge;
  2. interface
  3.   procedure HugeInc(var HugePtr: Pointer; Amount: LongInt);
  4.   procedure HugeDec(var HugePtr: Pointer; Amount: LongInt);
  5.   function HugeOffset(HugePtr: Pointer; Amount: LongInt): Pointer;
  6. {$ifdef WIN32}
  7.   { The Win3.1 API defines hmemcpy to copy memory
  8.     that might span a segment boundary. Win32
  9.     does not define it, so add it, for
  10.     portability. }
  11.   procedure HMemCpy(DstPtr, SrcPtr: Pointer; Amount: LongInt);
  12. {$else}
  13.   { The Win32 API defines these functions, so
  14.     they are needed only for Win3.1. }
  15.   procedure ZeroMemory(Ptr: Pointer; Length: LongInt);
  16.   procedure FillMemory(Ptr: Pointer; Length: LongInt; Fill: Byte);
  17. {$endif}
  18. implementation
  19. {$ifdef WIN32}
  20. procedure HugeInc(var HugePtr: Pointer; Amount: LongInt);
  21. begin
  22.   HugePtr := PChar(HugePtr) + Amount;
  23. end;
  24. procedure HugeDec(var HugePtr: Pointer; Amount: LongInt);
  25. begin
  26.   HugePtr := PChar(HugePtr) - Amount;
  27. end;
  28. function HugeOffset(HugePtr: Pointer; Amount: LongInt): Pointer;
  29. begin
  30.   Result := PChar(HugePtr) + Amount;
  31. end;
  32. procedure HMemCpy(DstPtr, SrcPtr: Pointer; Amount: LongInt);
  33. begin
  34.   Move(SrcPtr^, DstPtr^, Amount);
  35. end;
  36. {$else}
  37. uses SysUtils, WinTypes;
  38. procedure HugeShift; far; external 'KERNEL' index 113;
  39. procedure HugeInc(var HugePtr: Pointer; Amount: LongInt); assembler;
  40. asm
  41.   { Store Amount in DX:AX. }
  42.   mov ax, Amount.Word[0]
  43.   mov dx, Amount.Word[2]
  44.   { Get the reference to HugePtr }
  45.   les bx, HugePtr
  46.   { Add the offset parts. }
  47.   add ax, es:[bx]
  48.   { Propagate carry to the high word of Amount }
  49.   adc dx, 0
  50.   mov cx, Offset HugeShift
  51.   { Shift high word of Amount for segment }
  52.   shl dx, cl
  53.   { Increment the segment of HugePtr }
  54.   add es:[bx+2], dx
  55.   mov es:[bx], ax
  56. end;
  57. procedure HugeDec(var HugePtr: Pointer; Amount: LongInt); assembler;
  58. asm
  59.   { Store HugePtr ptr in es:[bx] }
  60.   les bx, HugePtr
  61.   mov ax, es:[bx]
  62.   { Subtract the offset parts }
  63.   sub ax, Amount.Word[0]
  64.   mov dx, Amount.Word[2]
  65.   { Propagate carry to the high word of Amount }
  66.   adc dx, 0
  67.   mov cx, OFFSET HugeShift
  68.   { Shift high word of Amount for segment }
  69.   shl dx, cl
  70.   sub es:[bx+2], dx
  71.   mov es:[bx], ax
  72. end;
  73. function HugeOffset(HugePtr: Pointer; Amount: LongInt): Pointer; assembler;
  74. asm
  75.   { Store Amount in DX:AX }
  76.   mov ax, Amount.Word[0]
  77.   mov dx, Amount.Word[2]
  78.   { Add the offset parts }
  79.   add ax, HugePtr.Word[0]
  80.   { Propagate carry to the high word of Amount }
  81.   adc dx, 0
  82.   mov cx, OFFSET HugeShift
  83.   { Shift high word of Amount for segment }
  84.   shl dx, cl
  85.   { Increment the segment of HugePtr }
  86.   add dx, HugePtr.Word[2]
  87. end;
  88. procedure FillWords(DstPtr: Pointer; Size: Word; Fill: Word); assembler;
  89. asm
  90.   mov ax, Fill            { Get the fill word }
  91.   les di, DstPtr          { Get the pointer }
  92.   mov cx, Size.Word[0]    { Get the size }
  93.   cld                     { Clear the direction flag }
  94.   rep stosw               { Fill the memory }
  95. end;
  96. procedure FillMemory(Ptr: Pointer; Length: LongInt; Fill: Byte);
  97. var
  98.   NBytes: Cardinal;
  99.   NWords: Cardinal;
  100.   FillWord: Word;
  101. begin
  102.   WordRec(FillWord).Hi := Fill;
  103.   WordRec(FillWord).Lo := Fill;
  104.   while Length > 1 do
  105.   begin
  106.     if Ofs(Ptr^) = 0 then
  107.       NBytes := $FFFE
  108.     else
  109.       NBytes := $10000 - Ofs(Ptr^);
  110.     if NBytes > Length then
  111.       NBytes := Length;
  112.     NWords := NBytes div 2;
  113.     FillWords(Ptr, NWords, FillWord);
  114.     NBytes := NWords * 2;
  115.     Dec(Length, NBytes);
  116.     Ptr := HugeOffset(Ptr, NBytes);
  117.   end;
  118.   if Length > 0 then
  119.     PByte(Ptr)^ := Fill;
  120. end;
  121. procedure ZeroMemory(Ptr: Pointer; Length: LongInt);
  122. begin
  123.   FillMemory(Ptr, Length, 0);
  124. end;
  125. {$endif}
  126. end.