// JP
0x00D6 Fehlerroutine mit Halt
0x00E0 Systemprüfung, Kein Fehler
0x012B RST 0x38
0x0140 ERROR
0x020E Systemprüfung, Kein Fehler
0x0307 Abfrage SIO-0-K2, Schlüsseleingelesen?
0x035D Lese SIO-0-K1 und K2
0x03D2 SIO-0-K1 und K2, Prüfe Status 0x0d08
0x043A Intitalsierung SIO-0-K2 und Alternativregistersatz
0x0477 Einsprungadresse (HL) im Stack Teil von 0x043A
0x0502 Bildung Wurmreihen LAMBDA Ein-Ausgabe
0x0537 Return-Trick ...
0x06EA Alternativregister umschalten, ?Blockchiffrierung?, Abfrage SIO-0-K2C
0x070B Einsprung aus 0x0259, 0x0278
0x086A Fehlerbehandlungsroutine:
0x0897 Fehler Systemhalt
0x0AA0 Einsprung INT-1 Routine
0x0BE2 POP/RETI
0x0BE9 NMI
0x1A41 Prüfprogramm RAM CHECK, Übergabe IX; Rückgabe Z-Flag
0x1A97 CRC1-16 nur für ROM
0xFF7C Programmfehler? Einsprung zum RAM ende und Neustart

//CALL
0x0208 A == M
0x032D Subroutine: SDCL bit 3 und 5 Prüfen
0x034D Abfrage Startzeichen STZ = 0x55
0x03B9 Lese SIO-0-K2
0x0415 Initialisierung SIO-0-K2C
0x042E Vorbereiten LAMBDA, SIO-0-K1C Initialisierung
0x04B6 Prüfe Bit 4 und 3 von Eingabe
0x0502 Bildung Wurmreihen LAMBDA Ein-Ausgabe
0x0538 Kopiere Ein- Ausgabe LAMBDA von 0x0d08 nach 0x2A00
0x0557 Rundenschlüssel erzeugen, Chiffrierung Daten mit Ergebnis LAMBDA
0x0598 Initalisierung Wurmreihe/ Dateneingabe für LAMBDA
0x0600 Aktivierung Alternativregistersatz, Steuer-Signale, Rückgabe (0x0e10, 0x0e11)[0x00, 0x0f]
0x0622 Rundenschlüssel mit Initalwert 0x87, Prüfe auf RAM1 und RAM2
0x066E Statussignal 0x0e11, Löschen 0x0e00 / 0x0f00 4 byte; Warteschleife
0x0686 Inital Speichern Alternativregister Teil1, INT gespeert
0x068B Inital Speichern Alternativregister Teil2
0x06AC Lese SIO-0-K2 bis 0x55 in 0x0d08; Abfrage STZ; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
0x075E De- Chiffrierung
0x07B7 Warte STZ ab, danach De- Chiffrierung
0x07BC De- Chiffrierung
0x0801 Initalwerte nach RAM1, CTC Zeitkonst. Übergabe HL, Warte auf INT17

0x0825 PIO-1-B-C, Über-Rückgabe BC, A, NZ/Z
0x0833 PIO-1-A-C, Rückgabe DE, A, NZ/Z
0x0843 SIO-0-K1C = 0x05, "B"; Übergabe B     L0054:

0x0848 SIO-0-K2C = 0x05, "B"; Übergabe B     L0070:
0x084D SIO-0-K1C = 0x03, "B"; Übergabe B     L0068:
0x0857 SIO-0-K2C = 0x03, "B"; Übergabe B     L0069:
0x0861 Warteschleife; Übergabe BC
0x08EE XOR-Verknüpfung Wurmreihe XOR Daten
0x0936 XOR 8 byte Block, (0x2a00++) = (0x2a00++) XOR (0x0d08--)
0x1000 Einlesen Schlüssel, Erstelle Rundenschlüssel
0x11D4 Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
0x1204 Blockrotieren Schlüssel3 RAM2:0x28b0 ... 0x28c7, RAM2 4*6 = 24 Bytes
0x121D 5 bytes rotieren 10*; Übergabe DE, Rückgabe im RAM (DE)+10
0x123c Schlüsseleinlesen Kennung 11011, Rückgabe C Wert, Start- Ende- Kennung
0x1244 SLS Lesen
0x1259 Prüfe CRC 16 im Speicherbereich 0x2800 bis 0x2888; Rückgabe Z-Flag; Rundenschlüssel

0x126F Prüf-Funktion Rundenschlüssel; Rückgabe Z-Flag
0x12AA Blockkopie Rundenschlüssel 0x2800; LAMBDA Ein-Ausgabe Initialwerte 0x87 ...  Initale Bildung Wurmreihen
0x1800 LAMBDA über 0x2a00 Ein-Ausgabe 64bit; 0x2800 Rundenschlüssel
0x1AED CRC2-16, Übergabe DE, A; Rückgabe DE

//

// DB Bereiche
//
0x0299 DB Adress-Bereich, RAM Check 0x1a41
0x02b0 INT Tabelle
0x02d8 PIO-SIO Steuertabelle
0x08e6 SIO-0-K2C 8 Steuerbytes
0x12cf Schlüssel für Prüffunktion
0x1357 Initalwert 0x87
0x135f Prüfwerte Chiffrator-Test
0x1367 EPROM CRC
0x1400 K-Box
0x1a28 RAM Check Variablen

// CTC
//
0x80 Kanal 0
0x81 Kanal 1
0x82 Kanal 2
0x83 Kanal 3

// PIO Ports, 3 installierte U855
0x84 P0A-D Schlüssellochstreifenleser Bit 0 ... 4 + Transportspur - Lesetakt
0x85 P0B-D
0x86 P0A-C Schlüssellochstreifenleser Bit 0 ... 4 + Transportspur - Lesetakt
0x87 P0B-C

0x88 P1A-D
0x89 P1B-D
0x8a P1A-C
0x8b P1B-D

0x8c P2A-D
0x8d P2B-D Tasten/LED
0x8e P2A-C
0x8f P2B-C Tasten/LED

// Halpbduplex DEE <-> T-325, Halbduplex T-325 <-> DÜE
// LED 108	Betriebsbereitschaft an DUE
//     106	Betriebsbereitschaft an DEE
//     105.1	Sendebeginn Sendeseite DEE = 1; Ende Sendung = 0
//     105.2	Sendeleitung durchgeschaltet an DÜE
//     109.2    DÜE Träger ein, empfangsseitig T-325
//     106.2    T-325 Sendesitig zur DEE
//     106.1    T-325 == 1 wenn 105.1 UND 106.2 == 1
//     109.1    STZ erkannt, Synchronfolge geladen danach 109.1 = 1: Beginn Dechiffrierung! ; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
//     109      8*0xff gesendet danach 109 = 0
// Pin CCITT-V24 Klartext
//  1  101       Masse
//  2  103       TxD -> Senden
//  3  104       RxD <- Empfangen
//  4  105       RTS -> Senden einschalten
//  5  106       CTS <- Sendebereitschaft
//  6  107       DSR <- Betriebsbereitschaft
//  7  102       Masse
//  8  109       DCD <- Träger erkannt
// 20  108       DTR -> Empfänger bereit
// 22  125       RI  <- ankommender Ruf
77


// Duplex DEE <-> T-325, Halbduplex T-325 <-> DÜE
// LED 108	Betriebsbereitschaft an DUE
//     106	Betriebsbereitschaft an DEE
//     105.1	= 1
//     105.2	= 1
//     109.2    = 1
//     106.2    = 1
//     106.1    = 1
//     109.1    = 1; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
//     109      8*0xff gesendet danach 109 = 0

// Tasten:
//          Rücksetzen     RST 0x00, eingelsener Schlüssel bleibt erhalten wenn CRC korrekt ist.
//          Start/Test     BZ DÜT, Übetragung Testfolgen -> 0x0622 und 0x12AA Online Test
//          Test           Übergang Betriebszustand (BZ) Datenübertragungstest (DÜT); Nur im Betriebszustand Normalbetrieb (NB) -> 0x0622 und 0x12AA Online Test
//          Anzeige        Lampentest
// LED:
//          108.1     108.2 Betriebsbereitschaft der DEE (Computer)
//          107.1     107.2 Betriebsbereitschaft der DÜE (Modem)
//          105.1     105.2 Sendebeginn 105.1,                    105.2 Weitergabe an DÜE
//          106.1     106.2 105.1 UND 106.2 aktiv dann 106.1 EIN, einschalten 106.2 T-325 empfangsbereit (109.2)
//          109.1     109.2                                       DÜE erkennt Täger Empfangsbereit 109.2
//          Test      A1
//          Testende  A2
//          SE
//          BLZ       STV Bereit
// Datenaustausch immer im Halbduplex, Duplex Signalaustausch der Steuerleitungen
// Duplex immer Ein 105.1, 105.2, 106.1, 106.2, 109.1, 109.2
//
// EPROM CPU Karte
0x0000 ... 0x0bff    // 3 kbyte

// RAM   CPU Karte; Schlüselspeicher, SP
0x0c00 ...  0x0fff

//
// EPROM ROM/RAM Karte
// EPROM 0x1000 ... 0x1bff  3 kbyte
// RAM   0x2800 ... 0x2fff  2 kbyte; Speicher Rundenschlüssel, Ein-Ausgabe LAMBDA



// RAM Bereiche
//0x0c00   1 byte ... 0x45, Chiffrieren?
//0x0c01
//0x0c02   1 byte EPROM Kennung
//0x0c03   1 byte 0x45, Chiffrieren?
//0x0c04   1 byte 0x64
//0x0c05   1 byte 0x8a,
//0x0c06   1 byte 0x92,
//0x0c08   3 byte ... Schlüssel Kenngruppe des Schlüssellochstreifenabschnittes, nicht für die Chiffrierung nutzen
//0x0c0b  32 byte ... Schlüssel 256bit                -> Kopie Rundenschlüssel, 0x88 bytes
//0x0c2b   2 byte ... Schlüssel CRCFalse
//0x0c2d   2 byte ... Schlüssel CRCTrue
//0x0c2f
// ...
//0x0c92 136 byte                                     -> Ende Kopie Rundenschlüssel, 0x88 byte
//0x0c95   8 byte Ausgabe LAMBDA mit Initialwert 0x87, Wurmreihe abgelegt, für CFB?; Testfunktion Online

//0x0ce0  12 byte Rauschgenerator? 0x0cec wird mit beschrieben, IX erhält Zeiger
//0x0ce0   2 byte Zeiger auf 0x0cee
//0x0ce2   2 byte Zeiger auf 0x0cf7
//0x0ce4   1 Byte Schleifenvariable, Init = 8
//0x0ce6   1 Byte Schleifenvariable, Init = 0
//0x0ce9   1 Byte Schleifenvariable, Init = 8
//0x0ce9   4 bytes   -> 0x05e0 0xcf9 nach 0x0d0a; kopiere 4 bytes ... Auszug aus Rauschgenerator Daten
//0x0cec   1 byte 0x40
//0x0ced   1 byte 0x16, 0x32 -> 0x0d09, 0x0f06 bis 0x0f08; 0x0e00 bis 0x0e0a
//0x0cee   9 byte ... Wurmreihe + Summe Wurmreihe; Rauschgenerator
//0x0cf7   9 byte ... Wurmreihe + Summe Wurmreihe; Rauschgenerator

//0x0d00  Prüfbyte? -> Invers
//0x0d01 -> Daten Byte -> 0x0548 kopiere nach 0x2a00 ...
//0x0d02 -> Daten Byte
//0x0d03 -> Daten Byte
//0x0d04 -> Daten Byte
//0x0d05 -> Daten Byte
//0x0d06 -> Daten Byte
//0x0d07 -> Daten Byte
//0x0d08 -> Daten Byte  -> 0x03e4 0x16, 0x55; STZ Block?
//0x0d09 -> Daten Byte  -> 0x0ced 0x16, 0x32; oder aus 0x0ced
//0x0d0a -> Daten Byte  -> 0x05e0 0xcf9 nach 0x0d0a; kopiere 4 bytes ... Auszug aus Rauschgenerator Daten
//0x0d0b -> Daten Byte
//0x0d0c -> Daten Byte
//0x0d0d -> Daten Byte
//0x0d0e
//0x0d0f
//0x0d10     Status; 0x00
//0x0d11 ... Zähler, Schleifenzähler; 0x04cf 0x02
//
//0x0e00 -> Summe 0x2a0n+1, XOR 0x0d00
//0x0e01 -> GTX Byte 8
//0x0e02 -> GTX Byte 7
//0x0e03 -> GTX Byte 6
//0x0e04 -> GTX Byte 5
//0x0e05 -> GTX Byte 4
//0x0e06 -> GTX Byte 3
//0x0e07 -> GTX Byte 2
//0x0e08 -> GTX Byte 1 Senden
//0x0e0a -> Status
//0x0ec0  4 byte  STZ-folge NUR Klartext
//0x0e10    Status; Werte 0x00, 0x08, 0x0a
//0x0e11    Status; Werte 0x04, 0x05, 0x0e, 0x0f; 0x0e/0x0f Senden-Empfangen Speicherbereich
//0x0ef5 ... 0eff = 0x55; STZ Folge?
//
//0x0f00 -> Summe 0x2a0n+1, XOR 0x0d00
//0x0f01 -> GTX Byte 8
//0x0f02 -> GTX Byte 7
//0x0f03 -> GTX Byte 6
//0x0f04 -> GTX Byte 5
//0x0f05 -> GTX Byte 4
//0x0f06 -> GTX Byte 3
//0x0f07 -> GTX Byte 2
//0x0f08 -> GTX Byte 1 Empfangen
//0x0f0a -> Status
//0x0fff ... Stackpointer
//
//0x2800 136 byte Rundenschlüssel für LAMBDA
//0x2880  88 byte RAM Rundenschlüssel
//0x2890         Arbeitskopien Rundenschlüssel
//0x28b0         Arbeitskopien Rundenschlüssel
//0x2a00  8 byte LAMBDA Ein- Ausgabe 0x2A00; Wurmreihen für XOR Verknüpfung mit Daten
//0x2a08  1 byte Prüfbyte Summe 0x2a00 bis 0x2a07

// Interrupt Programme Modus 2,
// !! In den INT-Routinen werden die alternativ Register verwendet !!
// 0x0951 INT-Nr.7  Lese SIO-0-K1D Empfange Daten, bis 0x2aff gefüllt ist
// 0x0986 INT-Nr.15 springt in INT-7 ließt SIO-0-K1D oder schreibt 0x16 in 0x0f01 bis 0x0f10
// 0x09b6 INT-Nr.3  Lese SIO-0-K2CD, 256 byte, Vergleiche (HL) Inhalte
// 0x09eb INT-Nr.11 Einsprung INT-3, Lese SIO-0-K2CD, Prüfe Startfolge; Übergabe SIO-0-K2C
// 0x0a3f INT-Nr.5  Einsprung INT 11, 3; Ausgabe SIO-0-K1D
// 0x0a6e INT-Nr.13 Einsprung INT-5, 11, 3; Ausgabe SIO-0-K1C
// 0x0a80 INT-Nr.1  Ausgabe SIO-0-K2CD
// 0x0ac4 INT-Nr.9  - weiter in INT-1 oder Error
// 0x0b0b INT-Nr.6  SIO-K1C
// 0x0b10 INT-Nr.2  SIO-K2C
// 0x0b15 INT-Nr.8  und 16 SIO-K1C
// 0x0b1a INT-Nr.4  und 12 SIO-K2C
// 0x0b1f INT-Nr.14 SIO-K1C
// 0x0b36 INT-Nr.10 SIO-K2C
// 0x0b4d INT-Nr.17 Rauschgenerator, ohne INT-Registersatz!

// Schlüssel f:\...\pdf\DV\MfS-Abt-XI-305-Schlüsselerzeugung-T311-T314-T317-325.pdf
// Schlüsseleinlesen, CRC f:\...\pdf\DV\MfS-Abt-XI-307-Schluesselunterlagen T3xx.pdf 14.10.1988
// Aus BArch XI-549, Bereichsprüfung der Sync-Folge auf 0x4d. Seite22
// Rauschquelle liefert 16byte Zufallsfolgen.
// Synchronfolgetest, es dürfen nicht 8 gleiche Zeichen auftreten
// Synchronfolge == 8bye lang
// RAM Test 5 Kontrollwerte in bestimmte RAMzellen gespeichert und geprüft
// Test 4; 1 ... 5,
// Datenausgabe aus den RAM Bereichen:0x0e00 ... 0x0eff bzw. 0x0f00 ... 0x0fff

// Trickreich über alternativregister D' Bit 1 = 1

// CRC Check ROM 2 ... 4 K-Box-1 und K-Box-2, LZS (K-Box) 1024bit
// CRC über Kenngruppe 3byte (24bit), Schlüssel 32 byte (256 bit)
// CRC ab Adr + 34 und Adr + 36
// Senden 7 bit
// Startzeichen STZ = 0x55
// Chiffrierung beginnt nach SYN Zeichen (BSC-Prozedure) der DEE an T-325
// Beginnt mit Klartext-Synchronfolge, 0x55, GTX
// Ende des GTX mit anschließenden 8 * 0xff
// letzter GTXBlock wird zwischengespeicherte als nächste Synchronfolge

// aus BArch*549
// Halbduplex Leitung    108   Betriebsbereitschaft an DÜE
//                       107   Betriebsbereitschaft der DÜE an die DEE
// Sendebereitschaft DEE 105.1 aktiv
//                       105.2 weiterleitung and DÜE, Einschalten des Trägers DÜE
// Empfang Träger        109.2 an T-325
// Einschalten           106.2 sendeseitig T-325
// Sendeseitig aktiv?    105.1 und
//                       106.2 schaltet
//                       106.1 Ein
// Sendeseite DEE-> T-325->DÜE SyncF Startzeichen STZ (0x55) und Beginn Chiffrierung eingehender Zeichen
// Empfangsseite wartet auf 0x55 lädt empfangene SyncF
//                       109.1 Ein, Beginn Dechiffrierung

// SyncF = 64 bit, einmalig verwendet, nachfolgende GTX werden in die SyncF eingschrieben CFB-Betrieb; Cipher-Feedback Mode

// Duplex der Steuerleitung

// DCA Test Chiffrierung 0x87 in 75 Runden und Vergleich mit dem Dechiffrat. (0x4b)

----------------------------------------
Z80 DISASSEMBLER LISTING
Addr       Opcodes    Instruction
----------------------------------------                     Kommentare
ORG 0x0000                                                  // ROM 1 Start
0000      C3 69 00    JP 0x0069                             // StartCPU
0003      7F                                                // Füllbytes
...
0007      7F                                                // Füllbytes
0008      C3 00 00    JP 0x0000                             // RST 0x08
000B      7F                                                // Füllbytes
...
000F      7F                                                // Füllbytes
0010      C3 00 00    JP 0x0000                             // RST 0x10
0013      7F                                                // Füllbytes
...
0017      7F                                                // Füllbytes
0018      C3 00 00    JP 0x0000                             // RST 0x18
001B      7F                                                // Füllbytes
...
001F      7F                                                // Füllbytes
0020      C3 00 00    JP 0x0000                             // RST 0x20
0023      7F                                                // Füllbytes
...
0027      7F                                                // Füllbytes
0028      C3 00 00    JP 0x0000                             // RST 0x28
002B      7F                                                // Füllbytes
...
002F      7F                                                // Füllbytes
0030      C3 00 00    JP 0x0000                             // RST 0x30
0033      7F                                                // Füllbytes
...
0037      7F                                                // Füllbytes
0038      C3 2B 01    JP 0x012B                             // RST 0x38
003B      7F                                                // Füllbytes
...
0065      7F                                                // Füllbytes
0066      C3 E9 0B    JP 0x0BE9                             // NMI-Programm

StartCPU:
0069      F3          DI                                    // Sperre INT
006A      31 00 10    LD SP, 0x1000                         // Unteres Ende des RAMS, auf der CPU Karte
006D      3E 02       LD A, 0x02                            // Interruptprogramm High-Adresse 0x02nn
006F      ED 47       LD I, A                               // nn wird mit OUT oder OTIR geladen
0071      ED 5E       IM 2                                  // Setze Interrupt Modus 2
0073      21 00 0C    LD HL, 0x0C00                         // Start RAM Bereich 1, vor dem Schlüsselbereich
0076      06 08       LD B, 0x08                            // Länge 8
0078      36 00       LD M, 0x00    <-\
007A      23          INC HL          |
007B      10 FB       DJNZ 0xFB     >-/                     // Lösche RAM, 0x0c00 ... 0x0c07 = 0x00
007D      21 D8 02    LD HL, 0x02D8                         // PIO CTC Initialisierung
0080      16  09      LD D,0x09                             // 9 PIO & CTC Initialisierungen
0082      46          LD B, M     <-\                       // Anzahl der Kommandos
0083      23          INC HL        |
0084      4E          LD C, M       |                       // C Adresse der PIO I/O Kanäle
0085      23          INC HL        |                       // Initialisierung CTC PIO anhand der Tabelle
0086      ED B3       OTIR          |                       // Ausgabe (C)=M; B-1; HL+1; bis B = 0x00
0088      15          DEC D         |                       // 9 Blöcke
0089      20 F7       JR NZ, 0xF7 >-/
008B      3E 03       LD A, 0x03
008D      D3 85       OUT (0x85), A                         // PI0-0-B-D Alle LED Ein
008F      3E 1F       LD A, 0x1F
0091      D3 8D       OUT (0x8D), A                         // PIO-1-B-D LED Ein/AUS; A1 und A2 Bit 0 und 2
// Intialisieren SIO-0-K1C, SIO-0-K2C
0093      3E 05       LD A, 0x05                            // Register 5
0095      D3 8A       OUT (0x8A), A                         // SIO-0-K1C
0097      3E 82       LD A, 0x82                            // /WAIT/READY + Sendeunterbrechung erlauben
0099      D3 8A       OUT (0x8A), A                         // SIO-0-K1C
009B      3E 05       LD A, 0x05                            // Register 5
009D      D3 8B       OUT (0x8B), A                         // SIO-0-K2C
009F      3E 02       LD A, 0x02                            // Sendeunterbrechung erlauben
00A1      D3 8B       OUT (0x8B), A                         // SIO-0-K2C

00A3      01 00 00    LD BC, 0x0000
00A6      0B          DEC BC      <--\                      // Zeitschleife 1 Sekunde
00A7      AF          XOR A          |                      // Lösche A, beeinflusse Flags
00A8      B0          OR B           |                      // Zeitschleife für Bitausgabe PIO, Abfrage Input?
00A9      B1          OR C           |                      // Länge 0xFFFF
00AA      20 FA       JR NZ, 0xFA  >-/
00AC      3E 01       LD A, 0x01
00AE      D3 85       OUT (0x85), A                         // PI0-0-B-D
00B0      3E 01       LD A, 0x01
00B2      D3 8D       OUT (0x8D), A                         // PIO-1-B-D LED Ein/AUS; A1 und A2 Bit 0 und 2
// Intialisieren SIO-0-K1C, SIO-0-K2C
00B4      3E 05       LD A, 0x05                            // Register 5
00B6      D3 8A       OUT (0x8A), A                         // SIO-0-K1C
00B8      D3 8B       OUT (0x8B), A                         // SIO-0-K2C
00BA      3E 00       LD A, 0x00                            // Kein INT & Steuerung
00BC      D3 8A       OUT (0x8A), A                         // SIO-0-K1C
00BE      D3 8B       OUT (0x8B), A                         // SIO-0-K2C

00C0      DB 8C       IN A, (0x8C)                          // PIO-1-A-D; Wert von? Bit 3 und 4 dürfen nicht gesetzt sein
00C2      E6 18       AND 0x18                              // Maske über den Input
00C4      FE 18       CP 0x18                               // Prüfe auf 0x18
00C6      CA D6 00    JP Z, 0x00D6 >--\                     // Fehler System HALT
00C9      FE 10       CP 0x10         |                     // Prüfe auf 0x10
00CB      CA 97 08    JP Z, 0x0897    |                     // Fehler System HALT
00CE      FE 08       CP 0x08         |                     // Prüfe auf 0x08
00D0      CA 6A 08    JP Z, 0x086A    |                     // Fehler System HALT; Fehlerbehandlungsroutine:
00D3      C3 E0 00    JP 0x00E0       |   >--\              // Alles-OK
                                      |      |
Fehler Systemstop:                    |      |
00D6      F3          DI         <----/      |              // Sperre INT
00D7      3E 01       LD A, 0x01             |
00D9      D3 85       OUT (0x85), A          |              // PI0-0-B-D
00DB      3E 05       LD A, 0x05             |
00DD      D3 8D       OUT (0x8D), A          |              // PIO-1-B-D LED Ein/AUS; A1 und A2 Bit 0 und 2
00DF      76          HALT                   |              // Systemfehler HALT-Befehl, Kann durch NMI oder Reset aus dem HALT geholt werden
                                             |
Alles-OK:                                    |              //
00E0      3E 01       LD A, 0x01         <---/
00E2      D3 85       OUT (0x85), A                         // PI0-0-B-D
00E4      3E 05       LD A, 0x05                            // Register 5
00E6      D3 8A       OUT (0x8A), A                         // SIO-0-K1C
00E8      3E 80       LD A, 0x80                            // CTC Kanal 0; /WAIT/READY
00EA      D3 8A       OUT (0x8A), A                         // SIO-0-K1C
00EC      DD 21 67 13 LD IX, 0x1367                         // Tabelle ROM Adresse und CRC
00F0      FD 21 F7 00 LD IY, 0x00F7                         // Rücksprungadresse IY
00F4      C3 97 1A    JP 0x1A97                             // CRC1-16 nur für ROM

Rücksprung aus EPROM CRC1-16, CRC der EPROMs Z-Flag
00F7      DD 5E 00    LD E, (IX + 00)                       // Hole wert aus der Tabelle 0x1397, letzte Änderung IX im CRC Programm IX + (6 * 8)
00FA      21 02 0C    LD HL, 0x0C02
00FD      73          LD M, E                               // lege in Wert in 0C02h ab
00FE      3E 26       LD A, 0x26                            // Kennung ROM Check Ende
0100      20 03       JR NZ, 0x03   >-\                     // Auswertung Z-Flag CRC1 Check über alle EPROM
0102      C3 40 01    JP  0x0140      |                     // ERROR EPROM!
0105      BB          CP E          <-/                     // E == A ? 0x26; (0x1397)
0106      20 0A       JR NZ, 0x0A     >--\                  // E > 0x26
0108      01 00 80    LD BC, 0x8000      |                  // E == 0x26, Kennung ROM Check Ende
010B      0B          DEC BC      <-\    |
010C      78          LD A, B       |    |
010D      B1          OR C          |    |
010E      20 FB       JR NZ, 0xFB >-/    |                  // Zeitschleife
0110      18 41       JR 0x41            |   >-\            // zu Adresse 0x0153, RAM Check
Fehlerbehandlung                         |     |            // Binäranzeige ROM Nr. Fehlerhaft
0112      DD 7E 01    LD A, (IX + 01)  <-/     |            // A = (0x1392), z. B. 0x00, 0x04, 0x08, 0x14 ...
0115      47          LD B, A                  |            // B = 0x00, 0x04 ...
0116      87          ADD A, A                 |            // 2*A; 0x00, 0x08, 0x10, 0x28
0117      E6 18       AND 0x18                 |            // Maskierung 0001 1000; 0x00, 0x08, 0x10, 0x18,
0119      F6 05       OR 0x05                  |            // set 0, 2   000x x101; 0x05, 0x0c, 0x15, 0x1c
011B      D3 8D       OUT (0x8D), A            |            // PIO-1-B-D LED Ein/AUS; A1 und A2 Bit 0 und 2
011D      CB 60       Bit 4, B                 |            // Bit 4 von B == 0?
011F      28 0F       JR Z, 0x0F      >-\      |            // (0x1398) ja
0121      3E 05       LD A, 0x05        |      |            // (0x1398) nein; Register 5
0123      D3 8B       OUT (0x8B), A     |      |            // SIO-0-K2C
0125      3E 02       LD A, 0x02        |      |            // Sendeunterbrechung erlauben
0127      D3 8B       OUT (0x8B), A     |      |            // SIO-0-K2C
0129      18 05       JR 0x05         >-+      |
                                        |      |
