; ARBEITSZELLEN
ARGN    EQU 0B781H      ;ANZAHL ARG.
ARG1    EQU 0B782H
ARG2    EQU 0B784H
ARG3    EQU 0B786H

PROG    EQU 2A00H

;------------- AES ------------------

        ORG PROG
        DEFW 7F7FH
        DEFM 'AESST'    ;entweder Parameter im Menü übergeben oder im Programm ermitteln
        DEFB 01
;       ...             ;evtl. Code um z.B. Speicherbereiche vom Textprogramm
                        ;zu durchsuchen, um Parameter zu ermitteln
        LD A,2          ;Argumente für KCAES in ARGx speichern
        LD HL,200H      ;z.B. ab 200H
        LD DE,450H
        Call Arg
        LD DE,CTR       ;Menüwort
        CALL AES
        JP C,Abbruch    ;Carry-Flag testen
;       ...             ;Anzahl Parameter aus A auslesen und
;       ...             ;entsprechend HL, DE und BC auswerten
;       ...             ;und z.B. AES-Chiffre automatisch speichern
        CP 3
        RET C           ;keine 3 Parameter?
        LD A,2
        LD D,B          ;dritten Parameter Endadresse+1 übergeben,
        LD E,C          ;da Save-Kommando vom KC85 ein Byte zuwenig speichert
        CALL Arg
        CALL Save
        RET

CTR     DEFM 'AESXCTR',0

;-------------- SHA ---------------

        DEFW 7F7FH
        DEFM 'SHAST'     ;entweder Parameter im Menü übergeben oder im Programm ermitteln
        DEFB 01
;       ...              ;evtl. Code z.B. ROM-Modul einschalten um Hashwert zu bestimmen
        LD A,2           ;Argumente für KCAES in ARGx speichern
        LD HL,0F000H     ;z.B. Hash vom ROM
        LD DE,0FFFFH
        Call Arg
        LD DE,SHA        ;Menüeintrag
        CALL AES
        JP C,Abbruch     ;Carry-Flag testen
;       ...              ;Anzahl Parameter aus A auslesen und
;       ...              ;entsprechend HL, DE und BC auswerten
;       ...              ;und z.B. AES-Chiffre automatisch speichern
        CP 1
        RET C            ;kein Parameter?
        LD DE,200H       ;HL = Hash-Adresse im RAM
        PUSH DE
        LD BC,32         ;Länge Hash 32 = 20H 
        LDIR             ;Hash nach 200H kopieren
        LD A,2
        POP HL           ;DE von LDIR übernehmen
        CALL Arg
        CALL Save
        RET

SHA     DEFM 'SHA256',0

;----------- Save ---------------

Save    CALL 0F003H       ;Print
        DEFB 23H
        DEFM 'Save J/N ',0
        CALL 0F003H       ;Tastaturabfrage
        DEFB 04H
        CP 'J'
        RET NZ

        LD HL,Chiffre
        CALL 0F003H       ;Save
        DEFB 036H
        RET               ;ins Caos

Chiffre DEFM 'Chiffre AES',0

;------------ Arg -----------------

;Der Einfachheit halber, werden alle Registerpaare gespeichert,
;über die Gültigkeit entscheidet der Wert im Register A

ARG     LD (ARGN),A
        LD (ARG1),HL
        LD (ARG2),DE
        LD (ARG3),BC
        RET

;---------- KCAES -----------------

AES     LD A,07FH
        LD HL,2C00H       ;RAM nach Menükommando von KCAES2C o. KCAES6C durchsuchen
        LD BC,6CFFH-2C00H ;Länge
        CALL 0F003H       ;UP-Nr.: 1DH
        DEFB 1DH          ;ZSUCH
        JR NC,noAES       ;KCAES nicht gefunden
        INC HL            ;IRM Byte überspringen
        JP (HL)           ;CALL KCAES, RET ist schon auf Stapel von CALL AES
noAES   POP HL            ;Rücksprung CALL AES vom Stack nehmen!
;       ...               ;Code, wenn KCAES nicht gefunden wurde
        CALL 0F003H       ;Print
        DEFB 23H
        DEFM 'KCAES nicht gefunden',0DH,0AH,0
        RET               ;ins Caos

Abbruch AND A
        JR Z,BRK
;       ...               ;Code für Errror in KCAES
        RET               ;ins Caos

BRK;    ...               ;Code für Break in KCAES
        RET               ;ins Caos
Prog_E