*
* $VER: CheckSum.a 0.1 (8.8.93)
*
* Berechnung der CheckSumme für den Benutzerstring
*
* Copyright (C) 1996 by Stefan Scherer.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for non-commerical use and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation.  This software is provided "as is" without
* express or implied warranty.
*

		SECTION	CheckSum,CODE

		XDEF	_DecodeString
		XDEF	_CheckSum
		XREF	_KeyConfig
		XREF	_revision

*****i* CheckSum/DecodeString ***********************************************
*
*   NAME
*	DecodeString -- dekodiert den Benutzerstring zu einem lesbaren String
*
*   SYNOPSIS
*	DecodeString( userstring )
*
*	void DecodeString( STRPTR );
*
*   FUNCTION
*	Diese Assemblerroutine dekodiert den angegebenen kodierten
*	String. Danach kann er im C-Teil normal verwendet werden.
*
*   INPUTS
*	userstring  - Zeiger auf den String, der dekodiert werden soll
*
*   RESULT
*	keine
*
*   SEE ALSO
*	Main/main()
*
*****************************************************************************
*
*

_DecodeString	move.l	4(sp),a0		; Zeiger auf String

;--------------	Zeichen einlesen und dekodieren

.decodeloop	move.b	(a0),d0
		cmp.b	#$ff,d0
		beq.s	.done

		neg.b	d0
		move.b	d0,(a0)+
		bra.s	.decodeloop

.done		clr.b	(a0)
		rts


*****i* CheckSum/CheckSum ***************************************************
*
*   NAME
*	CheckSum -- prüft die CheckSumme des Benutzerstrings
*
*   SYNOPSIS
*	ok = CheckSum( userstring, oldchecksum )
*
*	BOOL CheckSum( STRPTR, ULONG );
*
*   FUNCTION
*	Diese Assemblerroutine prüft, ob der Benutzerstring verändert
*	wurde. Wenn der String in Ordnung ist, wird TRUE zurückgegeben.
*	Im Fehlerfall wird FALSE zurückgegeben.
*
*   INPUTS
*	userstring  - Zeiger auf den String, der geprüft werden soll
*	oldchecksum - alte Checksumme, die mit der neuen verglichen wird
*
*   RESULT
*	ok - FALSE im Fehlerfall, TRUE wenn alles geklappt hat
*
*   SEE ALSO
*	RechnungWindow/LadenClicked(), RechnungWindow/SpeichernClicked(),
*	RechnungWindow/DruckenClicked(), RechnungWindow/AnsehenClicked()
*
*****************************************************************************
*
*

_CheckSum	move.l	4(sp),a0		; Zeiger auf String
		clr.l	d1			; neue Checksumme

;----3.1.95: nichtbezahlte Keyfiles werden ausgeschlossen

		lea	_KeyConfig,a1
		tst.b	(a1)
		beq.b	.checknext
		addq.b	#3,d1
		bra.b	.checkloop

;----3.1.95: begrenzte Keyfiles bis zu einer bestimmten Revisionsnummer

.checknext	lea	1(a1),a1
		move.b	(a1),d0
		beq.b	.checkloop
		move.b	_revision,d1
		sub.b	d0,d1
		bgt.b	.checkloop
		moveq	#0,d1

;--------------	Zeichen einlesen und Checksumme bilden

.checkloop	move.b	(a0)+,d0
		beq.s	.DoTheCheck
		lsl.l	#8,d0
		move.b	(a0)+,d0
		beq.s	.Add3
		lsl.l	#8,d0
		move.b	(a0)+,d0
		beq.s	.Add2
		lsl.l	#8,d0
		move.b	(a0)+,d0
		beq.s	.DoTheCheck

		add.l	d0,d1
		bra.s	.checkloop

.Add3		swap	d0
		clr.w	d0
		swap	d0
		add.l	d0,d1
		bra.s	.DoTheCheck

.Add2		rol.l	#8,d0
		clr.b	d0
		ror.l	#8,d0
		add.l	d0,d1

;--------------	Checksummen vergleichen

.DoTheCheck	move.l	8(sp),d0		; alte Checksumme
		cmp.l	d0,d1
		beq.b	.ok
		moveq	#0,d0			; Änderung im String
		rts

.ok		moveq	#1,d0			; OK, alles richtig
		rts


		END