RST 0x38 Blinken A1 A2:                 |      |            // Fehlerbehandlung Hardware/RAM/ROM
012B      F3          DI                |      |  <-\       // sperre INT
012C      3E 05       LD A, 0x05        |      |    |
012E      D3 8D       OUT (0x8D), A     |      |    |       // PIO-1-B-D LED Ein/AUS Bit-2; A1 und A2 Bit 0 und 2
0130      01 00 80    LD BC, 0x8000   <-+      |    |       // Zeitschleife
0133      0B          DEC BC        <-\ |      |    |
0134      78          LD A, B         | |      |    |
0135      B1          OR C            | |      |    |
0136      20 FB       JR NZ, 0xFB   >-/ |      |    |
0138      DB 8D       IN A, (0x8D)      |      |    |       // PIO-1-B-D Lese Tasteneingabe ANZEIGE
013A      EE 04       XOR 0x04          |      |    |       // A toggle Bit 2 (xxxx xtxx)
013C      D3 8D       OUT (0x8D), A     |      |    |       // PIO-1-B-D LED Ein/AUS Bit-2; A1 und A2 Bit 0 und 2
013E      18 F0       JR 0xF0         >-/      |    |       // Endlosschleife
                                               |    |
ERROR; LED Blinken                             |    |
0140      F3          DI                       |    |  <-\  // Sperre Interupt
0141      3E 19       LD A, 0x19               |    |    |  // 0001 1001
0143      D3 8D       OUT (0x8D), A  <-\       |    |    |  // PIO-1-B-D LED Ein/AUS; A1 und A2 Bit 0 und 2
0145      01 00 80    LD BC, 0x8000    |       |    |    |  // Zeitschleife
0148      0B          DEC BC       <-\ |       |    |    |
0149      78          LD A, B        | |       |    |    |
014A      B1          OR C           | |       |    |    |
014B      20 FB       JR NZ, 0xFB  >-/ |       |    |    |  // Zeitschleife
014D      DB 8D       IN A, (0x8D)     |       |    |    |  // PIO-1-B-D Lese Tasteneingabe ANZEIGE
014F      EE 18       XOR 0x18         |       |    |    |  // toggle Bit 3, 4 der Eingabe, Ausgabe (xxx1 1xxx)
0151      18 F0       JR 0xF0      >---/       |    |    |  // Reset oder Interrupt erforderlich
Systemcheck weiter                             |    |    |
0153      3E 05       LD A, 0x05     <---------/    |    |  // Register 5
0155      D3 8A       OUT (0x8A), A                 |    |  // SIO-0-K1C
0157      3E 02       LD A, 0x02                    |    |  // Sendeunterbrechung erlauben
0159      D3 8A       OUT (0x8A), A                 |    |  // SIO-0-K1C
015B      DD 21 99 02 LD IX, 0x0299                 |    |  // Konstante RAM-Check
015F      FD 21 66 01 LD IY, 0x0166                 |    |  // Rücksprungadresse RET IY
0163      C3 41 1A    JP 0x1A41                     |    |  // Prüfprogramm RAM CHECK, Übergabe IX; Rückgabe Z-Flag
                                                    |    |
Ende RAM1 Check                                     |    |
0166      20 C3       JR NZ, 0xC3             >-----+    |  // RST 38; Fehler RAM
0168      DD 21 A1 02 LD IX, 0x02A1                 |    |  // Datenblock RAM Check
016C      FD 21 73 01 LD IY, 0x0173                 |    |  // Rücksprungadresse RET IY
0170      C3 41 1A    JP 0x1A41                     |    |  // Prüfprogramm RAM CHECK, Übergabe IX; Rückgabe Z-Flag
                                                    |    |
Ende RAM2 Check                                     |    |
Start Prüffunktion Chiffrieren                      |    |
0173      21 03 0C    LD HL, 0x0C03                 |    |
0176      36 45       LD M, 0x45                    |    |  // RAM Wert: 0x45
0178      20 B1       JR NZ, 0xB1             >-----/    |  // RST 38, Fehler RAM1 oder 2
017A      3E 05       LD A, 0x05                         |  // Register 5
017C      D3 8A       OUT (0x8A), A                      |  // SIO-0-K1C
017E      3E 82       LD A, 0x82                         |  // /WAIT/READY, Sendeunterbrechung erlauben
0180      D3 8A       OUT (0x8A), A                      |  // SIO-0-K1C
0182      CD 6F 12    CALL 0x126F                        |  // Prüf-Funktion Rundenschlüssel; Rückgabe Z-Flag
0185      3E 64       LD A, 0x64                         |
0187      32 04 0C    LD (0x0C04), A                     |
018A      20 B4       JR NZ, 0xB4              >---------/  // Fehler LED Blinken
018C      06 00       LD B, 0x00
018E      CD 43 08    CALL 0x0843                           // Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
0191      3E 05       LD A, 0x05
0193      D3 8D       OUT (0x8D), A                         // PIO-1-B-D LED Ein/Aus
0195      AF          XOR A                                 // Lösche A, beeinflusse Flags
0196      32 E7 0C    LD (0x0CE7), A
0199      3E 03       LD A, 0x03
019B      32 EA 0C    LD (0x0CEA), A                        // Steuerwort
019E      21 EE 0C    LD HL, 0x0CEE                         // Übergabe Rauschgenerator; 9 byte ... Wurmreihe + Summe Wurmreihe
01A1      CD 01 08    CALL 0x0801                           // Initalwerte nach RAM1, CTC Zeitkonstante; Übergabe HL, Warte auf INT17 Rauschgenerator, ohne INT-Registersatz!
// weiter nach (0x0cec) bit 7 == 1
01A4      F3          DI                                    // Disable Interrupt
01A5      3E 8A       LD A, 0x8A                            //
01A7      32 05 0C    LD (0x0C05), A                        // ? Wert 0x8a
01AA      3A EC 0C    LD A, (0x0CEC)                        // in 0x0801 gesetzt
01AD      CB 77       Bit 6, A                              // Bit 6
01AF      C2 7C FF    JPNZ, 0xFF7C                          // Z != 0; 131 * NOP bis Neustart?
01B2      3E 03       LD A, 0x03                <---\       // ja, hier weiter
01B4      D3 8D       OUT (0x8D), A                 |       // PIO-1-B-D LED Ein/AUS; A1 und A2 Bit 0 und 2
01B6      CD 59 12    CALL 0x1259                   |       // Prüfe CRC 16 im Speicherbereich 0x2800 bis 0x2888; Rückgabe Z-Flag; Rundenschlüssel
01B9      3E 92       LD A, 0x92                    |
01BB      32 06 0C    LD (0x0C06), A                |
01BE      28 20       JR Z, 0x20      >--\          |       // CRC in 0x02800 OK? dann ist der Rundenschlüssel bereits erzeugt.
01C0      CD 00 10    CALL 0x1000        |          |       // Einlesen Schlüssel, Erstelle Rundenschlüssel
01C3      CD AA 12    CALL 0x12AA        |          |       // Blockkopie Rundenschlüssel 0x2800; LAMBDA Ein-Ausgabe Initialwerte 0x87 ...  Initale Bildung Wurmreihen
01C6      21 00 0D    LD HL, 0x0D00      |          |       // Daten
01C9      01 A0 02    LD BC, 0x02A0      |          |       // 0x0d00 bis 0x0fa0; 672 Bytes
01CC      7E          LD A, M            |  <--\    |       // BC-Schleife
01CD      23          INC HL             |     |    |
01CE      BE          CP M               |     |    |       // Vergleiche M; (HL) mit (HL+1)
01CF      28 08       JR Z, 0x08 >--\    |     |    |       // Gleich
01D1      06 02       LD B, 0x02    |    |     |    |       // Ungleich
01D3      CD 43 08    CALL 0x0843   |    |     |    |       // Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
01D6      C3 2B 01    JP 0x012B     |    |     |    |       // RST 0x38, Zeitschleife LED blinken A1 und A2
                                    |    |     |    |
01D9      0B          DEC BC     <--/    |     |    |       // Schleifenzähler
01DA      78          LD A, B            |     |    |
01DB      B1          OR C               |     |    |
01DC      20 EE       JR NZ, 0xEE        |  >--/    |       // Schleife bis BC == 0
01DE      18 D2       JR 0xD2            |      >---/       // Springe zur Adresse 0x01b2
// Aufruf der Funktions-                 |             Parameter über die Tasten bzw. Systemparameter
01E0      3E 01       LD A, 0x01      <--/                  // RAM 0x2800 ist korrekt
01E2      D3 8D       OUT (0x8D), A                         // PIO-1-B-D LED Ein/AUS; A1 und A2 Bit 0 und 2
01E4      21 02 0C    LD HL, 0x0C02                         // Fülle RAM mit Init Bytes
01E7      3E 26       LD A, 0x26                            // Inhalt von M XOR 0x26
01E9      CD 08 02    CALL 0x0208                           // Unterprogramm IST-GLEICH A == M
01EC      3E 45       LD A, 0x45                            // Inhalt von M == 0x45
01EE      CD 08 02    CALL 0x0208                           // Unterprogramm IST-GLEICH A == M
01F1      3E 64       LD A, 0x64                            // Inhalt von M == 0x64
01F3      CD 08 02    CALL 0x0208                           // Unterprogramm IST-GLEICH A == M
01F6      3E 8A       LD A, 0x8A                            // Inhalt von M == 0x8A
01F8      CD 08 02    CALL 0x0208                           // Unterprogramm IST-GLEICH A == M
01FB      3E 92       LD A, 0x92                            // Inhalt von M == 0x92
01FD      CD 08 02    CALL 0x0208                           // Unterprogramm IST-GLEICH A == M
0200      AF          XOR A                                 // ab 0x0c02: 0x26, 0x45, 0x64, 0x8a, 0x92
0201      3C          INC A                                 // A = 1, Z-falg == 0; Kontrolle Fehler CPU? - sonst sinnlos
0202      C2 0E 02    JP NZ, 0x020E >---\                   // Nächster Programmschritt
0205      C3 40 01    JP 0x0140         |                   // ERROR LED Blinken
                                        |
IST-GLEICH [A == M]                     |                   // Übergabe A, HL
0208      AE          XOR M             |                   // A XOR M
0209      23          INC HL            |                   // HL+1
020A      C2 40 01    JP NZ, 0x0140     |                   // Wenn A != M ERROR LED Blinken
020D      C9          RET               |
                                        |
020E      3E 16       LD A, 0x16     <--/
0210      32 ED 0C    LD (0x0CED), A
0213      DB 8C       IN A, (0x8C)                          // PIO-1-A-D
0215      47          LD B, A
0216      CB 50       Bit 2, B                              // Bit 2 von B == 0
0218      28 05       JR Z, 0x05   >--\                     // ja in Speicherzelle 0x0ced = 0x16
021A      3E 32       LD A, 0x32      |                     // nein in Speicherzelle 0x0ced = 0x32
021C      32 ED 0C    LD (0x0CED), A  |
021F      3E 06       LD A, 0x06   <--/                     // Register 6
0221      D3 8A       OUT (0x8A), A                         // SIO-0-K1C = 0x06 oder 0x32
0223      3A ED 0C    LD A, (0x0CED)                        // Wait/Ready-Steuerung
0226      D3 8A       OUT (0x8A), A                         // SIO-0-K1C = 0x16 oder 0x32
0228      3E 07       LD A, 0x07                            // Register 7
022A      D3 8A       OUT (0x8A), A                         // SIO-0-K1C = 0x07
022C      3A ED 0C    LD A, (0x0CED)                        // Wait/Ready-Steuerung
022F      D3 8A       OUT (0x8A), A                         // SIO-0-K1C = 0x16 oder 0x32
0231      FB          EI                                    // INT Freigabe
0232      3E 01       LD A, 0x01
0234      32 E7 0C    LD (0x0CE7), A
0237      32 EA 0C    LD (0x0CEA), A
023A      21 F7 0C    LD HL, 0x0CF7                         // Initialwerte (HL) Rauschgenerator Werte
023D      CD 01 08    CALL 0x0801                           // Initalwerte nach RAM1, CTC Zeitkonstante; Übergabe HL, Warte auf INT17 Rauschgenerator, ohne INT-Registersatz!
// weiter nach (0x0cec) bit 7 == 1
0240      CB 48       Bit 1, B                              // Bit 1 von B == 0?
0242      28 1B       JR Z, 0x1B   >-\                      // Ja Springe
0244      3A ED 0C    LD A, (0x0CED) |                      // nein: 0x16 oder 0x32
0247      EE 0F       XOR 0x0F       |                      // invertiere unter 4 Bits, 0x19 oder 0x3d
0249      D3 8D       OUT (0x8D), A  |                      // PIO-1-B-D LED Ein/AUS 0x8d = 0x19 oder 0x3d; A1 und A2 Bit 4 und 3
024B      01 00 00    LD BC, 0x0000  |
024E      CD 61 08    CALL 0x0861    |                      // Warteschleife; Übergabe BC (1 sec)
0251      3E 02       LD A, 0x02     |
0253      D3 85       OUT (0x85), A  |                      // PI0-0-B-D Ausgabe 0x85 = 0x19 oder 0x3d
0255      DB 85       IN A, (0x85)   |                      // PI0-0-B-D Lese Eingabe B2
0257      CB 5F       Bit 3, A       |                      // Bit 3 == 0 ?
0259      C2 0B 07    JP NZ, 0x070B  |  >-\                 // nein Springe: Alternativregister umschalten, ?Blockchiffrierung?, Abfrage SIO-0-K2C
025C      C3 D2 03    JP 0x03D2      |                      // ja: SIO-o-K1 und K2, Prüfe Status 0x0d08
                                     |
025F      CB 40       Bit 0, B     <-/                      // Bit 0 von B == 0?
0261      28 1B       JR Z, 0x1B   >---\                    // ja: Springe
0263      3A ED 0C    LD A, (0x0CED)   |                    // nein: PIO-1-B-D = 0x16 oder 0x32
0266      EE 07       XOR 0x07         |                    // invertiere Bit 0, 1, 2, 0x11 oder 0x35
0268      D3 8D       OUT (0x8D), A    |                    // PIO-1-B-D LED Ein/AUS; A1 und A2 Bit 0 und 2
026A      01 00 00    LD BC, 0x0000    |
026D      CD 61 08    CALL 0x0861      |                    // Warteschleife; Übergabe BC (1 sec)
0270      3E 02       LD A, 0x02       |
0272      D3 85       OUT (0x85), A    |                    // PI0-0-B-D
0274      DB 85       IN A, (0x85)     |                    // PI0-0-B-D
0276      CB 5F       Bit 3, A         |                    // Bit 3 von A == 0
0278      C2 0B 07    JP NZ, 0x070B    |                    // nein: Springe: Alternativregister umschalten, ?Blockchiffrierung?, Abfrage SIO-0-K2C
027B      C3 3A 04    JP 0x043A        |                    // Ja: Intitalsierung SIO-0-K2 und Alternativregistersatz
                                       |
027E      3A ED 0C    LD A, (0x0CED)<--/                    //
0281      EE 1F       XOR 0x1F                              // Maskieren, 5 bit
0283      D3 8D       OUT (0x8D), A                         // PIO-1-B-D LED Ein/AUS; A1 und A2 Bit 0 und 2
0285      01 00 00    LD BC, 0x0000
0288      CD 61 08    CALL 0x0861                           // Warteschleife; Übergabe BC (1 sec)
028B      3E 02       LD A, 0x02
028D      D3 85       OUT (0x85), A                         // PI0-0-B-D
028F      DB 85       IN A, (0x85)                          // PI0-0-B-D
0291      CB 5F       Bit 3, A                              // Bit 3 von A == 0
0293      C2 EA 06    JP NZ, 0x06EA                         // nein: Springe zu Alternativregister umschalten, ?Blockchiffrierung?, Abfrage SIO-0-K2C
0296      C3 07 03    JP 0x0307                             // Ja: Abfrage SIO-0-K2, Schlüsseleingelesen?

//DB Adress-Bereich, RAM Check 0x1a41
0299      E0 0C                                            // IX + 0; IX + 1; 0x0ce0 -> Zeiger auf 0x0cee
029B      20 03                                            // IX + 2; -> C; IX + 3; -> B; BC = 0x0320, Länge
029D      00 00 00 00
02A1      90 28                                            // IX + 0; IX + 1; 0x2890 -> RAM2, Schlüssel2
02A3      6F 03                                            // IX + 2; -> C; IX + 3; -> B; BC = 0x036f, Länge
02A5      00 00 00 00
02A9      7F        // Füllbytes
...
02AF      7F

// INT Tabelle
02B0      80 0A                                            // 0x0a80 INT Routine NR.  1; INT SIO-0-K2; Ausgabe SIO-0-K2CD
02B2      10 0B                                            // 0x0b10 INT Routine NR.  2; SIO-K2C
02B4      B6 09                                            // 0x09b6 INT Routine NR.  3; Lese SIO-0-K2CD, 256 byte, Vergleiche (HL) Inhalte
02B6      1A 0B                                            // 0x0b1a INT Routine NR.  4; und 12 SIO-K2C
02B8      3F 0A                                            // 0x0a3f INT Routine NR.  5; Einsprung INT 11, 3; Ausgabe SIO-0-K1D
02BA      0B 0b                                            // 0x0b0b INT Routine NR.  6; SIO-K1C
02BC      51 09                                            // 0x0951 INT Routine NR.  7; Lese SIO-0-K1D Input bis 0x2aff gefüllt ist
02BE      15 0B                                            // 0x0b15 INT Routine NR.  8; und 16 SIO-K1C
02C0      C4 0A                                            // 0x0ac4 INT Routine NR.  9; - weiter in INT-1 oder Error
02C2      36 0B                                            // 0x0b36 INT Routine NR. 10; SIO-K2C
02C4      EB 09                                            // 0x09eb INT Routine NR. 11; Einsprung INT-3, Lese SIO-0-K2CD, Prüfe Startfolge; Übergabe SIO-0-K2C
02C6      1A 0B                                            // 0x0b1a INT Routine NR. 12; und 4 SIO-K2C
02C8      6E 0A                                            // 0x0a6e INT Routine NR. 13; Einsprung INT-5, 11, 3; Ausgabe SIO-0-K1C
02CA      1F 0B                                            // 0x0b1f INT Routine NR. 14; SIO-K1C
02CC      86 09                                            // 0x0986 INT Routine NR. 15; springt in INT-7 ließt SIO-0-K1D oder schreibt 0x16 in 0x0f01 bis 0x0f10
02CE      15 0B                                            // 0x0b15 INT Routine NR. 16; und 8 SIO-K1C
02D0      00 00                                            // 0x0000 Restart
02D2      4D 0B                                            // 0x0b4d INT Routine NR. 17; Rauschgenerator, ohne INT-Registersatz!
02D4      00 00                                            // 0x0000 Restart
02D6      00 00                                            // 0x0000 Restart

// PIO und CTC Steuerbytes, Initialisierung
------Anzahl| C |Steuerwörter
02D8      06 8A 18 18 04 10 01 1F                          // Länge  6, Port 0x8A SIO-0-Kanal1   Steuerbyte 18 Kanal rücksetzen,18 Empfangsunterbrechung,04,10 Suche Synch-Zeichen SDLC,01 Parity angefügt,1F Sendelogik
02E0      0C 8B 18 18 04 10 02 B0 01 1F 06 16 07 16        // Länge 12, Port 0x8B SIO-0-Kanal2   Steuerbyte 18 Kanal rücksetzen,18 Empfangsunterbrechung,04,10 Suche Synch-Zeichen SDLC,02 gerade Parity,B0 INT-1 0x02b0,01 Sendelogik,1F 4bit,06 Synch-Zeichen SDLC,16 Synch-Zeichen SDLC,07 Lesereigster 0,16 Leseregister 1
02EE      02 80 D0 03                                      // Länge  2, Port 0x80 CTC-Kanal 0    INT 0x02d0-> DI, Zeigeber, Vorteiler 16, neg. Flanke, Zeitkonst. Start, RESET
02F2      02 87 CF 08                                      // Länge  2, Port 0x87 PI0-0-B-C      Bit-Mode 3 B0 ... B2 und B4 ... B7 Input, B3 Output
02F6      01 85 03                                         // Länge  1, Port 0x85 PIO-0-B-D      Datenausgabe 03
02F9      02 8F CF C0                                      // Länge  2, Port 0x8F PIO-1-B-C      Bit-Mode 3 B7, B6 Input, B0 ... B5 Output
02FD      01 8D 01                                         // Länge  1, Port 0x8D PIO-1-B-D      B1 = 1
0300      02 86 CF FF                                      // Länge  2, Port 0x86 PIO-0-A-C      Bit-Mode 3: A0 ... A7 Input SLS
0304      01 81 03                                         // Länge  1, Port 0x81 CTC Kanal 1    DI, Zeigeber, Vorteiler 16, neg. Flanke, Zeitkonst. Start, RESET

// Abfrage SIO-0-K2, SDLC
0307      CD 86 06    CALL 0x0686  <-+                      // Inital Speichern Alternativregister Teil1, INT-gespeert
030A      DB 8C       IN A, (0x8C)   |                      // PIO-1-A-D
030C      CB 7F       BIT 7, A       |                      // Bit 7 von A == 0?
030E      C2 5D 03    JP NZ, 0x035D  |                      // nein: Lese SIO-0-K1 und K2
0311      06 00       LD B, 0x00     |                      // ja: hier weiter
0313      CD 43 08    CALL 0x0843    |                      // Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
0316      CD 48 08    CALL 0x0848    |                      // Ausgabe SIO-0-K2C = 0x05, "B"
0319      DB 8A       IN A, (0x8A)   |                      // SIO-0-K1C
031B      CB 5F       BIT 3, A       |                      // Bit 3 von A == 0
031D      28 05       JR Z, 0x05     |    >---\             // Ja dann Eingabe lesen
031F      CD 2D 03    CALL 0x032D    |        |             // nein: Bit 3 und 5 Prüfen
0322      18 E3       JR 0xE3   >----+        |
                                     |        |
0324      DB 8B       IN A, (0x8B)   |    <---/             // SIO-0-K2C
0326      CB 5F       BIT 3, A       |                      // Bit 3 von A == 0
0328      C4 4D 03    CALL NZ 0x034D |                      // nein: Subroutine: Abfrage Startzeichen STZ = 0x55
032B      18 DA       JR 0xDA   >----/                      // Ja

// Subroutine: SDCL bit 3 und 5 Prüfen
032D      DB 8B       IN A, (0x8B)                         // SIO-0-K2C
032F      CB 6F       BIT 5, A                             // Bit 5 von A == 0
0331      20 19       JR NZ, 0x19   >-------\              // nein Springe Return
0333      06 6A       LD B, 0x6A            |              // ja hier weiter
0335      CD 48 08    CALL 0x0848           |              // Ausgabe SIO-0-K2C = 0x05, "B"
                                            |
0338      DB 8A       IN A, (0x8A) <---\    |              // SIO-0-K1C
033A      CB 5F       BIT 3, A         |    |              // Bit 3 von A == 0
033C      28 0E       JR Z, 0x0E       |  >-+              // ja dann Return
033E      DB 8B       IN A, (0x8B)     |    |              // nein hier weiter SIO-0-K2C
0340      CB 6F       BIT 5, A         |    |              // Bit 5, von A == 0
0342      28 F4       JR Z, 0xF4   >---/    |              // Ja dann neu einlesen
0344      06 D3       LD B, 0xD3            |              // nein hier weiter
0346      CD 4D 08    CALL 0x084D           |              // Ausgabe SIO-0-K1C = 0x03, "B"
0349      CD B6 04    CALL 0x04B6           |              // Prüfe Bit 4 und 3 von Eingabe
034C      C9          RET           <-------/
// Subroutine: Abfrage Startzeichen STZ = 0x55
034D      CD AC 06    CALL 0x06AC                          // Lese SIO-0-K2 bis 0x55 in 0x0d08; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
0350      C8          RET Z                                // SyncF falsch?
0351      CD 38 05    CALL 0x0538                          // Kopiere Ein- Ausgabe LAMBDA von 0x0d08 nach 0x2A00
0354      06 6A       LD B, 0x6A
0356      CD 43 08    CALL 0x0843                          // Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
0359      CD 57 05    CALL 0x0557                          // Rundenschlüssel erzeugen, Chiffrierung Daten mit Ergebnis LAMBDA
035C      C9          RET

// Lese SIO-0-K1 und K2
035D      06 D3       LD B, 0xD3
035F      CD 4D 08    CALL 0x084D                          // Ausgabe SIO-0-K1C = 0x03, "B"
0362      01 00 00    LD BC, 0x0000
0365      CD 61 08    CALL 0x0861                          // Warteschleife; Übergabe BC (1 sec)
0368      3E 18       LD A, 0x18
036A      D3 8D       OUT (0x8D), A                        // PIO-1-B-D LED Ein; A1 und A2 Bit 4 und 3
036C      01 00 00    LD BC, 0x0000
036F      CD 61 08    CALL 0x0861                          // Warteschleife; Übergabe BC (1 sec)
0372      3E FF       LD A, 0xFF
0374      32 ED 0C    LD (0x0CED), A
0377      47          LD B, A                              // Rette A
0378      3E 06       LD A, 0x06
037A      D3 8A       OUT (0x8A), A                        // SIO-0-K1C
037C      78          LD A, B                              // Hole A zurück
037D      D3 8A       OUT (0x8A), A                        // SIO-0-K1C
037F      3E 07       LD A, 0x07
0381      D3 8A       OUT (0x8A), A                        // SIO-0-K1C
0383      78          LD A, B                              // Hole A zurück
0384      D3 8A       OUT (0x8A), A                        // SIO-0-K1C
0386      DB 8A       IN A, (0x8A)  <--\                   // SIO-0-K1C Inputschleife
0388      CB 67       BIT 4, A         |                   // BIT 4 von A == 0
038A      20 FA       JR NZ, 0xFA   >--/                   // nein: Sprung
038C      06 C1       LD B, 0xC1                           // ja
038E      CD 4D 08    CALL 0x084D                          // Ausgabe SIO-0-K1C = 0x03, "B"
0391      AF          XOR A        <-\                     // Lösche A, beeinflusse Flags  ?sonst? .03AE.
0392      32 10 0D    LD (0x0D10), A |                     // Status 0x0d10
0395      32 11 0D    LD (0x0D11), A |                     // Status 0x0d11
0398      D3 8D       OUT (0x8D), A  |                     // PIO-1-B-D LED Ein/AUS; A1 und A2 Bit 0 und 2
039A      06 00       LD B, 0x00     |
039C      CD 57 08    CALL 0x0857    |                      // Ausgabe SIO-0-K2C = 0x03, "B"
039F      CD 48 08    CALL 0x0848    |                      // Ausgabe SIO-0-K2C = 0x05, "B"
03A2      CD 43 08    CALL 0x0843    |                      // Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
03A5      DB 8A       IN A, (0x8A)   |                      // SIO-0-K1C
03A7      CB 5F       BIT 3, A       |                      // BIT 1 von A == 0
03A9      28 05       JR Z, 0x05     |      >-\             // ja
03AB      CD B9 03    CALL 0x03B9    |        |  >-\  <---\ // nein: Lese SIO-0-K2
03AE      18 E1       JR 0xE1      >-+        |    |      |
                                     |        |    |      |
