; File: KRYPTO.ASM                            24.10.88
; Ver.: 1.0                 LEFO 88     (C) F.B. Flack
; =====================================================
; Dieses Programm demonstriert das prinzipielle Ver-
; und Entschluesseln von Daten ｜er ein 6 Byte langes
; Passwort.
; Mit dem Beispiel sollen wesentliche Grundlagen des
; Crossassemblers AVMACZ80 und des Simulators AVSIMZ80
; vorgestellt werden.
; =====================================================
;
         JP    KRYPTO      ;Sprung zum Hauptprogramm
                           ;Eintrag in Codesegment
                           ;Adresse 0000H
;
; Definieren des Programmsegments (Hauptprogramm)
;
         DEFSEG HPROG, START=0003H,ABSOLUTE
                           ;Start auf 0003h um Code-
                           ;segment zu erhalten
         SEG   HPROG
         ORG   1800H       ;Startadresse des Programms
                           ;im Codesegment
;
;-------------------------------------------------------
; Mit EQU werden Symbole numerischen Werte zugewiesen
;
LANG     EQU   20H         ;Laenge von Sicherungsdaten
QUELL    EQU   1900H       ;Adresse der Quelldaten
ZIEL     EQU   1950H       ;Adresse der Zieldaten
LEER     EQU   00H         ;Loeschwert
;
; Mit DB lassen sich einzelne Bytes definieren
;
KEY      DB    "Geheim"    ;Passwort (6 Byte)
;
;-------------------------------------------------------
; Hauptprogramm: Verschluesseln eines Datenfeldes
;-------------------------------------------------------
;
KRYPTO:  LD    IX,QUELL    ;Zeiger Quelldaten
         LD    IY,ZIEL     ;Zeiger Zieldaten
         LD    B,LANG      ;Laenge der Daten
VERSCH:  LD    C,06H       ;Laenge des Passwortes
         LD    HL,KEY      ;Zeiger Passwort
LOOP:    LD    A,(IX+00H)  ;Hole Quelldate, verschlues-
         XOR   A,(HL)      ;sele ｜er Passwort-Byte und
         LD    (IY+00H),A  ;sichere Date im Ziel
         INC   IX          ;)
         INC   IY          ;) Zeiger aktualisieren
         INC   HL          ;)
         DEC   B           ;wenn alle Daten durch
         JP    Z,DELETE    ;Ende der Verschluesselung
         DEC   C           ;Ende des Passwortes nicht
         JP    NZ,LOOP     ;erreicht, dann weiter
         JP    VERSCH      ;sonst Passwort von vorn
;
;-------------------------------------------------------
; Loeschen des Quellfiles
;-------------------------------------------------------
;
DELETE:  LD    B,LANG      ;Laenge des Quellfiles
         LD    DE,QUELL    ;Startadresse Quellfile
KILL:    LD    A,LEER      ;Akku = 00h
         LD    (DE),A      ;loesche Quelldate
         INC   DE          ;Zeiger aktualisieren
         DJNZ  KILL        ;weiter bis fertig
;
;-------------------------------------------------------
; Wiederherstellen des Quellfiles
;-------------------------------------------------------
;
DEKEY:   LD    IX,ZIEL     ;Zeiger Schluesseldaten
         LD    IY,QUELL    ;Zeiger Ziel Ursprungsdaten
         LD    B,LANG      ;Laenge der Daten
ENTSCH:  LD    C,06H       ;Laenge des Passwortes
         LD    HL,KEY      ;Zeiger Passwort
NDAT:    LD    A,(IX+00H)  ;Hole Date, entschluessele
         XOR   A,(HL)      ;｜er Passwort-Byte und
         LD    (IY+00H),A  ;sichere Ursprungsdate
         INC   IX          ;)
         INC   IY          ;) Zeiger aktualisieren
         INC   HL          ;)
         DEC   B           ;wenn alle Daten durch
         JP    Z,DONE      ;Ende der Entschluesselung
         DEC   C           ;Ende des Passwortes nicht
         JP    NZ,NDAT     ;erreicht, dann weiter
         JP    ENTSCH      ;sonst Passwort von vorn
;
;--------------------------------------------------------
;
DONE:    NOP               ;Ende
         HALT
;
;--------------------------------------------------------
; Definieren eines Datensegments mit Startadresse 1900H.
; Das Datensegment enthaelt die zu verschluesselnden Daten
;--------------------------------------------------------
;
         DEFSEG QUELLE, CLASS=DATA, START=03H
         SEG   QUELLE
         ORG   1900H
;
TEXT     DB    "Dies ist ein sehr geheimer Text!"
;
;------------------------------------------------------
         END
;
;=======================================================
;
;1. Aufruf: AVMACZ80 krypto $PG, TL(KRYPTO.ASM), PW=125, XR
;
;   mit Optionen ($...):  PG        Seitenformatierung
;                         TL(...)   Seiten｜erschrift
;                         PW        Schreibbreite
;                         XR        Crossreferenz - Liste
;
;2. Aufruf: AVLINK krypto=krypto -SY
;
;   mit Option  (-...)    SY        Symboltaballe
;
;3. Aufruf: AVSIMZ80
;           SET/MEMORY-MAP/RAM/00h/2000h
;           RESET/CPU
;           LOAD/DATA/krypto.hex
;           F1 oder F10 zum Testen
;=======================================================
