*********************************************************
*							*
*  MemCrunch V1.0 / Dreamer From WizzCat 16.march 1989	*
*							*
* Feel free to use it in your own products. But send me *
* a postcard to make me happy when you use this source.	*
*							*
*	DREAMER, PLK 2286, 96200 ROVANIEMI, FINLAND	*
*							*
*********************************************************

Crunch: ; Version V1.0 / Dreamer From WizzCat
	; What You Give...
	; A0.L = StartAddress of source
	; A1.L = EndAddress of source
	; And What You Get...
	; A0.L = StartAddress of crunched data
	; A1.L = EndAddress of crunched data

	move.l a0,d5		; Save startaddress
	move.b #$11,d3		; CheckWord Hi Part
	move.b #$00,d2		; Checkword Lo Part
MC_SORRY:
	addq.b #1,d2		; Next Checkword
	bne.s MC_NOHI
	addq.b #1,d3
MC_NOHI:
	move.l d5,a0		; Reset Start
MC_LOOP1:
	cmpi.b (a0)+,d3		; Can we find this word HICheck
	bne.s MC_HINO		; NO
	cmpi.b (a0),d2		; LoCheck
	beq.s MC_SORRY		; Shit
MC_HINO:
	cmpa.l a1,a0		; Is the end came
	bls.s MC_LOOP1		; No
	move.l d5,a0		; Yeah, we get Checkword
	move.l d5,a2		; Start of Crunched data
MC_NOGOT:
	move.b #$ff,d0		; Clear Counter
	move.l a2,d4		; Crunched data StartAddress
	move.b (a0),d1		; Checked Byte to D1
MC_YES:
	addq.b #1,d0		; +1 to count
	cmpi.b #$ff,d0		; Next Check legal
	beq.s MC_GOT		; no / go pack
	cmpa.l a1,a0		; Is end Come ??
	bhi.s MC_YES2		; YES / Go And check Pack
	move.b (a0),(a2)+	; Data to Packed-data
	cmp.b (a0)+,d1		; Is there more same bytes
	beq.s MC_YES		; Yes
	subq.w #1,a0
	subq.w #1,a2
MC_YES2:
	cmpi.b #5,d0		; No / Check byte count
	blo.s MC_ENDC		; No pack
MC_GOT:
	move.l d4,a2		; Back to the start of same data
	move.b d3,(a2)+		; Checkword Hi part
	move.b d2,(a2)+		; Checkword Lo part
	move.b d0,(a2)+		; How muck there is same byte
	move.b d1,(a2)+		; Value
MC_ENDC:
	cmpa.l a1,a0		; End of data ?
	bls.s MC_NOGOT		; No
	addq.b #1,d3		; To make it wrong
	move.b d3,(a2)+		; Checkword Hi Part to data
	move.b d2,(a2)		; Checkword Lo Part to data
	move.l a2,a1		; Yes / EndAddress to a1
	move.l d5,a0		; Startaddress to a0
	rts

DeCrunch: ; Version V1.0 / Dreamer
	; You Give...
	; A0.L = Start Of Crunched Data
	; A1.L = End of it
	; A2.l = Destination (StartAddress of DeCrunched data)
	; Jos laitat pakatun datan entisen sourcealueen loppuun
	; (A1.L on sama kuin sourcen SourceEndAddress) voit laittaa
	; A2.L:n samaksi kuin Sourcen StartAddress.
	; You Get...
	; A0.l = Start Of Data
	; A1.l = End Of Data
	; Be SURE THAT THE A0 AND A1 ARE RIGHT!!!! (A2 TOO..)

	move.l a2,d4		; Save start
	move.b (a1),d0		; Check Lo
	move.b -(a1),d1		; Check Hi
	subq.b #1,d1		; Make High to be checkword
MC_NO1:
	cmpi.b (a0),d1		; Check CheckWord
	bne.s MC_NO		; No Hi
	cmpi.b 1(a0),d0		; Check Checkword
	bne.s MC_NO		; No Lo
	addq.w #2,a0		; to count/value
	move.b (a0)+,d2		; Count
	move.b (a0)+,d3		; Value
MC_LOOP2:
	move.b d3,(a2)+		; Packed Data to normal
	subq.b #1,d2		; How many times
	bne.s MC_LOOP2
	cmpi.l a1,a0		; is end came
	beq.s MC_YES3		; Yes
	bra.s MC_NO1
MC_NO:
	move.b (a0)+,(a2)+	; Normal data
	cmpi.l a1,a0		; is end come
	bne.s MC_NO1		; No
MC_YES3:
	subq.w #1,a2		; To get It Right
	move.l a2,a1		; End address of data
	move.l d4,a0		; Start address of data
	rts

***********
* Info
* ----
* Tämä cruncheri ei ole mitenkään erikoisen hyvä pakkamaan dataa
* vaan se on tarkoitettu helpoksi tavaksi pakata kuvia yms. muistiin
* ei levylle. Sen takia cruncheri on tehty nopeaksi ei tehokkaaksi.
* Totta puhuen en edes tiedä kuinka tehdä tehokas cruncheri joten
* se siitä. Valitettavasti voin taata crunherin toiminnan vain
* silloin kun pakattavan alueen koko ei ylitä $10000 = 65536,
* tämä sen takia sillä yleensä muistissa pakataan pieniä alueita
* ja näin pystyin tehostamaan pakkausta, mutta luulen, että pakkaus
* yleensä onnistuu myös suuremmilla alueilla ilman ongelmia.
* Vaikka ohjelma on optimoitu kuvien pakkaamiseen se on ihan 
* kohtalainen myös muunlaisen datan pakkaukseen.
* Pakkaustekniikasta johtuen pakkaus voi kestää kauankin.
* Mutta se on mielestäni nopein tekniikka kun pakattu data avataan.
* Ja nyt lopuksi pieni ilmoitus, mikäli tiedät enemmän esim.
* TetraCrunherin/ByteKillerin tai muuten vain tehokkaammista
* tekniikoista niin lähetä kirje ja kerro minkälainen se on.
* Osoite on ohjelman alussa. 