03B0      DB 8B       IN A, (0x8B)   |      <-/    |      | // SIO-0-K2C
03B2      CB 5F       BIT 3, A       |             |      | // BIT 3 von A == 0
03B4      C4 4D 03    CALL NZ 0x034D |             |      | // nein; Subroutine: Abfrage Startzeichen STZ = 0x55
03B7      18 D8       JR 0xD8      >-/             |      | // ja
                                                   |      |
// Lese SIO-0-K2                                   |      |
03B9      DB 8B       IN A, (0x8B)             <---/      | // SIO-0-K2C
03BB      CB 6F       BIT 5, A                            | // BIT 5 von A == 0
03BD      C0          RET NZ                    >---------+ // nein return
03BE      06 6A       LD B, 0x6A                          | // ja
03C0      CD 48 08    CALL 0x0848                         | // Ausgabe SIO-0-K2C = 0x05, "B"
03C3      DB 8A       IN A, (0x8A)  <--\                  | // SIO-0-K1C
03C5      CB 5F       BIT 3, A         |                  | // BIT 3 von A == 0
03C7      C8          RET Z            |     >------------/ // ja return
03C8      DB 8B       IN A, (0x8B)     |                    // nein lese Input SIO-0-K2C
03CA      CB 6F       BIT 5, A         |                    // BIT 5 von A == 0
03CC      28 F5       JR Z, 0xF5    >--/                    // ja lese Input
03CF      CD B6 04    CALL 0x04B6                           // nein: Prüfe Bit 4 und 3 von Eingabe
03D1      C9          RET
// SIO-o-K1 und K2, Prüfe Status 0x0d08
03D2      CD 86 06    CALL 0x0686     <------\              // Inital Speichern Alternativregister Teil1, INT-gespeert
03D5      06 00       LD B, 0x00             |
03D7      CD 43 08    CALL 0x0843            |              // Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
03DA      06 6A       LD B, 0x6A             |
03DC      CD 48 08    CALL 0x0848            |              // Ausgabe SIO-0-K2C = 0x05, "B"
03DF      06 D3       LD B, 0xD3             |        <--\
03E1      CD 57 08    CALL 0x0857            |           |  // Ausgabe SIO-0-K2C = 0x03, "B"
03E4      21 08 0D    LD HL, 0x0D08          |           |  // Status 0x0d08
03E7      36 16       LD M, 0x16             |           |  // (0x0d08)=0x16
03E9      DB 8B       IN A, (0x8B)           |   <--\    |  // SIO-0-K2C
03EB      CB 67       Bit 4, A               |      |    |  // BIT 4 von A == 0
03ED      20 1A       JR NZ, 0x1A  >--\      |      |    |  // nein
03EF      06 C1       LD B, 0xC1      |      |      |    |  // ja
03F1      CD 57 08    CALL 0x0857     |      |      |    |  // Ausgabe SIO-0-K2C = 0x03, "B"
03F4      F3          DI              |      |      |    |  // Sperre INT
03F5      D9          EXX             |      |      |    |  // INT-Registersatz tauschen, BC/DE/HL
03F6      21 08 0D    LD HL, 0x0D08   |      |      |    |  // Status 0x0d08; HL im Alternativ-Registersatz mit Adresse geladen
03F9      D9          EXX             |      |      |    |  // Alternativ-Registersatz tauschen, BC/DE/HL
03FA      FB          EI              |      |      |    |  // INT Freigabe
03FB      7E          LD A, M         |      |      |    |  // Wenn nicht durch INT-Routine geändert sollte es 0x16 sein
03FC      FE 16       CP 0x16         |      |      |    |  // Status 0x0d08 == 0x16
03FE      28 09       JR Z, 0x09  >---+      |      |    |
0400      FE 55       CP 0x55         |      |      |    |  // Status 0x0d08 == 0x55; STZ; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
0402      20 DB       JR NZ 0xDB      |      |      |  >-/
0404      CD 2E 04    CALL 0x042E     |      |      |       // Vorbereiten LAMBDA, SIO-0-K1C Initialisierung
0407      18 C9       JR 0xC9         |  >---+      |
0409      FB          EI           <--/      |      |       // INT Freigabe
040A      DB 8A       IN A, (0x8A)           |      |       // SIO-0-K1C
040C      CB 5F       BIT 3, A               |      |       // BIT 3 von A == 0
040E      28 D9       JR Z 0xD9              |   >--/       // ja
0410      CD 15 04    CALL 0x0415            |              // nein; Initialisierung SIO-0-K2C
0413      18 BD       JR 0xBD       >--------/

// Subroutine: Initialisierung SIO-0-K2C
0415      06 00       LD B, 0x00                            // Übergabe 0x00
0417      CD 57 08    CALL 0x0857                           // Ausgabe SIO-0-K2C = 0x03, "B"
041A      DB 8B       IN A, (0x8B)                          // SIO-0-K2C
041C      CB 6F       BIT 5, A                              // BIT 5 von A == 0
041E      28 08       JR Z 0x08   >--\                      // ja
0420      06 D3       LD B, 0xD3      |                     // nein; übergabe 0xd3
0422      CD 4D 08    CALL 0x084D     |                     // Ausgabe SIO-0-K1C = 0x03, "B"
0425      CD B6 04    CALL 0x04B6     |                     // Prüfe Bit 4 und 3 von Eingabe
0428      06 02       LD B, 0x02  <--/
042A      CD 48 08    CALL 0x0848                           // Ausgabe SIO-0-K2C = 0x05, "B"
042D      C9          RET

// Subroutine: Vorbereiten LAMBDA, SIO-0-K1C Initialisierung, Rundenschlüssel
042E      CD 38 05    CALL 0x0538                           // Kopiere Ein- Ausgabe LAMBDA von 0x0d08 nach 0x2A00
0431      06 6A       LD B, 0x6A                            // 0x6a, 106
0433      CD 43 08    CALL 0x0843                           // Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
0436      CD 57 05    CALL 0x0557                           // Rundenschlüssel erzeugen, Chiffrierung Daten mit Ergebnis LAMBDA
0439      C9          RET

// Einsprung: Intitalsierung SIO-0-K2 und Alternativregistersatz
043A      F3          DI              <--------\            // Sperre INT, Keine Eingabe
043B      3E 02       LD A, 0x02               |
043D      D3 8B       OUT (0x8B), A            |            // SIO-0-K2C
043F      3E C0       LD A, 0xC0               |
0441      D3 8B       OUT (0x8B), A            |            // SIO-0-K2C
0443      CD 86 06    CALL 0x0686              |            // Inital Speichern Alternativregister Teil1, INT-gespeert
0446      06 82       LD B, 0x82               |
0448      CD 43 08    CALL 0x0843              |            // Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
044B      06 6A       LD B, 0x6A               |
044D      CD 48 08    CALL 0x0848              |            // Ausgabe SIO-0-K2C = 0x05, "B"
0450      06 D3       LD B, 0xD3               |
0452      CD 4D 08    CALL 0x084D              |            // Ausgabe SIO-0-K1C = 0x03, "B"
0455      CD 57 08    CALL 0x0857              |            // Ausgabe SIO-0-K2C = 0x03, "B"
0458      3E 16       LD A, 0x16               |
045A      D3 89       OUT (0x89), A            |            // SIO-0-K2D
045C      FB          EI              <---\    |            // INT Freigabe
045D      06 00       LD B, 0x00          |    |
045F      DB 8B       IN A, (0x8B)        |    |            // SIO-0-K2C
0461      CB 5F       BIT 3, A            |    |            // BIT 3 von A == 0
0463      28 02       JR Z, 0x02  >--\    |    |            // Ja
0465      CB C8       SET 1, B       |    |    |            // nein
0467      CB 6F       BIT 5, A    <--/    |    |            // BIT 5 von A == 0
0469      28 02       JR Z, 0x02  >-\     |    |            // Ja
046B      CB F8       SET 7, B      |     |    |            // nein
046D      CD 43 08    CALL 0x0843 <-/     |    |            // Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
0470      3E 04       LD A, 0x04          |    |
0472      32 10 0D    LD (0x0D10), A      |    |            // Status 0x0d10
0475      18 E5       JR 0xE5         >---/    |            // Setze Einlesen und Prüfen fort
//Einsprungadresse (HL) im Stack               |
0477      3E 01       LD A, 0x01               |
0479      32 10 0D    LD (0x0D10), A           |            // Status 0x0d10
047C      06 D3       LD B, 0xD3               |
047E      CD 57 08    CALL 0x0857              |            // Ausgabe SIO-0-K2C = 0x03, "B"
0481      06 C1       LD B, 0xC1               |
0483      CD 4D 08    CALL 0x084D              |            // Ausgabe SIO-0-K1C = 0x03, "B"
0486      06 82       LD B, 0x82               |
0488      CD 43 08    CALL 0x0843              |            // Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
048B      CD 98 05    CALL 0x0598              |            // Initalisierung Wurmreihe/Dateneingabe für LAMBDA/ STZ-Kommando/Prüfsummen Wurmreihen
048E      3E 05       LD A, 0x05               |
0490      32 10 0D    LD (0x0D10), A           |            // Status 0x0d10
0493      CD 02 05    CALL 0x0502              |            // Bildung Wurmreihen
0496      C3 3A 04    JP 0x043A                |            // Intitalsierung SIO-0-K2 und Alternativregistersatz
0499      3E 02       LD A, 0x02               |
049B      32 10 0D    LD (0x0D10), A           |            // Status 0x0d10
049E      06 D3       LD B, 0xD3               |
04A0      CD 4D 08    CALL 0x084D              |            // Ausgabe SIO-0-K1C = 0x03, "B"
04A3      06 C1       LD B, 0xC1               |
04A5      CD 57 08    CALL 0x0857              |            // Ausgabe SIO-0-K2C = 0x03, "B"
04A8      CD 38 05    CALL 0x0538              |            // Kopiere Ein- Ausgabe LAMBDA von 0x0d08 nach 0x2A00
04AB      06 EA       LD B, 0xEA               |
04AD      CD 43 08    CALL 0x0843              |            // Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
04B0      CD 57 05    CALL 0x0557              |            // Rundenschlüssel erzeugen, Chiffrierung Daten mit Ergebnis LAMBDA
04B3      C3 3A 04    JP 0x043A     >----------/            // Schleife bis Abbruch

// Prüfe Bit 4 und 3 von Eingabe
04B6      06 E0       LD B, 0xE0
04B8      CD 43 08    CALL 0x0843                           // Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
04BB      DB 8A       IN A, (0x8A) <--\                     // SIO-0-K1C
04BD      CB 67       BIT 4, A        |                     // BIT 4 von A == 0
04BF      28 07       JR Z 0x07       |  >---\              // ja
04C1      CB 5F       BIT 3, A        |      |              // nein; Bit 3 von A == 0
04C3      CA 37 05    JP Z, 0x0537    |      |              // ja -> Return
04C6      18 F3       JR 0xF3      >--/      |              // nein Lese Input fortsetzen
                                             |
04C8      06 C1       LD B, 0xC1         <---/
04CA      CD 4D 08    CALL 0x084D                           // Ausgabe SIO-0-K1C = 0x03, "B"
04CD      3E 02       LD A, 0x02
04CF      32 11 0D    LD (0x0D11), A                        // Status 0x0d11 = 0x02
04D2      21 09 0D    LD HL, 0x0D09
04D5      3A ED 0C    LD A, (0x0CED)
04D8      77          LD M, A                               // (0x0d09) = (0x0ced)
04D9      F3          DI               <----\               // Sperre INT, Eingabe gesperrt
04DA      D9          EXX                   |               // Alternativ-Registersatz tauschen, BC/DE/HL
04DB      21 09 0D    LD HL, 0x0D09         |               // Lade HL mit Speicheradresse im ALternativ-Registersatz
04DE      D9          EXX                   |               // Alternativ-Registersatz tauschen, BC/DE/HL
04DF      FB          EI                    |               // INT Freigabe
04E0      DB 8A       IN A, (0x8A)          |               // SIO-0-K1C
04E2      CB 5F       BIT 3, A              |               // BIT 1 von A == 0
04E4      28 51       JR Z 0x51     >---\   |               // Ja
04E6      3A ED 0C    LD A, (0x0CED)    |   |               // nein
04E9      BE          CP M              |   |               // Änderung in (0x0d09) oder (0x0ced)
04EA      28 ED       JR Z 0xED         | >-/               // keine, Warte
04EC      F3          DI                |                   // Sperre INT, Eingabe gesperrt
04ED      D9          EXX               |                   // Alternativ-Registersatz tauschen, BC/DE/HL
04EE      21 08 0D    LD HL, 0x0D08     |
04F1      D9          EXX               |                   // Alternativ-Registersatz tauschen, BC/DE/HL
04F2      FB          EI                |                   // INT Freigabe
04F3      CD 98 05    CALL 0x0598       |                   // Initalisierung Wurmreihe/Dateneingabe für LAMBDA/ STZ-Kommando/Prüfsummen Wurmreihen
04F6      3E 16       LD A, 0x16        |
04F8      D3 89       OUT (0x89), A     |                   // SIO-0-K2CD
04FA      3A 10 0D    LD A, (0x0D10)    |                   // Status 0x0d10
04FD      E6 07       AND 0x07          |                   // Maskiere bits 0, 1, 2, A = 0x00 bis 0x07
04FF      32 10 0D    LD (0x0D10), A    |                   // Status 0x0d10
                                        |
// Subroutine: Bildung Wurmreihen       |                   // LAMBDA Ein-Ausgabe
0502      CD 00 18    CALL 0x1800       |  <------\         // LAMBDA über 0x2a00 Ein-Ausgabe 64bit; 0x2800 Rundenschlüssel
0505      21 10 0D    LD HL, 0x0D10     |         |         // Status 0x0d10
0508      CB 5E       BIT 3, M          |         |         // BIT 3 von M == 0
050A      28 FC       JR Z 0xFC         |     >---+         // ja Bildung Wurmreihen und Rundenschlüssel
050C      CD EE 08    CALL 0x08EE       |         |         // nein: XOR-Verknüpfung Wurmreihe XOR Daten
050F      3A 10 0D    LD A, (0x0D10)    |         |         // Status 0x0d10
0512      CB 9F       RES 3, A          |         |         // Lösche Bit 3, Wert: 0x00 ... 0x03
0514      32 10 0D    LD (0x0D10), A    |         |         // Status 0x0d10
0517      E6 A0       AND 0xA0          |         |         // Maskiere bit 7, 5
0519      20 19       JR NZ 0x19        | >--\    |         // prüfe bit 7 und 5
051B      DB 8A       IN A, (0x8A)      |    |    |         // SIO-0-K1C
051D      CB 5F       BIT 3, A          |    |    |         // BIT 3 von A == 0
051F      C2 02 05    JPNZ 0x0502       |    | >--/         // nein: Bildung Wurmreihen
0522      06 00       LD B, 0x00        |    |              // Ja
0524      CD 43 08    CALL 0x0843       |    |              // Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
0527      CD 00 18    CALL 0x1800       |    |              // LAMBDA über 0x2a00 Ein-Ausgabe 64bit; 0x2800 Rundenschlüssel
052A      21 10 0D    LD HL, 0x0D10     |    |              // Status 0x0d10
052D      CB 5E       BIT 3, M          |    |  <-\         // BIT 3 von M == 0
052F      28 FC       JR Z, 0xFC        |    |  >-/         // Ja: Warte auf INT
0531      CD EE 08    CALL 0x08EE       |    |              // nein: XOR-Verknüpfung Wurmreihe XOR Daten
0534      CD 22 06    CALL 0x0622       | <--/              // Rundenschlüssel mit Initalwert 0x87, Prüfe auf RAM1 und RAM2
0537      C9          RET           <---/

// Subroutine: Kopiere Ein-Ausgabe LAMBDA 0x0d08 nach 0x2A00
0538      CD 00 06    CALL 0x0600                           // Aktivierung Alternativregistersatz, Steuer-Signale, Rückgabe (0x0e10, 0x0e11)[0x00, 0x0f]
053B      21 10 0D    LD HL, 0x0D10                         // Status 0x0d10
053E      7E          LD A, M                               // A = (0x0d10)
053F      E6 07       AND 0x07                              // Maskiere unteren 3 Bits
0541      77          LD M, A                               // Status 0x0d10
0542      CB 5E       BIT 3, M    <-\                       // BIT 3 von M == 0
0544      28 FC       JR Z, 0xFC  >-/                       // ja: Tastendruck, Flanke abfragen
0546      CB 9E       RES 3, M                              // nein: Lösche Bit 3 M
0548      21 08 0D    LD HL, 0x0D08                         // Kopie Ein- Ausgabe LAMBDA, Wurmreihe
054B      11 00 2A    LD DE, 0x2A00                         // Ein- Ausgabe LAMBDA, Wurmreihe
054E      06 08       LD B, 0x08                            // Schleifenzähler = 8
0550      7E          LD A, M        <--\
0551      12          LD (DE), A        |                   // 0x2a00 ... 0x2a07 mit 0x0d08 ... 0x0d01 laden
0552      13          INC DE            |                   // Ein- Ausgabe LAMBDA
0553      2B          DEC HL            |                   // kopiert rückwärts!
0554      10 FA       DJNZ 0xFA       >--/
0556      C9          RET

// Subroutine: Rundenschlüssel erzeugen, Chiffrierung Daten mit Ergebnis LAMBDA
0557      3A ED 0C    LD A, (0x0CED)                        // Steuerwort für SIO
055A      D3 88       OUT (0x88), A                         // SIO-0-K1D
055C      CD 00 18    CALL 0x1800       <------\            // LAMBDA über 0x2a00 Ein-Ausgabe 64bit; 0x2800 Rundenschlüssel
055F      21 10 0D    LD HL, 0x0D10            |            // Status 0x0d10
0562      CB 5E       BIT 3, M     >-\         |            // BIT 3 von A == 0
0564      28 FC       JR Z, 0xFC   >-/         |            // ja; Warte auf Interrupt-auslösende Änderung
0566      CB 9E       RES 3, M                 |            // Lösche Bit 3, Status 0x0d10 = 0x00 ... 0x37
0568      CB 4E       BIT 1, M                 |            // BIT 1 von M == 0
056A      20 06       JR NZ 0x06  >-\          |            // nein
056C      DB 8A       IN A, (0x8A)  |          |            // Ja; SIO-0-K1C
056E      CB 5F       BIT 3, A      |          |            // BIT 3 von A == 0
0570      20 22       JR NZ 0x22    |   >--\   |            // nein
0572      3E 30       LD A, 0x30  <-/      |   |            // ja
0574      A6          AND M                |   |            // 0011 0000 and M
0575      20 1D       JR NZ 0x1D        >--+   |            // abbruch aus der Subroutine
0577      CD 36 09    CALL 0x0936          |   |            // XOR 8 byte Block, (0x2a00++) = (0x2a00++) XOR (0x0d08--)
057A      21 10 0D    LD HL, 0x0D10        |   |            // Status 0x0d10
057D      CB 7E       BIT 7, M             |   |            // BIT 7 von M == 0
057F      20 DB       JR NZ, 0xDB          | >-+            // nein
0581      CB FE       SET 7, M             |   |            // ja Bit 7 = 1
0583      3A ED 0C    LD A, (0x0CED)       |   |
0586      32 08 0F    LD (0x0F08), A       |   |            // Adressbereich 0xf05 bis 0x0f08 füllen mit (0x0ced)
0589      32 07 0F    LD (0x0F07), A       |   |
058C      32 06 0F    LD (0x0F06), A       |   |
058F      32 05 0F    LD (0x0F05), A       |   |
0592      18 C8       JR 0xC8              | >-/
0594      CD 6E 06    CALL 0x066E       <--/                // Statussignal 0x0e11, Löschen 0x0e00 / 0x0f00 4 byte; Warteschleife
0597      C9          RET

// Initalisierung Wurmreihe/Dateneingabe für LAMBDA/ STZ-Kommando/Prüfsummen Wurmreihen
0598      3E 08       LD A, 0x08
059A      D3 8D       OUT (0x8D), A                         // PIO-1-B-D LED Ein/Aus
059C      21 EE 0C    LD HL, 0x0CEE                         // aus 0x2a00 kopierte 9! byte; Ein- Ausgabe LAMBDA
059F      11 00 2A    LD DE, 0x2A00                         // Ein- Ausgabe LAMBDA, Wurmreihen
05A2      01 09 00    LD BC, 0x0009                         // 9! Byte
05A5      ED B0       LDIR                                  // (DE) = M von 0xcee nach 0x2a00, Ein- Ausgabe LAMBDA
05A7      21 00 2A    LD HL, 0x2A00                         // Ein- Ausgabe LAMBDA, Wurmreihen
05AA      06 08       LD B, 0x08                            // Schleifenzähler = 8
05AC      7E          LD A, M                               // A = 0x2aa = 0xcee
05AD      BE          CP M                <--\              // M == (HL + 1) ?
05AE      20 06       JR NZ, 0x06   >--\     |              // Ungleich?
05B0      23          INC HL           |     |
05B1      10 FA       DJNZ 0xFA        |  >--/              // 7 Runden, vergleich M == (HL + 1)
05B3      C3 2B 01    JP 0x012B        |                    // RST 0x38
05B6      AF          XOR A          <-/                    // Lösche A, beeinflusse Flags
05B7      32 10 0E    LD (0x0E10), A                        // Status 0x0e10 = 0x00
05BA      21 0C 0E    LD HL, 0x0E0C                         //
05BD      3E 0F       LD A, 0x0F
05BF      32 11 0E    LD (0x0E11), A                        // Status 0x0e11 = 0x0f; Status; Werte 0x04, 0x05, 0x0e, 0x0f; 0x0e/0x0f Senden-Empfangen Speicherbereich
05C2      36 16       LD M, 0x16                            // HL = 0x0ec0
05C4      2D          DEC L
05C5      36 16       LD M, 0x16                            // HL = 0x0ecb
05C7      2D          DEC L
05C8      36 16       LD M, 0x16                            // HL = 0x0eca
05CA      2D          DEC L                                 // STZ ?
05CB      36 55       LD M, 0x55                            // HL = 0x0ec9 - 0x0e0c: 0x55 0x16 0x16 0x16 0x55; 0x55; ...0x00, 0x0f = STZ?; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
05CD      11 00 2A    LD DE, 0x2A00                         // Ein- Ausgabe LAMBDA, Wurmreihen
05D0      2D          DEC L                                 // HL = 0x0ec8
05D1      1A          LD A, (DE)  <--\                      // Daten -> 0x0ec8 ... 0x0ec0
05D2      77          LD M, A        |                      // kopiere (DE) nach M; 0x2a00 nach 0x0ecc; Ein- Ausgabe LAMBDA
05D3      13          INC DE         |                      // 0x2a00 bis 0x2a0c; Ein- Ausgabe LAMBDA 8 byte
05D4      2D          DEC L          |                      // 0x0ec7
05D5      20 FA       JR NZ, 0xFA >--/                      // bis HL 0x0ec0
05D7      3A 08 2A    LD A, (0x2A08)                        // Prüfbyte Summe 0x2a00 bis 0x2a07
05DA      EE BC       XOR 0xBC                              // Maskierung 1011 1100
05DC      77          LD M, A                               // 0x0ec7 = (0x2A08) XOR 0xbc
05DD      21 F9 0C    LD HL, 0x0CF9                         // Auszug aus Rauschgenerator-Daten
05E0      11 0A 0D    LD DE, 0x0D0A
05E3      01 04 00    LD BC, 0x0004                         // 4 bytes
05E6      ED B0       LDIR                                  // Blockkopie (DE) = M, von 0x0cf9 nach 0x0d0a
05E8      F3          DI                                    // Sperre INT, Eingabe gesperrt
05E9      D9          EXX                                   // Alternativ-Registersatz tauschen, BC/DE/HL
05EA      0E 00       LD C, 0x00
05EC      11 F7 0E    LD DE, 0x0EF7
05EF      43          LD B, E                               // BC = 0xf700
05F0      ED 53 F5 0E LD (0x0EF5), DE                       // Startbereich STZ-Folge?
05F4      3E 55       LD A, 0x55                            // STZ; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
05F6      12          LD (DE), A      <--\
05F7      1C          INC E              |
05F8      20 FC       JR NZ, 0xFC     >--/                  // 0x0ef7 8byte füllen mit 0x55; SZT?; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
05FA      11 0D 0E    LD DE, 0x0E0D
05FD      D9          EXX                                   // Alternativ-Registersatz tauschen, BC/DE/HL
05FE      FB          EI                                    // INT Freigabe
05FF      C9          RET                                   // Rückgabe DE=0x0e0d

// Subroutine: Aktivierung Alternativregistersatz, Steuer-Signale, Rückgabe (0x0e10, 0x0e11)[0x00, 0x0f]
0600      3E 10       LD A, 0x10
0602      D3 8D       OUT (0x8D), A                         // PIO-1-B-D LED Ein/AUS; A1 und A2 Bit 0 und 2
0604      F3          DI                                    // Sperre INT, Eingabe gesperrt
0605      D9          EXX                                   // Alternativ-Registersatz tauschen, BC/DE/HL
0606      21 08 0D    LD HL, 0x0D08                         // Lade HL und DE im Alternativ-Register-Satz
0609      11 0A 0E    LD DE, 0x0E0A
060C      D9          EXX                                   // Alternativ-Registersatz tauschen, BC/DE/HL
060D      FB          EI                                    // INT Freigabe
060E      3A ED 0C    LD A, (0x0CED)
0611      21 0A 0E    LD HL, 0x0E0A
0614      77          LD M, A       <--\                    // fülle 0xe0a bis 0xe00 mit (0x0ced)
0615      2D          DEC L            |
0616      20 FC       JR NZ, 0xFC   >--/                    // wiederholen wenn L > 0, ->0xe00
0618      AF          XOR A                                 // Lösche A, beeinflusse Flags
0619      32 10 0E    LD (0x0E10), A                        // Status 0x0e10 = 0x00
061C      3E 0F       LD A, 0x0F
061E      32 11 0E    LD (0x0E11), A                        // Status 0x0e11 = 0x0f; Status; Werte 0x04, 0x05, 0x0e, 0x0f; 0x0e/0x0f Senden-Empfangen Speicherbereich
0621      C9          RET

// Rundenschlüssel mit Initalwert 0x87, Funktion Test Online mit aktuellen Schlüssel und Initialwert 0x87
0622      21 10 0D    LD HL, 0x0D10   <--\                  // Status 0x0d10
0625      CB 6E       BIT 5, M           |                  // bit 5 == 0
0627      C0          RET NZ             |                  // nein Rücksprung
0628      21 10 0E    LD HL, 0x0E10      |                  // ja: Status 0x0e10
062B      AF          XOR A              |                  // Lösche A, beeinflusse Flags
062C      BE          CP M               |                  // Ist (0xe10) == 0x00, sonst kann (0x0e10) == 0x08, 0x0a sein
062D      20 F3       JR NZ, 0xF3     >--/                  // nein
062F      36 0A       LD M, 0x0A                            // (0xe10) = 0x0a
0631      3A 11 0E    LD A, (0x0E11)                        // Status; Werte 0x0e/0x0f Senden-Empfangen Speicherbereich
0634      67          LD H, A
0635      2E 0A       LD L, 0x0A                            // HL = 0x0e0a oder 0x0f0a
0637      36 FF       LD M, 0xFF      <--\                  // HL == 0x0e0a, 0x0f0a
0639      2D          DEC L              |                  // Fülle (HL) mit 0xff; 9 Runden; 0x0e09 - 0x0e01, bw. 0x0f09 - 0x0f01
063A      20 FB       JR NZ 0xFB      >--/                  // bis HL == 0x0e00; 0x0f00;
063C      36 FF       LD M, 0xFF                            // auch 0x0e00 oder 0x0f00 mit 0xff füllen
063E      21 57 13    LD HL, 0x1357                         // Startvariablen 8 bytes, 0x87
0641      11 00 2A    LD DE, 0x2A00                         // Ein- Ausgabe LAMBDA, Wurmreihen
0644      01 08 00    LD BC, 0x0008                         // Schleifenzähler = 8
0647      ED B0       LDIR                                  // Kopiere (DE) = M, von 0x1357 nach 0x2a00, 8 bytes
0649      CD 00 18    CALL 0x1800                           // LAMBDA über 0x2a00 Ein-Ausgabe 64bit; 0x2800 Rundenschlüssel
064C      21 95 0C    LD HL, 0x0C95                         // CFB-Modus, letzte Wurmreihe - 0x0c9c
064F      11 00 2A    LD DE, 0x2A00                         // Ein- Ausgabe LAMBDA, Wurmreihen
0652      06 08       LD B, 0x08                            // Schleifenzähler = 8
0654      1A          LD A, (DE)    <--\                    // Ein- Ausgabe LAMBDA, Wurmreihen
0655      AE          XOR M            |                    // A = Wurmreihe XOR M
0656      C2 40 01    JP NZ, 0x0140    |                    // A != M ERROR LED Blinken
0659      23          INC HL           |
065A      13          INC DE           |
065B      10 F7       DJNZ 0xF7     >--/                    // Vergleiche M == (DE); Berechnete Wurmreihe ist mit festgelegter Identisch
065D      EE FF       XOR 0xFF                              // 0x2a08 NOT A
065F      AE          XOR M                                 // A = A XOR (0x0c9D)
0660      AE          XOR M                                 // A = A XOR (0x0c9D)
0661      20 03       JR NZ 0x03     >--\                   // A != 0
0663      C3 40 01    JP 0x0140         |                   // ERROR LED Blinken
0666      21 10 0D    LD HL, 0x0D10 <---+                   // Status 0x0d10
0669      CB 6E       BIT 5, M          |                   // bit 5 == 0
066B      28 F9       JR Z 0xF9      >--/                   // ja
066D      C9          RET                                   // nein

