Difference between revisions of "Z80 Routines:Security:CRC32"

From WikiTI
Jump to: navigation, search
 
(wikified)
Line 1: Line 1:
 
[[Category:Z80 Routines:Security|CRC32]][[Category:Z80 Routines|CRC32]]
 
[[Category:Z80 Routines:Security|CRC32]][[Category:Z80 Routines|CRC32]]
 +
 +
== Notes from the author ==
 +
 
I (84plusfreak) made this routine on-calc.
 
I (84plusfreak) made this routine on-calc.
 
If you find an error, please tell me (serninpc at gmail dot com).
 
If you find an error, please tell me (serninpc at gmail dot com).
  
==CRC32Init==
+
== The code ==
 +
 
 +
=== CRC32Init ===
  
 
  CRC32Init:
 
  CRC32Init:
Line 32: Line 37:
 
   ret
 
   ret
  
==CRC32Update==
+
=== CRC32Update ===
  
 
  CRC32Update:
 
  CRC32Update:
Line 114: Line 119:
 
   ret
 
   ret
  
==CRC32Finalize==
+
=== CRC32Finalize ===
  
 
  CRC32Finalize:
 
  CRC32Finalize:

Revision as of 02:52, 16 May 2006


Notes from the author

I (84plusfreak) made this routine on-calc. If you find an error, please tell me (serninpc at gmail dot com).

The code

CRC32Init

CRC32Init:
 ;Inputs:
 ; A=0 -> Use 'default' Polynomial (the one used in the ZIP Format)
 ; A=1 -> Use custom Polynomial
 ;     -> DEHL=Polynomial
 ;Outputs:
 ; ($8292)=Polynomial
 ; ($8296)=Current CRC (~($8296)=CRC32)
 ;Destroys:
 ; AF,DE,HL
 or a
 jr nz,$+08
 ld de,$EDB8
 ld hl,$8320
 ld a,d
 ld d,e
 ld e,a
 ld a,h
 ld h,l
 ld l,a
 ld ($8292),de
 ld ($8294),hl
 ld hl,$FFFF
 ld ($8296),hl
 ld ($8298),hl
 ret

CRC32Update

CRC32Update:
 ;Inputs:
 ; HL -> Points to data
 ; BC -> Number of bytes
 ;Outputs:
 ; ($8296) = Updated
 ;Destroys:
 ; AF,BC,DE,HL
 ld a,b
 or c
 ret z
 push hl
 push bc
 ld b,(hl)
 call CRC32Update_Routine
 pop bc
 pop hl
 inc hl
 dec bc
 jr CRC32Update
CRC32Update_OneByte:
 ;Inputs:
 ; A = Byte to add to CRC
 ;Destroys:
 ; AF,BC,DE,HL
 ld b,a
CRC32Update_Routine:
 ld a,($8296)
 xor b
 call CRC32TableLookup
 ld a,($8297)
 xor l
 ld ($8296),a
 ld a,($8298)
 xor h
 ld ($8297),a
 ld a,($8299)
 xor e
 ld ($8298),a
 ld a,d
 ld ($8299),a
 ret
CRC32TableLookup:
 ld de,$0000
 ld h,d
 ld l,a
 ld b,8
CRC32TableLookupLoop:
 push bc
 or a
 rr d
 rr e
 rr h
 rr l
 jr nc,CRC32TableLookupLoopEnd
 push hl
 pop bc
 ld hl,$8292
 ld a,d
 xor (hl)
 inc hl
 ld d,a
 ld a,e
 xor (hl)
 inc hl
 ld e,a
 ld a,b
 xor (hl)
 inc hl
 ld b,a
 ld a,c
 xor (hl)
 ld c,a
 push bc
 pop hl
CRC32TableLookupLoopEnd:
 pop bc
 djnz CRC32TableLookupLoop
 ret

CRC32Finalize

CRC32Finalize:
 ;Inputs:
 ; None
 ;Outputs:
 ; DEHL = CRC32
 ;Destroys:
 ; AF,BC,DE,HL
 ld de,($8298)
 ld bc,($8296)
 ld hl,$FFFF
 push hl
 or a
 sbc hl,bc
 ex (sp),hl
 sbc hl,de
 ex de,hl
 pop hl
 ret