home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / archives / tpdoskermit.zip / crcs.pas < prev    next >
Pascal/Delphi Source File  |  1991-04-18  |  3KB  |  107 lines

  1. $R-,S-
  2.  
  3. Unit CRCS;
  4.  
  5. Interface
  6.  
  7. FUNCTION CRC (VAR buf; len : WORD) : WORD;
  8.  
  9. FUNCTION ChkSum (VAR buf; len : WORD): WORD;
  10.  
  11. Implementation
  12.  
  13. TYPE CrcTabType = ARRAY [BYTE] OF WORD;
  14.  
  15. VAR CrcTab : CrcTabType;
  16.  
  17. FUNCTION CRC (VAR buf; len : WORD) : WORD;
  18. BEGIN
  19. Inline(
  20.   $1E                    {push ds}
  21.   /$1E                   {push ds}
  22.   /$07                   {pop es}
  23.   /$8D/$3E/>CRCTAB       {lea di,[>crctab]}
  24.   /$C5/$76/<BUF          {lds si,[bp<buf]}
  25.   /$8B/$4E/<LEN          {mov cx,[bp<len]}
  26.   /$31/$D2               {xor dx,dx}
  27.   /$E3/$13               {jcxz done}
  28.   /$FC                   {cld}
  29.                          {l1:}
  30.   /$AC                   {lodsb}
  31.   /$30/$D0               {xor al,dl}
  32.   /$88/$C3               {mov bl,al}
  33.   /$88/$F2               {mov dl,dh}
  34.   /$30/$FF               {xor bh,bh}
  35.   /$88/$FE               {mov dh,bh}
  36.   /$D1/$E3               {shl bx,1}
  37.   /$26/$33/$11           {es: xor dx,[di+bx]}
  38.   /$E2/$EE               {loop l1}
  39.                          {done:}
  40.   /$89/$56/$FE           {mov [bp-2],dx}
  41.   /$1F                   {pop ds}
  42. );
  43. END;
  44.  
  45. FUNCTION ChkSum (VAR buf; len : WORD): WORD;
  46. BEGIN
  47. InLine(
  48.   $1E                    {  push ds}
  49.   /$C5/$76/<BUF          {  lds si,[bp<buf]}
  50.   /$8B/$4E/<LEN          {  mov cx,[bp<len]}
  51.   /$31/$D2               {  xor dx,dx}
  52.   /$89/$D0               {  mov ax,dx}
  53.   /$FC                   {  cld}
  54.   /$88/$CB               {  mov bl,cl}
  55.   /$D1/$E9               {  shr cx,1}
  56.   /$D1/$E9               {  shr cx,1}
  57.   /$41                   {  inc cx}
  58.   /$80/$E3/$03           {  and bl,3}
  59.   /$74/$15               {  jz add0}
  60.   /$80/$FB/$02           {  cmp bl,2}
  61.   /$77/$07               {  ja add3}
  62.   /$74/$08               {  je add2}
  63.   /$EB/$09               {  jmp short add1}
  64.                          {add4:}
  65.   /$AC                   {  lodsb}
  66.   /$01/$C2               {  add dx,ax}
  67.                          {add3:}
  68.   /$AC                   {  lodsb}
  69.   /$01/$C2               {  add dx,ax}
  70.                          {add2:}
  71.   /$AC                   {  lodsb}
  72.   /$01/$C2               {  add dx,ax}
  73.                          {add1:}
  74.   /$AC                   {  lodsb}
  75.   /$01/$C2               {  add dx,ax}
  76.                          {add0:}
  77.   /$E2/$F2               {  loop add4}
  78.                          {done:}
  79.   /$89/$56/$FE           {  mov [bp-2],dx}
  80.   /$1F                   {  pop ds}
  81. );
  82. END;
  83.  
  84. BEGIN
  85. InLine(
  86.    $1E                   {push ds}
  87.   /$07                   {pop es}
  88.   /$8D/$3E/>CRCTAB       {lea di,[>crctab]}
  89.   /$BE/$08/$84           {mov si,$8408}
  90.   /$FC                   {cld}
  91.   /$31/$DB               {xor bx,bx}
  92.   /$89/$D9               {mov cx,bx}
  93.                          {l2:}
  94.   /$89/$D8               {mov ax,bx}
  95.   /$B1/$08               {mov cl,8}
  96.                          {l3:}
  97.   /$D1/$E8               {shr ax,1}
  98.   /$73/$02               {jnc l4}
  99.   /$31/$F0               {xor ax,si}
  100.                          {l4:}
  101.   /$E2/$F8               {loop l3}
  102.   /$AB                   {stosw}
  103.   /$FE/$C3               {inc bl}
  104.   /$75/$EF               {jnz l2}
  105. );
  106. END.
  107.