// Subroutine: Statussignal 0x0e11, Löschen 0x0e00 / 0x0f00 4 byte; Warteschleife
066E      3A 11 0E    LD A, (0x0E11)                        // Status 0x0e11; 0x00, 0x04, 0x05, 0x0e, 0x0f
0671      67          LD H, A                               // 0x0e oder 0x0f
0672      2E 04       LD L, 0x04                            // HL = 0x0e04, 0x0f04
0674      36 FF       LD M, 0xFF     <--\
0676      2D          DEC L             |
0677      20 FB       JR NZ, 0xFB    >--/                   // Fülle M mit 0xff von 0x0e04 bis 0x0e01; 0x0f04 ..
0679      3E 04       LD A, 0x04
067B      32 10 0E    LD (0x0E11), A                        // Status 0x0e11 == 0x04
067E      21 10 0D    LD HL, 0x0D10                         // Status 0x0d10
0681      CB 6E       BIT 5, M        <-\                   // Warte bis Bit 5 gesetzt, INT Routine!
0683      28 FC       JR Z, 0xFC      >-/                   // Tastendruck? Flankenabfrage INT
0685      C9          RET

// Inital Speichern Alternativregister Teil1, INT-gespeert
0686      F3          DI                                    // Sperre INT, Eingabe gesperrt
0687      AF          XOR A                                 // Lösche A, beeinflusse Flags
0688      32 11 0D    LD (0x0D11), A                        // Status 0x0d11 = 0x00

// speichern Alternativregister Teil2
068B      AF          XOR A                                 // Lösche A, beeinflusse Flags
068C      32 10 0D    LD (0x0D10), A                        // Status 0x0d10
068F      D3 8D       OUT (0x8D), A                         // PIO-1-B-D LED AUS; A1 und A2 Bit 4 und 3
0691      32 10 0E    LD (0x0E10), A                        // Status 0x0e10 = 0
0694      D9          EXX                                   // INT-Registersatz, BC/DE/HL
0695      21 08 0D    LD HL, 0x0D08                         // Adressbereich Daten
0698      11 00 0F    LD DE, 0x0F00                         // RAM1
069B      06 16       LD B, 0x16                            // BC = 0x16xx x = "A"; Der Inhalt von 0x1600 bis 0x17ff ist 0x7f == 7bit
069D      4F          LD C, A                               // Rette A?
069E      3E FF       LD A, 0xFF
06A0      12          LD (DE), A                            // 0x0f00 = 0xff
06A1      13          INC DE
06A2      D9          EXX                                   // Alternativ-Registersatz tauschen, BC/DE/HL
06A3      06 00       LD B, 0x00
06A5      CD 4D 08    CALL 0x084D                           // Ausgabe SIO-0-K1C = 0x03, "B"
06A8      CD 57 08    CALL 0x0857                           // Ausgabe SIO-0-K2C = 0x03, "B"
06AB      C9          RET

// Lese SIO-0-K2 bis 0x55 in 0x0d08; Abfrage STZ; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
06AC      06 D3       LD B, 0xD3
06AE      CD 57 08    CALL 0x0857                           // Ausgabe SIO-0-K2C = 0x03, "B"
06B1      01 C8 00    LD BC, 0x00C8
06B4      11 14 00    LD DE, 0x0014
06B7      DB 8B       IN A, (0x8B)       <--\               // SIO-0-K2C
06B9      CB 67       BIT 4, A              |               // bit 4 == 0
06BB      28 0A       JR Z, 0x0A  >---\     |               // ja
06BD      CD 25 08    CALL 0x0825     |     |               // nein: Lese Input SIO-0-K2C, Übergabe BC, Rückgabe BC, A, Flag NZ/Z
06C0      C8          RET Z           |     |               // Zerro Flag der vorherigen Funktion == 1?, Rücksprung
06C1      CD 33 08    CALL 0x0833     |     |               // SIO-0-K2C Lese Input, Rückgabe DE, A, NZ/Z
06C4      C8          RET Z           |     |               // Zerro Flag der vorherigen Funktion == 1?, Rücksprung
06C5      18 F0       JR 0xF0         |  >--/
06C7      06 C1       LD B, 0xC1  <---/
06C9      CD 57 08    CALL 0x0857                           // Ausgabe SIO-0-K2C = 0x03, "B"
06CC      21 08 0D    LD HL, 0x0D08                         // Daten, 0x16 für STZ?
06CF      36 16       LD M, 0x16
06D1      01 C8 00    LD BC, 0x00C8
06D4      F3          DI          <---\                     // Sperre INT, Eingabe gesperrt
06D5      D9          EXX             |                     // INT-Registersatz tauschen, BC/DE/HL
06D6      21 08 0D    LD HL, 0x0D08   |                     // HL = 0x0d08 für Alternativ-Register-Satz
06D9      D9          EXX             |                     // Alternativ-Registersatz tauschen, BC/DE/HL
06DA      FB          EI              |                     // INT Freigabe
06DB      CD 25 08    CALL 0x0825     |                     // Lese Input  PIO-1-B-C, Übergabe BC, Rückgabe BC, A,Flag NZ/Z
06DE      C8          RET Z           |                     // Zerro Flag der vorherigen Funktion == 1?, Rücksprung
06DF      CD 33 08    CALL 0x0833     |                     // PIO-1-A-C Lese Input, Rückgabe DE, A, NZ/Z
06E2      C8          RET Z           |                     // Zerro Flag der vorherigen Funktion == 1?, Rücksprung
06E3      3E 55       LD A, 0x55      |                     // STZ; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
06E5      BE          CPM             |
06E6      20 EC       JR NZ 0xEC  >---/                     // M != 0x55 wiederholen; Zeichen nach STZ?; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
06E8      A7          AND A                                 //
06E9      C9          RET

// Einsprung: Alternativregister umschalten, ?Blockchiffrierung?, Abfrage SIO-0-K2C
06EA      CD 86 06    CALL 0x0686                           // Inital Speichern Alternativregister Teil1, INT-gespeert
06ED      CD 8B 06    CALL 0x068B        <---\              // Inital Speichern Alternativregister Teil2
06F0      06 00       LD B, 0x00             |
06F1      CD 48 08    CALL 0x0848            |              // Ausgabe SIO-0-K2C = 0x05, "B"
06F4      3A 11 0D    LD A, (0x0D11)         |              // Status 0x0d11
06F7      A7          AND A                  |              // A == 0?
06F8      28 05       JR Z, 0x05  >---\      |              // A == 0
06FA      CD 5E 07    CALL 0x075E     |      |              // De- Chiffrierung; A == 1
06FD      18 ED       JR 0xED         |  >---+
                                      |      |
0700      DB 8B       IN A, (0x8B)<---/      |              // lese SIO-0-K2C
0702      CB 5F       BIT 3, A               |              // Bit 3 == 0
0704      28 E7       JR Z 0xE7          >---+              // ja
0706      CD B7 07    CALL 0x07B7            |              // nein: Warte STZ ab, danach Dechiffrierung
0709      18 E2       JR 0xE2            >---/

// Einsprung: Alternativregister umschalten, ?Blockchiffrierung?, Abfrage SIO-0-K2C
070B      CD 86 06    CALL 0x0686                           // Inital Speichern Alternativregister Teil1, INT-gespeert
070E      3E 02       LD A, 0x02       <--\
0710      D3 8B       OUT (0x8B), A       |                 // SIO-0-K2C, 0x02
0712      3E B0       LD A, 0xB0          |
0714      D3 8B       OUT (0x8B), A       |                 // SIO-0-K2C, 0xb0
0716      CD 8B 06    CALL 0x068B         |                 // Inital Speichern Alternativregister Teil2
0719      06 00       LD B, 0x00          |
071B      CD 43 08    CALL 0x0843         |                 // Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
071E      06 6A       LD B, 0x6A          |
0720      CD 48 08    CALL 0x0848         |                 // Ausgabe SIO-0-K2C = 0x05, "B"
0723      06 D3       LD B, 0xD3     <--\ |
0725      CD 57 08    CALL 0x0857       | |                 // Ausgabe SIO-0-K2C = 0x03, "B"
0728      3A 11 0D    LD A, (0x0D11)<\  | |                 // Status 0x0d11 = 0x00 ... 0x14
072B      A7          AND A          |  | |                 // A == 0
072C      20 2B       JR NZ 0x2B     |  | |   >---\         // Sprung: Blockchiffrierung?
072E      DB 8B       IN A, (0x8B)   |  | |       |         // Lese SIO-0-K2C
0730      CB 67       BIT 4, A       |  | |       |         // bit 4 == 0
0732      20 F4       JR NZ 0xF4  >--/  | |       |         // nein
0734      06 C1       LD B, 0xC1        | |       |         // ja
0736      CD 57 08    CALL 0x0857       | |       |         // Ausgabe SIO-0-K2C = 0x03, "B"
0739      21 08 0D    LD HL, 0x0D08     | |       |         // Daten, 0x16 für STZ
073C      36 16       LD M, 0x16        | |       |
073E      3A 11 0D    LD A, (0x0D11) <\ | |       |         // Status 0x0d11
0741      A7          AND A           | | |       |         // A == 0
0742      20 15       JR NZ, 0x15     | | |    >--+         // Sprung Blockchiffrierung?
0744      F3          DI              | | |       |         // Sperre INT, Eingabe gesperrt
0745      D9          EXX             | | |       |         // Alternativ-Registersatz tauschen, BC/DE/HL
0746      21 08 0D    LD HL, 0x0D08   | | |       |
0749      D9          EXX             | | |       |         // Alternativ-Registersatz tauschen, BC/DE/HL
074A      FB          EI              | | |       |         // INT Freigabe
074B      7E          LD A, M         | | |       |         // 0x0D11
074C      FE 16       CP 0x16         | | |       |
074E      28 EE       JR Z 0xEE    >--/ | |       |         // A == 0x16
0750      FE 55       CP 0x55           | |       |         // A == 0x55, STZ; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
0752      20 CF       JR NZ 0xCF      >-/ |       |         // nein
0754      CD BC 07    CALL 0x07BC         |       |         // Ja: Folge 0x16, 0x55; Warte STZ ab, danach De- Chiffrierung; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
0757      18 B5       JR 0xB5           >-+       |
0759      CD 5E 07    CALL 0x075E         |   <---/         // De- Chiffrierung
075C      18 B0       JR 0xB0           >-/

// Chiffrierung
075E      06 00       LD B, 0x00
0760      CD 57 08    CALL 0x0857                           // Ausgabe SIO-0-K2C = 0x03, "B"
0763      06 6A       LD B, 0x6A
0765      CD 48 08    CALL 0x0848                           // Ausgabe SIO-0-K2C = 0x05, "B"
0768      DB 8B       IN A, (0x8B) <-\                      // Lese SIO-0-K2C
076A      CB 6F       BIT 5, A       |                      // bit 5 == 0
076C      28 FA       JR Z, 0xFA  >--/                      // Flankenabfrage
076E      01 DC 05    LD BC, 0x05DC                         // ja, Zeitwert für Warteschleife
0771      CD 61 08    CALL 0x0861                           // Warteschleife; Übergabe BC
0774      AF          XOR A                                 // Lösche A, beeinflusse Flags
0775      32 10 0D    LD (0x0D10), A                        // Status 0x0d10
0778      21 F7 0C    LD HL, 0x0CF7                         // Start; letzte gebildete Wurmreihe
077B      11 00 0D    LD DE, 0x0D00                         // Daten, 64 Bit + 9.Byte
077E      01 09 00    LD BC, 0x0009                         // 9! Byte
0781      ED B0       LDIR                                  // Blockkopie (DE) = M, von 0x0cf7 nach 0x0d00 8 bytes
0783      3A 01 0D    LD A, (0x0D01)                        // kopiere Daten erstes byte nach 0x0d09
0786      32 09 0D    LD (0x0D09), A                        // Kopie (0x0d09) = (0x0d01) = (0x0cf8)
0789      3A 00 0D    LD A, (0x0D00)                        // Prüfbyte, aus 0x0cf7
078C      EE FF       XOR 0xFF                              // Inverse
078E      32 00 0D    LD (0x0D00), A                        // (0x0d00) = not (0x0d00)
0791      CD 98 05    CALL 0x0598                           // Initalisierung Wurmreihe/Dateneingabe für LAMBDA/ STZ-Kommando/Prüfsummen Wurmreihen
0794      3E 16       LD A, 0x16                            // STZ ?
0796      D3 89       OUT (0x89), A                         // SIO-0-K2CD
0798      CD 00 18    CALL 0x1800    <---\                  // LAMBDA über 0x2a00 Ein-Ausgabe 64bit; 0x2800 Rundenschlüssel
079B      3A 10 0D    LD A, (0x0D10)     |                  // Status 0x0d10
079E      CB 6F       BIT 5, A           |                  // bit 5 == 0
07A0      C0          RET NZ             |                  // nein
07A1      3A 10 0E    LD A, (0x0E10)     |                  // ja; Status 0x0e10 = 0x00, 0x08
07A4      A7          AND A              |                  // Prüfung auf 0x00; Flag N, C = 0; Zerro = 1 wenn A == 0x00
07A5      20 F4       JR NZ, 0xF4 >------+                  // == 0?
07A7      CD EE 08    CALL 0x08EE        |                  // XOR-Verknüpfung Wurmreihe XOR Daten
07AA      3A 11 0D    LD A, (0x0D11)     |                  // Schleifenzähler; Status 0x0d11 = 0x00 ... 0x14
07AD      3D          DEC A              |
07AE      32 11 0D    LD (0x0D11), A     |                  // Status 0x0d11 - 1
07B1      20 E5       JR NZ, 0xE5    >---/                  // Schleife bis Status 0x0d11 == 0
07B3      CD 22 06    CALL 0x0622                           // Rundenschlüssel mit Initalwert 0x87, Prüfe auf RAM1 und RAM2
07B6      C9          RET

// Warte STZ ab, danach Dechiffrierung
07B7      CD AC 06    CALL 0x06AC                           // Lese SIO-0-K2 bis 0x55 in 0x0d08; Abfrage STZ; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
07BA      28 3A       JR Z 0x3A     >---\                   // Zerro Flag der vorherigen Funktion == 1?, Sprung
                                        |
// Chiffrierung                         |
07BC      CD 38 05    CALL 0x0538       |                   // Kopiere Ein- Ausgabe LAMBDA von 0x0d08 nach 0x2A00
07BF      CD 00 18    CALL 0x1800       |   <---------\     // LAMBDA über 0x2a00 Ein-Ausgabe 64bit; 0x2800 Rundenschlüssel
07C2      21 10 0D    LD HL, 0x0D10     |             |     // Status 0x0d10
07C5      CB 5E       BIT 3, M     <--\ |             |     // bit 3 == 0
07C7      28 FC       JR Z, 0xFC   >--/ |             |     // ja durch INT verändert M, Tastendruck?
07C9      CB 9E       RES 3, M          |             |     // Lösche Bit 3
07CB      CB 66       BIT 4, M          |             |     // bit 4 == 0
07CD      20 27       JR NZ 0x27    >---+             |     // nein
07CF      CD 36 09    CALL 0x0936       |             |     // ja-> XOR 8 byte Block, (0x2a00++) = (0x2a00++) XOR (0x0d08--)n
07D2      3A 11 0E    LD A, (0x0E11)    |             |     // Status 0x0e11; Status; Werte 0x04, 0x05, 0x0e, 0x0f; 0x0e/0x0f Senden-Empfangen Speicherbereich
07D5      EE 01       XOR 0x01          |             |     // Flip bit 0, A = 0x04 wird 0x05, A = 0x0f wird 0x0e
07D7      32 11 0E    LD (0x0E11), A    |             |     // Switch 0x04<>0x05; 0x0e0<>0x0f; Status 0x0e11 = 0x04, 0x05, 0x0e oder 0x0f invertiert Bit 0
07DA      21 08 0E    LD HL, 0x0E08     |             |
07DD      11 08 0F    LD DE, 0x0F08     |             |
07E0      1A          LD A, (DE)        |      <--\   |
07E1      BE          CP M              |         |   |
07E2      20 0A       JR NZ, 0x0A       | >--\    |   |     // (DE) == M
07E4      2D          DEC L             |    |    |   |
07E5      1D          DEC E             |    |    |   |
07E6      20 F8       JR NZ 0xF8        |    | >--/   |
07E8      DB 8D       IN A, (0x8D)      |    |        |     // PIO-1-B-D Lese Tasteneingabe ANZEIGE, Schnittstellensignal DEE oder DÜE
07EA      CB D7       SET 2, A          |    |        |     // Bit 2 = 1
07EC      18 04       JR 0x04     >--\  |    |        |
07EE      DB 8D       IN A, (0x8D)   |  | <--/        |     // PIO-1-B-D Lese Tasteneingabe ANZEIGE; Schnittstellensignal DEE oder DÜE
07F0      CB 97       RES 2, A       |  |             |     // Bit 2 = 0
07F2      D3 8D       OUT (0x8D), A<-/  |             |     // PIO-1-B-D LED Ein/AUS; A1 und A2 Bit 0 und 2
07F4      18 C9       JR 0xC9           |    >-------/
07F6      DB 8B       IN A, (0x8B)  <---/                   // SIO-0-K2C Schnittstellensignal DEE oder DÜE
07F8      CB 67       BIT 4, A                              // bit 4 == 0
07FA      C0          RET NZ                                // nein
07FB      3E 14       LD A, 0x14                            // ja
07FD      32 11 0D    LD (0x0D11), A                        // Status 0x0d11 = 0x14
0800      C9          RET

// Initalwerte nach RAM1, CTC Zeitkonstante; Übergabe HL, Warte auf INT17
0801      22 E0 0C    LD (0x0CE0), HL                       // 0x0ce0 = M; Zeiger 0x0cee - abgelegt 9byte Wurm + Prüfbyte
0804      22 E2 0C    LD (0x0CE2), HL                       // 0x0ce2 = M; Zeiger 0x0cf7 - abgelegt 9byte Wurm + Prüfbyte
0807      3E 08       LD A, 0x08
0809      32 E4 0C    LD (0x0CE4), A                        // 0x0ce4 = 0x08; Schleifenvariable, Init = 8
080C      32 E9 0C    LD (0x0CE9), A                        // 0x0ce9 = 0x08; Schleifenvariable, Init = 8
080F      AF          XOR A                                 // Lösche A, beeinflusse Flags
0810      32 E6 0C    LD (0x0CE6), A                        // 0x0ce6 = 0x00
0813      3E 87       LD A, 0x87                            // EI, Zeitgeber, Vorteiler 16, neg. Flanke,Zeitkonst. Start, Zeitkonstante folgt, RESET
0815      D3 81       OUT (0x81), A                         // CTC Kanal 1 Zeitgeber
0817      3E 05       LD A, 0x05                            // Zeitkonstante = 5 * 16 / f in ms
0819      D3 81       OUT (0x81), A                         // CTC Kanal 1 Takt
081B      21 EC 0C    LD HL, 0x0CEC                         // RAM1
081E      36 40       LD M, 0x40                            // 0x0cec = 0x40
0820      CB 7E       BIT 7, M       <---\                  // Prüfe bit 7 (0x0cec)
0822      28 FC       JR Z, 0xFC     >---/                  // wiederhole bis INT Routine 17 den Wert in (0x0cec) beeinflust
0824      C9          RET                                   //

// Input PIO-1-B-C, Übergabe BC, Rückgabe A, BC
0825      DB 8B       IN A, (0x8B)                          // SIO-0-K2C
0827      CB 5F       BIT 3, A                              // Bit 3 == 0
0829      20 04       JR NZ, 0x04  >--\                     // nein
082B      0B          DEC BC          |                     // ja BC--
082C      78          LD A, B         |                     // A = B
082D      B1          OR C            |                     // A OR C
082E      C9          RET             |                     // Flag Z wird bei BC = 0 gesetzt, Rückgabe BC, A
                                      |
082F      01 C8 00    LD BC, 0x00C8 <-/
0832      C9          RET                                   // Rückgabe BC = 0x00c8 und A

// SIO-0-K1C Übergabe DE, Rückgabe A, DE
0833      DB 8A       IN A, (0x8A)                          // SIO-0-K1C Lese
0835      EE 08       XOR 0x08                              // toggel Bit 3 von A 0000 1000
0837      CB 5F       BIT 3, A                              // Bit 3 == 0
0839      20 04       JR NZ, 0x04  >---\                    // nein
083B      1B          DEC DE           |                    // ja
083C      7A          LD A, D          |                    // A = D
083D      B3          OR E             |                    // A = D or E
083E      C9          RET              |                    // SIO-0-K1C Rückgabewert DE, A und NZ/Z
                                       |
083F      11 14 00    LD DE, 0x0014  <-/
0842      C9          RET                                   // SIO-0-K1C Rückgabewert DE = 0x0014, A und NZ/Z

// Ausgabe SIO-0-K1C = 0x05, "B"; Übergabe B
0843      F3          DI                                    // Sperre INT, Eingabe gesperrt
0844      3E 05       LD A, 0x05
0846      18 08       JR 0x08   >---\
                                    |
// Ausgabe SIO-0-K2C = 0x05, "B"    |
0848      F3          DI            |                       // Sperre INT, Eingabe gesperrt
0849      3E 05       LD A, 0x05    |
084B      18 0D       JR 0x0D       |  >-\
                                    |    |
// Ausgabe SIO-0-K1C = 0x03, "B"    |    |
084D      F3          DI            |    |                  // Sperre INT, Eingabe gesperrt
084E      3E 03       LD A, 0x03    |    |
0850      D3 8A       OUT (0x8A),A </    |                  // SIO-0-K1C = 0x05 oder 0x03
0852      78          LD A, B            |
0853      D3 8A       OUT (0x8A), A      |                  // SIO-0-K1C
0855      FB          EI                 |                  // INT Freigabe
0856      C9          RET                |
                                         |
// Ausgabe SIO-0-K2C = 0x03, "B"         |
0857      F3          DI                 |                  // Sperre INT, Eingabe gesperrt
0858      3E 03       LD A, 0x03         |
085A      D3 8B       OUT (0x8B), A    <-/                  // SIO-0-K2C 0x05 oder 0x03
085C      78          LD A, B
085D      D3 8B       OUT (0x8B), A                         // SIO-0-K2C
085F      FB          EI                                    // INT Freigabe
0860      C9          RET

// Warteschleife; Übergabe BC
0861      F5          PUSH AF                               // Rette AF
0862      0B          DEC BC      <---\
0863      AF          XOR A           |                     // Lösche A, beeinflusse Flags
0864      B0          OR B            |
0865      B1          OR C            |
0866      20 FA       JR NZ, 0xFA  >--/                     // BC 0 erreicht?
0868      F1          POP AF                                // Stelle AF wieder her
0869      C9          RET

// Fehlerbehandlungsroutine:
086A      3E 02       LD A, 0x02
086C      D3 85       OUT (0x85), A                         // PI0-0-B-D
086E      16 02       LD D, 0x02
0870      3E 05       LD A, 0x05     <---\                  // Kanal 5
0872      D3 8B       OUT (0x8B), A      |                  // SIO-0-K2C
0874      3E 02       LD A, 0x02         |
0876      D3 8B       OUT (0x8B), A      |                  // SIO-0-K2C
0878      01 E8 03    LD BC, 0x03E8      |
087B      0B          DEC BC        <--\ |                  // Zeitschleife 1/3 sec
087C      AF          XOR A            | |                  // Lösche A, beeinflusse Flags
087D      B0          OR B             | |
087E      B1          OR C             | |
087F      20 FA       JR NZ, 0xFA   >--/ |
0881      3E 05       LD A, 0x05         |                  // Kanal 5
0883      D3 8B       OUT (0x8B), A      |                  // SIO-0-K2C
0885      3E 00       LD A, 0x00         |
0887      D3 8B       OUT (0x8B), A      |                  // SIO-0-K2C
0889      01 00 02    LD BC, 0x0200      |
088C      0B          DEC BC        <--\ |                  // Zeitschleife 1/4 sec
088D      AF          XOR A            | |                  // Lösche A, beeinflusse Flags
088E      B0          OR B             | |
088F      B1          OR C             | |
0890      20 FA       JR NZ, 0xFA   >--/ |
0892      15          DEC D              |
0893      20 DB       JR NZ, 0xDB   >----/
0895      F3          DI                                    // Sperre INT, Eingabe gesperrt
0896      76          HALT                                  // Fehler? Kann durch NMI oder Reset aus dem HALT geholt werden

