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