home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / zkuste / delphi / unity / d345 / ALP.ZIP / Alp32.pas < prev    next >
Pascal/Delphi Source File  |  2001-04-03  |  9KB  |  314 lines

  1. unit Alp32;
  2.  
  3. interface
  4.  
  5. uses
  6.  SysUtils;
  7.  
  8. {-----------------------------------------------------------------------}
  9. {  QStrings functions                                                   }
  10. {  are copied from Andrew N. Driazgov QSTRINGS.PAS unit                 }
  11. {-----------------------------------------------------------------------}
  12. procedure _Move(Source, Dest: Pointer; Count: Cardinal);
  13. procedure _ReverseByteArr(P: Pointer; Count: Cardinal);
  14. procedure _StrToAnsi(var S: string);
  15. function  _PStrToAnsi(P: PChar): PChar;
  16. procedure _PdxToSmall(pData: Pointer);
  17. procedure _SmallToPdx(pData: Pointer);
  18. procedure _PdxToInt(pData: Pointer);
  19. procedure _IntToPdx(pData: Pointer);
  20. procedure _PdxToDouble(pData: Pointer);
  21. procedure _DoubleToPdx(pData: Pointer);
  22.  
  23. implementation
  24.  
  25. const
  26.   ToAnsiChars: array[0..255] of Char =
  27.     (#$00,#$01,#$02,#$03,#$04,#$05,#$06,#$07,#$08,#$09,#$0A,#$0B,#$0C,#$0D,#$0E,#$A4,
  28.      #$10,#$11,#$12,#$13,#$B6,#$A7,#$16,#$17,#$18,#$19,#$1A,#$1B,#$1C,#$1D,#$1E,#$1F,
  29.      #$20,#$21,#$22,#$23,#$24,#$25,#$26,#$27,#$28,#$29,#$2A,#$2B,#$2C,#$2D,#$2E,#$2F,
  30.      #$30,#$31,#$32,#$33,#$34,#$35,#$36,#$37,#$38,#$39,#$3A,#$3B,#$3C,#$3D,#$3E,#$3F,
  31.      #$40,#$41,#$42,#$43,#$44,#$45,#$46,#$47,#$48,#$49,#$4A,#$4B,#$4C,#$4D,#$4E,#$4F,
  32.      #$50,#$51,#$52,#$53,#$54,#$55,#$56,#$57,#$58,#$59,#$5A,#$5B,#$5C,#$5D,#$5E,#$5F,
  33.      #$60,#$61,#$62,#$63,#$64,#$65,#$66,#$67,#$68,#$69,#$6A,#$6B,#$6C,#$6D,#$6E,#$6F,
  34.      #$70,#$71,#$72,#$73,#$74,#$75,#$76,#$77,#$78,#$79,#$7A,#$7B,#$7C,#$7D,#$7E,#$7F,
  35.      #$C0,#$C1,#$C2,#$C3,#$C4,#$C5,#$C6,#$C7,#$C8,#$C9,#$CA,#$CB,#$CC,#$CD,#$CE,#$CF,
  36.      #$D0,#$D1,#$D2,#$D3,#$D4,#$D5,#$D6,#$D7,#$D8,#$D9,#$DA,#$DB,#$DC,#$DD,#$DE,#$DF,
  37.      #$E0,#$E1,#$E2,#$E3,#$E4,#$E5,#$E6,#$E7,#$E8,#$E9,#$EA,#$EB,#$EC,#$ED,#$EE,#$EF,
  38.      #$2D,#$2D,#$2D,#$A6,#$2B,#$A6,#$A6,#$AC,#$AC,#$A6,#$A6,#$AC,#$2D,#$2D,#$2D,#$AC,
  39.      #$4C,#$2B,#$54,#$2B,#$2D,#$2B,#$A6,#$A6,#$4C,#$E3,#$A6,#$54,#$A6,#$3D,#$2B,#$A6,
  40.      #$A6,#$54,#$54,#$4C,#$4C,#$2D,#$E3,#$2B,#$2B,#$2D,#$2D,#$2D,#$2D,#$A6,#$A6,#$2D,
  41.      #$F0,#$F1,#$F2,#$F3,#$F4,#$F5,#$F6,#$F7,#$F8,#$F9,#$FA,#$FB,#$FC,#$FD,#$FE,#$FF,
  42.      #$A8,#$B8,#$AA,#$BA,#$AF,#$BF,#$A1,#$A2,#$B0,#$95,#$B7,#$76,#$B9,#$A4,#$A6,#$A0);
  43.  
  44.  
  45. procedure IntCopy16;
  46. asm
  47.         MOV     EAX,[ESI]
  48.         MOV     [EDI],EAX
  49.         MOV     EAX,[ESI+4]
  50.         MOV     [EDI+4],EAX
  51.         MOV     EAX,[ESI+8]
  52.         MOV     [EDI+8],EAX
  53.         MOV     EAX,[ESI+12]
  54.         MOV     [EDI+12],EAX
  55.         MOV     EAX,[ESI+16]
  56.         MOV     [EDI+16],EAX
  57.         MOV     EAX,[ESI+20]
  58.         MOV     [EDI+20],EAX
  59.         MOV     EAX,[ESI+24]
  60.         MOV     [EDI+24],EAX
  61.         MOV     EAX,[ESI+28]
  62.         MOV     [EDI+28],EAX
  63.         MOV     EAX,[ESI+32]
  64.         MOV     [EDI+32],EAX
  65.         MOV     EAX,[ESI+36]
  66.         MOV     [EDI+36],EAX
  67.         MOV     EAX,[ESI+40]
  68.         MOV     [EDI+40],EAX
  69.         MOV     EAX,[ESI+44]
  70.         MOV     [EDI+44],EAX
  71.         MOV     EAX,[ESI+48]
  72.         MOV     [EDI+48],EAX
  73.         MOV     EAX,[ESI+52]
  74.         MOV     [EDI+52],EAX
  75.         MOV     EAX,[ESI+56]
  76.         MOV     [EDI+56],EAX
  77.         MOV     EAX,[ESI+60]
  78.         MOV     [EDI+60],EAX
  79. end;
  80.  
  81. procedure _Move(Source, Dest: Pointer; Count: Cardinal);
  82. asm
  83.         PUSH    EDI
  84.         PUSH    ESI
  85.         MOV     EDI,EDX
  86.         MOV     EDX,ECX
  87.         MOV     ESI,EAX
  88.         TEST    EDI,3
  89.         JNE     @@cl
  90.         SHR     ECX,2
  91.         AND     EDX,3
  92.         CMP     ECX,16
  93.         JBE     @@cw0
  94. @@lp0:  CALL    IntCopy16
  95.         ADD     ESI,64
  96.         SUB     ECX,16
  97.         ADD     EDI,64
  98.         CMP     ECX,16
  99.         JA      @@lp0
  100. @@cw0:  JMP     DWORD PTR @@wV[ECX*4]
  101. @@cl:   MOV     EAX,EDI
  102.         MOV     EDX,3
  103.         SUB     ECX,4
  104.         JB      @@bc
  105.         AND     EAX,3
  106.         ADD     ECX,EAX
  107.         JMP     DWORD PTR @@lV[EAX*4-4]
  108. @@bc:   JMP     DWORD PTR @@tV[ECX*4+16]
  109. @@lV:   DD      @@l1, @@l2, @@l3
  110. @@l1:   AND     EDX,ECX
  111.         MOV     AL,[ESI]
  112.         MOV     [EDI],AL
  113.         MOV     AL,[ESI+1]
  114.         MOV     [EDI+1],AL
  115.         MOV     AL,[ESI+2]
  116.         SHR     ECX,2
  117.         MOV     [EDI+2],AL
  118.         ADD     ESI,3
  119.         ADD     EDI,3
  120.         CMP     ECX,16
  121.         JBE     @@cw1
  122. @@lp1:  CALL    IntCopy16
  123.         ADD     ESI,64
  124.         SUB     ECX,16
  125.         ADD     EDI,64
  126.         CMP     ECX,16
  127.         JA      @@lp1
  128. @@cw1:  JMP     DWORD PTR @@wV[ECX*4]
  129. @@l2:   AND     EDX,ECX
  130.         MOV     AL,[ESI]
  131.         MOV     [EDI],AL
  132.         MOV     AL,[ESI+1]
  133.         SHR     ECX,2
  134.         MOV     [EDI+1],AL
  135.         ADD     ESI,2
  136.         ADD     EDI,2
  137.         CMP     ECX,16
  138.         JBE     @@cw2
  139. @@lp2:  CALL    IntCopy16
  140.         ADD     ESI,64
  141.         SUB     ECX,16
  142.         ADD     EDI,64
  143.         CMP     ECX,16
  144.         JA      @@lp2
  145. @@cw2:  JMP     DWORD PTR @@wV[ECX*4]
  146. @@l3:   AND     EDX,ECX
  147.         MOV     AL,[ESI]
  148.         MOV     [EDI],AL
  149.         INC     ESI
  150.         SHR     ECX,2
  151.         INC     EDI
  152.         CMP     ECX,16
  153.         JBE     @@cw3
  154. @@lp3:  CALL    IntCopy16
  155.         ADD     ESI,64
  156.         SUB     ECX,16
  157.         ADD     EDI,64
  158.         CMP     ECX,16
  159.         JA      @@lp3
  160. @@cw3:  JMP     DWORD PTR @@wV[ECX*4]
  161. @@wV:   DD      @@w0, @@w1, @@w2, @@w3
  162.         DD      @@w4, @@w5, @@w6, @@w7
  163.         DD      @@w8, @@w9, @@w10, @@w11
  164.         DD      @@w12, @@w13, @@w14, @@w15
  165.         DD      @@w16
  166. @@w16:  MOV     EAX,[ESI+ECX*4-64]
  167.         MOV     [EDI+ECX*4-64],EAX
  168. @@w15:  MOV     EAX,[ESI+ECX*4-60]
  169.         MOV     [EDI+ECX*4-60],EAX
  170. @@w14:  MOV     EAX,[ESI+ECX*4-56]
  171.         MOV     [EDI+ECX*4-56],EAX
  172. @@w13:  MOV     EAX,[ESI+ECX*4-52]
  173.         MOV     [EDI+ECX*4-52],EAX
  174. @@w12:  MOV     EAX,[ESI+ECX*4-48]
  175.         MOV     [EDI+ECX*4-48],EAX
  176. @@w11:  MOV     EAX,[ESI+ECX*4-44]
  177.         MOV     [EDI+ECX*4-44],EAX
  178. @@w10:  MOV     EAX,[ESI+ECX*4-40]
  179.         MOV     [EDI+ECX*4-40],EAX
  180. @@w9:   MOV     EAX,[ESI+ECX*4-36]
  181.         MOV     [EDI+ECX*4-36],EAX
  182. @@w8:   MOV     EAX,[ESI+ECX*4-32]
  183.         MOV     [EDI+ECX*4-32],EAX
  184. @@w7:   MOV     EAX,[ESI+ECX*4-28]
  185.         MOV     [EDI+ECX*4-28],EAX
  186. @@w6:   MOV     EAX,[ESI+ECX*4-24]
  187.         MOV     [EDI+ECX*4-24],EAX
  188. @@w5:   MOV     EAX,[ESI+ECX*4-20]
  189.         MOV     [EDI+ECX*4-20],EAX
  190. @@w4:   MOV     EAX,[ESI+ECX*4-16]
  191.         MOV     [EDI+ECX*4-16],EAX
  192. @@w3:   MOV     EAX,[ESI+ECX*4-12]
  193.         MOV     [EDI+ECX*4-12],EAX
  194. @@w2:   MOV     EAX,[ESI+ECX*4-8]
  195.         MOV     [EDI+ECX*4-8],EAX
  196. @@w1:   MOV     EAX,[ESI+ECX*4-4]
  197.         MOV     [EDI+ECX*4-4],EAX
  198.         SHL     ECX,2
  199.         ADD     ESI,ECX
  200.         ADD     EDI,ECX
  201. @@w0:   JMP     DWORD PTR @@tV[EDX*4]
  202. @@tV:   DD      @@t0, @@t1, @@t2, @@t3
  203. @@t3:   MOV     AL,[ESI+2]
  204.         MOV     [EDI+2],AL
  205. @@t2:   MOV     AL,[ESI+1]
  206.         MOV     [EDI+1],AL
  207. @@t1:   MOV     AL,[ESI]
  208.         MOV     [EDI],AL
  209. @@t0:   POP     ESI
  210.         POP     EDI
  211. end;{ proc }
  212.  
  213. procedure _ReverseByteArr(P: Pointer; Count: Cardinal);
  214. asm
  215.         LEA     ECX,[EAX+EDX-1]
  216. @@lp:   CMP     EAX,ECX
  217.         JGE     @@qt
  218.         MOV     DH,BYTE PTR [EAX]
  219.         MOV     DL,BYTE PTR [ECX]
  220.         MOV     BYTE PTR [ECX],DH
  221.         MOV     BYTE PTR [EAX],DL
  222.         INC     EAX
  223.         DEC     ECX
  224.         JMP     @@lp
  225. @@qt:
  226. end;{ proc }
  227.  
  228. procedure _StrToAnsi(var S: string);
  229. asm
  230.         CALL    UniqueString
  231.         TEST    EAX,EAX
  232.         JE      @@2
  233.         MOV     ECX,[EAX-4]
  234.         DEC     ECX
  235.         JS      @@2
  236. @@1:    MOVZX   EDX,BYTE PTR [EAX+ECX]
  237.         MOV     DL,BYTE PTR [EDX+ToAnsiChars]
  238.         MOV     BYTE PTR [EAX+ECX],DL
  239.         DEC     ECX
  240.         JNS     @@1
  241. @@2:
  242. end;
  243.  
  244. function _PStrToAnsi(P: PChar): PChar;
  245. asm
  246.         TEST    EAX,EAX
  247.         JE      @@2
  248.         PUSH    EAX
  249.         JMP     @@1
  250. @@0:    MOV     CL,BYTE PTR [EDX+ToAnsiChars]
  251.         MOV     BYTE PTR [EAX],CL
  252.         INC     EAX
  253. @@1:    MOVZX   EDX,BYTE PTR [EAX]
  254.         TEST    DL,DL
  255.         JNE     @@0
  256.         POP     EAX
  257. @@2:
  258. end;{ func }
  259.  
  260. procedure _PdxToSmall(pData: Pointer);
  261. begin
  262.  _ReverseByteArr(pData, 2);
  263.  SmallInt(pData^) := Smallint(pData^) - Low(SmallInt);
  264. end;
  265.  
  266. procedure _SmallToPdx(pData: Pointer);
  267. begin
  268.  SmallInt( pData^ ) := SmallInt( pData^ ) + Low(SmallInt);
  269.  _ReverseByteArr(pData, 2);
  270. end;
  271.  
  272. procedure _PdxToInt(pData: Pointer);
  273. begin
  274.  _ReverseByteArr(pData, 4);
  275.  Integer(pData^) := Integer(pData^) - Low(Integer);
  276. end;
  277.  
  278. procedure _IntToPdx(pData: Pointer);
  279. begin
  280.  Integer( pData^ ) := Integer( pData^ ) + Low(Integer);
  281.  _ReverseByteArr(pData, 4);
  282. end;
  283.  
  284. procedure _PdxToDouble(pData: Pointer);
  285. var
  286.  I: Integer;
  287. begin
  288.  if( PByteArray(pData)^[0] < $80 )then
  289.  begin
  290.   for I := 0 to 7 do
  291.    PByteArray(pData)^[I] := PByteArray(pData)^[I] xor 255;
  292.   _ReverseByteArr(pData, 8);
  293.  end{ if }else
  294.  begin
  295.   _ReverseByteArr(pData, 8);
  296.   Double(pData^) := Abs(Double(pData^));
  297.  end;
  298. end;{ proc }
  299.  
  300. procedure _DoubleToPdx(pData: Pointer);
  301. var
  302.  I: Integer;
  303. begin
  304.  if( Double(pData^) < 0 )then
  305.  begin
  306.   for I := 0 to 7 do
  307.    PByteArray(pData)^[I] := PByteArray(pData)^[I] xor 255;
  308.  end else
  309.   Double(pData^) := -Double(pData^);
  310.   _ReverseByteArr(pData, 8);
  311. end;{ proc }
  312.  
  313. end.
  314.