// Fehler Systemhalt
0897      F3          DI                                    // Sperre INT, Eingabe gesperrt
0898      3E 17       LD A, 0x17                            // DI, Zeigeber, Vorteiler 16, neg. Flanke, Zeitgeberkonst. Start, Zeitkonstante folgt, RESET
089A      D3 80       OUT (0x80), A                         // CTC Kanal 0 Zeitgber
089C      3E 20       LD A, 0x20                            // Zeitgeberkonstante = 32 * 16 / f in ms
089E      D3 80       OUT (0x80), A                         // CTC Kanal 0 Takt
08A0      3E 06       LD A, 0x06
08A2      D3 85       OUT (0x85), A                         // PI0-0-B-D
08A4      AF          XOR A                                 // Lösche A, beeinflusse Flags
08A5      D3 8D       OUT (0x8D), A                         // PIO-1-B-D LED AUS; A1 und A2 Bit 4 und 3
08A7      DB 8C       IN A, (0x8C)                          // PIO-1-A-D
08A9      E6 20       AND 0x20                              // Maskiere Bit 5
08AB      20 12       JR NZ 0x12  >--\                      // Bit 5 == 1
08AD      3E 05       LD A, 0x05      |                     // Routine Bit 5 == 0
08AF      D3 8B       OUT (0x8B), A   |                     // SIO-0-K2C
08B1      3E 68       LD A, 0x68      |
08B3      D3 8B       OUT (0x8B), A   |                     // SIO-0-K2C
08B5      3E 05       LD A, 0x05      |
08B7      D3 8A       OUT (0x8A), A   |                     // SIO-0-K1C
08B9      3E 68       LD A, 0x68      |
08BB      D3 8A       OUT (0x8A), A   |                     // SIO-0-K1C
08BD      18 10       JR 0x10         |  >--\               // Bit 5 == 0
08BF      3E 05       LD A, 0x05   <--/     |               // Kanal 5
08C1      D3 8B       OUT (0x8B), A         |               // SIO-0-K2C
08C3      3E 6A       LD A, 0x6A            |               // SIO-0-K1C
08C5      D3 8B       OUT (0x8B), A         |               // SIO-0-K2C
08C7      3E 05       LD A, 0x05            |               // Kanal 5
08C9      D3 8A       OUT (0x8A), A         |               // SIO-0-K1C
08CB      3E EA       LD A, 0xEA            |
08CD      D3 8A       OUT (0x8A), A         |               // SIO-0-K1C
08CF      21 E6 08    LD HL, 0x08E6      <--/               // Datenbereich 0x08E6 Intitialisierung mittes OTIR
08D2      06 08       LD B, 0x08                            // 8 Byte Länge
08D4      0E 8B       LD C, 0x8B                            // SIO-0-K2C
08D6      ED B3       OTIR                                  // Datenblock -> SIO-0-K2C Ausgabe
08D8      DB 8C       IN A, (0x8C)                          // PIO-1-A-D
08DA      E6 20       AND 0x20                              // Bit 5 Maskieren
08DC      06 28       LD B, 0x28
08DE      28 02       JR Z, 0x02   >---\                    // Bit 5 == 1 gebe (SIO-0-K2C) = 0x028 aus
08E0      06 2A       LD B, 0x2A       |                    // Bit 5 == 0 gebe (SIO-0-K2C) = 0x02a aus
08E2      ED 41       OUT (C), B   <---/
08E4      F3          DI                                    // Sperre INT, Eingabe gesperrt
08E5      76          HALT                                  // ?Hardware? - Fehler? Kann durch NMI oder Reset aus dem HALT geholt werden

// Datenbereich für SIO-0-K2C Steuerbytes = 8
08E6      18 04 10 06 AA 07 AA 05                           //

// XOR-Verknüpfung Wurmreihe XOR Daten
08EE      21 00 2A    LD HL, 0x2A00                         // Ein- Ausgabe LAMBDA, Wurmreihen
08F1      01 0D 0D    LD BC, 0x0D0D                         // Daten Start
08F4      3A 11 0E    LD A, (0x0E11)                        // Status 0x0e11 0x0e, 0x0f-> Senden/Empfangen
08F7      57          LD D, A                               // 0x0e oder 0x0f
08F8      1E 08       LD E, 0x08                            // DE = 0x0e08 oder 0x0f08; Ablageort Chiffrat und Schleifenzähler 8byte
08FA      0A          LD A, (BC)     <--\                   // A = (0x0d0d)
08FB      AE          XOR M             |                   // Daten XOR Wurmreihe
08FC      12          LD (DE), A        |                   // Kopie in (DE) abgelegt 0x0e00+n 0x0f00+n
08FD      77          LD M, A           |                   // Ein- Ausgabe LAMBDA
08FE      0D          DEC C             |                   // 0x0d0d--
08FF      2C          INC L             |                   // 0x2a00++ (E schleifenzähler)
0900      1D          DEC E             |                   // von 0x0e08 bis 0x0e01; 0x2A00 - 0x2A07; 0x0d0d - 0x0d05
0901      20 F7       JR NZ, 0xF7    >--/                   // 8 Bytes ablegen, XOR verknüft
0903      3E 08       LD A, 0x08
0905      32 10 0E    LD (0x0E10), A                        // Status 0x0e10 = 0x08
0908      3A 00 0D    LD A, (0x0D00)                        // Daten
090B      21 08 2A    LD HL, 0x2A08                         // Prüfbyte mit letztem Wert
090E      AE          XOR M                                 // (0x0d00) XOR (0x2a08)
090F      12          LD (DE), A                            // (DE = 0x0e00) = A
0910      EE FF       XOR 0xFF                              // invertiert A
0912      77          LD M, A                               // (0x2a08) = NOT(DE)
0913      21 00 2A    LD HL, 0x2A00                         // Ein- Ausgabe LAMBDA, Wurmreihen mit Prüfbyte
0916      11 EE 0C    LD DE, 0x0CEE                         // von 0x2a00 nach 0x0cee kopierte 9! byte
0919      01 09 00    LD BC, 0x0009                         // Schleifenzähler = 9!
091C      F3          DI                                    // Interrupt verbieten
091D      ED B0       LDIR                                  // Blockkopie 9! bytes, von 0x2a00 nach 0x0cee
091F      FB          EI                                    // INT Freigabe
0920      21 01 0D    LD HL, 0x0D01                         // Daten 0x0d01 - 0x0d05
0923      11 09 0D    LD DE, 0x0D09                         // Ziel 0x0d09 - 0x0d0d
0926      01 05 00    LD BC, 0x0005                         // Schleifenzähler = 5
0929      ED B0       LDIR                                  // Blockkopie 5 bytes, (DE) = M
092B      21 00 0C    LD HL, 0x0C00
092E      3E 45       LD A, 0x45
0930      AE          XOR M                                 // 0x45 XOR (0x0c00) System-Signal
0931      C2 40 01    JP NZ, 0x0140                         // 0x0c00 != 0x45 ERROR LED Blinken
0934      77          LD M, A                               // (0x0c00) = A = 0x45
0935      C9          RET

// XOR 8 byte Block, (0x2a00++) = (0x2a00++) XOR (0x0d08--)
0936      3A 11 0E    LD A, (0x0E11)                        // Status 0x0e11; 0x0e, 0x0f
0939      57          LD D, A
093A      1E 08       LD E, 0x08                            // DE = 0x0e08 oder 0x0f08
093C      7B          LD A, E                               // A = 0x08
093D      32 10 0E    LD (0x0E10), A                        // Status 0x0e10 = 0x08
0940      21 00 2A    LD HL, 0x2A00                         // Ein- Ausgabe LAMBDA, Wurmreihen
0943      01 08 0D    LD BC, 0x0D08                         // Daten
0946      0A          LD A, (BC)    <-\                     // Hole Byte
0947      AE          XOR M           |                     // (0x0d08+x) XOR (0x2a00+x)
0948      12          LD (DE), A      |                     // (DE) = (BC) XOR M
0949      0A          LD A, (BC)      |                     //
094A      77          LD M, A         |                     // M = (BC)
094B      2C          INC L           |                     // 0x2a01 ...
094C      1D          DEC E           |                     // 0x0e07 ...
094D      0D          DEC C           |                     // 0x0d07 ...
094E      20 F6       JR NZ 0xF6    >-/                     // bis C == 0
0950      C9          RET                                   // 8 byte chiffriert

INT-Routine 7: Lese SIO-0-K1D Empfange Daten, bis 0x2aff gefüllt ist
0951      08          EX AF, AF'                            // INT-Registersatz, AF
0952      D9          EXX                                   // INT-Registersatz, BC/DE/HL
0953      3A 11 0D    LD A, (0x0D11)                        // Status 0x0d11
0956      A7          AND A                                 // abfrage auf 0
0957      28 29       JR Z 0x29        >----\               // A == 0 Sprung, Lese SIO-0-Input
0959      3A 10 0D    LD A, (0x0D10)        |               // Status 0x0d10
095C      CB 5F       BIT 3, A              |
095E      20 22       JR NZ, 0x22      >----+               // Bit 3 == 1 Sprung
0960      DB 88       IN A, (0x88)          |               // SIO-0-K1D Input
0962      77          LD M, A               |               // (0x2A00) = Input
0963      2D          DEC L                 |               // L--, M 0x2A00 ... 0x2AFF als Ringspeicher
0964      28 05       JR Z, 0x05    >---\   |               // HL == 0x2A00
0966      08          EX AF, AF'        |   |  <-\          // Alternativ-Registersatz tauschen, AF
0967      D9          EXX               |   |    |          // Alternativ-Registersatz tauschen, BC/DE/HL
0968      FB          EI                |   |    |          // INT Freigabe
0969      ED 4D       RETI              |   |    |          // Return, Beende INT Routine
                                        |   |    |
096B      2E 10       LD L, 0x10    <---+   |    |          // HL != 0x2A00, HL = 0x2A10
096D      CB DE       SET 3, M          |   |    |          // Bit 3 (0x2A10), wenn 0x00 dann 0x08
096F      2E 0D       LD L, 0x0D        |   |    |          // 0x2A0D
0971      3E FF       LD A, 0xFF        |   |    |          // A = 0xff
0973      C5          PUSH BC           |   |    |
0974      06 08       LD B, 0x08        |   |    |          // Länge 8
0976      AE          XOR M       <--\  |   |    |          // A = NOT (HL + x); 0x2a0d bis 0x2a06
0977      2D          DEC L          |  |   |    |
0978      10 FC       DJNZ 0xFC   >--/  |   |    |          // 8 bytes
097A      32 00 0D    LD (0x0D00), A    |   |    |          // Ergebnis in 0x0d00 ablegen
097D      C1          POP BC            |   |    |
097E      2E 08       LD L, 0x08        |   |    |          // HL = 0x2a08
0980      18 E4       JR 0xE4           |   |  >-+          // RETI
0982      DB 88       IN A, (0x88)      | </     |          // SIO-0-K1D Input
0984      18 E0       JR 0xE0           |      >-/          // RETI
                                        |
INT Routine NR. 15                      |                   //springt in INT-7 ließt SIO-0-K1D oder schreibt 0x16 in 0x0f01 bis 0x0f10
0986      08          EX AF, AF'        |                   // INT-Registersatz, AF
0987      D9          EXX               |                   // INT-Registersatz, BC/DE/HL
0988      3A 10 0D    LD A, (0x0D10)    |                   // Status 0x0d10
098B      CB 47       BIT 0, A          |                   //
098D      20 CD       JR NZ 0xCD  >-----/                   // Bit 0 == 1
098F      DB 88       IN A, (0x88)                          // SIO-0-K1D Bit 0 == 0
0991      FE FF       CP 0xFF                               // vergleiche auf 0xff
0993      20 05       JR NZ 0x05       >--\                 // Input == 0xff
0995      08          EX AF, AF'          |                 // Alternativ-Registersatz tauschen, AF, Input != 0xff
0996      D9          EXX                 |                 // Alternativ-Registersatz tauschen, BC/DE/HL
0997      FB          EI                  |                 // INT Freigabe
0998      ED 4D       RETI                |                 // Return Interruptprogramm Modus 2
                                          |
099A      32 09 0D    LD (0x0D09), A   <--/                 // Input == 0xff, rette A in 0x0d09
099D      3E 16       LD A, 0x16
099F      11 01 0F    LD DE, 0x0F01
09A2      06 0F       LD B, 0x0F                            // Länge 0x0f
09A4      12          LD (DE), A  <--\                      // (0x0f01) = 0x16
09A5      13          INC DE         |                      // 0x0f01+1
09A6      10 FC       DJNZ 0xFC    >--                      // (0x0f01) ... (0x0fff) = 0x16 fülle Stack mit 0x16
09A8      31 00 10    LD SP, 0x1000                         // Stackpointer = 0x1000 bis 0x0e00; geradebiegen des Stackpointers
09AB      21 77 04    LD HL, 0x0477                         // Einsprungadresse für SIO-0-K2 Intialisierung
09AE      E5          PUSH HL                               // (0x0ffe) = 77, (0x0fff) = 04
09AF      21 08 0D    LD HL, 0x0D08                         // Daten byte 1
09B2      08          EX AF, AF'                            // Alternativ-Registersatz tauschen, AF
09B3      D9          EXX                                   // Alternativ-Registersatz tauschen, BC/DE/HL
09B4      ED 4D       RETI                                  // Return Interruptprogramm Modus 2

// INT Routine NR. 3 Lese SIO-0-K2CD, 256 byte, Vergleiche (HL) Inhalte
09B6      08          EX AF, AF'                            // INT-Registersatz, AF
09B7      D9          EXX                                   // INT-Registersatz, BC/DE/HL
09B8      DB 89       IN A, (0x89)                          // SIO-0-K2CD
09BA      77          LD M, A                               // lege in 0x???? ab
09BB      2D          DEC L                                 // L - 1, Ringspeicher 0x00 ... 0xff
09BC      28 05       JR Z, 0x05   >--\                     // L == 00
09BE      08          EX AF, AF'      |                     // Alternativ-Registersatz tauschen, AF
09BF      D9          EXX             |                     // Alternativ-Registersatz tauschen, BC/DE/HL
09C0      FB          EI              |                     // INT Freigabe
09C1      ED 4D       RETI            |                     // Return, Beende INT Routine
                                      |
09C3      2E 08       LD L, 0x08  <---+
09C5      7E          LD A, M         |
09C6      2D          DEC L           |                     // 0xYY07
09C7      BE          CP M            |                     // Vergleich HL == HL + 1; HL != HL + 1
09C8      06 05       LD B, 0x05      |                     // Länge 5
09CA      28 02       JR Z, 0x02      |     >--------\      // L --
09CC      2D          DEC L           |              |      // L --
09CD      7E          LD A, M         |              |
09CE      2D          DEC L           |    <---------+      // HL != HL + 1 dann L + 2 sonst L + 1
09CF      28 09       JR Z, 0x09      |     >--\     |      // L == 0, Abbruch
09D1      BE          CP M            |        |     |
09D2      20 FA       JR NZ, 0xFA     |        | >---+      // L--
09D4      10 F8       DJNZ 0xF8       |        | >---/      // BC--
09D6      2E 10       LD L, 0x10      |        |
09D8      CB E6       SET 4, M        |        |
09DA      2E 10       LD L, 0x10      |     <--/
09DC      CB DE       SET 3, M        |
09DE      3A 01 0D    LD A, (0x0D01)  |
09E1      F6 20       OR 0x20         |                      // Bit 6 setzen
09E3      47          LD B, A         |
09E4      2E 08       LD L, 0x08      |
09E6      08          EX AF, AF'      |                      // Alternativ-Registersatz tauschen, AF
09E7      D9          EXX             |                      // Alternativ-Registersatz tauschen, BC/DE/HL
09E8      FB          EI              |                      // INT Freigabe
09E9      ED 4D       RETI            |                      // Return, Beende INT Routine
                                      |
INT Routine NR. 11                    |                     // Einsprung INT-3, Lese SIO-0-K2CD, Prüfe Startfolge; Übergabe SIO-0-K2C
09EB      08          EX AF, AF'      |                     // INT-Registersatz, AF
09EC      D9          EXX             |                     // INT-Registersatz, BC/DE/HL
09ED      3A 10 0D    LD A, (0x0D10)  |                     // Status 0x0d10
09F0      CB 4F       BIT 1, A        |                     // Bit A == 0
09F2      20 C4       JR NZ 0xC4   >--/                     // nein
09F4      CB 57       BIT 2, A                              // Ja, Bit 2 == 0
09F6      DB 89       IN A,(0x89)                           // SIO-0-K2CD
09F8      28 2B       JR Z, 0x2B   >--\                     // ja
09FA      FE 55       CP 0x55         |                     // Input = 0x55; STZ?; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
09FC      28 34       JR Z 0x34       | >-\                 // ja
09FE      E5          PUSH HL         |   |                 // nein
09FF      2A F5 0E    LD HL, (0x0EF5) |   |                 // Starbereich STZ-Folge?
0A02      BE          CP M            |   |                 // A == M
0A03      28 0C       JR Z 0x0C       |   | >-\             // ja
0A05      3E 55       LD A, 0x55      |   |   |             // STZ; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
0A07      BE          CP M            |   |   |             // M == 0x55; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
0A08      28 17       JR Z, 0x17      |   |   |      >-\    // ja
0A0A      3A 10 0D    LD A, (0x0D10)  |   |   |        |    // nein Status 0x0d10
0A0D      C6 40       ADD A, 0x40     |   |   |        |    // A = 0x40 + Status 0x0d10
0A0F      18 05       JR 0x05         |   |   | >-\    |
                                      |   |   |   |    |
0A11      3A 10 0D    LD A, (0x0D10)  |   | <-/   |    |    // Status 0x0d10
0A14      E6 3F       AND 0x3F        |   |       |    |    // Maske 0011 1111 (7bit)
0A16      32 10 0D    LD (0x0D10), A  |   |     <-+    |    // Status 0x0d10
0A19      36 55       LD M, 0x55      |   |       |    |    // STZ; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
0A1B      2C          INC L           |   |       |    |
0A1C      20 03       JR NZ, 0x03     |   |       | >--+    // STZ gefunden
0A1E      21 F7 0E    LD HL, 0x0EF7   |   |       |    |    // Ansonsten Zeigerkopie?
0A21      22 F5 0E    LD (0x0EF5), HL |   |       |  <-/    // Startbereich STZ-Folge?
0A24      E1          POP HL          |   |       |
0A25      3E 03       LD A, 0x03  <---/   |       |
0A27      D3 8B       OUT (0x8B), A       |       |         // SIO-0-K2C
0A29      3E D3       LD A, 0xD3          |       |
0A2B      D3 8B       OUT (0x8B), A       |       |         // SIO-0-K2C
0A2D      08          EX AF, AF'          |       |         // Alternativ-Registersatz tauschen, AF
0A2E      D9          EXX                 |       |         // Alternativ-Registersatz tauschen, BC/DE/HL
0A2F      FB          EI                  |       |         // INT Freigabe
0A30      ED 4D       RETI                |       |         // Return Interrupt
                                          |       |
0A32      06 16       LD B, 0x16   <------/       |
0A34      31 00 10    LD SP, 0x1000               |         // Setzte Stackpointer auf 0x1000; geradebiegen des Stackpointers
0A37      21 99 04    LD HL, 0x0499               |         // HL = 0x0499
0A3A      E5          PUSH HL                     |         // Rette HL (in 0x0fff)
0A3B      08          EX AF, AF'                  |         // Alternativ-Registersatz tauschen, AF
0A3C      D9          EXX                         |         // Alternativ-Registersatz tauschen, BC/DE/HL
0A3D      ED 4D       RETI                        |         // Return, Beende INT Routine
                                                  |
// INT Routine NR. 5                              |         // Einsprung INT 11, 3; Ausgabe SIO-0-K1D
0A3F      08          EX AF, AF'                  |         // INT-Registersatz, AF
0A40      D9          EXX                         |         // INT-Registersatz, BC/DE/HL
0A41      1D          DEC E                       |
0A42      28 08       JR Z, 0x08    >-\           |         // E == 0
0A44      1A          LD A, (DE)      |           |         // E == 1
0A45      D3 88       OUT (0x88), A   |           |         // SIO-0-K1D
0A47      08          EX AF, AF'      |           |         // Alternativ-Registersatz tauschen, AF
0A48      D9          EXX             |           |         // Alternativ-Registersatz tauschen, BC/DE/HL
0A49      FB          EI              |           |         // INT Freigabe
0A4A      ED 4D       RETI            |           |         // Return, Ende INT Routine
                                      |           |
0A4C      3A 10 0E    LD A, (0x0E10)<-+           |         // Status 0x0e10 = 0x04, 0x05, 0x08, 0x0e, 0x0f
0A4F      A7          AND A           |           |         // Vergleich auf (0x0e10) == 0x00
0A50      28 0E       JR Z 0x0E       |  >-\      |         // Status 0x0e10 == 0
0A52      5F          LD E, A         |    |      |         // Status 0x0e10 = 0x04, 0x05, 0x08, 0x0e, 0x0f
0A53      7A          LD A, D         |    |      |
0A54      32 11 0E    LD (0x0E11), A  |    |      |         // Status 0x0e11 = "D"
0A57      EE 01       XOR 0x01        |    |      |         // toggle Bit 0 (0x05 oder 0x0e)
0A59      57          LD D, A         |    |      |         // Rette A
0A5A      AF          XOR A           |    |      |         // Lösche A, beeinflusse Flags
0A5B      32 10 0E    LD (0x0E10), A  |    |      |         // Status 0x0e10 = 0x00
0A5E      18 E4       JR 0xE4         |    |    >-/         // goto 0x0a16
                                      |    |
0A60      3A 10 0D    LD A, (0x0D10)  |  <-+                // Status 0x0d10
0A63      CB EF       SET 5, A        |    |                // Bit 5 = 1
0A65      32 10 0D    LD (0x0D10), A  |    |                // Status 0x0d10 = 0x10 ... 0x1f, 0x30 ... 0x3f
0A68      3E 28       LD A, 0x28      |    |
0A6A      D3 8A       OUT (0x8A), A   |    |                // SIO-0-K1C
0A6C      18 D9       JR 0xD9   >-----/    |                // goto 0x0a4c
                                           |
// INT Routine NR. 13                      |                // Einsprung INT-5, 11, 3; Ausgabe SIO-0-K1C
0A6E      08          EX AF, AF'           |                // INT-Registersatz, AF
0A6F      D9          EXX                  |                // INT-Registersatz, BC/DE/HL
0A70      3A 10 0D    LD A, (0x0D10)       |                // Status 0x0d10
0A73      CB 4F       BIT 1, A             |
0A75      20 CA       JR NZ 0xCA      >----/                // Bit 1 == 0 goto 0x0a60
0A77      3E 28       LD A, 0x28                            // Bit 1 == 1
0A79      D3 8A       OUT (0x8A), A                         // SIO-0-K1C
0A7B      08          EX AF, AF'                            // Alternativ-Registersatz tauschen, AF
0A7C      D9          EXX                                   // Alternativ-Registersatz tauschen, BC/DE/HL
0A7D      FB          EI                                    // INT Freigabe
0A7E      ED 4D       RETI                                  // Return,  beende INT Routine

// INT Routine Nr. 1: Ausgabe SIO-0-K2CD
0A80      08          EX AF, AF'                            // INT-Registersatz, AF
0A81      D9          EXX                                   // INT-Registersatz, BC/DE/HL
0A82      1D          DEC E                                 // E - 1
0A83      28 0C       JR Z,0x0C   >---\                     // E == 0x00; Error
0A85      CB CA       SET 1, D        |    <-------\        // E  > 0x00, D Bit 1 = 1
0A87      1A          LD A, (DE)      |            |
0A88      D3 89       OUT (0x89), A   |            |        // SIO-0-K2CD
0A8A      A9          XOR C           |            |        // (DE) XOR C
0A8B      4F          LD C, A         |            |        // C = (DE) XOR C
0A8C      08          EX AF, AF'      |    <---\   |        // Alternativ-Registersatz tauschen, AF
0A8D      D9          EXX             |        |   |        // Alternativ-Registersatz tauschen, BC/DE/HL
0A8E      FB          EI              |        |   |        // INT Freigabe
0A8F      ED 4D       RETI            |        |   |        // Return, beende INT Routine
ERROR                                 |        |   |
0A91      1A          LD A, (DE)  <---/        |   |
0A92      A9          XOR C                    |   |        // A = (DE) XOR C
0A93      EE FF       XOR 0xFF                 |   |        // A = NOT ((DE) XOR C)
0A95      4F          LD C, A                  |   |        // C = NOT ((DE) XOR C)
0A96      C2 40 01    JP 0x0140                |   |        // ERROR LED Blinken
                                               |   |
0A99      EE FF       XOR 0xFF                 |   |        // NOT A
0A9B      20 03       JR NZ, 0x03   >---\      |   |        // A == 0x00
0A9D      C3 40 01    JP 0x0140         |      |   |        // A  > 0x00 ERROR LED Blinken
Einsprung aus INT-9                     |      |   |        // Rückgabe DE 0x0Enn, 0x0fnn
0AA0      3A 10 0E    LD A, (0x0E10) <--/      |   |        // Status 0x0e10
0AA3      A7          AND A                    |   |        // (0x0e10) == 0?
0AA4      28 10       JR Z, 0x10    >---\      |   |        // Status 0x0e10 == 0x00
0AA6      5F          LD E, A           |      |   |        // Status 0x0e10 > 0x00
0AA7      3A 11 0E    LD A, (0x0E11)    |      |   |        // Status 0x0e11; 0x0e, 0x0f
0AAA      57          LD D, A           |      |   |        // DE 0x0Enn 0x0Fnn
0AAB      EE 01       XOR 0x01          |      |   |        // Switch 0x0e<>0x0f;
0AAD      32 11 0E    LD (0x0E11), A    |      |   |        // Switch 0x0e<>0x0f; Status 0x0e11; 0x04, 0x05, 0x0e, 0x0f
0AB0      AF          XOR A             |      |   |        // A = 0
0AB1      32 10 0E    LD (0x0E10), A    |      |   |        // Status 0x0e10 = 0x00
0AB4      18 CF       JR 0xCF           |      | >-+
                                        |      |   |
0AB6      3A 10 0D    LD A, (0x0D10) <--/      |   |        // Status 0x0d10
0AB9      CB EF       SET 5, A                 |   |        // Bit 5 = 1
0ABB      32 10 0D    LD (0x0D10), A           |   |        // Status 0x0d10 = 0x10 ... 0x1f, 0x30 ... 0x3f
0ABE      3E 28       LD A, 0x28               |   |
0AC0      D3 8B       OUT (0x8B),A             |   |        // SIO-0-K2C
0AC2      18 C8       JR 0xC8                >-/   |
                                                   |
// INT Routine Nr. 9                               |        // läuft in INT-1 weiter, oder ERROR
0AC4      08          EX AF, AF'                   |        // INT-Registersatz, AF
0AC5      D9          EXX                          |        // INT-Registersatz, BC/DE/HL
0AC6      3A 10 0D    LD A, (0x0D10)               |        // Status 0x0d10
0AC9      CB 47       Bit 0, A                     |
0ACB      28 34       JR Z, 0x34   >--\            |        // Status 0x0d10 Bit 0 == 0
0ACD      1D          DEC E           |            |        // Status 0x0d10 Bit 0 == 1
0ACE      20 B5       JR NZ, 0xB5     |    >-------/        // E != 0x00 nach INT-Nr.1
0AD0      1A          LD A, (DE)      |                     // E == 0x00
0AD1      A9          XOR C           |                     // A = A XOR C
0AD2      EE FF       XOR 0xFF        |                     // Invers
0AD4      4F          LD C, A         |                     // C = NOT (A XOR C)
0AD5      C2 40 01    JP 0x0140       |                     // ERROR LED Blinken
                                      |
0AD8      EE FF       XOR 0xFF        |                     // NOT A, prüfe auf != 0xff
0ADA      20 03       JR NZ, 0x03     |    >---\            // A != 0xff
0ADC      C3 40 01    JP 0x0140       |        |            // A == 0xff ERROR LED Blinken
                                      |        |
0ADF      1C          INC E           |    <---/            // A != 0xff
0AE0      1A          LD A, (DE)      |
0AE1      F6 20       OR 0x20         |                     // A Bit 5 wird gesetzt
0AE3      16 0E       LD D, 0x0E      |
0AE5      58          LD E, B         |
0AE6      47          LD B, A         |
0AE7      1A          LD A, (DE)      |
0AE8      FE 55       CP 0x55         |                     // STZ; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
0AEA      28 0A       JR Z, 0x0A      |    >---\            // (DE) == 0x55; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
0AEC      3A 10 0D    LD A, (0x0D10)  |        |            // (DE) != 0x55; Status 0x0d10; ist die SyncF korrekt wird LED 109.1 Signal eingeschaltet
0AEF      CB FF       SET 7, A        |        |            // RAM Wert: 0x80 ... 0xff
0AF1      32 10 0D    LD (0x0D10), A  |        |            // Status 0x0d10
0AF4      18 08       JR 0x08         |        | >---\
                                      |        |     |
0AF6      78          LD A, B         |     <--/     |
0AF7      12          LD (DE), A      |              |
0AF8      43          LD B, E         |              |
0AF9      04          INC B           |              |      // B++, Zerro Flag wenn B == 0x00 wird
0AFA      20 02       JR NZ, 0x02     |        >-----+      // B != 0xFF
0AFC      06 F7       LD B, 0xF7      |              |      // B == 0xFF, B = 0xf7
0AFE      C3 A0 0A    JP 0x0AA0       |          <---/      // weiter bei 0x0aa0, INT-1
                                      |
