7.9 DSP Listing

data0			.SET	00600h			; 4 x 16Bit für die 64Bit
data1			.SET	00601h			; Daten (vom Klartext bis
data2			.SET	00602h			; hin zum Ciffretext)
data3			.SET	00603h

data4			.SET	00604h			; Zwischenergebniss innerhalb
data5			.SET	00605h			; einer IDEA Runde

temp			.SET	00606h			; Temp für Multiplikation
ser_dat		.SET	00607h			; Byte von seriellem Prot

key0			.SET	00608h			; 8 x 16 Bit = 128Bit
key1			.SET	00609h			; für den Schlüssel
key2			.SET	0060Ah
key3			.SET	0060Bh
key4			.SET	0060Ch
key5			.SET	0060Dh
key6			.SET	0060Eh
key7			.SET	0060Fh

e_key_begin		.SET	00610h			; erster expandierter Schlüssel
e_key_end		.SET	00640h			; letzter expandierter Schlüssel

shift0			.SET	00670h			; 8 Speicherzellen für
shift1			.SET	00671h			; das Schieberegister
shift2			.SET	00672h			; Es werden nur 8Bit je
shift3			.SET	00673h			; Speicherplatz verwendet
shift4			.SET	00674h
shift5			.SET	00675h
shift6			.SET	00676h
shift7			.SET	00677h

; ---------------------------------------------------------------------------

			.DS	00608h			; Bitmuster für Testschlüssel
						; !!!	; hier muss der Schlüssel rein

init_test_key:	.WORD	00000h, 01111h, 02222h, 03333h
			.WORD	04444h, 05555h, 06666h, 07777h

; ---------------------------------------------------------------------------

			.PS	0FA00h			; Einsprungsadresse für
			.ENTRY				; das Hauptprogramm
RESET:			B	start

			.PS	0FA0Ah			; Einsprungsadresse für
B0RINT:		B	RINT			; den seriellen Interrupt

; ---------------------------------------------------------------------------

			.PS	0FB00h			; Hauptprogramm

start:			SPM	0			; Akku Shift Mode=0
			RSXM				; Unsigned Mode

			FORT	1			; Serialport initialisieren
			RTXM
			SFSM

			LDPK	0Ch			; Setze Datenpointer auf $0600

			CALL	idea_key_exp, *, 7	; IDEA Key expandieren

			LDPK	00h			; Interrupt freigeben
			LARP	00h
			LARK	AR0,0
			LACK	010h
			SACL	004h
			EINT

loop:			B	loop			; Endlosschleife

; ---------------------------------------------------------------------------

RINT:			LDPK	00h			; Interrupt Service Routine
			SST1	060h
			LAC	000h			; hole Byte aus dem Serialport
			LDPK	0Ch

			SACL	ser_dat		; speicher Byte in „ser_dat“

			CALL	idea_cyk, *, 7	; führe IDEA Berechnung aus

			LAC	ser_dat
			XOR	data0		; !!!	; Verexclusivoderung des Datenbytes
			CALL	idea_shift, *, 7	; vor oder nach dem Schieben
		;	XOR	data0		; !!!	; ob ver  oder entschlüsseln

			LDPK	00h
			SACL	001h			; schreibe Datenbyte auf Serialport
			LST1	060h
			EINT				; Interrupt Service Routine
			RET				; verlassen

; ---------------------------------------------------------------------------

idea_key_exp:	LRLK	AR7,e_key_begin	; IDEA Schlüessel expandieren
			LRLK	AR0,e_key_end

idea_key_exp_3:	RPTK	007h			; 8 Teilschlüssel herrauskopieren
			BLKD	key0, *+

			LARK	AR2, 018h		; 128bitigen Schlüssel 25Bit nach
			LARP	2			; links rotieren
idea_key_exp_2:	ZALH	key0			; MSB aus key0 holen
			ROL

			ZALH	key6			; key7 und key6 um 1 Bit nach
			OR	key7			; links schieben
			ROL
			SACL	key7
			SACH	key6

			ZALH	key4			; key5 und key4 um 1 Bit nach
			OR	key5			; links schieben
			ROL
			SACL	key5
			SACH	key4

			ZALH	key2			; key3 und key2 um 1 Bit nach
			OR	key3			; links schieben
			ROL
			SACL	key3
			SACH	key2

			ZALH	key0			; key1 und key0 um 1 Bit nach
			OR	key1			; links schieben
			ROL
			SACL	key1
			SACH	key0

			BANZ	idea_key_exp_2, *-

			LARP	7			; Test, ob alle Teilschlüssel
			CMPR	02			; expandiert worden sind
			BBZ	idea_key_exp_3


			LRLK	AR7,e_key_begin	; jeden Teilschlüssel mit
			LRLK	AR0,e_key_end	; $0DEA verexclusivodern

idea_key_exp_1:	LAC	*
			XORK	00DEAh
			SACL	*+

			CMPR	02
			BBZ	idea_key_exp_1

			RET

; ---------------------------------------------------------------------------

