home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 10 / crca.asm < prev    next >
Encoding:
Assembly Source File  |  1988-11-16  |  3.6 KB  |  112 lines

  1. ;
  2. ;----------------------------------------------------------
  3. ; File       : CRCA.PAS  Vers. 1.0
  4. ; Last Edit  : 16.11.88
  5. ; Autor      : (c) G. Born
  6. ; Progr. Spr.: Assembler (A86 / MASM)
  7. ;
  8. ;        CRC 16 Generator für den 8086 Prozessor
  9. ; Es wird das Polynom y = x^16 + x^15 + x^2 + 1 verwendet
  10. ; Aufruf von Hochsprachen mit:
  11. ;
  12. ; CALL CRC (CRCr,Buff,Len)
  13. ;
  14. ; CRCr = Adresse Variable 16 Bit CRC Register
  15. ; Buff = Adresse des Zeichenpuffers
  16. ; Len  = Wert Zeichenzahl im Puffer
  17. ;
  18. ; Es sind die Adressen der zwei Parameter CRCr, Buff und
  19. ; der Wert von Len über den Stack zu übergeben:
  20. ;
  21. ;        Stack Anordnung
  22. ;      +-------------------+
  23. ;      ! Seg:   CRCr       !
  24. ;      +-------------------+ + 0E
  25. ;      ! Ofs:   CRCr       !
  26. ;      +-------------------+ + 0C
  27. ;      ! Seg:   Buff       !
  28. ;      +-------------------+ + 0A
  29. ;      ! Ofs:   Buff       !
  30. ;      +-------------------+ + 08
  31. ;      ! Wert   Len        !
  32. ;      +-------------------+ + 06
  33. ;      ! Seg:   Return Adr.!
  34. ;      +-------------------+ + 04
  35. ;      ! Ofs:   Return Adr.!
  36. ;      +-------------------+ + 02
  37. ;      !  BP  von CRCA     !
  38. ;      +-------------------+
  39. ;
  40. ; Die Procedur ist als Far aufzurufen. Es wird angenommen, daß die
  41. ; Variablen im DS - Segment liegen. Diese Konvention entspricht der
  42. ; Parameterübergabe in Turbo Pascal und Quick Basic. Für die eigent-
  43. ; liche CRC Berechnung gilt folgende Registerbelegung:
  44. ; Register: BX = CRC Register
  45. ;           DX = Zeiger in den Datenstrom
  46. ;           CX = Zahl der Daten
  47. ;           AH = Bit Counter
  48. ;           AL = Hilfsaccu
  49. ;----------------------------------------------------------
  50. ;
  51. CODE    SEGMENT   WORD PUBLIC
  52.         ASSUME    CS:CODE, DS:DATA
  53.  
  54. POLY    EQU       0010000000000001xB ; Polynom
  55.  
  56.         PUBLIC    CRC
  57.  
  58. CRC     PROC      FAR
  59.  
  60.         PUSH      BP            ; save old frame
  61.         MOV       BP,SP         ; set new frame
  62.         PUSH      DS            ; save DS
  63.         MOV       CX,[BP]+06    ; get (Len)
  64.         MOV       DX,[BP]+08    ; get Adr (Buff)
  65.         MOV       DS,[BP]+0A    ; get Seg (Buff)
  66.         MOV       BX,[BP]+0C    ; get Adr (CRC)
  67.         MOV       DI,BX         ; merke Adr
  68.         MOV       DS:BX,[BX]    ; load CRC value
  69. ;
  70. START:  LEA       SI,DX         ; Datenzeiger laden
  71.         CLD                     ; Autoincrement
  72. ;
  73. LESE:   MOV       AH,08         ; 8 Bit pro Zeichen
  74.         LODSB                   ; Zeichen lesen & SI + 1
  75.         MOV       DL, AL        ; merke Zeichen
  76. ;
  77. ; CRC Generator
  78. ;
  79. CRC1:   XOR       AL,BL         ; BCC - LSB XOR Zchn
  80.         RCR       AL,1          ; Ergebnis in Carry Bit
  81.         JNC       NULL          ; Serial Quotient ?
  82. ;
  83. ; Serial Quotient = 1
  84. ;
  85. EINS:   RCR       BX,1          ; SHIFT CRC right
  86.         XOR       BX,POLY       ; Übertrag einblenden
  87.         JMP       TESTE         ; weitere Bits
  88. ;
  89. ; Serial Quotient = 0
  90. ;
  91. NULL:   RCR       BX,1          ; Shift CRC right
  92. ;
  93. TESTE:  MOV       AL,DL         ; Lese Zeichen
  94.         RCR       AL,1          ; Shift Zeichen 1 Bit right
  95.         MOV       DL,AL         ; merke Restzeichen
  96.         DEC       AH            ; 8 Bit fertig ?
  97.         JNZ       CRC1          ; Zeichen weiter bearbeiten ?
  98.         LOOP      LESE          ; String bearbeitet?
  99. ;
  100. ; Ende -> Das CRC Ergebnis steht im Register BX
  101. ;      -> schreibe in Ergebnisvariable zurück
  102. ;
  103.         MOV       DS:[DI],BX    ; restore CRC result
  104.  
  105.         POP       DS            ; restore Segmentreg.
  106.         POP       BP            ; restore old frame
  107.         RETF      0A            ; Return + POP 10 Bytes
  108.  
  109.         END
  110.  
  111.