0B01      78          LD A, B      <--/
0B02      D3 89       OUT (0x89), A                         // SIO-0-K2CD
0B04      06 16       LD B, 0x16
0B06      08          EX AF, AF'                            // Alternativ-Registersatz tauschen, AF
0B07      D9          EXX                                   // Alternativ-Registersatz tauschen, BC/DE/HL
0B08      FB          EI                                    // INT Freigabe
0B09      ED 4D       RETI                                  // Return, beende INT Routine

// INT Progr Nr. 6 SIO-K1C
0B0B      08          EX AF, AF'                            // INT-Registersatz, AF
0B0C      DB 8A       IN A, (0x8A)                          // SIO-0-K1C
0B0E      18 1E       JR 0x1E      >--\
                                      |
// INT Progr Nr. 2 SIO-K2C            |
0B10      08          EX AF, AF'      |                     // INT-Registersatz, AF
0B11      DB 8B       IN A, (0x8B)    |                     // SIO-0-K2C
0B13      18 30       JR 0x30         |   >--\
                                      |      |
// INT Progr Nr. 8 und 16 SIO-K1C     |      |
0B15      08          EX AF, AF'      |      |              // INT-Registersatz, AF
0B16      3E 30       LD A, 0x30      |      |              // SIO-0-K1C Ausgabe
0B18      18 16       JR 0x16         |      |  >---\
                                      |      |
// INT Progr Nr. 4 und 12 SIO-K2C     |      |      |
0B1A      08          EX AF, AF'      |      |      |       // INT-Registersatz, AF
0B1B      3E 30       LD A, 0x30      |      |      |       // SIO-0-K2C Ausgabe
0B1D      18 28       JR 0x28         |      |      |  >-\
                                      |      |      |    |
// INT Routine NR. 14 SIO-K1C         |      |      |    |
0B1F      08          EX AF, AF'      |      |      |    |  // INT-Registersatz, AF
0B20      DB 8A       IN A, (0x8A)    |      |      |    |  // SIO-0-K1C
0B22      CB 67       BIT 4, A        |      |      |    |
0B24      20 08       JR NZ, 0x08   >-+      |      |    |  // Bit 4 == 1
0B26      3E 03       LD A, 0x03      |      |      |    |  // Bit 4 == 0
0B28      D3 8A       OUT (0x8A), A   |      |      |    |  // SIO-0-K1C
0B2A      3E C3       LD A, 0xC3      |      |      |    |
0B2C      D3 8A       OUT (0x8A), A   |      |      |    |  // SIO-0-K1C
0B2E      3E 10       LD A, 0x10    <-/      |      |    |
0B30      D3 8A       OUT (0x8A), A          |  <---/    |  // SIO-0-K1C
0B32      08          EX AF, AF'             |           |  // Alternativ-Registersatz tauschen, AF
0B33      FB          EI                     |           |  // INT Freigabe
0B34      ED 4D       RETI                   |           |  // Return, Beende INT Routine
                                             |           |
// INT Routine NR. 10 SIO-K2C                |           |
0B36      08          EX AF, AF'             |           |  // INT-Registersatz, AF
0B37      DB 8B       IN A, (0x8B)           |           |  // SIO-0-K2C
0B39      CB 67       BIT 4, A               |           |
0B3B      20 08       JR NZ, 0x08        >---+           |  // Bit 4 == 1
0B3D      3E 03       LD A, 0x03             |           |  // Bit 4 == 0
0B3F      D3 8B       OUT (0x8B), A          |           |  // SIO-0-K2C
0B41      3E C3       LD A, 0xC3             |           |
0B43      D3 8B       OUT (0x8B), A          |           |  // SIO-0-K2C
0B45      3E 10       LD A, 0x10       <-----/           |
0B47      D3 8B       OUT (0x8B), A      <---------------/  // SIO-0-K2C
0B49      08          EX AF, AF'                            // Alternativ-Registersatz tauschen, AF
0B4A      FB          EI                                    // INT Freigabe
0B4B      ED 4D       RETI                                  // Return Interruptprogramm Modus 2

// INT Routine NR. 17 Rauschgenerator; Idealwert 0x4d - im Bereich 0x17 bis 0x67
0B4D      F5          PUSH AF                               // Register A, BC, DE, HL retten
0B4E      C5          PUSH BC
0B4F      D5          PUSH DE
0B50      E5          PUSH HL
0B51      DB 8D       IN A, (0x8D)                          // PIO-1-B-D Lese Tasteneingabe ANZEIGE, Schnittstellensignal DEE oder DÜE
0B53      CB 6F       BIT 5, A                              // Bit 5 == 0
0B55      28 06       JR Z, 0x06  >---\                     // ja; LED Ein/Aus/POP/RETI
0B57      CB AF       BIT 5, A        |                     // nein, Flankenwechsel
0B59      D3 8D       OUT (0x8D), A   |                     // PIO-1-B-D LED Ein/AUS; A1 und A2 Bit 0 und 2; Ausgabe lt. Z80Sim (0x8d) = 0x0f
0B5B      18 07       JR 0x07         | >-\
                                      |   |
0B5D      CB EF       SET 5, A      <-/   |                 // setze Bit 5
0B5F      D3 8D       OUT (0x8D), A       |                 // PIO-1-B-D LED Ein/AUS; A1 und A2 Bit 0 und 2
0B61      C3 E2 0B    JP 0x0BE2           |    >------\     // POP/RETI
                                          |           |
0B64      21 E5 0C    LD HL, 0x0CE5 <-----/           |     // Zählervariable 50/50 0/1 Anzahl
0B67      DB 8D       IN A, (0x8D)                    |     // PIO-1-B-D Lese Tasteneingabe ANZEIGE; Schnittstellensignal DEE oder DÜE
0B69      CB 77       BIT 6, A                        |
0B6B      28 02       JR Z, 0x02   >-\                |     // Bit 6 == 1
0B6D      CB C6       SET 0, (HL)    |                |     // Bit 6 == 0 (0x0ce5); falls M 0x4d war ist es jetzt 0x4c
0B6F      7E          LD A, M      <-/                |     // 0x0ce5
0B70      FE 4D       CP 0x4D                         |     // Prüfung der Zufallsfolge auf 0x4d, BArch 549 Seite 22; 0100 1101
0B72      20 07       JR NZ, 0x07    >-----\          |     // 0x0ce5 != 0x4d
0B74      21 E6 0C    LD HL, 0x0CE6        |          |     // 0x0ce6; Schleifenvariable
0B77      34          INC M                |          |     // (0x0ce6)++
0B78      20 01       JR NZ, 0x01    >-----+          |     // (0x0ce6) > 0
0B7A      35          DEC M                |          |     // (0x0ce6) == 0 dann (0x0ce6)--
0B7B      21 E9 0C    LD HL, 0x0CE9  <-----/          |
0B7E      35          DEC M                           |     // (0x0ce9)--
0B7F      28 07       JR Z, 0x07     >-\              |     // (0x0ce9) == 0
0B81      21 E5 0C    LD HL, 0x0CE5    |              |     // (0x0ce9) != 0
0B84      CB 26       SLA M            |              |     // Shift Left (0x0ce5) null -> 0 -> 7 -> carry
0B86      18 5A       JR 0x5A          |    >---------+     // POP/RETI
0B88      36 08       LD M, 0x08     <-/              |     // (0x0ce9) = 0x08
0B8A      21 E5 0C    LD HL, 0x0CE5                   |     // Anzahl Zufall im Bereich; Prüfwert 0x4d
0B8D      7E          LD A, M                         |
0B8E      CB 26       SLA M                           |     // Shift Left (0x0ce5), null -> 0 -> 7 -> carry
0B90      2A E0 0C    LD HL, (0x0CE0)                 |     // Zeiger auf Adresse 0x0cee
0B93      77          LD M, A                         |     // Kopie vor SLA, 0x0ce5 -> 0x0ce0
0B94      23          INC HL                          |     // Schleife
0B95      22 E0 0C    LD (0x0CE0), HL                 |     // ++Zeiger  ab: 0x0cee
0B98      21 EB 0C    LD HL, 0x0CEB                   |
0B9B      AE          XOR M                           |     // (0x0ce0) XOR (0x0ceb); Schleife
0B9C      77          LD M, A                         |     // in 0x0ceb abgelegt
0B9D      21 E4 0C    LD HL, 0x0CE4                   |     // Schleifenvariable, Init = 8
0BA0      35          DEC M                           |
0BA1      20 3F       JR NZ, 0x3F       >-------------+     // (0x0ce4)  > 0, POP/RETI
0BA3      36 08       LD M, 0x08                      |     // (0x0ce4) == 0, (0x0ce4) = 0x08
0BA5      3A EB 0C    LD A, (0x0CEB)                  |
0BA8      2A E0 0C    LD HL, (0x0CE0)                 |     // Zeiger auf 0x0cee
0BAB      77          LD M, A                         |     // Kopiere (0xceb) nach (0xcee)
0BAC      2A E2 0C    LD HL, (0x0CE2)                 |     // Lade Kopie des Zeiger zurück; Zeiger auf 0x0cf7 (Kopie von 0x0cee)
0BAF      22 E0 0C    LD (0x0CE0), HL                 |     // Umkopieren der Zeiger 0x0ce0/0x0ce2 der Adressen 0x0cee/0x0cf7
0BB2      21 EB 0C    LD HL, 0x0CEB                   |
0BB5      36 00       LD M, 0x00                      |     // (0x0ceb) = 00; 0x0c00
0BB7      21 E7 0C    LD HL, 0x0CE7                   |
0BBA      35          DEC M                           |     // (0x0ce7) - 1
0BBB      20 25       JR NZ 0x25        >-------------+     // (0x0ce7)  > 0; POP/RETI
0BBD      3A E6 0C    LD A, (0x0CE6)                  |     // (0x0ce7) == 0
0BC0      FE 17       CP 0x17                         |     // Zu wenig?
0BC2      38 04       JR C, 0x04  >---\               |     // A < 0x17 ?
0BC4      FE 67       CP 0x67         |               |     // Zu viel?
0BC6      38 11       JR C 0x11       |  >-\          |     // A < 0x67 ?
0BC8      3A EA 0C    LD A, (0x0CEA)<-/    |          |     // A < 0x017, A = (0x0cea)
0BCB      3D          DEC A                |          |     // A - 1
0BCC      32 EA 0C    LD (0x0CEA), A       |          |     // (0x0cea) - 1
0BCF      3E C0       LD A, 0xC0           |          |     // A = 0xc0
0BD1      28 08       JR Z, 0x08           |    >-\   |     // Zerro Flag bei DEC A auf 0?
0BD3      AF          XOR A                |      |   |     // Lösche A, beeinflusse Flags
0BD4      32 E6 0C    LD (0x0CE6), A       |      |   |     // (0x0ce6) = 0
0BD7      18 09       JR 0x09              |      | >-+     // POP/RETI
0BD9      3E 80       LD A, 0x80         <-/      |   |
0BDB      32 EC 0C    LD (0x0CEC), A      <-------/   |     // (0x0cea) == 0, (0x0cec) = 0xc0
0BDE      3E 03       LD A, 0x03                      |     // (0x0cea) != 0, (0x0cec) = 0x80
0BE0      D3 81       OUT (0x81), A                   |     // CTC Kanal 1 DI, Zeitgeber Vorteiler 16, neg. Flanke, Zeitkonst. Start, RESET
0BE2      E1          POP HL              <-----------/     // Register A, BC,DE HL wiederherstellen
0BE3      D1          POP DE
0BE4      C1          POP BC
0BE5      F1          POP AF
0BE6      FB          EI                                    // INT Freigabe
0BE7      ED 4D       RETI                                  // Return, beende INT Routine

NMI-Programm:
0BE9      F5          PUSH AF
0BEA      DB 85       IN A, (0x85)                          // PI0-0-B-D Lese Input
0BEC      CB 5F       BIT 3, A                              // bit 3 == 0
0BEE      28 05       JR Z, 0x05       >-\                  // ja, RETN
0BF0      3E 14       LD A, 0x14         |                  // nein Status 0x0d11 = 0x14
0BF2      32 11 0D    LD (0x0D11), A     |                  // Status 0x0d11 = 0x14
0BF5      F1          POP AF           <-/
0BF6      ED 45       RETN                                  // Return NMI Programm

0BF8      7F                                                // Füllbytes
...
0BFF      7F                                                // Füllbytes

// Start RAM CPU Karte
0C00
0C0B ... 0C2B           Datenbereich
...                     RAM Stack
0FFF
// Ende RAM CPU Karte

// Einlesen Schlüssel, Erstelle Rundenschlüssel
1000 21 08 0C            LD HL, 0x0C08                      // Startadresse Schlüssel
1003 06 27               LD B, 0x27                         // 39 Byte
1005 36 00               LD (HL), 0x00 <--\
1007 23                  INC HL           |
1008 10 FB               DJNZ 0xfb     >--/                 // Lösche 0x0c08 bis 0x0c2f
100A CD 44 12            CALL 0x1244           <--\         // SLS Lesen; übergabe Register C; Rückgabe C Wert, Start- Ende- Kennung
100D CD 3C 12            CALL 0x123C   <--\       |         // Schlüsseleinlesen Maske 11011, Rückgabe C Wert, Start- Ende- Kennung
1010 3E 09               LD A, 0x09       | <-\   |         // Kennung 0x09 No2: 100 10
1012 B9                  CP C             |   |   |         // C == 0x09, Anfangskennung No1: 100 10, Kanal 123T45
1013 20 F8               JR NZ, 0xF8   >--/   |   |         // Sprung != 0x09
1015 CD 3C 12            CALL 0x123C          |   |         // Schlüsseleinlesen Maske 11011, Rückgabe C Wert, Start- Ende- Kennung
1018 3E 12               LD A, 0x12           |   |         // Anfangskennung 01001
101A B9                  CP C                 |   |         // C == 0x12 Anfangskennung No2: 010 01, Kanal 123T45
101B 20 F3               JR NZ, 0xF3       >--/   |         // Sprung != 0x12
101D 16 00               LD D, 0x00               |         // Schleifenzähler
101F 21 08 0C            LD HL, 0x0C08            |         // Startbereich Speicherung des Schlüssels
1022 CD 3C 12            CALL 0x123C<---\         |         // Schlüsseleinlesen Maske 11011, Rückgabe C Wert, Start- Ende- Kennung
1025 79                  LD A,C         |         |         // Bit 1 und 2; Bsp: 0x18; 0x11
1026 CB 0F               RRC A          |         |         // Rechts Rotieren A0->A7----->A0 A0->carry
1028 CB 0F               RRC A          |         |         // Bit 6, 7 = 0
102A CB 0F               RRC A          |         |         // 0x03 -> 0x03; 001 1000 -> 0000 0011; 0x22
102C 2F                  CPL            |         |         // 0xfc -> 1111 1100; Complement accumulator; 0xdd
102D E6 03               AND 0x03       |         |         // nur 2 Bits= 0000 0000 -> 0; 0x01
102F 47                  LD B,A         |         |         // Sichere A
1030 79                  LD A,C         |         |         // letzten gelesenen Wert; 0x18
1031 E6 03               AND 0x03       |         |         // Maskiere                           ; 0x01
1033 B8                  CP B           |         |         // Prüfung Bit 1+5 und 0+4
1034 20 D4               JR NZ, 0xD4    |     >---+         // Bit 0,1 != 4,5 Neustart Schlüssel einlesen; Prüfung 1/2 = NOT 4/5
1036 CB 09               RRC C          |         |         // C0 -> C7, carry == C.0 == bit 0 == 0, C = 0x0c; 0000 1100
1038 CB 1B               RR E           |         |         // Rechts Rorieren E.0->C[C.carry]->E.7->... E0, Fülle E mit Bit C.0 (Bsp.: 1)
103A CB 09               RRC C          |         |         // C0 -> C7, carry == C.0 == bit 0, C = 0xc0  Carry == C.0 == bit 1
103C CB 1B               RR E           |         |         // Rechts Rorieren E.0->C[C.carry]->E.7->...E.0 E = 0xc0
103E 14                  INC D          |         |         // D++; Schleifenzähler 0 ... 7
103F 7A                  LD A,D         |         |         // A = counter
1040 E6 03               AND 0x03       |         |         // 2 * 4 eingelesen = 8bit; Modular-3 funktion
1042 20 DE               JR NZ, 0xDE >--+         |         // hole nächsten Bits vom SL, wenn weniger als 8 bit gesammelt
1044 73                  LD M,E         |         |         // Speichere E in M 0x0c08 ...0x0c2f
1045 23                  INC HL         |         |         // Nächste Adresse
1046 7A                  LD A,D         |         |         // Schleifenzähler
1047 FE 9C               CP 0x9C        |         |         // 156 * 2bit gesammelt?; 312 bit = 24 KG + 256bit + 32 CRC; 0x0c08 - 0x0c20 - 0x0c40
1049 20 D7               JR NZ, 0xD7  >-/         |         // nein, hole nächstes Byte vom SL
104B 21 08 0C            LD HL, 0x0C08            |         // ja, in 0x0c08 steht KG - Schlüssel - CRC-false - CRCtrue
104E 11 FF FF            LD DE, 0xFFFF            |         // Initialisierungsvektor 0xffff CRC-16
1051 06 23               LD B, 0x23               |         // Länge 0x23, 35 bytes == 280 bits, 32 byte Schlüssel + 3 bytes Kenngruppe
1053 7E                  LD A, M      <-\         |         // CRC-Schleife
1054 CD ED 1A            CALL 0x1AED    |         |         // CRC2-16, Übergabe DE, A; Rückgabe DE
1057 23                  INC HL         |         |         // bis 0x0c2a
1058 10 F9               DJNZ 0xF9   >--/         |         // 35 Runden
105A 2A 2B 0C            LD HL, (0x0C2B)          |         // FALSCH-CRC vom SL; 0x0c2b 0x0c2c low - high
105D A7                  AND A                    |         // carry-Zero löschen
105E ED 52               SBC HL, DE               |         // DE = berechnete CRC; CRCTrue != CRCFalse->vom SL
1060 28 A8               JR Z, 0xA8            >--+         // Z = 1 fehler gestanzter CRC mit berechneten CRC gleich, neustart schlüssel einlesen
1062 2A 2D 0C            LD HL, (0x0C2D)          |         // soweit richtig, RICHTIG-CRC vom SL; 0x0c2d 0x0c2e low - high
1065 A7                  AND A                    |         // carry-Zero löschen, zweiter crc muß richtig sein
1066 ED 52               SBC HL, DE               |         // DE = berechnete CRC == CRC vom SL
1068 C2 0A 10            JP NZ, 0x100A         >--/         // Z = 0 gestanzter CRC mit berechneten CRC gleich, sonst neustart Schlüssel einlesen
106B 21 0B 0C            LD HL, 0x0C0B                      // Schlüssel1 256 bit: RAM1
106E 11 90 28            LD DE, 0x2890                      // Schlüssel2 256 bit: RAM2
1071 01 20 00            LD BC, 0x0020                      // Länge = 0x20, 32 bytes = 256 bit
1074 ED B0               LDIR                               // Schlüssel2 RAM2
1076 21 90 28            LD HL, 0x2890                      // Schlüssel2 RAM2
1079 11 B0 28            LD DE, 0x28B0                      // Schlüssel3 RAM2
107C 01 20 00            LD BC, 0x0020                      // Länge = 0x20, 32 bytes = 256 bit
107F ED B0               LDIR                               // Schlüssel3 RAM2
1081 21 B0 28            LD HL, 0x28B0                      // Schlüssel3 RAM2
1084 11 00 28            LD DE, 0x2800                      // Rundenschlüssel
1087 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
108A 21 93 28            LD HL, 0x2893                      // Versatz 3 Bytes, länge 4 bytes
108D 11 04 28            LD DE, 0x2804
1090 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
1093 21 96 28            LD HL, 0x2896
1096 11 08 28            LD DE, 0x2808
1099 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
109C 21 99 28            LD HL, 0x2899
109F 11 0C 28            LD DE, 0x280C
10A2 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
10A5 21 9C 28            LD HL, 0x289C
10A8 11 10 28            LD DE,0x2810
10AB CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
10AE 21 9F 28            LD HL,0x289F
10B1 11 14 28            LD DE,0x2814
10B4 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
10B7 21 A2 28            LD HL,0x28A2
10BA 11 18 28            LD DE,0x2818
10BD CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
10C0 21 A5 28            LD HL,0x28A5
10C3 11 1C 28            LD DE,0x281C
10C6 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE; No. 8
10C9 CD 04 12            CALL 0x1204                        // Blockrotieren Schlüssel3 RAM2:0x28b0 ... 0x28c7, RAM2 4*6 = 24 Bytes
10CC 21 B0 28            LD HL,0x28B0                       // Schlüssel3 RAM2
10CF 11 20 28            LD DE,0x2820
10D2 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
10D5 21 B3 28            LD HL,0x28B3
10D8 11 24 28            LD DE,0x2824
10DB CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
10DE 21 B6 28            LD HL, 0x28B6
10E1 11 28 28            LD DE,0x2828
10E4 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
10E7 21 B9 28            LD HL,0x28B9
10EA 11 2C 28            LD DE,0x282C
10ED CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
10F0 21 BC 28            LD HL, 0x28BC
10F3 11 30 28            LD DE,0x2830
10F6 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
10F9 21 BF 28            LD HL,0x28BF
10FC 11 34 28            LD DE,0x2834
10FF CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
1102 21 C2 28            LD HL, 0x28C2
1105 11 38 28            LD DE,0x2838
1108 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
110B 21 C5 28            LD HL,0x28C5
110E 11 3C 28            LD DE,0x283C
1111 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE; No. 8
1114 CD 04 12            CALL 0x1204                        // Blockrotieren Schlüssel3 RAM2:0x28b0 ... 0x28c7, RAM2 4*6 = 24 Bytes
1117 21 B0 28            LD HL,0x28B0                       // Schlüssel3 RAM2
111A 11 40 28            LD DE,0x2840
111D CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
1120 21 B3 28            LD HL,0x28B3
1123 11 44 28            LD DE,0x2844
1126 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
1129 21 B6 28            LD HL, 0x28B6
112C 11 48 28            LD DE,0x2848
112F CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
1132 21 B9 28            LD HL,0x28B9
1135 11 4C 28            LD DE,0x284C
1138 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
113B 21 BC 28            LD HL, 0x28BC
113E 11 50 28            LD DE,0x2850
1141 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
1144 21 BF 28            LD HL,0x28BF
1147 11 54 28            LD DE,0x2854
114A CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
114D 21 C2 28            LD HL, 0x28C2
1150 11 58 28            LD DE,0x2858
1153 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
1156 21 C5 28            LD HL,0x28C5
1159 11 5C 28            LD DE,0x285C
115C CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE; No. 8
115F CD 04 12            CALL 0x1204                        // Blockrotieren Schlüssel3 RAM2:0x28b0 ... 0x28c7, RAM2 4*6 = 24 Bytes
1162 21 B0 28            LD HL,0x28B0                       // Schlüssel3 RAM2
1165 11 78 28            LD DE,0x2878
1168 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
116B 21 B3 28            LD HL,0x28B3
116E 11 7C 28            LD DE,0x287C
1171 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
1174 21 B6 28            LD HL, 0x28B6
1177 11 70 28            LD DE,0x2870
117A CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
117D 21 B9 28            LD HL,0x28B9
1180 11 74 28            LD DE,0x2874
1183 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
1186 21 BC 28            LD HL, 0x28BC
1189 11 68 28            LD DE,0x2868
118C CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
118F 21 BF 28            LD HL,0x28BF
1192 11 6C 28            LD DE,0x286C
1195 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
1198 21 C2 28            LD HL, 0x28C2
119B 11 60 28            LD DE,0x2860
119E CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
11A1 21 C5 28            LD HL,0x28C5
11A4 11 64 28            LD DE,0x2864
11A7 CD D4 11            CALL 0x11D4                        // Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE; No. 8
11AA 21 A8 28            LD HL,0x28A8
11AD 11 80 28            LD DE,0x2880                       // 64bit
11B0 01 04 00            LD BC,0x0004                       // 0x08, könnte folgende 4 Zeilen sparen
11B3 ED B0               LDIR                               // bearbeiteter Schlüssel
11B5 21 AC 28            LD HL,0x28AC
11B8 11 84 28            LD DE,0x2884
11BB 01 04 00            LD BC,0x0004
11BE ED B0               LDIR                               // optimierungsbedarf!
11C0 21 00 28            LD HL,0x2800                       // Rundenschlüssel
11C3 06 88               LD B, 0x88                         // 136 bytes
11C5 11 FF FF            LD DE, 0xFFFF                      // CRC Vektor 0xffff
11C8 7E          L0209:  LD A, M        <--\                // CRC Schleife
11C9 CD ED 1A            CALL 0x1AED       |                // CRC2-16, Übergabe DE, A; Rückgabe DE
11CC 23                  INC HL            |
11CD 10 F9               DJNZ 0xf9      >--/                // 136 Runden
11CF ED 53 88 28         LD (0x2888), DE                    // Lege CRC des bearbeiteten Schlüssels am Ende ab
11D3 C9                  RET                                // CRC über Runden-Schlüssel

// Schlüsselauszug 4Byte Übergabe HL, DE, Rückgabe DE
11D4 7E                  LD A, M                            // Übergabevariablen HL und DE
11D5 23                  INC HL                             // A = M, HL+1
11D6 06 00               LD B, 0x00                         // B = 0
11D8 CB 3F               SRL A                              // Schiebe null -> 7 -> 0 -> carry
11DA CB 18               RR B                               // Rotiere rechts A:carry->B.7
11DC CB 3F               SRL A                              // schiebe null -> 7 -> 0 -> carry
11DE CB 18               RR B                               // Rotiere rechts A:carry - >B.7 und B.6 aus A.0 und A.1
11E0 12                  LD (DE), A                         // (DE) = 00xx xxxxxx von A
11E1 13                  INC DE                             // DE++
11E2 4E                  LD C, M                            // hole aus M; wird später wiederhergestellt wg. RLD
11E3 ED 6F               RLD                                // A.high unverändert, M.low = A.low; A.low = M.high, M.high = M.low;
11E5 E6 0F               AND 0x0F                           // Maskiere, entspricht M.high, Lösche carry
11E7 CB 38               SRL B                              // Schiebe  null -> 7 -> 0 -> carry
11E9 CB 38               SRL B                              // Schiebe  null -> 7 -> 0 -> carry
11EB B0                  OR B                               // A OR B; M.high OR 00xx 0000
11EC 12                  LD (DE), A                         // in (DE) sichern
11ED 13                  INC DE                             // DE++
11EE ED 6F               RLD                                // A.high unverändert, M.low = A.low; A.low = M.high, M.high = M.low;
11F0 E6 0F               AND 0x0F                           // Maskiere, entspricht M.high
11F2 71                  LD M, C                            // schreibe M zurück, wiederherstellen wg. RLD
11F3 23                  INC HL                             // HL++
11F4 46                  LD B, M                            //
11F5 CB 20               SLA B                              // Schiebe null -> 0 -> 7 -> carry
11F7 17                  RLA                                // Rotiere carry -> A.0 -> A.7 -> carry; B.7 nach A.0
11F8 CB 20               SLA B                              // Schiebe null -> 0 -> 7 -> carry
11FA 17                  RLA                                // Rotiere carry -> A.0 -> A.7 -> carry; B.7 nach A.0
11FB 12                  LD (DE), A                         // (DE) = A; A.0 A.1 aus B.7 B.6
11FC 13                  INC DE                             // DE++
11FD CB 38               SRL B                              // Schiebe null -> 7 -> 0 -> carry
11FF CB 38               SRL B                              // Schiebe null -> 7 -> 0 -> carry
1201 78                  LD A, B                            // A.3 ... A.0 = B.7 ... B.4; A.high = 0000
1202 12                  LD (DE), A                         // (DE) = B
1203 C9                  RET                                // DE Rückgabe

