diff examples/crc32.asm @ 57:2088fd998865

sbc09 directry clean up
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 23 Jul 2018 16:07:12 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/crc32.asm	Mon Jul 23 16:07:12 2018 +0900
@@ -0,0 +1,98 @@
+; 6809 CRC32 with tests
+;
+; Johann E. Klasek, j AT klasek at
+;
+; Testprogram, previous version submitted to http://beebwiki.mdfs.net/index.php/CRC-32#6809
+
+	org $100
+	lds #$8000
+
+; Calculate a ZIP 32-bit CRC from data in memory. This code is as
+; tight and nearly as fast as it can be, moving as much code out of inner
+; loops as possible. With the included optimisation, moving the whole
+; CRC in registers, the performane gain on average data is only slight
+; (estimated 2% but at losing clarity of implementation;
+; worst case gain is 18%, best case worsens at 29%)
+;
+; On entry, crc..crc+3  = incoming CRC
+;           reg. U      = start address of data
+;           reg. X      = number of bytes
+; On exit,  crc..crc+3  = updated CRC
+;           reg. U      = points to first byte behind data
+;           reg. X      = 0
+;	    reg. Y      = 0
+;
+; Value order in memory is H,L (big endian)
+;
+; Multiple passes over data in memory can be made to update the CRC.
+; For ZIP, initial CRC must be $FFFFFFFF, and the final CRC must
+; be EORed with $FFFFFFFF before being stored in the ZIP file.
+; Total 47 bytes (if above parameters are located in direct page).
+;
+; ZIP polynomic, reflected (bit reversed) from $04C11DB7
+CRCHH	EQU $ED
+CRCHL	EQU $B8
+CRCLH	EQU $83
+CRCLL	EQU $20
+CRCINITH EQU $FFFF		
+CRCINITL EQU $FFFF		
+
+; CRC 32 bit in DP (4 bytes)
+crc	EQU $80
+
+	ldu #s1		; start address in u 
+	ldb ,u+		;
+	clra		; length in d
+	leax d,u	; 
+	pshs x		; end address +1 to TOS
+	ldd #CRCINITL
+	std crc+2
+	ldx #CRCINITH
+	stx crc
+			; d/x contains the CRC
+bl:	
+	eorb ,u+	; XOR with lowest byte
+	ldy #8		; bit counter
+rl:
+	exg d,x
+rl1:
+	lsra		; shift CRC right, beginning with high word
+	rorb
+	exg d,x
+	rora		; low word
+	rorb
+	bcc cl
+			; CRC=CRC XOR polynomic
+	eora #CRCLH	; apply CRC polynomic low word
+	eorb #CRCLL
+	exg d,x
+	eora #CRCHH	; apply CRC polynomic high word
+	eorb #CRCHL
+	leay -1,y	; bit count down
+	bne rl1
+	exg d,x		; CRC: restore correct order
+	beq el		; leave bit loop
+cl:
+	leay -1,y	; bit count down
+	bne rl		; bit loop
+el:
+	cmpu ,s		; end address reached?
+	bne bl		; byte loop
+
+	std crc+2	; CRC low word
+	stx crc		; CRC high word
+
+
+realexit:
+	sync
+
+
+s1:	fcb 19,"An Arbitrary String"
+	; CRC=$90415518 
+
+s2:	fcb 26,"ZYXWVUTSRQPONMLKJIHGFEDBCA"
+	; CRC32=$6632024D
+
+enddata
+  
+	end