idea_shift:		ANDK	000ffh			; Byte in das Schieberegister laden

			LRLK	AR7, 00676h
			RPTK	006h
			DMOV	*-
			SACL	shift0

			RET

; ---------------------------------------------------------------------------

idea_cyk:		LT	shift7			; Inhalt des Schieberegisters
			MPYK	00100h			; für den IDEA Algorithmus auslesen
			PAC
			OR	shift6
			SACL	data3

			LT	shift5
			MPYK	00100h
			PAC
			OR	shift4
			SACL	data2

			LT	shift3
			MPYK	00100h
			PAC
			OR	shift2
			SACL	data1

			LT	shift1
			MPYK	00100h
			PAC
			OR	shift0
			SACL	data0

; ---------------------------------------------------------------------------

idea_start:		LRLK	AR7,e_key_begin	; Der IDEA Algorithmus
			LRLK	AR0,e_key_end

idea_loop:		LAC	*			; IDEA Multiplikation
			BZ	idea_00
			LAC	data0
			BZ	idea_01
			LT	data0
			MPYU	*+
			PAC
			SPH	temp
			SUBH	temp
			SUB	temp
			BNC	idea_02
			B	idea_03
idea_00:		LAC	data0
			B	idea_04, *+
idea_01:		LAC	*+
idea_04:		NEG
idea_02:		ADDK	001h
idea_03:		SACL	data0

			LAC	data1			; 16bit Addition
			ADD	*+
			SACL	data1

			LAC	data2			; 16bit Addition
			ADD	*+
			SACL	data2

			LAC	*			; IDEA Multiplikation
			BZ	idea_10
			LAC	data3
			BZ	idea_11
			LT	data3
			MPYU	*+
			PAC
			SPH	temp
			SUBH	temp
			SUB	temp
			BNC	idea_12
			B	idea_13
idea_10:		LAC	data3
			B	idea_14, *+
idea_11:		LAC	*+
idea_14:		NEG
idea_12:		ADDK	001h
idea_13:		SACL	data3

			LAC	data0			; XOR
			XOR	data2
			SACL	data4

			LAC	data1			; XOR
			XOR	data3
			SACL	data5

			LAC	*			; IDEA Multiplikation
			BZ	idea_20
			LAC	data4
			BZ	idea_21
			LT	data4
			MPYU	*+
			PAC
			SPH	temp
			SUBH	temp
			SUB	temp
			BNC	idea_22
			B	idea_23
idea_20:		LAC	data4
			B	idea_24, *+
idea_21:		LAC	*+
idea_24:		NEG
idea_22:		ADDK	001h
idea_23:		SACL	data4

			ADD	data5			; 16bit Addition
			SACL	data5

			LAC	*			; IDEA Multiplikation
			BZ	idea_30
			LAC	data5
			BZ	idea_31
			LT	data5
			MPYU	*+
			PAC
			SPH	temp
			SUBH	temp
			SUB	temp
			BNC	idea_32
			B	idea_33
idea_30:		LAC	data5
			B	idea_34, *+
idea_31:		LAC	*+
idea_34:		NEG
idea_32:		ADDK	001h
idea_33:		SACL	data5

			ADD	data4			; 16bit Addition
			SACL	data4

			LAC	data0			; XOR
			XOR	data5
			SACL	data0

			LAC	data1			; XOR
			XOR	data4
			SACL	data1

			LAC	data2			; XOR
			XOR	data5
			SACL	data2

			LAC	data3			; XOR
			XOR	data4
			SACL	data3

			LAC	data2			; die mittleren beiden 16 Bit Daten
			DMOV	data1			; vertauschen
			SACL	data1

			CMPR	1			; Test auf 8 Durchgänge
			BBNZ	idea_loop

			LAC	data2			; Vertauschung für die letzte halbe
			DMOV	data1			; Runde rückgängig machen
			SACL	data1

			LAC	*			; IDEA Multiplikation
			BZ	idea_40
			LAC	data0
			BZ	idea_41
			LT	data0
			MPYU	*+
			PAC
			SPH	temp
			SUBH	temp
			SUB	temp
			BNC	idea_42
			B	idea_43
idea_40:		LAC	data0
			B	idea_44, *+
idea_41:		LAC	*+
idea_44:		NEG
idea_42:		ADDK	001h
idea_43:		SACL	data0

			LAC	data1			; 16bit Addition
			ADD	*+
			SACL	data1

			LAC	data2			; 16bit Addition
			ADD	*+
			SACL	data2

			LAC	*			; IDEA Multiplikation
			BZ	idea_50
			LAC	data3
			BZ	idea_51
			LT	data3
			MPYU	*+
			PAC
			SPH	temp
			SUBH	temp
			SUB	temp
			BNC	idea_52
			B	idea_53
idea_50:		LAC	data3
			B	idea_54, *+
idea_51:		LAC	*+
idea_54:		NEG
idea_52:		ADDK	001h
idea_53:		SACL	data3

			RET


zurück