// Blockrotieren Schlüssel3 RAM2:0x28b0 ... 0x28c7, RAM2 4*6 = 24 Bytes
1204 11 B0 28            LD DE,0x28B0                       // Schlüssel3 RAM2; Datenbereich 0x28b0 ... 0x28b5
1207 CD 1D 12            CALL 0x121D                        // 5 bytes rotieren 10*; Übergabe DE, Rückgabe im RAM (DE)+10
120A 11 B6 28            LD DE, 0x28B6                      // Datenbereich 0x28b6 ... 0x28bb
120D CD 1D 12            CALL 0x121D                        // 5 bytes rotieren 10*; Übergabe DE, Rückgabe im RAM (DE)+10
1210 11 BC 28            LD DE, 0x28BC                      // Datenbereich 0x28bc ... 0x28c1
1213 CD 1D 12            CALL 0x121D                        // 5 bytes rotieren 10*; Übergabe DE, Rückgabe im RAM (DE)+10
1216 11 C2 28            LD DE, 0x28C2                      // Datenbereich 0x28c2 ... 0x28c7
1219 CD 1D 12            CALL 0x121D                        // 5 bytes rotieren 10*; Übergabe DE, Rückgabe im RAM (DE)+10
121C C9                  RET                                // Schleife über 24 bytes

// 5 bytes rotieren 10*; Übergabe DE, Rückgabe im RAM (DE)+10
121D 3E 0B               LD A, 0x0B                         // Schleifenzähler = 11
121F 62                  LD H,D                             // Übergabe der Startadresse
1220 6B                  LD L,E                             // HL = DE
1221 CB 3E               SRL M          <----\              // Schiebe null -> 7 -> 0 -> carry
1223 23                  INC HL              |              // HL + 1
1224 CB 1E               RR M                |              // Rotiere rechts carry - > 7 -> 0 -> carry
1226 23                  INC HL              |              // HL + 2
1227 CB 1E               RR M                |              // Rotiere rechts carry - > 7 -> 0 -> carry
1229 23                  INC HL              |              // HL + 3
122A CB 1E               RR M                |              // Rotiere rechts carry - > 7 -> 0 -> carry
122C 23                  INC HL              |              // HL + 4
122D CB 1E               RR M                |              // Rotiere rechts carry - > 7 -> 0 -> carry
122F 23                  INC HL              |              // HL + 5
1230 CB 1E               RR M                |              // Rotiere rechts carry - > 7 -> 0 -> carry
1232 62                  LD H,D              |              // Übergabe der Startadresse
1233 6B                  LD L,E              |              // HL wieder auf Start = DE
1234 30 02               JR NC, 0x02>--\     |              // carry der letzten RR M
1236 CB FE               SET 7,M       |     |              // Übertrag; HL+5 Bit 0-> C -> HL bit 7
1238 3D                  DEC A      <--/     |              // Schleifenzähler
1239 20 E6               JR NZ, 0xE6      >--/              // 10 Runden
123B C9                  RET                                //

// Schlüsseleinlesen Maske 11011, Rückgabe C Wert, Start- Ende- Kennung
123C 0E 00               LD C, 0x00                         // C = 0
123E DB 84       L0213:  IN A,(0x84) <--\                   // PIO-0-A-D Schlüssellochstreifenleser Bit 0, 1 ... 3, 4
1240 E6 1B               AND 0x1B       |                   // Eingabe maskieren  11011, Prüfe auf Gültigkeit; keine 0x00; eines der bits 0,1,3,4  muß 1 sein
1242 28 FA               JR Z,L0213  >--/                   // A != 0x1b, A soll 0x03, 0x0a, 0x11, 0x18, 0x1b sein.

// SLS Lesen; Anfangskennung gefunden - bei Einsprung 0x123C// A != 0; Schlüssellochstreifenleser Bit 0, 1 ... 3, 4
1244 06 08               LD B, 0x08        <------\         // 8 Loch Takte = ein gelesenes 1/4Byte
1246 DB 84               IN A, (0x84)      <--\   |         // PIO-0-A-D, Schlüssellochstreifenleser Bit 0, 1 ... 3, 4
1248 E6 1B               AND 0x1B             |   |         // maskieren 11011, Prüfe auf Gültigkeit; bit 2 ungenutzt
124A 28 04               JR Z, 0x04    >-\    |   |         // Schleife Anfangskennung; Flankenwechsel
124C B1                  OR C            |    |   |         // ungleich 0x1b; A Or C, für Flagabfrage; Achtung bei Einsprung aus der Funktion 0x123C ist C = 0; bei direkten Einsprung ist C = ??
// Register C ist das Sammelregister der eingelesenen Bytes
124D 4F                  LD C, A         |    |   |         // A = C, in C die letzte Eingabe
124E 18 F6               JR 0xF6         | >--/   |         // Lese Eingabe
// weiter                                |        |         // wenn A != 0x03, 0x0a, 0x11, 0x18, 0x1b; Ende des Schlüssels
1250 DB 84               IN A, (0x84)<---+        |         // PIO-0-A-D, Schlüssellochstreifenleser Bit 0 ... 4
1252 E6 1B               AND 0x1B        |        |         // Eingabe maskieren  Bits 4, 3, 1, 0, Prüfe auf Gültigkeit bit 0 or 1 or 3 or 4 == 1
1254 20 EE               JR NZ, 0xEE     |   >----/         // Keine Ende-Kennnung
1256 10 F8               DJNZ 0xF8    >--/                  // Lese Eingabe 8 mal
1258 C9                  RET                                // Rückgabewert in C

// Prüfe CRC 16 im Speicherbereich 0x2800 bis 0x2888; Rückgabe Z-Flag; Rundenschlüssel
1259 21 00 28            LD HL, 0x2800                      // Speicher Rundenschlüssel
125C 11 FF FF            LD DE, 0xFFFF                      // CRC Vektor 0xffff
125F 06 88               LD B, 0x88                         // 136 Bytes
1261 7E          L0217:  LD A,M     <-\                     // CRC Schleife
1262 CD ED 1A            CALL 0x1AED  |                     // CRC2-16, Übergabe DE, A; Rückgabe DE
1265 23                  INC HL       |                     // bis 0x2887
1266 10 F9               DJNZ 0xf9  >-/                     // 136 Runden
1268 7E                  LD A,M                             // A = (0x2888)
1269 BB                  CP E                               // A == Rückgabe der CRC 16
126A C0                  RET NZ                             // nein Return
126B 23                  INC HL                             // ja, 0x2889
126C 7E                  LD A,M                             // A = (0x2889)
126D BA                  CP D                               // A == Rückgabe der CRC 16
126E C9                  RET                                // Return, Flags beachten im Rücksprung

// Prüf-Funktion Rundenschlüssel; Rückgabe Z-Flag
126F 21 CF 12            LD HL, 0x12CF                      // Prüfschlüssel-Rundenschlüssel 0x12cf in den RAM 0x2800
1272 11 00 28            LD DE, 0x2800                      // Ziel RAM: Schlüsselbereich
1275 01 88 00            LD BC, 0x0088                      // 136 Bytes
1278 ED B0               LDIR                               // Kopiere nach RAM
127A 21 57 13            LD HL, 0x1357                      // Test-Variablen 8 bytes, 0x87
127D 11 00 2A            LD DE, 0x2A00                      // Ein- Ausgabe LAMBDA, Wurmreihen
1280 01 08 00            LD BC, 0x0008                      // Schleifenzähler = 8 Bytes
1283 ED B0               LDIR                               // Blockkopie von 0x1357 = 0x87 in den RAM 0x2a00
1285 06 01               LD B, 0x01                         // Schleifenzähler, 1 Runde! In der Beschreibung BArch 549 Seite 22 ist von 75mal die Rede!
1287 C5                  PUSH BC      <---\                 // rette Schleifenzähler
1288 CD 00 18            CALL 0x1800      |                 // LAMBDA über 0x2a00, Klartext 64bit; Quell- und Zieladresse 0x2A00, Rundenschlüssel 0x2800
128B C1                  POP BC           |
128C 10 F9               DJNZ 0xf9    >---/                 // Rufe die Routine 1mal auf
128E 21 0B 0C            LD HL,0x0C0B                       // RAM1, Schlüssel + CRC
1291 11 00 28            LD DE,0x2800                       // Ziel Rundenschlüssel
1294 01 88 00            LD BC, 0x0088                      // Schleifenzähler = 0x88 Bytes
1297 ED B0               LDIR                               // Kopiere Schlüssel nach RAM2; Wiederherstellen
1299 06 08               LD B, 0x08                         // Schleifenzähler = 8,  Vergleichen
129B 21 00 2A            LD HL, 0x2A00                      // Ein- Ausgabe LAMBDA, Wurmreihen
129E 11 5F 13            LD DE, 0x135F                      // Prüfwerte BitPermutation, Vergleich mit RAM2:0x2a00
12A1 1A                  LD A,(DE)   <--\
12A2 BE                  CP M           |                   // Vergleiche RAM2 mit EPROM
12A3 C0                  RET NZ         |                   // A != 0 wenn das ergebnis NIO
12A4 23                  INC HL         |
12A5 13                  INC DE         |
12A6 10 F9               DJNZ 0xF9  >---/
12A8 AF                  XOR A                              // Lösche AF, A = 0 wenn das Ergbnis OK
12A9 C9                  RET

// Blockkopie Rundenschlüssel 0x2800; LAMBDA Ein-Ausgabe Initialwerte 0x87 ...  Initale Bildung Wurmreihen
12AA 21 00 28            LD HL, 0x2800                      // Rundenschlüssel
12AD 11 0B 0C            LD DE, 0x0C0B                      // Schlüssel1 0x0c0b - 0x0c93
12B0 01 88 00            LD BC, 0x0088                      // 0x88 Bytes, 136 bytes
12B3 ED B0               LDIR                               // Überschreibe Schlüssel1 mit rotierten Schlüssel3 RAM2
12B5 21 57 13            LD HL, 0x1357                      // Initialwert EPROM 0x87
12B8 11 00 2A            LD DE, 0x2A00                      // Ein- Ausgabe LAMBDA, Wurmreihen
12BB 01 08 00            LD BC, 0x0008                      // Schleifenzähler 8 Bytes
12BE ED B0               LDIR                               // 8 * 0x87, Initialwerte
12C0 CD 00 18            CALL 0x1800                        // LAMBDA Ein-Ausgabe 0x2a00, 64bit; Rundenschlüssel 0x2800
12C3 21 00 2A            LD HL, 0x2A00                      // Ein- Ausgabe LAMBDA, Wurmreihen
12C6 11 95 0C            LD DE, 0x0C95                      // Wurmreihe abgelegt, für CFB?; Für Testfunktion Online mit Aktualschlüssel
12C9 01 08 00            LD BC, 0x0008                      // Schleifenzähler 8 Bytes
12CC ED B0               LDIR                               // Blockkopie 8 bytes von 0x2a00 nach 0x0c95 - 0x09c; Wurmreihen
12CE C9                  RET                                // -> 0x01c6

// Datenbereich 0x87 bytes, 136bytes   : ENDE = 0x1356      // Rundenschlüssel Test-Schlüssel
12CF                                              00
12D0 12 0D 05 19 38 26 2B 33 1E 3F 3E 37 0B 2A 18 1D
12E0 25 10 32 04 00 04 23 11 16 1E 09 2A 3C 37 2F 0D
12F0 16 00 24 1A 0A 33 31 14 31 26 3D 3F 3D 2E 17 09
1300 06 3B 0A 21 24 08 00 2F 1E 22 2C 3C 13 15 39 27
1310 22 1A 2C 01 08 34 15 1C 2E 29 23 0D 3B 3F 3B 10
1320 00 12 0D 36 15 03 08 2B 33 1E 3D 05 19 38 26 31
1330 0D 17 26 3D 3A 0A 33 06 10 20 00 24 1B 2C 2A 3F
1340 36 39 1D 13 06 1B 37 28 2B 0F 04 35 18 02 11 FE
1350 DC BA 98 76 54 32 10

// Startvariablen 8 bytes      // Kopiert in RAM: 0x2a00 bis 0x2a07
1357 87 87 87 87 87 87 87 87

// Prüfwerte Chiffrat Feisel, Vergleich mit RAM2:0x2a00
135f 87
1360 D4
1361 18
1362 F0
1363 FC
1364 28
1365 30
1366 7A

// Konstantenberich IX: ROM CRC-16 Start/Länge/Prüfsummen
1367 00 00               // IX+0 + 1 Startbereich 0x0000, 1. EPROM -CPU Karte-
1369 00 04               // + 2, + 3 Länge 0x0400
136B 50 B6               // + 4, + 5 Prüfsumme 0xb650
136D 00 04               // IX+0 + 1 Startbereich 0x0400, 2. EPROM -CPU Karte-
136F 00 04               // + 2 + 3 Länge 0x0400
1371 58 3A               // + 4 + 5 Prüfsumme 0x3a58
1373 00 08               // IX+0 + 1 Startbereich 0x0800, 3. EPROM -CPU Karte-
1375 00 04               // + 2 + 3 Länge 0x0400
1377 46 F4               // + 4 + 5 Prüfsumme 0xf446
1379 00 14               // IX+0 + 1 Startbereich 0x1400, 5. EPROM -ROM/RAM Karte-
137B 00 04               // + 2 + 3 Länge 0x0400
137D 90 69               // + 4 + 5 Prüfsumme 0x6990
137F 00 18               // IX+0 + 1 Startbereich 0x1800, 6. EPROM -ROM/RAM Karte-
1381 00 04               // + 2 + 3 Länge 0x0400
1383 9B C2               // + 4 + 5 Prüfsumme 0xc29b; Nach Programmänderung neu berechnet 0x1f31 !!
1385 00 10               // IX+0 + 1 Startbereich 0x1000, 4. EPROM -ROM/RAM Karte-
1387 89 03               // + 2 + 3 Länge 0x0389, Teilsegment 0x1000 ... 0x1389
1389 50 D3               // + 4 + 5 Prüfsumme 0xd350; Nach Programmänderung neu berechnet 0xA2E2 !!
// ungeprüfter ROM
138B 91 13               // IX+0 + 1 Startbereich 0x1391, Teilsegment -ROM/RAM Karte-
138D 6F 00               // + 2 + 3 Länge 0x006f, Teilsegment 0x1391 ... 0x1400
138F 37 41               // + 4 + 5 Prüfsumme 0x4137;
// ab hier wieder geprüfter ROM
1391 26 00               // IX+0 + 1 Startbereich 0x0026, Teilsegment mit der Prüfsumme 0x0000! ?? 0x26 Kennzeichen für Abbruch -> 0x00f7
1393 00 04               // + 2 + 3 Länge 0x0400, Segmentbereich 0x0026 ... 0x0426 Absicht die Prüfsumme muß hier falsch sein!
1395 00 00               // + 4 + 5 Prüfsumme 0x0000

1397 00 00               //
1399 00 00               //

139B 7F                  //
...                      // Füllbytes
13FF 7F                  //

// Datenbereich   0x1400 ... 0x15ff  = 0x200 Bytes == 512 bytes      Auffällig H-bytes und L-Bytes
// K-Box Subsitution der Bits
// S0
1400 E0 00 40 F0 D0 70 10 40 20 E0 F0 20 B0 D0 80 10        // 64 H-bytes
1410 30 A0 A0 60 60 C0 C0 B0 50 90 90 50 00 30 70 80
1420 40 F0 10 C0 E0 80 80 20 D0 40 60 90 20 10 B0 70
1430 F0 50 C0 B0 90 30 70 E0 30 A0 A0 00 50 60 00 D0
1440 0F 03 01 0D 08 04 0E 07 06 0F 0B 02 03 08 04 0E        // 64 L-Bytes
1450 09 0C 07 00 02 01 0D 0A 0C 06 00 09 05 0B 0A 05
1460 00 0D 0E 08 07 0A 0B 01 0A 03 04 0F 0D 04 01 02
1470 05 0B 08 06 0C 07 06 0C 09 00 03 05 02 0E 0F 09
// S1
1480 A0 D0 00 70 90 00 E0 90 60 30 30 40 F0 60 50 A0        // 64 H-bytes
1490 10 20 D0 80 C0 50 70 E0 B0 C0 40 B0 20 F0 80 10
14A0 D0 10 60 A0 40 D0 90 00 80 60 F0 90 30 80 00 70
14B0 B0 40 10 F0 20 E0 C0 30 50 B0 A0 50 E0 20 70 C0
14C0 07 0D 0D 08 0E 0B 03 05 00 06 06 0F 09 00 0A 03        // 64 L-Bytes
14D0 01 04 02 07 08 02 05 0C 0B 01 0C 0A 04 0E 0F 09
14E0 0A 03 06 0F 09 00 00 06 0C 0A 0B 01 07 0D 0D 08
14F0 0F 09 01 04 03 05 0E 0B 05 0C 02 07 08 02 04 0E
// S2
1500 20 E0 C0 B0 40 20 10 C0 70 40 A0 70 B0 D0 60 10        // 64 H-bytes
1510 80 50 50 00 30 F0 F0 A0 D0 30 00 90 E0 80 90 60
1520 40 B0 20 80 10 C0 B0 70 A0 10 D0 E0 70 20 80 D0
1530 F0 60 90 F0 C0 00 50 90 60 A0 30 40 00 50 E0 30
1540 0C 0A 01 0F 0A 04 0F 02 09 07 02 0C 06 09 08 05        // 64 L-Bytes
1550 00 06 0D 01 03 0D 04 0E 0E 00 07 0B 05 03 0B 08
1560 09 04 0E 03 0F 02 05 0C 02 09 08 05 0C 0F 03 0A
1570 07 0B 00 0E 04 01 0A 07 01 06 0D 00 0B 08 06 0D
// S3
1580 40 D0 B0 00 20 B0 E0 70 F0 40 00 90 80 10 D0 A0        // 64 H-bytes
1590 30 E0 C0 30 90 50 70 C0 50 20 A0 F0 60 80 10 60
15A0 10 60 40 B0 B0 D0 D0 80 C0 10 30 40 70 A0 E0 70
15B0 A0 90 F0 50 60 00 80 F0 00 E0 50 20 90 30 20 C0
15C0 0D 01 02 0F 08 0D 04 08 06 0A 0F 03 0B 07 01 04        // 64 L-Bytes
15D0 0A 0C 09 05 03 06 0E 0B 05 00 00 0E 0C 09 07 02
15E0 07 02 0B 01 04 0E 01 07 09 04 0C 0A 0E 08 02 0D
15F0 00 0F 06 0C 0A 09 0D 00 0F 03 03 05 05 06 08 0B

1600 7F
...
17FF 7F                  // Füllbytes

// LAMBDA Ein-Ausgabe 0x2A00, Klartext 64bit; Rundenschlüssel 0x2800
// 0x2A00 Ein-Ausgabe LAMBDA, 0x2800 Rundenschlüssel
1800 3E 45               LD A, 0x45                         // A = 0x45; Systeminformation
1802 32 00 0C            LD (0x0C00), A                     // (0x0c00) = 0x45
1805 21 00 2A            LD HL, 0x2A00                      // Ein- Ausgabe LAMBDA, Wurmreihen
1808 46                  LD B, M                            // B = (0x2a00) = 0x87 oder Wurmeihen
1809 2C                  INC L
180A 4E                  LD C, M                            // BC = 0x8787 oder Wurmeihen
180B 2C                  INC L                              // = 0x2a02
180C C5                  PUSH BC
180D DD E1               POP IX                             // IX = BC = 0x8787 oder Wurmeihen
180F 56                  LD D, M                            // D = (0x2a02) = 0x87 oder Wurmeihen
1810 2C                  INC L                              // = 0x2a03
1811 5E                  LD E, M                            // DE =  0x8787
1812 D5                  PUSH DE                            // SP = 0x0fff
1813 FD E1               POP IY                             // IY = DE = 0x8787 oder Wurmeihen
1815 2C                  INC L                              // = 0x2a04
1816 46                  LD B, M                            // B = (0x2a04) = 0x87 oder Wurmeihen
1817 2C                  INC L                              // = 0x2a05
1818 4E                  LD C, M                            // BC = 0x8787
1819 2C                  INC L                              // = 0x2a06
181A 56                  LD D, M                            // D = (0x2a06) = 0x87 oder Wurmeihen
181B 2C                  INC L                              // = 0x2a07
181C 5E                  LD E, M                            // DE = 0x8787 oder Wurmeihen
181D 3E 10               LD A, 0x10                         // A = 0x10; Schleifenzähler 16 bytes
181F 21 00 28            LD HL, 0x2800                      // HL = 0x2800; Rundenschlüssel
// Weiter LAMBDA
1822 F5                  PUSH AF        <------\
1823 C5                  PUSH BC               |
1824 D5                  PUSH DE               |
1825 E5                  PUSH HL               |
1826 AF                  XOR A                 |            // A = 0, lösche Flags
1827 CB 5B               BIT 3, E              |            // Prüfe Bit 3 von E
1829 28 02               JR Z, 0x02 >-\        |
182B F6 01               OR 0x01      |        |            // Setze A Bit 0
182D CB 5A               BIT 3, D <---/        |            // Prüfe Bit 3 von D
182F 28 02               JR Z, 0x02  >-\       |
1831 F6 02               OR 0x02       |       |            // Setze A Bit 1
1833 CB 62               BIT 4, D  <---/       |            // Prüfe Bit 4 von D
1835 28 02               JR Z, 0x02  >-\       |
1837 F6 04               OR 0x04       |       |            // Setze A Bit 2
1839 CB 48               BIT 1,B    <--/       |            // Prüfe Bit 1 von B
183B 28 02               JR Z, 0x02  >-\       |
183D F6 08               OR 0x08       |       |            // Setze A Bit 3
183F CB 41               BIT 0, C   >--/       |            // Prüfe Bit 0 von C
1841 28 02               JR Z, 0x02  >-\       |
1843 F6 10               OR 0x10       |       |            // Setze A Bit 4
1845 CB 7B               BIT 7, E   <--/       |            // Prüfe Bit 7 von E
1847 28 02               JR Z, 0x02  >-\       |
1849 F6 20               OR 0x20       |       |            // Setze A Bit 5
184B AE                  XOR M      <--/       |            // A XOR P-Box((H) = 0x2a00); A kann max bit 0...5 gesetzt sein 0x3f
184C 26 14               LD H, 0x14            |            // HL = 0x1400 ...
184E 6F                  LD L, A               |            // HL = 0x14 (A XOR M); Tabellenauswahl hole H-Bytes (0x1400 ... 0x143f) LZS
184F 7E                  LD A,M                |            // Permutation der Bits, A = (M = (0x14xx); Permutation der Bits
1850 E1                  POP HL                |            // HL = 0x2800, Speicherplatz von vormals PUSH HL, Zeile 0x1825,; Rundenschlüssel
1851 F5                  PUSH AF               |            // Rette AF, (0x14xx)
1852 2C                  INC L                 |            // HL = 0x2801
1853 E5                  PUSH HL               |            // Rette HL
1854 3E 40               LD A, 0x40            |            // Lade A = 0x40
1856 CB 78               BIT 7, B              |            // Prüfe Bit 7 von B
1858 28 02               JR Z, 0x02 >-\        |
185A F6 01               OR 0x01      |        |            // setze Bit 0 von A, = 0x41
185C CB 7A               BIT 7, D  <--/        |            // Prüfe Bit 7 von D
185E 28 02               JR Z, 0x02 >-\        |
1860 F6 02               OR 0x02      |        |            // Setze Bit 1 von A, = 0x4x
1862 CB 63               BIT 4, E   <-/        |            // Prüfe Bit 4 von E
1864 28 02               JR Z, 02   >-\        |
1866 F6 04               OR 0x04      |        |            // Setze Bit 2 von A, = 0x4x
1868 CB 61               BIT 4, C  <--/        |            // Prüfe Bit 4 von C
186A 28 02               JR Z, 0x02 >-\        |
186C F6 08               OR 0x08      |        |            // Setze Bit 3 von A, = 0x4x
186E CB 5B               BIT 3,E   <--/        |            // Prüfe Bit 3 von E
1870 28 02               JR Z, 0x02 >-\        |
1872 F6 10               OR 0x10      |        |            // Setze Bit 4 von A, = 0x4x
1874 CB 5A               BIT 3, D  <--/        |            // Prüfe Bit 3 von D
1876 28 02               JR Z, 0x02 >-\        |
1878 F6 20               OR 0x20      |        |            // Setze Bit 5 von A, = 0x4x
187A AE                  XOR M     <--/        |            // A max. 0x7f
187B 26 14               LD H, 0x14            |            // Hole aus Tabelle l-Bytes (0x1440 ... 0x147f)
187D 6F                  LD L, A               |            // Adresse HL = 0x14 (A XOR (0x2a00))
187E 7E                  LD A, M               |            // Permutation der Bits, A = 0x147f
187F E1                  POP HL                |            // HL 0x2801
1880 F5                  PUSH AF               |            // Rette AF
1881 2C                  INC L                 |            // HL = 0x2802
1882 E5                  PUSH HL               |            // Rette HL
1883 3E 80               LD A, 0x80            |            // A = 0x80
1885 CB 58               BIT 3, B              |            // Prüfe Bit 3 von B
1887 28 02               JR Z, 0x02 >-\        |
1889 F6 01               OR 0x01      |        |            // Setze Bit 0 von A, = 0b1000 000y (0x81)
188B CB 73               BIT 6, E  <--\        |            // Prüfe Bit 6 von E
188D 28 02               JR Z, 0x02 >-\        |
188F F6 02               OR 0x02      |        |            // Setze Bit 1 von A, = 0b1000 00yx
1891 CB 4A               BIT 1, D  <--/        |            // Prüfe Bit 1 von D
1893 28 02               JR Z, 0x02 >-\        |
1895 F6 04               OR 0x04      |        |            // Setze Bit 2 von A, 0b1000 0yxx
1897 CB 49               BIT 1, C  <--/        |            // Prüfe Bit 1 von C
1899 28 02               JR Z, 0x02 >-\        |
189B F6 08               OR 0x08      |        |            // Setze Bit 3 von A, 0b1000 yxxx
189D CB 78               BIT 7,B    <-/        |            // Prüfe Bit 7 von B
189F 28 02               JR Z, 0x02 >-\        |
18A1 F6 10               OR 0x10      |        |            // Setze Bit 4 von A, 0b100y xxxx
18A3 CB 7A               BIT 7, D  <--/        |            // Prüfe Bit 7 von D
18A5 28 02               JR Z, 0x02 >-\        |
18A7 F6 20               OR 0x20      |        |            // setze Bit 5 von A, 0b10yx xxxx
18A9 AE                  XOR M     <--/        |            // A XOR (0x2802)
18AA 26 14               LD H, 0x14            |            // Feste Permutationstabelle
18AC 6F                  LD L, A               |            // Hole aus Tablle H-bytes (0x1480 ... 0x14bf)
18AD 7E                  LD A,M                |            // Permutation der Bits, A = (0x14yy)
18AE E1                  POP HL                |            // HL = 0x2802
18AF F5                  PUSH AF               |            // Rette AF
18B0 2C                  INC L                 |
18B1 E5                  PUSH HL               |            // HL = 0x2803
18B2 3E C0               LD A, 0xC0            |
18B4 CB 70               BIT 6, B              |            // Prüfe Bit 6 von B
18B6 28 02               JR Z, 0x02 >-\        |
18B8 F6 01               OR 0x01      |        |            // Setze Bit 0 von A, A = 0x0c + 1
18BA CB 71               BIT 6, C  <--/        |            // Prüfe Bit 6 von C
18BC 28 02               JR Z, 0x02 >-\        |
18BE F6 02               OR 0x02      |        |            // Setze Bit 1 von A, A + 2
18C0 CB 4B               BIT 1,E   <--/        |            // Prüfe Bit 1 von E
18C2 28 02               JR Z, 0x02 >-\        |
18C4 F6 04               OR 0x04      |        |            // Setze Bit 2 von A, A + 4
18C6 CB 72               BIT 6, D  <--/        |            // Prüfe Bit 6 von D
18C8 28 02               JR Z, 0x02 >-\        |
18CA F6 08               OR 0x08      |        |            // Setze Bit 3 von A, A + 8
18CC CB 58               BIT 3, B   <-/        |            // Prüfe Bit 3 von B
18CE 28 02               JR Z, 0x02 >-\        |
18D0 F6 10               OR 0x10      |        |            // Setze Bit 4 von A, A + 0x10
18D2 CB 73               BIT 6, E  <--/        |            // Prüfe Bit 6 von E
18D4 28 02               JR Z, 0x02 >-\        |
18D6 F6 20               OR 0x20      |        |            // setze Bit 5 von A, A + 0x20
18D8 AE                  XOR M     <--/        |            // A XOR (0x2803)
18D9 26 14               LD H, 0x14            |
18DB 6F                  LD L,A                |            // Hole aus Tabelle L-bytes (0x14c0 ... 0x14ff)
18DC 7E                  LD A,M                |            // Permutation der Bits, A = (0x14yy )
18DD E1                  POP HL                |            // HL = 0x2803
18DE F5                  PUSH AF               |            // Rette AF
18DF 2C                  INC L                 |
18E0 E5                  PUSH HL               |            // Rette HL = 0x2804
18E1 AF                  XOR A                 |            // Lösche AF
18E2 CB 43               BIT 0, E              |            // Prüfe Bit 0 von E
18E4 28 02               JR Z, 0x02 >-\        |
18E6 F6 01               OR 0x01      |        |            // Setze Bit 0 von A, A = 1
18E8 CB 51               BIT 2, C  <--/        |            // Prüfe Bit 2 von C
18EA 28 02               JR Z, 0x02 >-\        |
18EC F6 02               OR 0x02      |        |            // setze Bit 1 von A, A + 2
18EE CB 42               BIT 0, D  <--/        |            // Prüfe Bit 0 von D
18F0 28 02               JR Z, 0x02 >-\        |
18F2 F6 04               OR 0x04      |        |            // Setze Bit 2 von A, A + 4
18F4 CB 40               BIT 0, B  <--/        |            // Prüfe Bit 0 von B
18F6 28 02               JR Z, 0x02 >-\        |
18F8 F6 08               OR 0x08      |        |            // setze Bit 3 von A, A + 8
18FA CB 70               BIT 6, B  <--/        |            // Prüfe Bit 6 von B
18FC 28 02               JR Z, 0x02 >-\        |
18FE F6 10               OR 0x10      |        |            // Setze Bit 4 von A, A + 0x10
1900 CB 71               BIT 6, C  <--/        |            // Prüfe Bit 6 von C
1902 28 02               JR Z, 0x02 >-\        |
1904 F6 20               OR 0x20      |        |            // setze Bit 5 von A, A = 0x20
1906 AE                  XOR M     <--/        |            // A XOR (0x2804)
1907 26 15               LD H, 0x15            |            // Feste Permutationstabelle
1909 6F                  LD L,A                |            // Hole aus Tabelle byte (0x11500 ... 0x153f)
190A 7E                  LD A,M                |            // Permutation der Bits, A = (0x15yy)
190B E1                  POP HL                |            // Hole HL = 0x2804
190C F5                  PUSH AF               |            // Rette AF
190D 2C                  INC L                 |
190E E5                  PUSH HL               |            // Rette HL = 0x2805
190F 3E 40               LD A, 0x40            |            // A = 0x40
1911 CB 6A               BIT 5, D              |            // Prüfe Bit 5 von D
1913 28 02               JR Z, 0x02  >-\       |
1915 F6 01               OR 0x01       |       |            // Setze A Bit 0
1917 CB 79               BIT 7, C   <--/       |            // Prüfe Bit 7 von C
1919 28 02               JR Z, 0x02  >-\       |
191B F6 02               OR 0x02       |       |            // Setze A Bit 1
191D CB 68               BIT 5, B    <-/       |            // Prüfe Bit 5 von B
191F 28 02               JR Z, 0x02  >-\       |
1921 F6 04               OR 0x04       |       |            // Setze A Bit 2
1923 CB 6B               BIT 5, E    <-/       |            // Prüfe Bit 5 von E
1925 28 02               JR Z, 0x02  >-\       |
1927 F6 08               OR 0x08       |       |            // Setze A Bit 3
1929 CB 43               BIT 0, E  <---/       |            // Prüfe Bit 0 von E
192B 28 02               JR Z, 0x02  >-\       |
192D F6 10               OR 0x10       |       |            // Setze A Bit 5
192F CB 51               BIT 2, C   <--/       |            // Prüfe Bit 2 von C
1931 28 02               JR Z, 0x02  >-\       |
1933 F6 20               OR 0x20       |       |            // Setze A Bit 6
1935 AE                  XOR M      <--/       |            // A XOR (0x2805)
1936 26 15               LD H, 0x15            |
1938 6F                  LD L, A               |            // Hole aus Tabelle byte (0x1540 ... 0x157f)
1939 7E                  LD A,M                |            // Permutation der Bits, A = (0x15yy)
193A E1                  POP HL                |            // HL = 0x2805
193B F5                  PUSH AF               |            // Rette AF
193C 2C                  INC L                 |
193D E5                  PUSH HL               |            // Rette HL = 0x2806
193E 7B                  LD A,E                |            // 0x181C LD E, M »> DE = (0x2a06), (0x2a07)
193F E6 04               AND 0x04              |            // A = A AND 0x04, Bit 7-4 2-0 = 0, Bit 3 1/0
1941 F6 80               OR 0x80               |            // A = 0b1000 x000
1943 CB 59               BIT 3, C              |            // Prüfe Bit 3 von C
1945 28 02               JR Z, 0x02  >-\       |
1947 F6 08               OR 0x08       |       |            // Setze A Bit 3 (0x88)
1949 CB 52               BIT 2, D  <---/       |            // Prüfe Bit 2 von D
194B 28 02               JR Z, 0x02  >-\       |
194D F6 01               OR 0x01       |       |            // Setze A Bit 0
194F CB 50               BIT 2, B  <---/       |            // Prüfe Bit 2 von B
1951 28 02               JR Z, 0x02  >-\       |
1953 F6 02               OR 0x02       |       |            // Setze A Bit 1
1955 CB 6A               BIT 5, D   <--/       |            // Prüfe Bit 5 von D
1957 28 02               JR Z, 0x02  >-\       |
1959 F6 10               OR 0x10       |       |            // Setze A Bit 4
195B CB 79               BIT 7, C  <---/       |            // Prüfe Bit 7 von C
195D 28 02               JR Z, 0x02  >-\       |
195F F6 20               OR 0x20       |       |            // Setze A Bit 5
1961 AE                  XOR M      <--/       |            // A XOR (0x2806)
1962 26 15               LD H, 0x15            |
1964 6F                  LD L, A               |            // Hole aus Tabelle L-bytes (0x1580 ... 0x15bf)
1965 7E                  LD A,M                |            // Permutation der Bits, A = (0x15yy)
1966 E1                  POP HL                |            // HL = 0x2806
1967 F5                  PUSH AF               |            // Rette AF
1968 2C                  INC L                 |
1969 E5                  PUSH HL               |            // HL = 0x2807
196A 79                  LD A, C               |            // 0x1817: LD C, M  » BC = (0x2a04), (0x2a05)
196B E6 01               AND 0x01              |            // A = 0b0000 000x
196D F6 C0               OR 0xC0               |            // Setze A Bit 6 und7
196F CB 7B               BIT 7, E              |            // Prüfe Bit 7 von E
1971 28 02               JR Z, 0x02  >-\       |
1973 F6 02               OR 0x02       |       |            // Setze A Bit 1
1975 CB 60               BIT 4, B   <--/       |            // Prüfe Bit 4 von B
1977 28 02               JR Z, 0x02  >-\       |
1979 F6 04               OR 0x04       |       |            // Setze A Bit 2
197B CB 69               BIT 5, C   <--/       |            // Prüfe Bit 5 von C
197D 28 02               JR Z, 0x02  >-\       |
197F F6 08               OR 0x08       |       |            // Setze A Bit 3
1981 CB 52               BIT 2, D   <--/       |            // Prüfe Bit 2 von D
1983 28 02               JR Z, 0x02  >-\       |
1985 F6 10               OR 0x10        |      |            // Setze A Bit 4
1987 CB 50               BIT 2, B  <---/       |            // Prüfe Bit 2 von B
1989 28 02               JR Z, 0x02  >-\       |
198B F6 20               OR 0x20        |      |            // Setze A Bit 5
198D AE                  XOR M       <-/       |            // Hole aus Tabelle L-bytes (0x15c0 ... 0x15ff)
198E 26 15               LD H, 0x15            |            // H = 0x15
1990 6F                  LD L, A               |            // L = A XOR (0x2807)
1991 5E                  LD E, M               |            // Permutation der Bits, E = (0x15, A XOR (0x2807))
1992 E1                  POP HL                |            // HL = 0x2807
1993 2C                  INC L                 |            // HL = 0x2808
1994 F1                  POP AF                |            // A = eingesammelte Bits
1995 B3                  OR E                  |            // A OR E
1996 5F                  LD E, A               |            // E = A or E
1997 F1                  POP AF                |            // A = (0x15yy)
1998 57                  LD D, A               |            // D = A
1999 F1                  POP AF                |            // A = (0x15yy)
199A B2                  OR D                  |
199B 57                  LD D, A               |            // D = A OR D
199C F1                  POP AF                |            // A = (0x14yy)
199D 4F                  LD C, A               |            // C = A
199E F1                  POP AF                |            // A = (0x14yy)
199F B1                  OR C                  |
19A0 4F                  LD C, A               |            // C = C OR A
19A1 F1                  POP AF                |            // A = (A XOR (0x2a00))
19A2 47                  LD B, A               |            // B = A
19A3 F1                  POP AF                |            // A = (0x14xx)
19A4 B0                  OR B                  |
19A5 47                  LD B,A                |            // B = B OR (0x14xx)
19A6 E5                  PUSH HL               |            // Rette HL
19A7 DD E5               PUSH IX               |            // Rette IX
19A9 E1                  POP HL                |            // HL = IX
19AA 7C                  LD A, H               |            // A = 0x28
19AB A8                  XOR B                 |
19AC 47                  LD B,A                |            // B = 0x28 XOR B
19AD 7D                  LD A, L               |            // A = 0x08
19AE A9                  XOR C                 |
19AF 4F                  LD C,A                |            // C = 0x08 XOR C
19B0 FD E5               PUSH IY               |            //
19B2 E1                  POP HL                |            // HL = IY
19B3 7C                  LD A, H               |
19B4 AA                  XOR D                 |
19B5 57                  LD D,A                |            // D = D XOR H
19B6 7D                  LD A,L                |
19B7 AB                  XOR E                 |
19B8 5F                  LD E,A                |            // E = E XOR L
19B9 E1                  POP HL                |            // HOLE HL
19BA FD E1               POP IY                |            // HOLE IY
19BC DD E1               POP IX                |            // HOLE IX
19BE F1                  POP AF                |            // HOLE AF
19BF FE 09               CP 0x09               |            // A == 0x09?
19C1 28 2A               JR Z, 0x2A    >----\  |            // JA
19C3 3D                  DEC A              |  |            // Nein, --A
19C4 C2 22 18            JP NZ, 0x1822 >--> | >+            // A <> 0; Schleife
19C7 21 00 2A            LD HL, 0x2A00      |  |            // Ein- Ausgabe LAMBDA, Wurmreihen
19CA 70                  LD M,B             |  |            // (0x2a00) = B
19CB 2C                  INC L              |  |            // (0x2a01)
19CC 71                  LD M,C             |  |            // (0x2a01) = C
19CD 2C                  INC L              |  |            // (0x2a02)
19CE 72                  LD M,D             |  |            // (0x2a02) = D
19CF 2C                  INC L              |  |            // (0x2a03)
19D0 73                  LD M,E             |  |            // (0x2a03) = E
19D1 2C                  INC L              |  |            // (0x2a04)
19D2 DD E5               PUSH IX            |  |
19D4 C1                  POP BC             |  |            // LD BC, IX
19D5 70                  LD M,B             |  |            // (0x2a04) = B
19D6 2C                  INC L              |  |
19D7 71                  LD M,C             |  |            // (0x2a05) = C
19D8 2C                  INC L              |  |            // (0x2a06)
19D9 FD E5               PUSH IY            |  |
19DB C1                  POP BC             |  |            // LD BC, IY
19DC 70                  LD M,B             |  |            // (0x2a06) = B
19DD 2C                  INC L              |  |
19DE 71                  LD M,C             |  |            // (0x2a07) = C
19DF AF                  XOR A              |  |            // Lösche A
19E0 21 00 2A            LD HL, 0x2A00      |  |            // Ein- Ausgabe LAMBDA, Wurmreihen
19E3 06 08               LD B, 0x08         |  |            // Länge = 8
19E5 AE                  XOR M      <-\     |  |            // A XOR (0x2a00) Ein- Ausgabe LAMBDA XOR Daten
19E6 23                  INC HL       |     |  |            // (0x2a01)
19E7 10 FC               DJNZ 0xFC  >-/     |  |            // bis (0x2a07)
19E9 32 08 2A            LD (0x2A08), A     |  |            // Prüfbyte Summe über Ein- Ausgabe LAMBDA, Wurmreihen
19EC C9                  RET                |  |
                                            |  |
19ED E5          L0315:  PUSH HL    <-------/  |            // Rette HL
19EE FD E5               PUSH IY               |            // Manipulierter Stack über die Push/POPs
19F0 E1                  POP HL                |            // HL = IY
19F1 3A 83 28            LD A,(0x2883)         |            // A = (0x2883)
19F4 85                  ADD A,L               |            // A = A + L
19F5 6F                  LD L,A                |            // L = A
19F6 3A 82 28            LD A,(0x2882)         |            // A = (0x2882)
19F9 8C                  ADC A,H               |            // A = A + Carry + H
19FA 67                  LD H,A                |            // H = A
19FB E5                  PUSH HL               |
19FC FD E1               POP IY                |            // IY = HL
19FE DD E5               PUSH IX               |
1A00 E1                  POP HL                |            // HL = IX
1A01 3A 81 28            LD A,(0x2881)         |            // A = (0x2881)
1A04 8D                  ADC A,L               |            // A = A + Carry + L
1A05 6F                  LD L,A                |            // L = A
1A06 3A 80 28            LD A,(0x2880)         |            // A = (0x2880)
1A09 8C                  ADC A,H               |            // A = A + Carry + H
1A0A 67                  LD H,A                |            // H = A
1A0B E5                  PUSH HL               |
1A0C DD E1               POP IX                |            // IX = HL
1A0E 3A 87 28            LD A,(0x2887)         |            // A = (0x2887)
1A11 83                  ADD A,E               |            // A = A + E
1A12 5F                  LD E,A                |            // E = A
1A13 3A 86 28            LD A,(0x2886)         |            // A = (0x2886)
1A16 8A                  ADC A,D               |            // A = A + Carry + D
1A17 57                  LD D,A                |            // D = A
1A18 3A 85 28            LD A,(0x2885)         |            // A = (0x2885)
1A1B 89                  ADC A,C               |            // A = A + Carry + C
1A1C 4F                  LD C,A                |            // C = A
1A1D 3A 84 28            LD A,(0x2884)         |            // A = (0x2884)
1A20 88                  ADC A,B               |            // A = A + Carry + B
1A21 47                  LD B,A                |            // B = A
1A22 3E 08               LD A, 0x08            |            // A = 8
1A24 E1                  POP HL                |            // HL zurück, Zeile 0x19ed-> 0x19a6-> 0x1993
1A25 C3 22 18            JP 0x1822    >--------/            // Schleife

// Testwerte 0x1a41 RAM Check
1A28                         FF 00 FF 55 FF AA 55 FF
1A30 AA 55 AA 00 AA FF 00 AA 00 55 00 FF 55 00 55 AA
1A40 FF

// Prüfprogramm RAM CHECK, Übergabe IX; Rückgabe Z-Flag
1A41 DD 4E 02    L0322:  LD C, (IX+02)                     // Übergabe IX; 0x029B; 0x02a3; Größe der RAM Bereiche
1A44 DD 46 03            LD B, (IX+03)                     // BC = 0x0320; = 0x036f
1A47 78                  LD A, B                           // Prüfung BC == 0
1A48 B1                  OR C
1A49 28 4A               JR Z, 0x4A                        // Return IY;
1A4B DD 6E 00            LD L, (IX+00)                     // Übergabe IX; 0x0299; 0x02a1; Speicheradresse der RAM Bereiche
1A4E DD 66 01            LD H, (IX+01)                     // HL = 0x0ce0; = 0x2b90
1A51 5D                  LD E, L
1A52 54                  LD D, H                            // HL = DE = -> Speicherbereiche
1A53 13                  INC DE                             // 0x0ce1; 0x2b91
1A54 3A 28 1A            LD A, (0x1A28)                     // A = 0xff
1A57 77                  LD M, A                            // M = 0xff
1A58 0B                  DEC BC                             // BC = Länge = 0x0320 - 1; 0x036f - 1;
1A59 ED B0               LDIR                               // Fülle RAM mit 0xff; HL = HL + BC
1A5B 11 28 1A            LD DE, 0x1A28                      // BC == 0x0000, HL = 0xffff; DE = 0x1000 // HL von 0x2b91 bis 0x2f00
1A5E DD 4E 02    L0321:  LD C, (IX+02)            <---\
1A61 DD 46 03            LD B, (IX+03)                |     // Größe der RAM 0x029B; 0x02a3
1A64 1A          L0319:  LD A, (DE)        <-------\  |     // A = 0xff
1A65 AE                  XOR M                     |  |     // A = A XOR M; HL = 0xffff; HL = 0x2f00
1A66 20 2D               JR NZ, 0x2D      >---\    |  |     // A == HL ?
1A68 13                  INC DE               |    |  |     // = 0x1a29
1A69 1A                  LD A, (DE)           |    |  |     // A = 0x00
1A6A 77                  LD M, A              |    |  |     // M = 0x00
1A6B 1B                  DEC DE               |    |  |     // = 0x1A28
1A6C 2B                  DEC HL               |    |  |     // = 0xfffe; 0x2eff
1A6D 0B                  DEC BC               |    |  |     // 0x031f; 0x036e
1A6E 79                  LD A, C              |    |  |     // A = 1f; 6e
1A6F B0                  OR B                 |    |  |     // A or B
1A70 20 F2               JR NZ, 0xf2          | >--/  |     // BC == 0x0000 ?, Schleife RAM Check 0xff und 0x00
1A72 13                  INC DE               |       |     // = 0x1a29
1A73 23                  INC HL               |       |     // = 0xffff; 0x2f00
1A74 DD 4E 02            LD C, (IX+02)        |       |
1A77 DD 46 03            LD B, (IX+03)        |       |     // Größe der RAM 0x029B; 0x02a3
1A7A 1A          L0320:  LD A, (DE)    <-\    |       |     // A == 0x00
1A7B AE                  XOR M           |    |       |     // A = 0x00 XOR M
1A7C 20 17               JR NZ, 0x17     | >--+       |     // HL == 0x00 ?
1A7E 13                  INC DE          |    |       |     // DE = 0x1a2a (0xff)
1A7F 1A                  LD A, (DE)      |    |       |     // A = 0xff
1A80 77                  LD M, A         |    |       |     // M = 0xff
1A81 1B                  DEC DE          |    |       |
1A82 23                  INC HL          |    |       |
1A83 0B                  DEC BC          |    |       |
1A84 79                  LD A, C         |    |       |
1A85 B0                  OR B            |    |       |
1A86 20 F2               JR NZ, 0xF2   >-/    |       |     // BC == 0x00 ? RAM Check auf 0xff
1A88 2B                  DEC HL               |       |
1A89 13                  INC DE               |       |     // DE = 0x1a2a
1A8A 3E 40               LD A, 0x40           |       |
1A8C AB                  XOR E                |       |
1A8D 20 CF               JR NZ, 0xCF          |    >--/     // bis 0x1A40 abgearbeitet?
1A8F 0E 04               LD C, 0x04           |
1A91 DD 09               ADD IX, BC           |             // IX = 0x029B; 0x02a3; + 0x0004
1A93 18 AC               JR 0xAC              |             // Springe in den Anfang der Subroutine 0x1a41
1A95 FD E9       L0318:  JP (IY)        <-----/             // Beenden Rückgabe Z-Flag


//// CRC1-16 nur für ROM ///////////////////////////////////////////////////
// Übergabe  IX = 0x1367               Daten: Start/Länge/Prüfsumme       //
// Rücksprungadresse im Speicher  IY =  0x00f7                            //
////////////////////////////////////////////////////////////////////////////
1A97 DD 4E 02    L0325:  LD C, (IX+02)<-------\            // C = (IX+2);                           00          ; IX = 0x136d,
1A9A DD 46 03            LD B, (IX+03)        |            // B = (IX+3); Länge des Prüfbereichse   04 -> 0x0400; 0x0400
1A9D 78                  LD A, B              |            // A = (IX+3)
1A9E B1                  OR C                 |            // A = (IX+3) or (IX+2)
1A9F 28 4A               JR Z, 0x4A    >--\   |            // JUMP (IY) wenn BC == 0x0000 keine weiteren EPROM Prüfen
1AA1 DD 6E 00            LD L, (IX+00)    |   |            // L = (IX);                          00
1AA4 DD 66 01            LD H, (IX+01)    |   |            // H = (IX+1); Startbereich der Daten 00 -> ab 0x0000; ab 0x0400;
1AA7 11 FF FF            LD DE, 0xFFFF    |   |            // DE = 0xffff; CRC Startvektor
1AAA 7E          L0324:  LD A, M     <-\  |   |            // A = (ix+1,ix) M
1AAB AA                  XOR D          | |   |            // D = 0xff
1AAC 57                  LD D, A        | |   |            // D = A XOR D
1AAD 0F                  RRCA           | |   |            // Rotiere Rechts A über Carry, A.7 > A.0
1AAE 0F                  RRCA           | |   |
1AAF 0F                  RRCA           | |   |
1AB0 0F                  RRCA           | |   |            // 4 * RRCA
1AB1 E6 0F               AND 0x0F       | |   |            // Maskiere A, nur Lowbyte
1AB3 AA                  XOR D          | |   |            // A = A.low XOR D
1AB4 57                  LD D, A        | |   |            // D = A
1AB5 0F                  RRCA           | |   |            // rotiere rechts A.7 > A.0
1AB6 0F                  RRCA           | |   |
1AB7 0F                  RRCA           | |   |            // 3 * RRCA
1AB8 E6 1F               AND 0x1F       | |   |            // Maskiere A, 0x1f, bits 4 - 0
1ABA AB                  XOR E          | |   |            // A = A XOR E
1ABB 5F                  LD E, A        | |   |            // E = A
1ABC 7A                  LD A, D        | |   |            // A = D
1ABD 0F                  RRCA           | |   |            // rotiere rechts A.7 > A.0
1ABE 0F                  RRCA           | |   |
1ABF 0F                  RRCA           | |   |
1AC0 0F                  RRCA           | |   |            // 4 * RRCA
1AC1 E6 F0               AND 0xF0       | |   |            // Maskiere obere 4 bytes
1AC3 AB                  XOR E          | |   |            // A = A XOR E
1AC4 5F                  LD E, A        | |   |            // E = A
1AC5 7A                  LD A, D        | |   |            // A = D
1AC6 0F                  RRCA           | |   |            // rotiere rechts A.7 > A.0
1AC7 0F                  RRCA           | |   |
1AC8 0F                  RRCA           | |   |            // 3 * RRCA
1AC9 E6 E0               AND 0xE0       | |   |            // maskiere 0xe0, bit 7 - 5
1ACB AA                  XOR D          | |   |            // A = A XOR D
1ACC 53                  LD D, E        | |   |            // D = E
1ACD 5F                  LD E, A        | |   |            // E = A
1ACE 23                  INC HL         | |   |            // HL + 1
1ACF 0B                  DEC BC         | |   |            // BC - 1
1AD0 78                  LD A, B        | |   |            // A = B
1AD1 B1                  OR C           | |   |            // A = B or C
1AD2 20 D6               JR NZ, 0xD6  >-/ |   |            // bis BC == 0, Länge 0x0400; Debug
1AD4 DD 73 04            LD (IX+04), E    |   |            // ??(IX+4) = E; 50 In den ROM schreiben Debugversion?? -> NOP NOP NOP ersetzen
1AD7 DD 72 05            LD (IX+05), D    |   |            // ??(IX+5) = D; B6 Prüfsummen: 0x50b6; 0x583a ... -> NOP NOP NOP ersetzen
1ADA DD 6E 04            LD L, (IX+04)    |   |            // Prüfsumme EPROM Nr. x low
1ADD DD 66 05            LD H, (IX+05)    |   |            // Prüfsumme EPROM Nr. y High
1AE0 ED 52               SBC HL, DE       |   |            // HL = HL - DE
1AE2 20 07               JR NZ, 0x07    >-+   |            // ungleich null-> Prüfsumme Falsch
1AE4 01 06 00            LD BC, 0x0006    |   |            // BC = 0x06 -> Prüfsumme richtig
1AE7 DD 09               ADD IX, BC       |   |            // IX = IX + 6; 0x136d
1AE9 18 AC               JR 0xAC          | >-/            // Beginn der Subroutine
1AEB FD E9       L0323:  JP (IY)      <---/                // Ende CRC über ROM, Übergabe Z-Flag = 1 alle EPROM OK, = 0 mind. ein EPROM fehlerhaft

// CRC2-16, Übergabe DE, A; Rückgabe DE
1AED AA                  XOR D                              // A XOR D
1AEE 57                  LD D,A                             // D = D XOR A
1AEF 0F                  RRCA                               // A.7 > A.6 > ... A.0 > C, A.7 = C
1AF0 0F                  RRCA
1AF1 0F                  RRCA
1AF2 0F                  RRCA                               // 4 mal rechts rotation SWAP HIGH <> LOW
1AF3 E6 0F               AND 0x0F                           // Maskiere untere 4 Bits
1AF5 AA                  XOR D                              //
1AF6 57                  LD D,A                             // D = D XOR A (bit 4 ... 0)
1AF7 0F                  RRCA                               // Rotiere Rechts
1AF8 0F                  RRCA
1AF9 0F                  RRCA                               // A.0 > A.5, A.1 > A.6, A.2 > A.7, A.3 > A.0, ...
1AFA F5                  PUSH AF                            // Rette AF
1AFB E6 1F               AND 0x1F                           // Maskiere untere 5bits
1AFD AB                  XOR E
1AFE 5F                  LD E,A                             // E = E XOR A(bit 4 ... 0)
1AFF F1                  POP AF                             // AF zurück
1B00 F5                  PUSH AF                            // AF Retten
1B01 0F                  RRCA
1B02 E6 F0               AND 0xF0                           // Maskiere oberen bits 7 ... 4
1B04 AB                  XOR E
1B05 5F                  LD E,A                             // E = E XOR A (bit 7 ... 4)
1B06 F1                  POP AF                             // AF zurück
1B07 E6 E0               AND 0xE0                           // Maskiere Bit 4 ... 5
1B09 AA                  XOR D                              // A = D XOR A(bit 7 ... 5)
1B0A 53                  LD D,E                             // D = E
1B0B 5F                  LD E,A                             // E = A
1B0C C9                  RET                                // Rückgabe DE

1B0D 7F                      // Füllbytes
...
1BFF 7F                      // Füllbytes
// ROM 7 - 9 nicht belegt:
1c00 ...  27ff

// Start ROM/RAM Karte RAM Speicher 2kbyte:
2800 ... 2fff