/*************************************************/ /* Verwendete Abkürzungen der ersten beiden Buchstaben /* AG /* AZ Anzeige /* BA Arbeitsartenauswahl /* BL Blockierung /* BZ Betriebszustand /* CD Dechiffrieren /* CH Chiffrierung /* CK Chiffrierung Kontrollchiffrierung /* DH Dechiffrierung /* DR Drucken /* EM Empfang /* Gl Globale Variablen /* GT Geheimtext /* GTSPE GTX-Speicher Empfang /* GTSPS GTX-Speicher Senden /* KT Klartexterstellung /* KTSPE KTXT-Speicher Empfang /* KTSPS KTXT-Speicher Senden /* LZS Langzeitschlüssel /* PP Prophylaktische Prüfung /* SC Schlüsseleingabe /* SE Senden /* TA Tastatur /* TE Test /* TP Textprozessor /* ZG Zufallsgenerator /* ZP /* ZS Zeitschlüssel /*************************************************************/ /* Aus BArch 680 Kryptologische Analyse T-316 */ /* */ /* Das STW wird nach dem Kontrollchiffrieren und Löschen des ! /* Klartextes im Klartextspeicher Senden auf 0xfb gestellt ! /* Vor dem SENDEN wird geprüft ob STW == 0xfb ist, nur dann /* erfolgt der Übergang. /* Geheimtextempfang und Dechiffrieren verändert STW nicht. /* Im Dechiffrieren wird der gültige STW bespeichert. /* Während des Dechiffrierens und Klartext im Klartextspeicher /* ist STW == 0, nach dem Löschen des Klartextes wird STW /* wieder gültig gemacht (? Wert) /* /* CH2 STW = 0x00 /* ZSE STW = 0xfb /* KT STW = 0xfb /* CH1 STW = 0xfb /*************************************************************/ /*************************************************/ /* GLOBALPARAMETER /* SPEICHERORGANISATION /* GL.ADSP1 0x8000 ; Dopplungs-Speicher (ADD1 /* GL.KTSPS-16 0x83f0 ; Klartextspeicher 16 bit /* GL.KTSPS 0x8400 ; Textspeicher senden /* GL.KTSPE 0x8800 ; Textspeicher empfangen /* GL.GTSPT 0x8c00 ; GTX-Speicher Test erstellen /* GL.GTSPE 0x9000 ; GTX-Speicher empfangen /* GL.SSP 0x9400 ; Schlüsselspeicher, crc- /* GL.PWSP 0x9600 ; Passwort Speicher, 32 byte /* GL.LCDR 0xa000 ; LCD-RAM /* GL.ASP 0xdc00 ; Arbeitsspeicher /* GL.HBA 0xdc00 ; Hauptbetriebsart /* GL.GTSPS 0x5c10 ; GTX Speicher senden (Add /* GL.STACK ASP + 0x03de ; Stack 80 byte = 0xdfde /* GL.BG ASP + 0x03e0 ; für Bediengerät 32 byte = 0xdfe0 /* GL.ROME 0x4000 ; EPROM Speicher Ende 12 kybte /* GL.LIN ASP+0x03de ; Merker Kontrolle Linie = 0xdfde /* GL.KBOX ROME - 0x400 ; letztes byte für K-Box 0x3e00 /* GL.ZSADD GTSPS + 0x3d8 ; Adresse Zusatz-Additionsreihe, 984 Byte 15*64 + 24 /* GL.RAM 0x0400 ; Länge 1kbyte für RAM- /* RAM Merkerstellen Arbeitsspeicher /* /* Merkstellen RAM-Test /* /* TEND: LCDR + 0x03fe ; Abbruchparameter RAM-Test /* ORG ASP /* /* Betriebsartenmerkerstellen /* HBA1: def SSP(0x9400) + 0x3fff ; Hauptbetriebsarten, 0xd3ff /* = 0 : GO /* = 1 : MIRA /* /* 0xdc00 GL.HBA: Länge 1 ; entspricht Hauptbetriebsart-1 im ASP /* 0xdc01 BARE: Länge 1 ; Betriebsartenregister /* = 0 : KT erstellen /* = 1 : Schlüsselwechsel /* = 2 : GT erstellen /* = 3 : GT senden /* = 4 : GT senden Akustikkoppler /* /* Merkerstellen der Alpha-Tastatur /* 0xdc02 ALDAT: Länge 1 ; Datenübergaberegister /* 0xdc03 ZUALF: Länge 1 ; Zustand Alpha-Tastendruck /* bit 0: neues Zeichen war (=1) /* bit 1: CTL "0" war (=1) /* bit 2: INS-Mode (=1) /* bit 3: "Überholsperre" /* /* 0xdc04 ALMER: Länge 8 /* 0xdc0c ALZAL: Länge 1 ; Zähler für Zeile /* 0xdc0d ALMEA: Länge 8 /* 0xdc15 AMER: Länge 1 /* 0xdc16 BMER: Länge 1 /* 0xdc17 CMER: Länge 1 /* 0xdc18 DMER: Länge 1 ; Zähler für Durchläufe /* 0xdc19 TAZAL: Länge 1 /* /* Merkerstellen des Textprozessors /* 0xdc1a ZTP: Länge 1 ; Zustand TP /* 0xdc1b ZADR: Länge 2 ; Aktueller Zeiger /* 0xdc1d EADR: Länge 2 ; Ende Zeiger /* 0xdc1f AADRT: Länge 2 ; Anfangsadresse Textspeicher /* 0xdc21 EADRT: Länge 2 ; Endadresse Textspeicher /* 0xdc23 TPME1: Länge 1 ; Formatierung Schlüssel 1; /* 0xdc24 TPME2: Länge 1 ; Formatierung Schlüssel 2; /* /* Merkerstellen Anzeigesteuerung /* /* 0xdc25 ZUANZ: Länge 1 ; Zustandsanzeige /* 0xdc26 ZUAN2: Länge 1 ; Merkerstelle für Bedienermeldungen /* 0xdc27 ZUAN3: Länge 1 ; Einfügemode /* 0xdc28 ANCSP: Länge 2 ; Merkerstelle für Cursor /* /* Merkerstellen für Schlüsselwechsel /* 0xdc28 ALRC: Länge 2 ; Adresse CRC-Wert Register /* 0xdc2a ALRC: Länge 2 ; Adresse CRC-Wert Register /* 0xdc2b Länge 2 ; Speicherort CRC für Prüfung; Zeiger auf ... /* Merkerstellen für KSS-Programme /* 0xdc2c STW: Länge 1 ; Steuerwortregister /* /* Merkerstellen für PP-Programme /* 0xdc2d CRCF: Länge 2 ; Nr. des Schlüssel /* /* 0xdc2e Länge 1 ; Steuerwort; 0xfb nach Kontrollchiffr. u. Löschen KTSPS Senden /* 0x00 Klartext im KTSPE - beim Einschalten -Schlüsseleingabe -wechsel, BA wechsel, bei PP, Klartexterstellung und Blockierung /* /* Merkstellen für Chiffrieren und Dechiffrieren /* 0x3e00 KB0: H(KBOX) ; K-Box 0 /* KB3: KB0 + 3 ; K-Box 3 /* 0xdc2f ANZA1: Länge 2 ; Länge KT /* 0xdc31 ANZB1: Länge 2 ; Anzahl ersteller Byte /* 0xdc33 SPAD1: Länge 2 ; Zieladresse /* 0xdc35 GN2: Länge 4 ; 64-bit Reg. Chiffrieren /* 0xdc39 GN1: Länge 4 ; 64-bit Reg. Chiffrieren /* 0xdc3d GN4: Länge 4 ; Register Mod-Venküpfung /* 0xdc41 GN3: Länge 4 ; Reg. Mod-Verknüpfung /* 0xdc45 ZSB: Länge 0x32 ; 50 byte Zeitschlüsselbereich; im Programm 0xdc42; Rundenschlüssel /* 0xdc65 SB: Länge 0x32 ; 50 byte dto - 0xdc85 /* 0xdc52 S1 Länge 0x32 ; 50 byte Schlüssel; Kopie ! des Rundenschlüssels /* 0xdc72 CRC-S1 Länge 4 ; CRC falsch richtig /* 0xdc76 ; frei /* 0xdc77 IV Länge 8 ; IV 64 bit /* 0xdc7f CRCiv Länge 2 ; CRC des IV /* 0xdc81 Länge 2 ; Zeiger auf Rundenschlüssel 1 /* 0xdc83 Länge 2 ; Zeiger auf Rundenschlüssel 2 /* 0xdc85 ANZA2: Länge 2 ; Länge KT; CRC, HL XOR DE /* 0xdc87 ANZB2: Länge 2 ; Zeiger Zufallsfolgen /* 0xdc89 SPAD2: Länge 2 ; Zieladresse /* 0xdc8a ZUFAL: Länge 1 ; Zufallsbyte /* 0xdc8b N2: Länge 1 ; Sigma-3 Grenzen: 0x17 > x < 0x67 /* 0xdc8c Länge 2 ; Gesamtlänge Zufallsfolgen /* 0xdc8e Länge 1 ; Zähler Zufallsfolge 32 oder 8 bit /* 0xdc8f N1: Länge 1 ; Speicher Zyklusanzahl /* Übergabeparameter IN GL.G1: ; G1 Zufallsgenerator /* Bit 7 = Fertig; 6 = Fehler ZF; 5 = ZF-Test */ /* Statussignal für Unterprogramm ZF: /* ZF-Erzeugung 0x40 IN GL.G1 LAD /* Konst.Folge 0x20 IN GL.G1 LAD /* 0xdc90 GL.G1 Länge 1 ; Betriebsart Zufallsgenerator Rückgabe: bit 7, 6, 5 /* 0xdc93 N4: Länge 4 ; Reg. Mod-Verknüpfung /* oxdc97 N3: Länge 4 ; Register Mod-Venküpfung /* 0xdc9b ASPE: Länge 2 ; Speicher Zieladresse /* 0xdc9d ZADE: Länge 2 ; Aktueller Zeiger GTE /* 0xdc9f VORE: Länge 1 ; Vorbereitung X1.DCA /* 0xdca0 HWKB: Länge 1 ; Höherwertiger Teil K-Box 0x3e00 /* 0xdca1 ADZS: Länge 2 ; Adresse Zeitschlüssel /* 0xdca3 ADN1: Länge 2 ; Adresse N1 /* 0xdca5 ADN2: Länge 2 ; Adresse N2 /* 0xdca7 ARBS: Länge 6 ; Arbeitsspeicher löschen /* 0xdca9 Länge 1 ; Arbeitsart Drucker ; Bit 0 Drucken = 1, Beendet = 0, Bit 1, Bit 2 = Sonderdruck, Bit 3 = Sonderdruck, Bit 4, Bit 5 = Sendepuffer Voll == 1, Bit 6 ÜBERHOLSPERRE BYTEBEREIT, Bit 7 /* 0xdcaa Länge 1 ; Sonderdruck Nr. 0, 1, 2, 3 - Abspann, 4 - GTX MIRA, 5 - GTX in 5er Gruppen /* 0xdcab Länge 1 ; Zustandszeiger MIRA/GO? /* 0xdcad VORC: Länge 1 ; Vorbereiten X2,DCA (s.u.) /* 0xdcae HWKC: Länge 1 ; Länge - Anzahl der Zeichen für Druckprogramm, Achtung 2 Byte; s. 0x17bc /* 0xdcaf ADS: Länge 2 /* 0xdcb1 AN1: Länge 2 /* 0xdcb3 AN2: Länge 2 ; Zeiger Adresse /* 0xdcb5 ARBR: Länge 6 /* 0xdcb6 ASCII: Länge 1 ; Speicher konvertier Text, ASCII /* 0xdcb9 Länge 2 ; Zeiger auf 0xdcb1 /* /* Merkstellen für ZF-Folge Erzeugung /* 0xdcbb ZFZ: Länge 2 ; Zeiger ZF-folge /* 0xdcbd ZFL: Länge 1 ; Blocklänge /* 0xdcbe ZFB: Länge 1 ; Erzeugtes Byte /* 0xdcbf SIG3: Länge 1 ; Maskenzähler /* 0xdcc0 ZFGA: Länge 2 ; Gesamtzähler /* 0xdcc2 BITZ: Länge 1 ; Bitzähler /* 0xdcc3 ZFZY: Länge 1 ; Anzahl der Zyklen /* 0xdcc4 G1: Länge 1 ; Statussignal /* ; bit 7 = 1 G1 Fertig /* ; bit 6 = 1 Fehler ZF-1 /* 0xdcc5 GN5: Länge 4 ; Konstante C2 /* 0xdcc9 GN6: Länge 4 ; Konstante C1 /* 0xdccc SSR ; SENDESCHIEBEREGISTER /* 0xdccd HSP1: Länge 4 ; Hilfsspeicher 32*0 /* 0xdcd1 HSP2: Länge 4 ; Hilfsspeicher 31*0. 32=1 /* 0xdcd5 N5: Länge 4 ; =GN5 /* 0xdcd9 N6: Länge 4 ; =GN6 /* /* Empfangsmerkerregister /* 0xdcdd ZUEM2: Länge 1 ; Zustand Empfangsdaten /* ; = 0 Suchen und einlesen AA; 0x00 /* ; = 1 Einlesen IV /* ; = 2 Einlesen CRC IV /* ; = 3 Einlesen Datenlänge /* ; = 4 Einlesen Daten /* 0xdcde EMZA1: Länge 2 ; Datenlängenzähler /* 0xdce0 EMZA2: Länge 2 ; Teildatenmengenzähler /* 0xdce2 ZEIK1: Länge 6 ; Empfängerzeitkonstante /* ZEIK2: DEF ZEIK 1+2 ; neue Zeitkonstanten-GL /* ZEIK3: DEF ZEIK 1+4 ; Zeit zwischen 2 wechseln /* 0xdce8 ZEMPF: Länge 1 ; Zustand Empfänger /* ; bit 0 = 1 keine neueinstellung ZEIKONSTANTE /* ; = 0 neueinstellung ZEIKO bei 0->1 /* ; 1 = 1 Empfänger arbeiet /* ; 2 = 0 Kein Status IV /* ; 3 = 0 kein Status Datenfolge /* 0xdce9 FLANK: Länge 1 ; Letzte Empfangsflanke /* ; FLANK = 1 : 0 -> 1 Flanke war vorher /* ; 0 : 1 -> 0 Flanke war vorher /* 0xdcea BIZAE: Länge 1 ; Bitzähler für Empfang /* 0xdceb DBYTE: Länge 1 ; Datenbyte z.Zt. im Empfänger /* 0xdcec ADREM: Länge 2 ; Empfängerzeiger /* 0xdcee EAGTM: Länge 2 ; Ende Zeiger GT erstellen /* 0xdcf0 EAGTG: Länge 2 ; aktuelle Endadresse GTE /* 0xdcf2 EAKTE: Länge 2 ; Endadresse KTE (BA) /* /* Druckerregister /* 0xdcf4 DRBA: Länge 1 ; Druckerbetriebsart /* 0xdcf5 ZDR: Länge 1 ; Zustand Drucker /* ; bit 0 : Drucker soll arbeiten (=1) /* ; bit 1 : Drucker arbeitet /* ; bit 2 : Sonderdruck /* ; bit 3 : Sonderdruck im Sonderdruck /* ; bit 4 : Schieberegister leer /* ; bit 5 : Sendepuffer leer /* ; bit 6 : Datenbereitstellung für (DRZE!) Lädt /* 0xdcf6 ZDR2: Länge 1 ; Nr. des Sonderdruckes /* 0xdcf7 ZDR3: Länge 1 ; Drucken, vor-nach chiffrieren, vor-nach dechiffrieren /* 0xdcf8 DRADR: Länge 1 ; Druckeradresse für /* 0xdcfa DRANZ: Länge 1 ; Druckeranzahl /* 0xdcfc DRGTZ: Länge 1 ; Fünfergruppenzähler Drucken /* 0xdcfd GRZAE: Länge 4 ; Gruppenzähler /* 0xdd01 DRSR: Länge 1 ; Druckerschieberegister /* 0xdd02 DRZEI: Länge 1 ; Sendepuffer /* 0xdd03 DRSRZ: Länge 1 ; Druckerschieberegisterzähler /* 0xdd04 Z69: Länge 1 ; Zeilenzeichenzähler /* 0xdd05 BADR1: Länge 2 ; BildAdresse /* 0xdd07 Länge 6 /* BANZ1: DEF BADR1+2 ; Bildanzahl 1 /* BADR2: DEF BADR1+4 ; Bildadresse /* BANZ2: DEF BADR1+6 ; Bildanzahl /* /* Zwischenspeicher Auseinanderziehen /* 0xdd0e EAAZ: Länge 2 ; Endadresse Auseinanderziehen /* 0xdd10 SPAZ: Länge 2 ; Anfangsadresse Auseinanderziehen /* /* Merkregister Text erstellen /* 0xdd12 EAKTS: Länge 2 ; Ende Zeiger Text-S erstellen /* /* Sendemerkerregister /* BTANZ: DEF 0x08 ; bitanzahl pro byte /* 0xdd14 ZSE: Länge 1 ; Zusand senden /* ; = 1 Anfangsfolge FF /* ; = 2 Folge AA /* ; = 3 Datenblock /* ; = 5 Endblock 00 /* ; = 6 Sendeabbruch /* 0xdcc9 ; Gerät? /* 0xdd15 ZSE1: Länge 1 ; Gerät? /* ; = 0 Akustikoppler /* ; = 1 MODEM /* 0xdd16 ZUSE: Länge 1 ; Zustand sender /* ; = 0 inaktiv /* ; = 1 aktiv /* 0xdd17 SEBIT: Länge 1 ; zu sendendes Bit /* 0xdccc ; SENDESCHIEBEREGISTER /* 0xdd18 SERE: Länge 1 ; Sendeschieberegister /* 0xdd19 SENDL: Länge 1 ; Anzahl der Schwingungen /* 0xdd1a SEZAE: Länge 1 ; Anzahl bytes pro testfolge /* 0xdd1b SERES: Länge 1 ; Zähler der Bits pro /* 0xdd1c SEADR: Länge 2 ; Sendeadresse bei datenM /* 0xdc1e EAGTS: Länge 2 ; Sendeadresse GTX /* 0xdd20 LGT: Länge 2 ; Länge GTX für Umwandlung /* 0xdd22 AGT: Länge 2 ; Aktuelle Adresse GTX für Umwandlung /* /* ORG GTSPS /* 0x5c10 GTX: Länge 0x0360 ; GTX + IV + crc (= 608byte) /* Aufbau: IV 8byte, CRC-IV 2 byte; Länge CT 2byte; Geheimtext max 1024 Byte; CRC-GT 2byte /* /* ORG LCDR, Bildwiederholspeicher /* 0xa000 Z1: Länge 16, 1. Zeilenadresse, 0xa00f ungenutzt /* 0xa010 Z2: Länge 16, 2. Zeilenadresse, 0xa01f ungenutzt /* 0xa020 Z3: Länge 16 . /* 0xa030 Z4: Länge 16 . /* 0xa040 Z5: Länge 16 . /* 0xa050 Z6: Länge 16 . /* 0xa060 Z7: Länge 16 . /* 0xa070 Z8: Länge 16 . /* 0xa080 Z9: Länge 16 . /* 0xa090 Z10: Länge 16 10. Zeilen-Adresse, 0xa09f ungenutzt /* 0xa0a0 Länge 20 /* 0xa0b4 AZ: Länge 20 /* 0xa0c8 ZZ: Länge 20 /* 0xa0dc END Textcodierung T-316 entspricht Fs-ITA-II-CCITT-2 CPU-Frequenz ca 1,340 MHz I/O Adressen laut VVS (BArch-679) IC U84C30, Z80 CTC CTC 0: EQU 0x08 // Kanal 0 Zeitgeber Senden CTC 1: EQU 0x09 // Kanal 1 Empfang (Grundzeit), EM (Bitlänge) CTC 2: EQU 0x0a // Kanal 2 Drucken, EM (Wechsellängen) CTC 3: EQU 0x0b // Kanal 3 Tastatur, Taktvorgabe ZG CTC Kanal 0: Senden, Zeitgebermode, log 1 TC = 0x23 = 35 * 256 / 1,340 MHz = 6,7 ms log 0 TC = 0x2d = 45 * 256 / 1,340 MHz in 8,6 ms 1: Empfangen (Grundzeit), EM (Bitlänge) 2: Drucken, EM (Wechsellängen) 3: Tastatur, Taktvorgabe Zufallsgenerator I/O Control/Daten Steuerung PIO IC U84C20, Z80A PIO PIO-0-A-D EQU 0x00 // PIO 0 Port A Daten, Tastatur MA PIO-0-A-C EQU 0x02 // PIO 0 Port A Control PIO-0-B-D EQU 0x01 // PIO 0 Port B Daten, Tastatur ME, ZG, OUTC PIO-0-B-C EQU 0x03 // PIO 0 Port B Control, Steuerwort,Tastatur PIO 0 B PIO-1-A-D EQU 0x04 // PIO 1 Port A Daten, Div. Signale PIO-1-A-C EQU 0x06 // PIO 1 Port A Control, Steuerwort-PIO 1 A PIO-1-B-D EQU 0x05 // PIO 1 Port B Daten, Sonderschnittstelle PIO-1-B-C EQU 0x07 // PIO 1 Port B Control, Steuerwort, Sonderschnittstelle PIO 1 B :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Interruptvektorliste CTC für Normalbetrieb V CTC-1 CTC für Senden und ZG-Taktvorgabe V CTC Kanal 2 ............................................................ Signale PIO 0 Port A: Bit 0: Tastatur-Steuerung (MA) (OUT) Spaltensteuerung 1-7: DTO (OUT) Signale PIO 0 Port B: Bit 0: Tastatur-Steuerung (ME)(IN) Zeilen-Lesen 1-5: DTO (IN) 6: ZG-Folge (IN) 7: Out-Control (GTX) (IN) Signale PIO 1 Port A: Bit 0: GTX-OUT (OUT) 1: DR-Out (OUT) 2: DRUCK-IN (IN) 3: Sperren Linie (OUT) 0-Aktiv 4: Takt ZG (OUT) 5: MODEM 105 (OUT) 1-aktiv 6: GTX (IN) (IN) 7: GTX(MOD) IN (IN) Signale PIO 1 Port B: Bit 0: Status Funk (IN) 1: Leser (IN) ?alt Lochstreifenleser? 2-6: DTO (IN) 7: Status Leser (OUT) ?alt Lochstreifenleser? ------------------------------------------------------------ ROM Bereich: 0x0000 - 0x3fff ROM 1 0x0 - 0x1fff; ROM 2 0x2000 - 0x3fff RAM Bereich: 0x4000 - 0xdfff oder 0xffff RAM: (9k) 0x5c00 - 0x5fff RAM D10 SE oder TE, Senden oder Texteingabe 0x9000 - 0x93ff RAM D10 TE, Texteingabe, Empfangsspeicher 0xA000 - 0xA3FF RAM Bildwiederholspeicher D21/D22 0xDC00 - 0xdfff RAM D10 ständig verfügbar Stack-Pointer: 0xdfff Besonderheiten des SRAM 2 * KWH 32kbit RAM Bereich 0x9400 - 0x97ff gestützter Speicher; 1kbyte; für Schlüssel, GTX 0x8000 - 0x8fff ungestützter Speicher; 4kByte 0x9000 - 0x93ff ungestützter Speicher; 1kByte 0xdc00 - 0xdfff ungestützter Speicher; 1kByte 0xa000 - 0xa3ff ungestützter Speicher; 1kByte; Bildwiederholspeicher LCD U224 0x5c00 - 0x5fff ungestützter Speicher; 1kByte; Aufbau Bildwiederholspeicher: 1. Zeilenadrese 0xa000 - 0xa00e 0xa00f ungenutzt 2. Zeilenadrese 0xa010 - 0xa01e 3. Zeilenadrese 0xa020 - 0xa02e ... 10. Zeilenadrese 0xa090 - 0xa09e ------------------------------------------------------------ Call/Jump Adressen: 0x021c // Zeit 1sec 0x0221 // Zeitschleife 70ms 0x022b // ein Zeichen von der Tastatur 0x0235 // Schlüsselspeicher löschen, Bereich 0x8380 - 0x97ff 0x024a // CTC Kanal 3 Einschalten Tastatur CTC 0x0254 // Indikator Senden und Empfang (Ameisen) 0x0276 // Anzeige Meldung in A, System HALT 0x0294 // SCHLÜSSELFEHLER 0x02b8 // Schlüsselfehler > Sprung zur Schlüsseleingabe CTRL-Z 0x02df // NMI-Routine, ausgelöst durch Spannungsunterschreitung 4,90V 0x03be // Konverter Zahl -> Text, Übergabe A = Zahl, Rückgabe a = Text 0x0538 // Return Adresse 0x053e für IR Senden 0x061e 0x053e // Routine Senden, Int gesteuert 0x080e // Zufallsfolge 0x0815 // Init Zufallserzeugung 0x0848 // Ausschalten Zufallsgenerator 0x085f // Interruptroutine Zufallserzeugung 0x094a // Textprozessor 0x0d16 // Korrekturen 0x0d8a // Zustand Textprozessor, a und Z-Flag Rückgabe 0x0dc1 // Anzeigesteuerprogramm 0x0e2e // Umwandlungsprogramm für Anzeige 0x0f13 // LCD Speicher, Übergabe C Anzahl/Länge der einzuschreibenden Zeichen 0x103d // Bedienertexte Index angelegt 0x105a // Zeichengenerator Ziffern, Übergabe/Rückgabe in A 0x1062 // Einsprungpunkt in den Zeichengenerator Ziffern, Übergabe/Rückgabe in A 0x1071 // Anzeige BCD, Programm zur Fünfergruppenzählung 0x109a // Anzeige Befehls-Fehleranzeige 0x17a9 // Druckerprogramm 0x1804 // DRCON 0x1892 // Druckersteuerroutine 0x1a21 // Sonderdruck Nr. 1, 2, 3 - Abspann, 4 - GTX MIRA, 5 - GTX GO in 5er Gruppen 0x1a30 // RETI; Erlaube Interrupt, verlasse Int-Routine 0x1a33 // DRUCKPROGRAMM; INPUTS B = 0x00 AUSGABE L-BIT; B = 0x02 AUSGABE H-BIT 0x1a3b // Konverter T-316 - ASCII; Übergabe A = T316 Zeichen, Rückgabe A = ASCII Zeichen 0x1b1f // CRC2 Berechnung und Prüfung, Übergabe HL Wertebereich, BC Länge, (0xdc2b) CRC für Prüfung; Rückgabe A 0 = io, 0xff = falsch 0x1b31 // CRC2-16 Schleife, Übergabe HL Wert, BC Länge, Rückgabe CRC in DE 0x1b3f // CRC2-16 mit Übergabe des Vektors, Übergabe DE-CRC Vektor, A Wert, Rückgabe DE CRC 0x1b5f // Lösche Bereich HL, Länge BC 0x1b69 // Rundenschlüssel für Feistel, Übergabe A, Schlüssel 0xde93 ... 0xdea5, Rückgabe 0xde00 0x1c3d // Feistel vorwärts, Wurmerzeugung und chiffrieren PWD 0x1c40 // Feistel rückwärts, dechiffrieren PWD 0x1f58 // Kontroll-Dechiffrierung, Übergabe IX, Rückgabe A 0x00 OK, A 0xff Fehler 0x21f7 // Datenlesen IR Routine für Modem, Umprogrammieren PIO 0x22da // DATENLESEROUTINE; DLR: BER 0 EINLESEN DER CTC-STÄNDE 0x2328 // EINLESE UP FÜR CTC-STAND DER FLANKENABSTÄNDE 0x241b // KONTROLLE CRC DES IV 0x24a2 // UP ANZAHL ZUR BESTIMMUNG DER ANZAHL; GLEICHER BITS HINTEREINANDER; Übergabe HL, Rückgabe B, 0xdc99 Status 0x24c0 // PLAUSIBILITÄTSKONTROLLE DER ZÄHLER; ZÄHLER DARF NICHT KLEINER ALS 0X0002 UND NICHT GRÖßER ALS 0X01F0 SEIN; // BA2 darf der Klartext nicht größer als 500 Zeichen sein - eingeschlossen CRC-16 0x2575 // Konverter Text - Zahl, Übergabe A = Text (A - P), Rückgabe A = Zahl (0x00 - 0x0f) 0x25b9 // Berechne CRC1 HL Startadresse, BC Länge, Rückgabe DE 0x27e2 // De-Kodieren Tasteneingabe-Hexzahlen; Übergabe (DE), Rückgabe A 0x27f3 // Korrektur/Einfügen in Zeile 0x289f // Prüfung CRC1, Übergabe HL Start, BC Länge, (0x8301) CRC, Rückgabe A ok = 0, Falsch = 0xff 0x28b4 // Prüfe (HL) == 0x00 0x28ca // Prüfung Passwort 0x2961 // Passwortchiffrierung mit Feistel, Übergabe HL, DE, A; identisch mit 0x2ad7; rückwärts 0x299e // Passworteingabe 0x29c8 // Einsprung in die Passworteingabe -Textprozessor -> weiter Zusammenziehen -> Rundenschlüssel 0x2a29 // Ausgabe Zufalls-Passwort 0x2ad7 // Passwortchiffrierung mit Feistel, Übergabe HL, DE, A; identisch mit 0x2961; vorwärts 0x2d5d // Zusammenziehen (0x8400) Rückgabe DE (0xdcc6), 6 bit ASCII nach 8 bit 0x2f7f // Auseinanderziehen KT.ZA (0x8400); aus 8 Bit werden 6 Bit ASCII 0x323d // Sprung nach 0x3244, PP 0x3732 // BC = A, 0xff 0x396f // PP Prüfung aller Register des Z80 0x47cb // ============================================================ Interruptroutinen: 0x061e // Senden ISR 0x085f // Zufall ISR 0x0932 // Linie ISR 0x0a3b // Funktionstaste F3 Drucken GTX/Klartext aus Texteditor 0x0ba2 // 0x0ba3 // 0x1534 // Tastatur CTC-1 ISR 0x180c // Drucker ISR 0x21ea // Empfangen ISR Modem 0x22b4 // CTC ISR 0x22cd // Empfangen ISR Akustikkoppler ------------------------------------------------------------ /**********************************************************/ /* Startbereich CPU */ /* ORG 0x0000 */ /**********************************************************/ 0000 01 76 76 ld bc, 0x7676 // Kaltstart 0003 56 ld d, (hl) // Sehr Trickreich: d = 0x01 0004 7E ld a, (hl) // a = 0x01 0005 66 ld h, (hl) // h = 0x01 0006 1C inc e // e = 0x01 0007 FB ei // RST 0x08 0008 DF rst 0x18 // Weiter mit RST 0x18 // Einsprung ? 0009 09 add hl, bc 000a 1A ld a, (de) 000b F9 ld sp, hl // Einsprung 0x004d 000c 58 ld e, b 000d 3F ccf 000e 76 halt // Warte auf Interrupt 000f 00 nop // Endloss Schleife // RST 0x10 0010 D7 rst 0x10 // Warte auf Interrupt // Konstantenbereich? 0011 7F 7F 7F 7F 7F 7F 7F // RST 18 0018 6F ld l, a // RST 0x18; HL = 0101 0019 EE 0F xor 0x0f // a = 0x01 xor 0x0f = 0x0e 001b E7 rst 0x20 // weiter mit RST 0x20 001c 7F 7F 7F 7F // RST 0x20; Aufruf PP Kaltstart 0020 3E FF ld a, 0xff 0022 32 30 DC ld (0xdc30), a // Kennzeichen (0xdc30) == 0xff, Kaltstart 0025 C3 21 30 jp 0x3021 // Aufruf von PP, Kaltstart // Konstantenbereich? // RST 0x28 0028 EF rst 0x28 // Endlosschleife, warten auf Interrupt 0029 00 nop 002a F8 ret m 002b DA A8 DD jpc 0xdda8 002e 05 dec b 002f 09 add hl, bc // RST 0x30 0030 F7 rst 0x30 // Endlosschleife, warten auf Interrupt 0031 DA 38 1F jpc 0x1f38 0034 E0 ret P0 0035 EF rst 28 0036 8F adc a, (hl) 0037 DA // Ende Konstantenbereich ? // RST 0x38; Anzeige Blockierung 5 HALT 0038 C3 DB 02 jp 0x02db // BLOCKIERUNG 5, HALT // ??? 003b 20 A3 jrnz 0xa3 003d 0B dec bc 003e 01 00 4F ld bc, 0x4f00 0031 CC 14 0D call z 0x0d14 // -> jr x0cd6 0044 44 ld b, h 0045 04 inc b 0046 5D ld e, l 0047 00 nop 0048 A4 and h 0049 0B dec bc 004a 0E C7 ld c, 0xc7 004c 02 ld (bc), a 004d 18 BD jr 0xbd // 0x000c // ?? 004f C7 RST 0 // Interrupt-Adressen; ausgelöst von PIO 0050 A3 0B // 0x0ba3 0052 A2 0B // 0x0ba2 0054 A2 0B // 0x0ba2 // Parameter? 0056 4A 1F 0058 98 C7 // Interrupt-Adressen; ausgelöst von PIO 005a 3B 0A // 0x0a3b; F3 Drucken aus Texteditor GTX/Klartext // Parameter? 005c 01 18 005e 02 18 0060 B7 C7 0062 E5 07 0064 30 04 // NMI Löschung 0066 C3 DF 02 jp 0x02df // NMI-Routine, ausgelöst durch Spannungsunterschreitung 4,90V // Initialisierungsprogramm 0069 F3 DI 006a 31 DE DF ld sp, 0xdfde // SP, GL.Stack 006d AF xor a // Lösche A, Z-Flag = 1, C-Flag = 0 006e ED 47 ld i, a // Highteil des I-Vektors ist 0x00xx 0070 21 D4 00 ld hl, 0x00d4 // HL, PIO Tabelle, PTAB 0073 16 07 ld d, 0x07 // Schleifenzähler, 7 Ports 0075 46 ld b, (hl) // Schleifenzähler Länge // Schleife 0076 23 inc hl <-\ // Sende Werte (HL) 0x00d5 + "D" 0077 4E ld c, (hl) | // Port 0078 23 inc hl | 0079 ED B3 outir | // Init PIOs, b := b - 1, HL := HL + 1 007b 15 dec d | // 7 Parameterlisten; 7 Ports 007c 20 F7 jrnz 0xf7 >-/ // 0x0076 d > 0 Springe 007e ED 5E IM2 // InterruptModus 2 0080 C3 F2 00 jp 0x00f2 // Start, Selftest 0083 C8 retz 0084 C3 AC C8 jp 0xc8ac // Leiche? // Achtung hier wurde getrickst! // Der ersten Interrupt-Routine wurde ein JP vorgesetzt! 0087 C3 1E 06 jp 0x061e // Routine SENDEN // Interrupt-Tabelle 1 für CTC 0088 1E 06 0x061e // SENDEN Ausgelöst vom CTC Kanal 0 008a B4 22 0x22b4 // Interrupt CTC Kanal 1 IR 008c 0C 18 0x180c // Interrupt CTC Kanal 2 Drucker IR 008e 34 15 0x1534 // Interrupt CTC Kanal 3 Tastatur CTC IR // Interrupt-Tabelle 2 für CTC 0090 1E 06 0x061e // Senden IR, CTC Kanal 0 0092 1E 06 0x061e // Senden IR, CTC Kanal 1 0094 5F 08 0x085f // Zufall IR, CTC Lanal 2 0096 34 15 0x1534 // CTC IR, CTC Kanal 3 // Interrupt-Tabelle 0098 32 09 0x0932 // Linie IR - ausgelöst vom PIO 0 Port B 009a CD 22 0x22cd // Empfangen IR Akustikkoppler - ausgelöst vom PIO 1 Port A 009c EA 21 0x21ea // Empfangen IR Modem //Parameter ROM Test 009e 00 00 // ROM Start 0x0000 00a0 A2 00 // ROM LÄNGE 0x00a2 (Ende 0x00a2) 00a2 2F E2 // Prüfsumme 0xe22f 00a4 B0 00 // Startadresse 0x00b0 00a6 52 1F // Länge 0x1f52 (Ende 0x2002) 00a8 BA 13 // Prüfsumme 0x13ba 00aa 00 20 // Startadresse 0x2000 00ac F6 1D // Länge 0x1df6 (Ende 0x3DF6) 00ae E0 DA // CRC 0xdae0 00b0 00 00 00 00 // Ende Datenbereich 0b04 00 80 // Startadresse RAMTEST ff0055aa 0b06 00 14 // Länge RAMTEST ff0055aa, 0x8000 - 0x9eff (Dopplungs-Speicher) 0b08 00 DC // Startadresse RAMTEST ff0055aa 0b0a 00 04 // Länge RAMTEST ff0055aa, 0xdc00 - 0xdfff, Arbeitsspeicher 0b0c 00 00 00 00 // Ende Datenbereich 00c0 00 5C // StartAdresse 0x5c00 00c2 00 04 // Länge 0x0400, 1024 byte 00c4 00 00 00 00 // Ende Datenbereich 00c8 00 80 // RAM Start 0x8000 Dopplungs-Speicher 00ca 00 10 // RAM Länge 0x1000, 4096 byte 00cc 00 DC // RAM Start 0xdc00, Arbeitsspeicher 00ce 00 04 // RAM Länge 0x0400, 1024 byte 00d0 00 00 00 00 // Ende Datenbereich // L P D............. // Aufbau: Länge - Port - Daten 00d4 01 08 88 // DB 1, CTC Kanal 0, L(U CTC) Int-Adresse 0x0088 SENDEN 00d8 02 0B A7 31 // DB 2, CTC Kanal 3 Tastatur, EI, Zeitgeber, Vorteiler 256, neg. Flanke, Zeitkonstanten Start, Zählerkonstante 0x31 ZK (X ms), RESET // 49 * 256 / 1340 kHz = 9,4 ms // PIO 0 Port A 00dc 02 02 FF 00 // DB 2, PIO-0-A-C, 0xff Bit E/A, 0x00 a:0-7 alles Ausgänge // Betriebsart 3, Bitweise, alles Ausgänge // PIO 0 Port B 00df 05 03 98 FF FF F7 7F // DB 5, PIO-0-B-C, L(V PIO-0-B) Vektor = 0x0098, 0xCF Bit E/A, 0xff B: 0-7, 0xf7 Int freigegeben-UND-1-Auslösung,Bitmaskefolg: 0x7f Maske // Int-Vektor 0x98; Betriebsart 3, bitweise, alles Eingänge, Int Maske Steuerwort 0xf7 = Int-Freigabe Eingänge -Und-Verknüpft -Kennzeichen des nächsten Wortes als Maske -Maske 0x7f Bit 0 bis 6 // PIO 1 Port A 0de6 03 06 9A FF C4 // DB 3, PIO-1-A-C, L(V PIO-1-A) Vektor = 0x009a, 0xff Bit E/A, 0xc4 // Int-Vektor 0x9a; Betriebsart 3 , bitweise, Eingänge bit: 2 6 7, Ausgänge bit: 0 1 3 4 5 // PIO 1 Port A Sende Daten 0deb 01 04 00 // DB 1, PIO-1-A-D, 0x00 Linie zu 105 ausschalten // Sende alle Ausgänge 0 // PIO 1 Port B 0dee 02 07 FF 7B // DB 2, PIO-1-B-C, 0xCF Bit Mode, O I I I I 0 I I // Betriebsart 3, Eingänge bit: 0 1 3 4 5 6 Ausgänge bit: 2 7 // IM 2 aktiv aus der Init Routine kommend 00f2 3E 14 ld a, 0x14 // LCD Display "SELFTEST" 00f4 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 00f7 DD 21 9E 00 ld ix, 0x009e // ROM Test 00fb FD 21 02 01 ld iy, 0x0102 // Kein Fehler springe zu 0x0102 00ff C3 8D 25 jp 0x258d // ROM-RAM Check, Übergabe IX + 0 & IX + 1 = Startbereich CRC , IX + 2 & IX + 3 Länge für CRC, IX + 4 & IX + 5 speichere CRC, BC Länge // Kein Fehler ROM1 0102 C2 CB 02 jp 0x02cb // BLOCKIERUNG 1 0105 DD 21 F6 3D ld ix, 0x3df6 // ROM Test K-Box 0109 FD 21 10 01 ld iy, 0x0110 // Kein Fehler springe zu 0x0110 010d C3 8D 25 jp 0x258d // ROM-RAM Check, Übergabe IX + 0 & IX + 1 = Startbereich CRC , IX + 2 & IX + 3 Länge für CRC, IX + 4 & IX + 5 speichere CRC, BC Länge // Kein Fehler ROM2 0110 C2 CB 02 jpnz 0x02cb // BLOCKIERUNG 1 0113 3E ED ld a, 0xed 0115 32 FE A3 ld (0xa3fe), a // RAM 0118 DD 21 C8 00 ld ix, 0x00c8 // RAM Test 011c FD 21 23 01 ld iy, 0x0123 // Kein Fehler springe zu 0x0123 0120 C3 00 26 jp 0x2600 // RAMTEST ff00ff55ffaa // Kein Fehler RAM 0123 C2 CF 02 jpnz 0x02cf // Blockierung 2, RAM Fehler 0126 21 00 90 ld hl, 0x9000 // GeheimtextspeicherZifferncode, GTX-Speicher empfangen; GL.SPE 0129 01 FF 03 ld bc, 0x03ff // 1023 byte Textspeicher 012c CD 5F 1B call 0x1b5f // Lösche Bereich; Übergabe HL, Länge BC 012f FB EI 0130 3E 40 ld a, 0x40 // ZF-Erzeugung 0132 32 90 DC ld (0xdc90), a // Betriebsart Zufallsgenerator bit 7, 6, 5 0135 CD 4A 02 call 0x024a // CTC Kanal 3 Einschalten Tastatur CTC 0138 CD 15 08 call 0x0815 // Init Zufallserzeugung 013b 06 20 ld b, 0x20 013d 21 00 94 ld hl, 0x9400 // SSP Schlüsselspeicher, crc- 0140 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0141 B6 or (hl) <---\ 0142 23 inc hl | 0143 10 FC djnz 0xfc >--/ // 32 Runden, (hl) 0x9420+n OR a 0145 B7 or a // a == 0x00 0146 CA B8 02 jpz 0x02b8 // Schlüsselfehler > Sprung zur Schlüsseleingabe CTRL-Z 0149 21 00 95 ld hl, 0x9500 // Schlüssel vorhanden 014c 22 01 83 ld (0x8301), hl // Zeiger auf 0x9500 014f 21 00 94 ld hl, 0x9400 // SSP Schlüsselspeicher, crc- 0152 01 20 00 ld bc, 0x0020 // Länge 0x20, 32 byte - 256 bit 0155 CD 9F 28 call 0x289f // CRC1 Check, Übergabe HL Start, BC Länge, (0x8301) CRC, Rückgabe A ok = 0, Falsch = 0xff 0158 FE FF cp 0xff // Schlüssel CRC falsch 015a CA B8 02 jpz 0x02b8 // Schlüsselfehler > Sprung zur Schlüsseleingabe CTRL-Z 015d CD CA 28 call 0x28ca // Prüfung Passwort 0160 21 C2 83 ld hl, 0x83c2 // Rundenschlüssel 1 0163 22 81 DC ld (0xdc81), hl // Zeiger auf 0x83c2, Rundenschlüssel 1 0166 21 E2 83 ld hl, 0x83e2 // Rundenschlüssel 2 0169 22 83 DC ld (0xdc83), hl // Zeiger auf 0x83e2, Rundenschlüssel 2 // Voreinstellung der Register 016c 21 00 DC ld hl, 0xdc00 // Arbeitsspeicher, Hauptbetriebsart-1; GL.HBA 016f 36 00 ld (hl), 0x00 // GO 0171 11 01 DC ld de, 0xdc01 // Betriebsartenregister: 0-KT erstellen/1-Schlüsselwechsel/2-GT erstellen/3-GTX senden 0174 01 64 00 ld bc, 0x0064 // Länge 100 0177 ED B0 ldir // Lösche (0xdc00 - 0xdc64) mit 0x00; GL.HBA 0179 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 017c 22 C6 DC ld (0xdcc6), hl // Zeiger auf 0x8400; GL.EAKTS 017f 21 00 8C ld hl, 0x8c00 // GeheimtextspeicherText (A-P) 0182 22 A2 DC ld (0xdca2), hl // Speicher Adresse in (0xdca2) 0185 21 00 90 ld hl, 0x9000 // GeheimtextspeicherZifferncode, GTX-Speicher empfangen; GL.SPE 0188 22 A4 DC ld (0xdca4), hl // Speicher Adresse in (0xdca4) 018b 21 10 5C ld hl, 0x5c10 // GTX Speicher senden (Add 018e 22 D2 DC ld (0xdcd2), hl // Zeiger auf 0x5c10 GTX Text Speicher 0191 3A FF 97 ld a, (0x97ff) // BA MIRA/GO 0194 32 00 DC ld (0xdc00), a // Arbeitsspeicher,Hauptbetriebsart-1 GO; GL.HBA 0197 06 0E ld b, 0x06 // Betriebsart 0199 FE 01 cp 0x01 // a == 1; Abfrage GO - MIRA 019b 28 09 jrz 0x09 // "Blockierung 2" 019d 06 0C ld b, 0x0c 019f AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 01a0 32 00 DC ld (0xdc00), a // Arbeitsspeicher,Hauptbetriebsart-1 GO; GL.HBA 01a3 32 FF 97 ld (0x97ff), a // BA MIRA/GO 01a6 78 ld a, b // "BETRIEBSART 1", A = 0x0c 01a7 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 01aa CD 1C 02 call 0x021c // Zeit 1sec 01ad CD 1C 02 call 0x021c // Zeit 1sec 01b0 CD 48 08 call 0x0848 // Ausschalten Zufallsgenerator 01b3 3A 90 DC ld a, (0xdc90) // Betriebsart Zufallsgenerator bit 7, 6, 5 01b6 CB 77 bit 6, a // Bit 6 Fehler Zufallsfolge 01b8 CA BE 01 jpz 0x01be // Menüprogramm 01bb C3 D3 02 jp 0x02d3 // BLOCKIERUNG 3, HALT // Menüprogramm 01be 06 20 ld b, 0x20 01c0 21 46 94 ld hl, 0x9446 // Ende Schlüssel2 01c3 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 01c4 B6 or (hl) <--\ 01c5 23 inc hl | 01c6 10 FC djnz 0xfc >--/ // von 0x9446 - 0x9466, ergebnis An := An OR (HLn) 01c8 B7 or a 01c9 3E 03 ld a, 0x03 01cb 28 17 jrz 0x17 >--\ // a == 00 ? 01cd 21 02 95 ld hl, 0x9502 | 01d0 22 01 83 ld (0x8301), hl | // Zeiger auf 0x9502 01d3 21 46 94 ld hl, 0x9446 | // Schlüssel2 01d6 01 20 00 ld bc, 0x0020 | // Prüfung RAM 0x9446 bis 0x9465 01d9 CD 9F 28 call 0x289f | // CRC1 Check, Übergabe HL Start, BC Länge, (0x8301) CRC, Rückgabe A ok = 0, Falsch = 0xff 01dc FE FF cp 0xff | // A == 0xff Fehler 01de 3E 03 ld a, 0x03 | // "BEREIT" 01e0 28 02 jrz 0x02 >---+ // 01e2 3E 20 ld a, 0x20 | // "BEREIT" 01e4 CD 9A 10 call 0x109a <--/ // Anzeige Befehls-Fehleranzeige 01e7 CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 01ea 3A 02 DC ld a, (0xdc02) // Programmverteiler, ALDAT:-Datenübergaberegister Tastatur 01ed FE 90 cp 0x90 // CTRL T 01ef CA C0 2C jpz 0x2cc0 // Klartextstart 01f2 FE 81 cp 0x81 // CTRL E 01f4 CA 8C 21 jpz 0x218c // Empfangsroutine 01f7 FE 41 cp 0x41 // F1 Senden 01f9 CA 7F 03 jpz 0x037f // Senden 01fc FE 99 cp 0x99 // CTRL B 01fe CA 1D 03 jpz 0x031d // Betriebsartwechsel/Arbeitsartenwechsel 0201 FE 8F cp 0x8f // CTRL K Aufruf der PP 0203 CA 3A 06 jpz 0x063a // prophylaktische Prüfung 0205 FE 8E cp 0x8e // CRTL C 0207 CA 2F 20 jpz 0x202f // Chiffrieren 020a FE 89 cp 0x89 // CRTL D 020c CA 2E 2B jpz 0x2b2e // Dechiffrieren 0210 FE 91 cp 0x91 // CTRL Z 0212 CA 57 26 jpz 0x2657 // Programm Schlüsseleingabe 0215 FE 93 cp 0x93 // CRTL W 0217 CA 21 28 jpz 0x2821 // Programm Schlüsselwechsel 021a 18 CB jr 0xcb // 0x01e7 // Allgemeine Zeitschleife ca 1 sec 021c 01 00 00 ld bc, 0x0000 021f 18 03 jr 0x03 // 0x0224 // Zeitschleife 70ms 0221 01 00 10 ld bc, 0x1000 // 4096 Runden 0224 0D dec c 0225 20 FD jrnz 0xfd // 0x0224 C > 0 springe 0026 05 dec b 0228 20 FA jrnz 0xfa // 0x0224 B > 0 Springe 022a C9 ret // ein Tastendruck 022b 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 022e CB 46 bit 0, (hl) 0230 28 F9 jrz 0xf9 // 0x022b, neues Zeichen? 0232 CB 86 res 0, (hl) // ja, Merker löschen 0234 C9 ret // Speicherbereich löschen, Bereich 0x8380 - 0x97ff 0235 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 0237 CB 86 res 0, (hl) // neues Zeichen, gelöscht 0239 21 80 83 ld hl, 0x8380 023c E5 push hl // Registerwechsel 023d D1 pop de // DE = HL = 0x8380 023f AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0240 13 inc de 0241 77 ld (hl), a 0242 01 7F 14 ld bc, 0x147f // Länge 5248 byte 0245 ED B0 ldir // Lösche von 0x8380 - 0x97ff mit 0x00 0247 C3 DB 02 jp 0x02db // Blockierung 5 auslösen // CTC Kanal 3 Einschalten, Tastatur CTC 024a 3E A7 ld a, 0xa7 // EI, Zeitgeber, Vorteiler 256, neg. Flanke, Zeitkonst. Start, Zeitkonstante folgt, RESET 024c D3 0B out (0x0b), a // CTC Kanal 3 Zeitgeber 024e 3E 31 ld a, 0x31 // Zeitkonstante 49 * 256 / 1340 kHz = 9,4 ms 0250 D3 0B out (0x0b), a // CTC Kanal 3 Takt 0252 FB ei 0253 C9 ret // Indikator Senden und Empfang (Ameisen) 0254 D5 push de 0255 E5 push hl 0256 F5 push af // Register retten 0257 3A C1 DC ld a, (0xdcc1) 025a 3C inc a 025b FE 0B cp 0x0b 025d 38 01 jr c, 0x01 >---\ // 0x0260, a >= 0x0b? 025f AF xor a | // Lösche A, Z-Flag = 1, carry-Flag = 0 0260 32 C1 DC ld (0xdcc1), a <---/ // (0xdcc1) zwischen 0x00 ... 0x0b 0263 21 0E A0 ld hl, 0xa00e // Speicher LCD 0266 11 10 00 ld de, 0x0010 // die nächsten 16 Adressen 0269 3C inc a // Schleife A 026a 3D dec a <---\ 026b 28 03 jr z, 0x03 >---\ | // 0x0270; A == 0x00? 026d 19 add hl, de | | // Speicher LCD 026e 18 FA jr 0xfa | >---/ // 0x026a | // Übergabe HL, DE, A Rückgabe (ÜbergabeHL) := A; POP hl-de-af 0270 EB ex de, hl <---/ // tausche Registerinhalt DE <> HL 0271 F1 pop af // wiederherstellen AF 0272 12 ld (de), a // Übergabe in LCD Speicher ablegen 0273 E1 pop hl // wiederherstellen HL 0274 D1 pop de // wiederherstellen DE 0275 C9 ret // Anzeige Meldung in A, System HALT 0276 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 0279 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 027a D3 04 out (0x04), a // PIO-1-A-D 027c F3 DI 027d 76 HALT // Warte auf INT // Kein Text -> Enter -> Menüprogramm 027e FB EI 027f CD 4A 02 call 0x024a // CTC Kanal 3 Einschalten Tastatur CTC 0282 3E 0F ld a, 0x0f // "KEIN TEXT" 0284 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige // Einsprung kein Enter 0287 CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 028a 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 028d FE 43 cp 0x43 // ENTER 028f 20 F6 jrnz 0xf6 // 0x0287 a != ENTER Springe 0291 C3 BE 01 jp 0x01be // Menüprogramm // Schlüsselfehler 0294 FB EI 0295 3E 0D ld a, 0x0d // "SCHLUESSELFEHLER" 0297 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige // Einsprung Kein Enter 029a CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 029d 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 02a0 FE 43 cp 0x43 // ENTER 02a2 20 F6 jrnz 0xf6 // 0x029a a != ENTER Springe 02a4 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 02a7 11 00 84 ld de, 0x8400 // Klartextspeicher; GL.KTSPS 02aa AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 02ab ED 52 sbc hl, de // Länge 02ad 28 06 jrz 0x06 // HL - DE == 0 Springe zu 0x26e0 02af 21 04 84 ld hl, 0x8404 // HL-DE <> == 0 0x8404 Klartextspeicher 02b2 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor // Länge == 0 02b5 C3 E0 26 jp 0x26e0 // Schlüsselfehler > Sprung zur Schlüsseleingabe CTRL-Z 02b8 FB EI 02b9 3E 0D ld a, 0x0d // "SCHLUESSELFEHLER" 02bb CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 02be CD 2B 02 call 0x022b <--\ // ein Zeichen von der Tastatur 02c1 3A 02 DC ld a, (0xdc02) | // ALDAT:-Datenübergaberegister Tastatur 02c4 FE 91 cp 0x91 | // CTRL Z 02c6 20 F6 jrnz 0xf6 >-/ // a != "CTRL Z" Springe 02c8 C3 7D 26 jp 0x267d // Einsprung Schlüsseleingabe 02cb 3E 00 ld a, 0x00 // Fehlermeldung: BLOCKIERUNG 1 02cd 18 A7 jr 0xa7 // 0x0276, Anzeige Meldung in A, System HALT 02cf 3E 0B ld a, 0x0b // Fehlermeldung: BLOCKIERUNG 2 02d1 18 A3 jr 0xa3 // 0x0276, Anzeige Meldung in A, System HALT 02d3 3E 1D ld a, 0x1d // Fehlermeldung: BLOCKIERUNG 3 02d5 18 9F jr 0x9f // 0x0276, Anzeige Meldung in A, System HALT 02d7 3E 1E ld a, 0x1e // Fehlermeldung: BLOCKIERUNG 4 02d9 18 9B jr 0x9b // 0x0276, Anzeige Meldung in A, System HALT // Einsprung aus Lösche Text-Schlüsselspeicher 0x0235 02db 3E 1F ld a, 0x1f // Fehlermeldung: BLOCKIERUNG 5 02dd 18 97 jr 0x97 // 0x0276, Anzeige Meldung in A, System HALT //NMI-Routine, ausgelöst durch Spannungsunterschreitung 4,90V 02df F3 DI 02e0 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 02e1 D3 04 out (0x04), a // PIO-1-A-D 02e3 06 0A ld b, 0x0a <-\ 02e5 10 FE djnz 0xfe >-/ // 10x NULL ausgebeb PIO-1-A-D 02e7 21 80 83 ld hl, 0x8380 02ea 11 81 83 ld de, 0x8381 02ed 01 7F 04 ld bc, 0x047f // Länge 02f0 36 EE ld (hl), 0xee 02f2 ED B0 ldir // fülle 0x8380 - 0x87ff mit 0xee, %11101110 02f4 21 00 96 ld hl, 0x9600 // PWSP; Passwort Speicher, 32 byte 02f7 11 01 96 ld de, 0x9601 02fa 01 20 00 ld bc, 0x0020 // Länge 32 byte 02fd 36 EE ld (hl), 0xee 02ff ED B0 ldir // fülle 0x9600 - 0x961f mit 0xee, %11101110 0301 21 00 88 ld hl, 0x8800 // Textspeicher empfangen 0304 11 01 88 ld de, 0x8801 0307 01 FF 03 ld bc, 0x03ff // Länge 1024 byte 030a 36 EE ld (hl), 0xee 030c ED B0 ldir // fülle 0x8800 - 0x8bff mit 0xee, Klartextspeicher empfangen 030e 21 00 DC ld hl, 0xdc00 // Arbeitsspeicher,Hauptbetriebsart-1; GL.HBA 0311 11 01 DC ld de, 0xdc01 // Betriebsartenregister: 0-KT erstellen/1-Schlüsselwechsel/2-GT erstellen/3-GTX senden 0314 01 FF 03 ld bc, 0x03ff // Länge 0317 36 EE ld (hl), 0xee 0319 ED B0 ldir // fülle 0xdc00 - 0xdfff mit 0xee; GL.HBA 031b F3 DI // Sperre Interrupt! 031c 76 HALT // warte auf INT // Wechsle der Betriebsart 031d 3E 0A ld a, 0x0a // "BETRIEBSARTWECHSEL" 031f CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 0322 CD 1C 02 call 0x021c // Zeit 1sec // BA Wechsel Schleife 0325 3A 00 DC ld a, (0xdc00) // Arbeitsspeicher,Hauptbetriebsart-1 GO; GL.HBA 0328 06 0E ld b, 0x0e // "Betriebsart 2" 032a FE 01 cp 0x01 // a == 1 032c 28 09 jrz 0x09 // 0x0337; MIRA 032e AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 HBA: GO 032f 32 00 DC ld (0xdc00), a // Arbeitsspeicher,Hauptbetriebsart-1; GL.HBA 0332 32 FF 97 ld (0x97ff), a // BA MIRA/GO 0335 06 0C ld b, 0x0c // "BETRIEBSART 1" // Einsprung MIRA 0337 78 ld a, b 0338 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige // CTRL B ausgelöst 033b CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 033e 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 0341 FE 43 cp 0x43 // ENTER 0343 CA BE 01 jpz 0x01be // Menüprogramm -> Ende BA Wechsel 0346 FE 99 cp 0x99 // CTRL + B 0348 20 F1 jrnz 0xf1 // 0x033b a != 0xf1 springe 034a 3A 00 DC ld a, (0xdc00) // Arbeitsspeicher,Hauptbetriebsart-1; GL.HBA 034d EE 01 xor 0x01 // HBA GO 034f 32 00 DC ld (0xdc00), a // Arbeitsspeicher,Hauptbetriebsart-1; GL.HBA 0352 32 FF 97 ld (0x97ff), a // BA MIRA/GO // LÖSCHEN DER TEXTSPEICHER BEI WECHSEL BA 0355 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 0358 22 C6 DC ld (0xdcc6), hl // GL.EAKTS 035b 21 00 8C ld hl, 0x8c00 // GeheimtextspeicherText (A-P) 035e 22 A2 DC ld (0xdca2), hl // Speicher Adresse in (0xdca2) 0361 21 10 5C ld hl, 0x5c10 // GTX Speicher senden (Add 0364 22 D2 DC ld (0xdcd2), hl 0367 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 036a 01 FF 03 ld bc, 0x03ff 036d CD 5F 1B call 0x1b5f // Lösche Bereich; Übergabe HL, Länge BC 0370 21 00 88 ld hl, 0x8800 // Textspeicher empfangen 0373 01 FF 03 ld bc, 0x03ff 0376 CD 5F 1B call 0x1b5f // Lösche Bereich; Übergabe HL, Länge BC 0379 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 037a 32 2E DC ld (0xdc2e), a // Steuerwort 0x00, nicht Chiffiert 037d 18 A6 jr 0xa6 // 0x0325; BA Wechsel Schleife // Senden // ÜBERGABEPARAMETER GL.EAGTS: AKTUELLE ENDADRESSE GT // KONTROLLE OB GT VORHANDEN 037f 11 10 5C ld de, 0x5c10 // GTX Speicher senden (Add 0382 2A D2 DC ld hl, (0xdcd2) // GL.EAGTS 0385 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0386 ED 52 sbc hl, de // Länge > 0 Weiter .. 0388 20 03 jrnz 0x03 // 0x038d; A == 0 038a C3 7E 02 jp 0x027e // Kein Text -> Enter -> Menüprogramm // Einsprung Länge <> 0 038d 3A 2E DC ld a, (0xdc2e) // Steuerwort - Chiff/Dechiff/Schlüsselwechsel 0390 FE FB cp 0xfb // Steuerwort nach Kontrollchiffr. u. Löschen KTXT? 0392 C2 7E 02 jpnz 0x027e // Kein Text -> Enter -> Menüprogramm 0395 21 1A 5C ld hl, 0x5c1a // Länge GTX 0398 46 ld b, (hl) 0399 23 inc hl // 0x5c1b zweites Byte 039a 4E ld c, (hl) 039b 0B dec bc 039c 0B dec bc // (0x5c1b, 0x5c1a) - 2; Länge ohne CRC 039d 21 85 DC ld hl, 0xdc85 // ANZA2: Länge 2; CRC 03a0 22 2B DC ld (0xdc2b), hl // Speicherort CRC für Prüfung 03a3 21 1C 5C ld hl, 0x5c1c // Startadresse GTX 03a6 CD 1F 1B call 0x1b1f // CRC2 Berechnung und Prüfung, Übergabe HL Wertebereich, BC Länge, (0xdc2b) CRC für Prüfung; Rückgabe A 0 = io, 0xff = falsch 03a9 FE FF cp 0xff // Fehler CRC 03ab CA DB 02 jpz 0x02db // BLOCKIERUNG 5 // BETRIEBSARTENWAHL 03ae 3A 00 DC ld a, (0xdc00) // Arbeitsspeicher,Hauptbetriebsart-1; GL.HBA 03b1 FE 01 cp 0x01 // MIRA 03b3 C2 7A 04 jpnz 0x047a // GO // GTX auf Anzeige MIRA 03b6 3E 13 ld a, 0x13 // "ANZEIGE GTX" 03b8 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 03bb CD 1C 02 call 0x021c // Zeit 1sec // Umwandlung 8bit GTX in Text // UMWANDLUNG des (-GTX-GTX IN ANZEIGBAREN TEXT // ÜBERGABEPARAMETER: GL.EAGTS - ENDADRESSE GTX IM GT // UMGEWANDELT. 4 BIT --> BST A-0000---> A BIS 1111 ---> P // D.H: AUS 1 BYTE WERDEN 2 BYTE LÄNGE // UND CRC-GT WERDEN AUSG // GL.EAGTS WIRD AUF NEUE ENDADR // GL.AGT - AKTUELLE GT ADRESSE // GL.KLGT LÄNGE GT 03be 21 10 5C ld hl, 0x5c10 // GTX Speicher senden (Add 03c1 22 D6 DC ld (0xdcd6), hl // Zeiger auf 0x5c10 03c4 2A D2 DC ld hl, (0xdcd2) // Zeiger auf Endadresse GTX, GL.EAGTS 03c7 2B dec hl 03c8 2B dec hl 03c9 2B dec hl 03ca 2B dec hl // Endadresse - 4 03cb 22 D2 DC ld (0xdcd2), hl // neue Endadresse ablegen, ohne GTX CRC 03ce ED 5B D6 DC ld de, (0xdcd6) // Zeiger auf 0x5c10; Startadresse GTX 03d2 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 03d3 ED 52 sbc hl, de // Länge GTX ohne CRC 03d5 22 D4 DC ld (0xdcd4), hl // Speichern Länge GTX ohne CRC 03d8 11 0A 00 ld de, 0x000a 03db AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 03dc ED 52 sbc hl, de // Länge - 10 03de 44 ld b, h 03df 4D ld c, l // BC = Länge - 10 03e0 21 1C 5C ld hl, 0x5c1c // Startadresse GTX 03e3 11 1A 5C ld de, 0x5c1a // ohne CRC der IV 03e6 ED B0 ldir // Vor-Schieben von HL 0x5c1c nach DE 0x5c1a, BC Runden: Länge - 10 03e8 ED 4B D4 DC ld bc, (0xdcd4) // Länge GTX ohne CRC, Schleifenvariable // Schleife BC- Textlänge, Umwandlung Zahl in Text 03ec 2A D2 DC ld hl, (0xdcd2) // Zeiger Ende GTX ohne CRC 03ef 2B dec hl // voherige Speicherzelle; Ende GTX ohne CRC - 1 03f0 ED 5B D2 DC ld de, (0xdcd2) // Zeiger Ende GTX ohne CRC 03f4 ED B8 lddr // Verschiebe von "Ende GTX-1" nach "Ende GTX", "Länge GTX-10"; --HL --DE --BC; rückwärts 03f6 ED 5B D6 DC ld de, (0xdcd6) // Zeiger auf 0x5c10; Startadresse GTX 03fa 2A D6 DC ld hl, (0xdcd6) // Zeiger auf 0x5c10; Startadresse GTX 03fd 23 inc hl // 0x5c11 03fe AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 03ff ED 6F rld // a = 0; (HL3-0) = a3-0; a = (HL7-4); (HL7-4) = (HL3-0) 0401 CD 6D 04 call 0x046d // Konvertiere Zahl -> Text, Übergabe A = Zahl, Rückgabe a = Text 0404 12 ld (de), a // de zeigt auf H-Byte 0405 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0406 ED 6F rld // a = 0; (HL3-0) = a3-0; a = (HL7-4); (HL7-4) = (HL3-0) 0408 CD 6D 04 call 0x046d // Konvertiere Zahl -> Text, Übergabe A = Zahl, Rückgabe a = Text 040b 77 ld (hl), a // hl zeigt auf Low-Byte 040c 23 inc hl // Schleife bis GTX Ende 040d 22 D6 DC ld (0xdcd6), hl // neue Adresse - nächstes Zeichen/Byte 0410 2A D2 DC ld hl, (0xdcd2) 0412 23 inc hl 0413 22 D2 DC ld (0xdcd2), hl // erhöhe Adresszeiger, nächstes Zeichen 0416 ED 4B D4 DC ld bc, (0xdcd4) // Länge 041a 0B dec bc 041b ED 43 D4 DC ld (0xdcd4), bc // Schleifenzähler 0420 79 ld a, c 0421 B0 or b 0422 20 C8 jrnz 0xc8 // 0x03ec Schleifenzähler Textlänge BC == 0 // Gewandelter GTX in Buchstabentext AA ... PP // LÖSCHEN DER 20 STELLEN VOR GTSPS 0424 21 00 5C ld hl, 0x5c00 0427 36 00 ld (hl), 0x00 0429 11 01 5C ld de, 0x5c01 042c 01 0F 00 ld bc, 0x000f // Länge 16 byte 042f ED B0 ldir // Lösche 0x5c00 - 0x5c0f mit 0x00 0431 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0432 32 03 DC ld (0xdc03), a // ZUALF:-Zustand Alpha-Tastendruck 0435 32 27 DC ld (0xdc27), a 0438 3E 02 ld a, 0x02 // AUF 2 ÄNDERN; GT-Eingabe 043a 32 1A DC ld (0xdc1a), a // ZTP:Zustand TextProzessor 043d 3E 02 ld a, 0x02 043f 32 25 DC ld (0xdc25), a // ZUANZ: Länge 2; Zustandsanzeige 0442 3E 03 ld a, 0x03 0444 32 01 DC ld (0xdc01), a // Betriebsartenregister: 3-GTX senden 0447 3E 04 ld a, 0x04 // Zustandszeiger auf 4 0449 32 AB DC ld (0xdcab), a // Zustandszeiger MIRA/GO 044c 21 10 5C ld hl, 0x5c10 // GTX Speicher senden (Add 044f 22 1F DC ld (0xdc1f), hl // AADRT:-Anfangsadresse Textspeicher 0452 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 0455 21 8F 5F ld hl, 0x5f8f 0458 22 21 DC ld (0xdc21), hl // EADRT:-Endadresse Textspeicher 045b 2A D2 DC ld hl, (0xdcd2) // Endadr. GTX 045e 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor 0461 CD 4A 09 call 0x094a // Textprozessor // LÖSCHEN DES ANGEZEIGTEN GTX 0464 21 10 5C ld hl, 0x5c10 // GTX Speicher senden (Add 0467 22 D2 DC ld (0xdcd2), hl 046a C3 BE 01 jp 0x01be // Menüprogramm // UNTERPROGRAMM BUCHSTABENDARSTELLUNG // Konverter Zahl -> Text, Übergabe A = Zahl, Rückgabe a = Text 046d E5 push hl 046e D5 push de // Register retten 046f 21 B1 0D ld hl, 0x0db1 // Tabelle Buchstaben A ... P (0x00 ... 0x0f Darstellung) 0472 5F ld e, a 0473 16 00 ld d, 0x00 0475 19 add hl, de 0476 7E ld a, (hl) 0477 D1 pop de 0478 E1 pop hl // wiederherstellen Register 0479 C9 ret // GTX auf Akustikkoppler oder Modem; ANZEIGE SENDEN 047a 3E 08 ld a, 0x08 // "SENDEN ?" 047c CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige // EINSCHALTEN DER SPANNUNG V24 UND SENDEENDSTUFE 047f DB 05 in a, (0x05) // PIO-1-B-D; Sonderschnittstelle 0481 CB FF set 7, a // Setze Ausgang 7 auf 1 0483 D3 05 out (0x05), a // PIO-1-B-D; Sonderschnittstelle 0485 CD 21 02 call 0x0221 // Zeitschleife 70ms 0488 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0489 32 C9 DC ld (0xdcc9), a // Gerät 0 Akustik/1 Modem GN6: Länge 4 ; Konstante C1 048c 3E 04 ld a, 0x04 048e 32 01 DC ld (0xdc01), a // Betriebsartenregister: 4 Senden Akkustikkoppler // KONTROLLE OB MODEM VORHANDEN 0491 DB 05 in a, (0x05) // PIO-1-B-D; Sonderschnittstelle 0493 CB 47 bit 0, a // Lese Eingang bit 0, IST LTG. 106 AKTIV? 0495 28 30 jrz 0x30 // 0x04c7; KEIN MODEM, MODEM aktivieren 0497 DB 04 in a, (0x04) // Lese Eingänge, PIO-1-A-D 0499 CB EF set 5, a // 105 AKTIV SCHALTEN 049b CB CF set 1, a // DATENLEITUNG AUF 1 049d D3 04 out (0x04), a // Setze auf bit 1 und 5 auf 1; PIO-1-A-D 049f 3E 01 ld a, 0x01 04a1 32 C9 DC ld (0xdcc9), a // Gerät MODEM; GN6: Länge 4 ; Konstante C1 04a4 CD 21 02 call 0x0221 // Zeitschleife 70ms; EINSCHWINGEN 04a7 DB 05 in a, (0x05) // Lese PIO-1-B-D; Sonderschnittstelle 04a9 CB 47 bit 0, a // Eingang Bit 0 == 1 04ab 28 23 jrz 0x23 // 0x04d0; 106 IST AKTIV GREWORDEN //FEHLERANZEIGE BEI DEFEKTEM MODEM 04ad DB 04 in a, (0x04) // Lese PIO-1-A-D 04af CB AF res 5, a // Schalte Bit 5 auf 0 04b1 D3 04 out (0x04), a // PIO-1-A-D 04b3 3E 15 ld a, 0x15 // "MODEM DEFEKT" 04b5 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 04b8 CD 1C 02 call 0x021c // Zeit 1sec 04bb CD 1C 02 call 0x021c // Zeit 1sec 04be DB 05 in a, (0x05) // Lese PIO-1-B-D; Sonderschnittstelle 04c0 CB BF res 7, a // Setze Ausgang 7 auf 0 04c2 D3 05 out (0x05), a // PIO-1-B-D; Sonderschnittstelle 04c4 C3 BE 01 jp 0x01be // Menüprogramm // KEIN MODEM, MODEM aktivieren 04c7 DB 04 in a, (0x04) // Lese PIO-1-A-D 04c9 CB EF set 5, a // Schalte Bit 5 auf 1 04cb D3 04 out (0x04), a // PIO-1A-D 04cd CD 21 02 call 0x0221 // Zeitschleife 70ms // BEGINN des EIGENTLICHEN SENDENS, Umprogrammieren PIO 0 Port B 04d0 3E 17 ld a, 0x17 // Maskensteuerwort: INTERRUPT LINIE SPERREN 04d2 D3 03 out (0x03), a // umprogrammierung Tastatur PIO-0-B-C 04d4 3E FF ld a, 0xff // Alles Eingänge 04d6 D3 03 out (0x03), a // E/A Steuerwort Tastatur PIO-0-B 04d8 DB 04 in a, (0x04) // Lese PIO-1-A-D; AUSGABE ERLAUBEN 04da CB DF set 3, a // schalte Bit 3 auf 1 04dc D3 04 out (0x04), a // PIO-1-A-D // EINSCHALTEN des PFEIFTONES 04de 3A C9 DC ld a, (0xdcc9) // An Gerät? Akustik/Modem ; GN6: Länge 4 ; Konstante C1 04e1 FE 01 cp 0x01 // a == 1 04e3 28 08 jrz 0x08 >-\ // 0x04ed, Modem 04e5 3E 15 ld a, 0x15 | // Akustik 04e7 D3 08 out (0x08), a | // CTC Kanal 0 DI, Zeitgeber, Vorteiler 16, pos. Flanke, Zeitkonst. Start, Zeitkonst. folgt 04e9 3E 23 ld a, 0x23 | // Zeitgebermodus Zeitkonstante TC = 0x23; 35 * 16 / 1340 kHz = 0,42 ms 04eb D3 08 out (0x08), a | // CTC Kanal 0 Zeitkonstante //NEUPROGRAMMIERUNG DER CTC | 04ed 3E 21 ld a, 0x21 <-/ // DI, Zeitgeber, Vorteiler 256, neg. Flanke, Zeitkonst. Start Zeitkonst = 255 04ef D3 0B out (0x0b), a // CTC Kanal 3 Zeitgeber TA AZS; 255 * 256 / 1340 in kHz = 49 ms 04f1 21 90 00 ld hl, 0x0090 // VORBEREITUNG REGISTER FÜR SENDEN 04f4 7D ld a, l // a = 0x90; 04f6 D3 08 out (0x08), a // CTC Kanal 0 Interruptroutine 0x0090 04f8 3E 01 ld a, 0x01 04fa 32 CB DC ld (0xdccb), a 04fd 32 CD DC ld (0xdccd), a // Anz. der Schwingung; HSP1: Länge 4 ; Hilfsspeicher 32*0 04ff 32 CA DC ld (0xdcca), a 0502 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0503 32 CF DC ld (0xdccf), a 0506 32 C8 DC ld (0xdcc8), a 0509 32 CE DC ld (0xdcce), a // Anz. der Testfolgen 050c 21 10 5C ld hl, 0x5c10 // GTX Speicher senden (Add 050f 22 D0 DC ld (0xdcd0), hl // SENDEN // SENDEN 0512 CD 3E 05 call 0x053e // Routine Senden, Int gesteuert // KONTROLLE OB SENDEN BEENDET 0515 3A CA DC ld a, (0xcadc) 0518 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0519 20 FA jrnz 0xfa // 0x0515; A == 0 // SENDEN BEENDET; UMPROGRAMMIERUNG CTC 051b 21 88 00 ld hl, 0x0088 // Interruptvektor 0x0088; SENDEN 051e 7D ld a, l // a = 0x88; 051f D3 08 out (0x08), a // CTC Kanal 0 Interruptroutine 0x0088 0521 CD 4A 02 call 0x024a // CTC Kanal 3 Einschalten Tastatur CTC; TA EIN 0524 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0525 D3 04 out (0x04), a // PIO-1-A-D; setze Ausgänge auf 0 0527 3E F7 ld a, 0xf7 // a = 0x7f; KONTROLLE LINIE ERLAUBEN 0529 D3 03 out (0x03), a // Steuerwort,Tastatur PIO-0-B-C 052b 3E 7F ld a, 0x7f // a = 0x7f 052d D3 03 out (0x03), a // Steuerwort,Tastatur PIO-0-B-C // AUSSSCHALTEN DER SENDESPANNUNG 052f DB 05 in a, (0x05) // Lese PIO-1-B-D; Sonderschnittstelle 0531 CB BF res 7, a // lösche bit 7, a 0533 D3 05 out (0x05), a // PIO-1-B-D; Sonderschnittstelle // RÜCKSPRUNG IN ZENTRALPOSITION 0535 C3 BE 01 jp 0x01be // Menüprogramm // Return Adresse 0x053e für IR Senden 0x061e 0538 21 3E 05 ld hl, 0x053e 053b E5 push hl // Adresse liegt jetzt auf dem Stack! für RET(SP) 053c ED 4D RETI // IR KETTE FREISCHALTEN // Aufruf durch Int Routine Senden, CTC Interrupt 053E 3A CD DC ld a, (0xdccd) // Schleifenzähler -- 0541 3D dec a 0542 32 CD DC ld (0xdccd), a // Schleifenzähler -- 0545 C0 0E 08 RET NZ // BEREITSTELLUNG EINES NEUEN SENDEBITS 0548 3A C9 DC ld a, (0xdcc9) // Gerät?; GN6: Länge 4 ; Konstante C1 054b FE 01 cp 0x01 // Modem? 054d 20 02 jrnz 0x02 // 0x0551 A != 0x01 054f 0E 09 ld c, 0x09 // MODEM NUTZT CTC Kanal 1 0551 3A CB DC ld a, (0xdccb) // AKTUELLES SENDEBIT 0554 06 95 ld b, 0x95 // CTC Kanal 1 EI, Zeitgeber, Vorteiler 16, pos. Flanke, Zeitkonst. Start, Zeitkonstante folgt 0556 16 2D ld d, 0x2d // ZEIKO FÜR 0; 45 * 16 * 1,34 MHz = 1389 Hz 0558 1E 0E ld e, 0x0e // DURCHLÄUFE BEI 0 (200 BIT) 055a 26 01 ld h, 0x01 // A == 0 dann H = 1 055c A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 055d 28 06 jrz 0x06 >-\ // 0x0565 055f 16 23 ld d, 0x23 | // ZEIKO FÜR 1; 35 * 16 * 1,34 MHz = 1786 Hz 0561 1E 12 ld e, 0x12 | // DURCHLÄUFE BEI 1 0563 26 00 ld h, 0x00 | 0565 ED 41 out (c), b <-/ // CTC Kanal 1 DI, Zeitgeber, Vorteiler 16, neg. Flanke, Externer Start 0567 ED 51 out (c), d // CTC Kanal 1 Timer 1,389/1,786 kHz 0569 DB 04 in a, (0x04) // Lese PIO-1-A-D 056b CB 87 res 0, a // setze Bit 4 auf 0 056d B4 or h // A = A or H; A war vorher 0 dann H = 1 sonst H = 0 056e D3 04 out (0x04), a // Toggle bit 0, PIO-1-A-D, UMSCHALTEN 103 -> Ausgabe SendeBit 0570 FB EI 0571 7B ld a, e 0572 32 CD DC ld (0xdccd), a // Anz. der Folgen 0575 3A CF DC ld a, (0xdccf) // Anz. der Folgen 0578 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0579 28 1D jrz 0x1d // 0x0598; NEUES BYTE // NEUES BIT INNERHALB EINES BYTES 057b 3D dec a 057c 32 CF DC ld (0xdccf), a // Anzahl der Folgen 057f E6 FE and 0xfe 0581 28 0F jrz 0x0f // 0x0592 // SENDEN INFORMATIONSBIS 0583 3A CC DC ld a, (0xdccc) // SENDESCHIEBEREGISTER 0586 21 CB DC ld hl, 0xdccb 0589 36 00 ld (hl), 0x00 // Start-Bit? 058b 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 058c 32 CC DC ld (0xdccc), a // SENDESCHIEBEREGISTER 058f CB 16 rl (hl) // rotiere (HL), carry <- (HL.7) <- (HL.0) <- carry 0591 C9 ret // SENDEN STOPPBITS 0592 3E 01 ld a, 0x01 // STOPPBIT 0594 32 CB DC ld (0xdccb), a 0597 C9 ret // SENDEN EINES NEUEN BYTES 0598 3A C8 DC ld a, (0xdcc8) // Anz. d. Folgen //AUSKOPPELUNG DER TEXTAUSGABE 059b FE 03 cp 0x03 // a == 3 059d 28 41 jrz 0x41 // 0x05e0 // BEARBEITEN DER FESTFOLGENAUSGABE 059f 3A CE DC ld a, (0xdcce) 05a2 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 05a3 20 32 jrnz 0x32 // 0x05d7 // Anfangskennung 16 * 0xff + 2 * 0xaa // AUSGABE EINER NEUEN FOLGE VORBEREITEN 05a5 3A C8 DC ld a, (0xdcc8) // Anz. d. Folgen 05a8 3C inc a 05a9 32 C8 DC ld (0xdcc8), a // Anz. d. Folgen 05ac FE 03 cp 0x03 // a == 3 TEXTAUSGABE 05ae 28 30 jrz 0x30 // 0x05e0 05b0 06 FF ld b, 0xff // sendebyte 0xff 05b2 0E 10 ld c, 0x10 // 16 mal senden 05b4 FE 01 cp 0x01 // a == 1 05b6 28 17 jrz 0x17 // 0x05cf; AUSGABE 16 * 0xFF 05b8 06 AA ld b, 0xaa // sendebyte 0xaa 05ba 0E 02 ld c, 0x02 // 2 mal senden 05bc FE 02 cp 02 // a == 2 05be 28 0F jrz 0x0f // 0x05cf; AUSGABE 2 * 0xAA 05c0 FE 03 cp 0x03 05c2 28 1C jrz 0x1c // 0x05e0; AUSGABE GEHEIMTEXT 05c4 06 00 ld b, 0x00 // Abschlußkennung 0x0 05c6 0E 10 ld c, 0x10 // 16 mal senden 05c8 FE 05 cp 0x05 // a == 5 05ca 28 03 jrz 0x03 // 0x05cf 05cc C3 0A 06 jp 0x060a // SONST SENDEABBRUCH //SENDEN VON FESTFOLGEN; NEUE FOLGE EINSTELLEN 05cf 21 CE DC ld hl, 0xdcce // Anz. d. Folgen 05d2 71 ld (hl), c // Anzahl der Wiederholung der Zeichen 0xff, 0xaa oder 0x00 05d3 21 CC DC ld hl, 0xdccc // SENDESCHIEBEREGISTER 05d6 70 ld (hl), b // zu sendendes Zeichen 0xff, 0xaa oder 0x00 //AUSGABE EINES FOLGENBYTES EINSTELLEN 05d7 3A CE DC ld a, (0xdcce) // Anz. d. Folgen 05da 3D dec a // - 1 05db 32 CE DC ld (0xdcce), a // Anz. d. Folgen 05de 18 1A jr 0x1a // 0x05fa, Programm Indikator Senden und Empfang (Ameisen) // SENDEN des GEHEIMTEXTES 05e0 2A D0 DC ld hl, (0xdcd0) // aus Speicher 0x5c10 05e3 7E ld a, (hl) // ZU SENDENDE DATEN 05e4 32 CC DC ld (0xdccc), a // IN SENDESCHIEBEREGISTER 05e7 23 inc hl 05e8 22 D0 DC ld (0xdcd0), hl // nächstes Zeichen 05eb EB ex de, hl 05ec 2A D2 DC ld hl, (0xdcd2) // Endadresse 05ef A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 05f0 ED 52 sbc hl, de // Länge > 0? 05f2 20 06 jrnz 0x06 // 0x05fa, Programm Indikator Senden und Empfang (Ameisen) // VORBEREITEN DER AUSGABE NEUER FOLGE 05f4 21 C8 DC ld hl, 0xdcc8 // Anz. d. Folgen 05f7 34 inc (hl) 05f8 18 00 jr 0x00 // 0x05fa, Programm Indikator Senden und Empfang (Ameisen) // AUSGABE des STARTBITS 05fa AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0, STARTBIT 05fb 32 CB DC ld (0xdccb), a // Anz. d. Schwingungen 05fe 3A CC DC ld a, (0xdccc) // SENDESCHIEBEREGISTER 0601 CD 54 02 call 0x0254 // Indikator Senden und Empfang (Ameisen) 0604 3E 0A ld a, 0x0a // 10 BIT FOLGEN 0606 32 CF DC ld (0xdccf), a // Anz. d. Folgen; 8 Informations- + 2 Stopp-Schritte 0609 C9 ret // SENDEABBRUCH 060a 3E 61 ld a, 0x61 // a = 0x61; RESET, DI, Zähler, neg. Flanke 060c D3 08 out (0x08), a // CTC Kanal 0 Zähler 060e D3 09 out (0x09), a // CTC Kanal 1 Zähler 0610 DB 04 in a, (0x04) // Lese PIO-1-A-D 0612 CB AF res 5, a // lösche Bit 5, a; 105 AUS 0614 D3 04 out (0x04), a // PIO-1-A-D 0616 CD 21 02 call 0x0221 // Zeitschleife 70ms; WARTE BIS 106 WEG IST 0619 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 061a 32 CA DC ld a, (0xdcca) 061d C9 ret // Interruptroutine SENDEN 061e E5 push hl 061f D5 push de 0620 C5 push bc 0621 F5 push af // Register retten 0622 CD 38 05 call 0x0538 // ISEND; Return Adresse 0x053e für IR Senden; RETI 0625 F1 pop af 0626 C1 pop bc 0627 D1 pop de 0628 E1 pop hl // Register wiederherstellen 0629 FB EI // Interrupt wieder freigeben 062a C9 ret // Aufruf der prophylaktischen Prüfung 062b 3E 17 ld a, 0x17 // "BITTE TASTE CR" 062c CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige // Warten auf Tastendruck 0630 CD 2B 02 call 0x022b <-\ // ein Zeichen von der Tastatur 0633 3A 02 DC ld a, (0xdc02) | // ALDAT:-Datenübergaberegister Tastatur 0636 FE 9D cp 0x9d | // CTRL X 0638 20 F6 jrnz 0xf6 >-/ // 0x0630 A != 0x9d; warten auf Tastendruck // PP Programm // große PP: 1. EPROM-Test // 2. RAM-Test (ohne LCD-Speicher) // 3. ZG-Test 063a 3E 14 ld a, 0x14 // "SELBSTTEST" 063c CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 063f F3 DI // ROM-Test 0640 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0641 32 2E DC ld (0xdc2e), a // Steuerwort 0x00, PP 0644 DD 21 9E 00 ld ix, 0x009e // ROM Test 0648 FD 21 4F 06 ld iy, 0x064f // Kein Fehler springe zu 0x064f 064c C3 8D 25 jp 0x258d // ROM-RAM Check, Übergabe IX + 0 & IX + 1 = Startbereich CRC , IX + 2 & IX + 3 Länge für CRC, IX + 4 & IX + 5 speichere CRC, BC Länge 064f C2 CB 02 jpnz 0x02cb // BLOCKIERUNG 1 0652 DD 21 F6 3D ld ix, 0x3df6 // Zeiger CRC Check K-Box 0656 FD 21 5D 06 ld iy, 0x065d // Kein Fehler springe zu 0x065d 065a C3 8D 25 jp 0x258d // ROM-RAM Check, Übergabe IX + 0 & IX + 1 = Startbereich CRC , IX + 2 & IX + 3 Länge für CRC, IX + 4 & IX + 5 speichere CRC, BC Länge 065d C2 76 02 jpnz 0x0276 // Anzeige Meldung in A, System HALT 0660 3E FF ld a, 0xff 0662 32 FE A3 ld (0xa3fe), a 0665 DD 21 B4 00 ld ix, 0x00b4 0669 FD 21 70 06 ld iy, 0x0670 // Kein Fehler springe zu 0x0670 069d C3 00 26 jp 0x2600 // RAMTEST ff00ff55ffaa 0670 C2 CF 02 jpnz 0x02cf // BLOCKIERUNG 2 0673 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 0376 36 01 ld (HL), 0x01 0678 01 FF 03 ld bc, 0x03ff 067b CD B4 28 call 0x28b4 // Prüfe (HL) == 0x00 067e FE FF cp 0xff 0680 C2 CB 02 jpnz 0x02cb // BLOCKIERUNG 1 0683 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 0686 36 00 ld (hl), 0x00 0688 01 FF 03 ld bc, 0x03ff 068b CD B4 28 call 0x28b4 // Prüfe (HL) == 0x00 068e FE FF cp 0xff 0690 CA CB 02 jpz 0x02cb // BLOCKIERUNG 1 0693 3E 00 ld a, 0x00 // Kontrolle Linie gespeert 0695 32 DE DF ld (0xdfde), a // Stack-Adresse 0698 3E 09 ld a, 0x09 069a D3 04 out (0x04), a // PIO-1-A-D 069c FB EI 069d 21 10 5C ld hl, 0x5c10 // Kontrolle GTSPS,SS,KTS, GTX Speicher senden (Add 06a0 36 55 ld (hl), 0x55 06a2 7E ld a, (hl) 06a3 FE 55 cp 0x55 06a5 CA D7 02 jpz 0x02d7 // BLOCKIERUNG 4 06a8 3E 18 ld a, 0x18 // "BITTE TASTE TE" 06aa CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 06ad CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 06b0 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 06b3 FE 44 cp 0x44 06b5 20 F6 jrnz 0xf6 // A != 0x44 Springe 06b7 3E 14 ld a, 0x14 // "SELBSTTEST" 06b9 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 06bb 21 00 90 ld hl, 0x9000 // GeheimtextspeicherZifferncode, GTX-Speicher empfangen; GL.SPE 06bf 36 55 ld (hl), 0x55 06c1 7E ld a, (hl) 06c2 FE 55 cp 0x55 06c4 CA D7 02 jpz 0x02d7 // BLOCKIERUNG 4 06c7 3E 00 ld a, 0x00 // Kontrolle Linie gespeert 06c9 32 DE DF ld (0xdfde), a // Stack-Adresse 06cc 3E 09 ld a, 0x09 06ce D3 04 out (0x04), a // PIO-1-A-D 06d0 CD 21 02 call 0x0221 // Zeitschleife 70ms 06d3 21 10 5C ld hl, 0x5c10 // Kontrolle GTSPS, SS, KTS, GTX Speicher senden (Add 06d6 36 55 ld (hl), 0x55 06d8 7E ld a, (hl) 06d9 FE 55 cp 0x55 06db C2 D7 02 jpnz 0x02d7 // BLOCKIERUNG 4 06de 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 06e1 36 55 ld (hl), 0x55 06e3 7E ld a, (hl) 06e4 FE 55 cp 0x55 06e6 C2 D7 02 jpnz 0x02d7 // BLOCKIERUNG 4 06e9 21 32 94 ld hl, 0x9432 06ec 36 55 ld (hl), 0x55 06ee 7E ld a, (hl) 06ef FE 55 cp 0x55 06f1 C2 D7 02 jpnz 0x02d7 // BLOCKIERUNG 4 //Kontrolle EPROM 2 offen; ROM Test 06f4 DD 21 9E 00 ld ix, 0x009e 06f8 FD 21 FF 06 ld iy, 0x06ff // kein Fehler springe zu 0x06ff 06fc C3 8D 25 jp 0x258d // ROM-RAM Check, Übergabe IX + 0 & IX + 1 = Startbereich CRC , IX + 2 & IX + 3 Länge für CRC, IX + 4 & IX + 5 speichere CRC, BC Länge 06ff C2 D7 02 jpnz 0x02d7 // Blockierung 4 0702 3E 00 ld a, 0x00 0704 D3 04 out (0x04), a // PIO-1-A-D 0706 3E 16 ld a, 0x16 // "BITTE TASTE SE" 0708 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 070b FB EI 070c CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 070f 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 0712 FE 41 cp 0x41 0714 20 F6 jrnz 0xf6 // a != 0x41 springe 0716 3E 14 ld a, 0x14 // "SELBSTTEST" 0718 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 071b 3E FF ld a, 0xff 017d 32 FE A3 ld (0xa3fe), a 0720 DD 21 C0 00 ld ix, 0x000c 0724 FD 21 2B 07 ld iy, 0x072b // Kein Fehler Springe zu 0x072b 0728 C3 00 26 jp 0x2600 // RAMTEST ff00ff55ffaa // Einsprung aus IY = 0x072b, Zeile 0x0724; Übergabe Z-Flag 072b C2 CF 02 jpnz 0x02cf // BLOCKIERUNG 2 072e 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 0731 36 55 ld (hl), 0x55 0733 7E ld a, (hl) 0735 FE 55 cp 0x55 0737 CA D7 02 jpz 0x02d7 // BLOCKIERUNG 4 073a 21 00 94 ld hl, 0x9400 // Schlüsselspeicher, RAM-Test 073d 36 55 ld (hl), 0x55 073e 7E ld a, (hl) 073f FE 55 cp 0x55 0741 CA D7 02 jpz 0x02d7 // BLOCKIERUNG 4 0744 21 00 88 ld hl, 0x8800 // Textspeicher empfangen 0747 36 55 ld (hl), 0x55 0749 7E ld a, (hl) 074a FE 55 cp 0x55 074c CA D7 02 jpnz 0x02d7 // BLOCKIERUNG 4 074f 3E 0F ld a, 0x0f 0751 32 DE DF ld(0xdfde), a // Stack-Adresse 0754 3E 09 ld a, 0x09 0756 D3 04 out (0x04), a // PIO-1-A-D 0758 CD 21 02 call 0x0221 // Zeitschleife 70ms 075b 06 05 ld b, 0x05 075d 21 00 20 ld hl, 0x2000 0760 7E ld a, (hl) 0761 FE FF cp 0xff 0763 C2 D7 02 jpnz 0x02d7 // BLOCKIERUNG 4 0766 23 inc hl 0767 10 F7 djnz 0xf7 0769 3A DE DF ld a, (0xdfde) 076c FE 00 cp 0x00 076e C2 D7 02 jpnz 0x02d7 // BLOCKIERUNG 4 0771 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0772 D3 04 out (0x04), a // PIO-1-A-D 0774 3E 17 ld a, 0x17 // "BITTE TASTE CR" 0776 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 0779 CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 077c 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 077f FE 9D cp 0x9d // CTRL X 0781 20 F6 jrnz 0xf6 // a != 0x9d springe 0783 3E 14 ld a, 0x14 // "SELBSTSTEST" 0785 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 0788 21 10 5C ld hl, 0x5c10 // GTX Speicher senden (Add 078b 36 55 ld (hl), 0x55 078d 7E ld a, (hl) 078e FE 55 cp 0x55 0790 CA D7 02 jpz 0x02d7 // BLOCKIERUNG 4 0793 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 0796 36 55 ld (hl), 0x55 0798 7E ld a, (hl) 0799 FE 55 cp 0x55 079b C2 D7 02 jpnz 0x02d7 // BLOCKIERUNG 4 079e 21 32 94 ld hl, 0x9432 07a1 36 55 ld (hl), 0x55 07a2 7E ld a, (hl) 07a3 FE 55 cp 0x55 07a5 C2 D7 02 jpnz 0x02d7 // BLOCKIERUNG 4 07a8 DD 21 9E 00 ld ix, 0x009e // ROM TE 07ac FD 21 B4 07 ld iy, 0x07b4 // MT0; Sprungadresse 0x07b4 07b1 C3 8D 25 jp 0x258d // ROM-RAM Check, Übergabe IX + 0 & IX + 1 = Startbereich CRC , IX + 2 & IX + 3 Länge für CRC, IX + 4 & IX + 5 speichere CRC, BC Länge 07b4 C2 D7 02 jpnz 0x02d7 // BLOCKIERUNG 4 // Kontrolle Linie gespeert 07b7 3E 00 ld a, 0x00 07b9 32 DE DF ld (0xdfde), a // Stack-Adresse 07bc 3E 09 ld a, 0x09 // Steuerwort 07bd D3 04 out (0x03), a // Steuerwort,Tastatur PIO-0-B 07c0 CD 21 02 call 0x0221 // Zeitschleife 70ms 07c3 3E 00 ld a, 0x00 07c5 D3 04 out (0x04), a // PIO-1-A-D //IV Erzeugung 07c6 3E 20 ld a, 0x20 // Konst.Folge 0x20 IN GL.G1 LAD; G1 Zufallsgenerator 07c8 32 90 DC ld (0xdc90), a // Betriebsart Zufallsgenerator bit 7, 6, 5 07cb CD 0E 08 call 0x080e // Zufallsfolge 07cf 3A 90 DC ld a, (0xdc90) // Betriebsart Zufallsgenerator bit 7, 6, 5 07d2 CB 77 bit 6, a // Fehler Zufallsfolge 07d4 CA DB 02 jpz 0x02db // BLOCKIERUNG 5 07d7 3E 40 ld a, 0x40 // ZF-Erzeugung 0x40; erste Zufallsfolgen verwerfen, neu Initialisieren 07d9 32 90 DC ld (0xdc90), a // Betriebsart Zufallsgenerator bit 7, 6, 5 07dc CD 0E 08 call 0x080e // Zufallsfolge 07df 3A 90 DC ld a, (0xdc90) // Betriebsart Zufallsgenerator bit 7, 6, 5 07e2 CB 77 bit 6, a // Fehler Zufallsfolge 07e4 C2 D3 02 jpnz 0x02d3 // BLOCKIERUNG 3, HALT 07e7 21 0A 95 ld hl, 0x950a // Zeiger auf CRC Schlüssel1 07ea 11 00 95 ld de, 0x9000 // GeheimtextspeicherZifferncode, GTX-Speicher empfangen; GL.SPE 07ed 01 02 00 ld bc, 0x0002 // Länge 2 Byte 07f0 ED B0 ldir // Kopiere (0x950a) > (0x9000) 2 byte, GTX-Speicher empfangen; GL.SPE 07f2 21 0C 95 ld hl, 0x950c // Zeiger auf CRC Schlüssel2 07f5 11 02 95 ld de, 0x9502 07f8 01 02 00 ld bc, 0x0002 // Länge 2 byte 07fb ED B0 ldir // Kopiere (0x950c) > (0x9502) 2byte 07fd 21 00 96 ld hl, 0x9600 // PWSP; Passwort Speicher, 32 byte 0800 11 01 96 ld de, 0x9601 0803 01 20 00 ld bc, 0x0020 // Länge 32 byte 0806 36 EE ld (hl), 0xee 0808 ED B0 ldir // fülle 0x9600 - 0x9620 mit 0xee, %1110 1110 080a F3 DI // Sperre Interrupt 080b C3 20 00 jp 0x0020 // RST 0x20, Aufruf PP Kaltstart // Zufallsfolge 080e CD 15 08 call 0x0815 // Init Zufallserzeugung; 0811 CD 48 08 call 0x0848 // Ausschalten Zufallsgenerator 0814 C9 ret /**********************************************************/ /* Zufallserzeugung */ /* Übergabeparameter IN GL.G1: Bit 7 = 1 Fertig */ /* 6 = 1 Fehler ZF */ /* 5 = 1 ZF-Test */ /* Statussignal für Unterprogramm ZF: */ /* ZF-Erzeugung 0x40 IN GL.G1 LAD */ /* Konst.Folge 0x20 IN GL.G1 LAD */ /* Bereitstellung der IV: */ /* Takt durch CTC Kanal 3 für G1 über PIO 1 Port A bit 4 */ /* PIO 0 Port B bit 7 übernimmt ZF von G1 */ /* PAP: 8bit Erzeugung = 1byte; 8 byte = 1 Block */ /* 256 Blöcke = 1 Testzyklus; bei Fehlerhafte */ /* bis max. 3 Zyklen möglich; dann Fehlermeldung */ /* aus fehlerfreiem Zyklus letzten 64 bit und CR */ /* */ /* Qualitätsbewertung: Ermittlung Sigma-3 Bereich d */ /* Maske 0x4d (nach jeder bit Erzeugung) mit D */ /* 0x16 > x < 0x68 (für einen Zyklus = */ /**********************************************************/ // Init Zufallserzeugung 0815 21 90 00 ld hl, 0x0090 // neuer Interrupt-Vektor 0818 7D ld a, l // a = 0x90 0819 D3 08 out (0x08), a // CTC Kanal 0 Interrupt 0x0090 081b DB 05 in a, (0x05) // Lese PIO-1-B-D; Sonderschnittstelle 081d CB FF set 7, a // bit 7 = 1 081f D3 05 out (0x05), a // PIO-1-B-D; Sonderschnittstelle, Spanung für ZG 0821 CD 21 02 call 0x0221 // Zeitschleife 70ms 0824 21 00 80 ld hl, 0x8000 // Dopplungs-Speicher 0827 22 87 DC ld (0xdc87), hl // Zeiger Zufallsfolgen 082a 21 00 00 ld hl, 0x0000 082d 22 8C DC ld (0xdc82), hl // Gesamtanzahl pro Zyklus = 0x0000 0830 3E 1F ld a, 0x1f // 32, Zähler für Anzahl der Bits 0832 32 89 DC ld (0xdc89), a // SPAD2: Länge 2; Zieladresse 0835 32 8E DC ld (0xdc8e), a // Bit Zähler 0838 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0839 32 8F DC ld (0xdc8f), a // Speicher Zyklusanzahl 083c 32 8B DC ld (0xdc8b), a // Sigma-3 Grenzen: 0x17 > x < 0x67 083f 3E 87 ld a, 0x87 // EI, Zeitgeber, Vorteiler 16, neg. Flanke, Zeitkonstantenstart, Zeitkonstante folgt, RESET 0841 D3 0A out (0x0a), a // CTC Kanal 2 0843 3E 15 ld a, 0x15 // Zeitkonstante 21 * 256 / 1,340 = 4 ms 0845 D3 0A out (0x0a), a // CTC Kanal 2 Zeitgeber 0847 C9 ret // Ausschalten Zufallsgenerator 0848 3A 90 DC ld a, (0xdc90) // Betriebsart Zufallsgenerator bit 7, 6, 5 084b CB 7F bit 7, a // bit 7 FERTIG, gesetzt in der Interrupt Routine 084d 28 F9 jrz 0xf9 // Schleife bis FERTIG; 0x0848 084f 21 88 00 ld hl, 0x0088 // Fertig: Vektor Normalbetrieb 0851 7D ld a, l // a = 0x88 0852 D3 08 out (0x08), a // CTC Kanal 0 Interruptroutine 0x0080 0854 DB 05 in a, (0x05) // Lese PIO-1-B-D; Sonderschnittstelle 0856 CB BF res 7, a // bit 7 = 0, Prüfung Spannung aus 0858 D3 05 out (0x05), a // PIO-1-B-D; Sonderschnittstelle, Spannung für ZG aus 085a CD 4A 02 call 0x024a // CTC Kanal 3 Einschalten Tastatur CTC 085e C9 ret // Interruptroutine Zufallserzeugung 085f D9 exx // tausche alle Register 0860 08 ex af, af' 0861 DB 04 in a, (0x04) // Lese PIO-1-A-D, Takt G1; G1 Zufallsgenerator 0863 CB 67 bit 4, a // bit 4 == 0; xxx0 xxxx 0865 28 06 jrz 0x06 // ja: 0x086d 0867 CB A7 res 4, a // nein, bit 4 == 1; xxx1 xxxx; Lösche bit 4 -> xxx0 xxxx 0869 D3 04 out (0x04), a // PIO-1-A-D A, ausgabe xxx0 xxxx 086b 18 06 jr 0x06 // 0x0873, Zur Bitabfrage (1-0 Flanke) // Takt G1 war 0 086d CB E7 set 4, a // xxx1 xxxx 086f D3 04 out (0x04), a // PIO-1-A-D A Ausgabe xxx1 xxxx 0871 18 30 jr 0x30 // 0x08a3; EXX - EI - RETI // Einsprung Takt G1 war 1 0873 21 8A DC ld hl, 0xdc8a // Zufallsbyte Länge 1 0876 3A 90 DC ld a, (0xdc90) // Betriebsart Zufallsgenerator bit 7, 6, 5 0879 CB 6F bit 5, a // Zufalls Test BA Bit 5 087b 20 0D jrnz 0x0d // 0x088a, nein; 087d 21 8A DC ld hl, 0xdc8a // Zufallsbyte Länge 1 0880 DB 01 in a, (0x01) // Lese PIO-0-B-D Zufallsbit an PIO/CTC Tastatur ME, ZG, OUTC 0882 CB 77 bit 6, a // bit 6 == 0; Zufallsbit 0884 28 04 jrz 0x04 >-\ // ja 0x088a 0886 CB C6 set 0, (hl) | // nein, 0xdc8a bit 0 = 1 0888 18 02 jr 0x02 | >-\ // 0x088c | | // Einsprung wenn 0xdc90 BA Bit 5 = 1 war 088a CB 86 res 0, (hl)<-/ | // 0xdc8a bit 0 = 0 088c 7E ld a, (hl) <-/ // Zufallsfolge in a 088d FE 4D cp 0x4d // a == 0x4d; Maske Sigma-3-Bereich 088f 20 07 jrnz 0x07 // nein: 0x0898 0891 21 8B DC ld hl, 0xdc8b // ja: Sigma-3 Grenzen: 0x17 > x < 0x67 0894 34 inc (hl) // Maskenzähler + 1 0895 20 01 jrnz 0x01 // 0x0898, (HL) != 0 0897 35 dec (hl) // ja: Festhalten auf 255 // Sigma-3 Bereich <> 0x4d 0898 21 8E DC ld hl, 0xdc8e // nein: 089b 35 dec (hl) // 1. Schritt 32 bit fertig, 2.Schritt 8 bit fertig 089c 28 0A jrz 0x0a // 0x08a8, (0xdc8e) == 0 089e 21 8A DC ld hl, 0xdc8a // Zufallsbyte Länge 1 08a1 CB 26 sla (hl) // schiebe (HL), carry <- (HL.7) <- (HL.0) <- 0 // Einsprung Zufallsbit war 0 08a3 08 ex af, af' // Register zurücktauschen 08a4 D9 exx 08a5 FB ei 08a6 ED 4D reti // 1 byte Fertig 08a8 36 08 ld (hl), 0x08 // HL = (0xdc8e) = 0x08 08aa 21 8A DC ld hl, 0xdc8a // Zufallsbyte Länge 1 08ad 7E ld a, (hl) // Erzeugtes Byte 08ae CB 26 sla (hl) // schiebe (HL), carry <- (HL.7) <- (HL.0) <- 0 08b0 2A 87 DC ld hl, (0xdc87) // Zeiger Zufallsfolgen 08b3 77 ld (hl), a // Zufallsbyte in Array ab (0x8000 + n) 08b4 23 inc hl // erhöhe Zeiger 08b5 22 87 DC ld (0xdc87), hl // speicher neuen Zeiger aufs Array; Zeiger Zufallsfolgen 08b8 2A 8C DC ld hl, (0xdc8c) // Gesamtzähler 08bb 23 inc hl // Gesamtzähler + 1 08bc 22 8C DC ld (0xdc8c), hl // Gesamtzähler 08bf 3A 89 DC ld a, (0xdc89) // SPAD2: Länge 2; Zieladresse; Startwert 0x1f 08c2 B7 add a, a // a = 2*a 08c3 28 06 jrz 0x06 // a == 0; 0x08cb 08c5 3D dec a // 32 runden 08c6 32 89 DC ld (0xdc89), a // SPAD2: Länge 2; Zieladresse 08c9 18 D8 jr 0xd8 // 0x08a3; EXX RETI // 1 block fertig 08cb 3E 1F ld a, 0x1f // Anzahl/Lowadresse (32 Byte) 08cd 32 89 DC ld (0xdc89), a // Setze 0xdc89 wieder hoch auf 0x1f; SPAD2: Länge 2; Zieladresse 08d0 21 00 80 ld hl, 0x8000 // Dopplungs-Speicher 08d3 22 87 DC ld (0xdc87), hl // Zeiger Zufallsfolgen 08d6 2A 8C DC ld hl, (0xdc8c) // Gesamtzähler 08d9 01 00 08 ld bc, 0x0800 // Endwert 1 zyklus = 2048 08dc A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 08dd ED 42 sbc hl, bc // Länge = -1 ?, ende 1 Zyklus ? 08df 38 C2 jrc 0xc2 // 0x08a3; EXX RETI // 1 Zyklus >= 16384 bit) Fertig 08e1 3A 8B DC ld a, (0xdc8b) // Sigma-3 Grenzen: 0x17 > x < 0x67 08e4 FE 17 cp 0x17 // Sigma-3 Grenzen: 0x17 > x 08e6 38 2A jrc 0x2a // nicht io 08e8 FE 67 cp 0x67 // Sigma-3 Grenzen: x < 0x67 08ea 30 26 jrnc 0x26 // nicht io 08ec 21 00 80 ld hl, 0x8000 // Quelle IV, Dopplungs-Speicher 08ef 11 77 DC ld de, 0xdc77 // Zieladr. 08f2 01 08 00 ld bc, 0x0008 // Blocklänge 08f5 ED B0 ldir // Kopie IV 0x8000 > 0xdc77 8 Byte, Dopplungs-Speicher 08f7 21 00 80 ld hl, 0x8000 // Startadresse 0x8000, Dopplungs-Speicher 08fa 01 08 00 ld de, 0x0008 // Länge 8yte 08fd CD B9 25 call 0x25b9 // Berechne CRC1, HL Startadresse, BC Länge, Rückgabe DE 0900 21 7F DC ld hl, 0xdc7f // CRCiv Länge 2 ; CRC der IV 0903 72 ld (hl), d 0904 23 inc hl 0905 73 ld (hl), e // Prüfsumme in (0xdc7f, 0xdc80) 0906 3E 21 ld a, 0x21 // DI, Zeitgeber, Vorteiler 256, neg. Flanke 0908 D3 0A out (0x0a), a // CTC Kanal 2 Zeitgeber 090a 3E 80 ld a, 0x80 // bit 7 = 1 OK 090c 32 90 DC ld (0xdc90), a // Betriebsart Zufallsgenerator bit 7, 6, 5 090f C3 A3 08 jp 0x08a3 // EXX - EI - RETI // SIGMA 3 fehlerhaft 0912 3A 8F DC ld a, (0xdc8f) // Speicher Zyklusanzahl 0915 3C inc a 0916 FE 03 cp 0x03 // a == 3, Max. Zyklenanzahl erreicht 0918 28 10 jrz 0x10 // 0x092a 091a 32 8F DC ld (0xdc8f), a // Speicher Zyklusanzahl 091d 21 00 00 ld hl, 0x0000 0920 22 8C DC ld (0xdc8c), hl // Gesamtanzahl Rückgesetzt 0923 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0924 32 8B DC ld (0xdc8b), a // Sigma-3 Grenzen: 0x17 > x < 0x67 0927 C3 A3 08 jp 0x08a3 // EXX - EI - RETI // mehr als 3 Zyklen, Fehler Zufallsgenerator 092a 3E 21 ld a, 0x21 // DI, Zeitgeber, Vorteiler 256, neg. Flanke 092c D3 0A out (0x0a), a // CTC Kanal 2 Zeitgeber 082e 3E C0 ld a, 0xc0 // Bit 7 & 6 = 1, Fehl 0930 18 DA jr 0xda // Interruptroutine Linie 0932 F5 push af // rette AF 0933 3A DE DF ld a, (0xdfde) // Status Linie 0936 FE 0F cp 0x0f // a == 0x0f 0938 28 09 jrz 0x09 // 0x0943, TEST // Linie unerlaubt gesendet 093a F1 pop af // wiederherstellen AF 093b E1 pop hl // Stack geradebiegen? 093c 21 DB 02 ld hl, 0x02db // BLOCKIERUNG 5 093f E5 push hl // rette HL 0940 FB ei 0941 ED 4D reti // richtig erkannt 0943 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0944 32 DE DF ld (0xdfde), a // Status Linie 0947 F1 pop af // wiederherstellen AF 0948 18 F6 jr 0xf6 // 0x0940 - EI/RETI /*************************************************/ /* Textprozessor /* Benutzte Register 0xdc1a /* ZTP: Zustand TP /* Bit 0 = 0 Texteingabe; = 1 Schlüsseleingabe /* 1 = 0 KT-Eingabe = 1 GT-Eingabe /* 2 = 0 GT-Senden = 1 GT-Empfangen /* ZADR: aktueller Zeiger /* EADR: EndZeiger /* /* Übergabeparameter: /* ALDAT: Alpha-Tastaturregister /* AADRT: Anfangsadresse des Datenspeichers /* EADRT: Endadressedes Datenspeichers /***************************************************/ //Textprozessor 094a CD C1 0D call 0x0dc1 // ANZEIGESTEUERPROGRAMM 0 KT-Ausgabe, 1 Bedienerführung, 2 MIRA 094d 47 ld b, a // rette A 094e 3A 15 DC ld a, (0xdc15) // AMER: Länge 1 0951 CB BF res 7, a // Lösche Bit 7 0953 FE 0F cp 0x0f // a == 0x0f 0955 28 0A jrz 0x0a // 0x0961 0957 3A 16 DC ld a, (0xdc16) // BMER: Länge 1 095a CB BF res 7, a // Lösche Bit 7 095c FE 0F cp 0x0f // a == 0x0f 095e 78 ld a, b // hole A zuruck, Zeile 0x04d 095f 20 29 jrnz 0x29 // 0x098a, KEINE TASTE SE // Einsprung 0961 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor; 0 ... 7 0964 FE 02 cp 0x02 // a == 2; GT-Eingabe 0966 28 22 jrz 0x22 // 0x098a, BEI SENDEN SE ERLAUBEN 0968 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 096b CB 86 res 0, (hl) // bit neues Zeichen gelöscht // Einsprung neue Taste 096d 3E 17 ld a, 0x17 // "BITTE TASTE CR" 096f CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 0972 CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 0975 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 0978 FE 9D cp 0x9d // CTRL X 097a 20 F6 jrnz 0xf6 // 0x097a 097c 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 097f FE 06 cp 0x06 // GTX EMPFANGEN 0981 20 55 jrnz 0x55 // 0x09d8 0983 3E 02 ld a, 0x02 0985 32 25 DC ld (0xdc25), a // FORMATIERTE ANZEIGE BEI, ZUANZ:-Zustandsanzeige 0988 18 4E jr 0x4e // 0x09d8 // BESTÄTIGUNG TASTE CRTL ? 098a 47 ld b, a // rette A 098b 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 098e FE 02 cp 0x02 // A == 0x02; GT-Eingabe 0990 78 ld a, b // hole A zurück 0991 20 45 jrnz 0x45 // 0x09d8; TASTE CTRL NUR BEI SE FE 0993 3A 15 DC ld a, (0xdc15) // AMER: Länge 1 0996 CB BF res 7, a // Lösche Bit 7 0998 FE 09 cp 0x09 // a == 9, CTRL 099a 28 1C jrz 0x1c // 0x09d8 099c 3A 16 DC ld a, (0xdc16) // BMER: Länge 1 099f CB BF res 7, a // Lösche Bit 7 09a1 FE 09 cp 0x09 // a == 9 09a3 78 ld a, b // hole A zurück, Zeile 0x98a 09a4 28 12 jrz 0x12 // 0x09d8 09a6 3A 15 DC ld a, (0xdc15) // AMER: Länge 1 09a9 CB BF res 7, a // Lösche Bit 7 09ab FE 34 cp 0x34 // a = 0x34, TE 09ad 28 09 jrz 0x09 // 0x09d8 09af 3A 16 DC ld a, (0xdc16) // BMER: Länge 1 09b2 CB BF res 7, a // Lösche Bit 7 09b4 FE 34 cp 0x34 // a == 0x34, TE 09b6 20 20 jrnz 0x20 // 0x09d8 09b8 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 09bb CB 86 res 0, (hl) // bit neues Zeichen gelöscht 09bd 3E 16 ld a, 0x16 // "BITTE TASTE SE" 09bf CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige // Schleife Abfrage Taste SE 09c2 CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 09c5 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 09c8 FE 41 cp 0x41 // TASTE SE 09ca 20 F6 jrnz 0xf6 // 0x09c2 09cc 3E 02 ld a, 0x02 09ce 32 25 DC ld (0xdc25), a // ZUANZ:-Zustandsanzeige 09d1 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 09d4 CB 86 res 0, (hl) // bit neues Zeichen gelöscht 09d6 18 21 jr 0x21 // 0x09f9 // Einsprung aus Textprozessor 09d8 3A 1A DC ld a, 0xdc1a // ZTP:Zustand TextProzessor 09db FE 06 cp 0x06 // GT-Empfangen 09dd 20 1A jrnz 0x1a // 0x09f9 09df 3A 15 DC ld a, (0xdc15) // AMER: Länge 1 09e2 CB BF res 7, a // Lösche Bit 7 09e4 FE 34 cp 0x34 // a == 0x34, TE 09e6 28 09 jrz 0x09 // 0x09f1 09e8 3A 16 DC ld a, (0xdc16) // BMER: Länge 1 09eb CB BF res 7, a // Lösche Bit 7 09ed FE 34 cp 0x34 // a == 0x34, TE 09ef 20 08 jrnz 0x08 // 0x09f9 09f1 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 09f4 CB 86 res 0, (hl) // bit neues Zeichen gelöscht 09f6 C3 6D 09 jp 0x096d // Schleife Tastenabfrage // Einsprung Taste SE 09f9 3A 03 DC ld a, (0xdc03) // ZUALF:-Zustand Alpha-Tastendruck 09fc CB 47 bit 0, a // bit neues Zeichen abgefragt 09fe 20 0A jrnz 0x0a // 0x0a0a 0a00 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0a01 32 15 DC ld (0xdc15), a // AMER: 0 0a04 32 16 DC ld (0xdc16), a // BMER: 0 0a07 C3 4D 09 jp 0x094d // Einsprung 0a0a CB 87 res 0, a // bit neues Zeichen gelöscht 0a0c 32 03 DC ld (0xdc03), a // ZUALF:-Zustand Alpha-Tastendruck 0a0f 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 0a12 FE 43 cp 0x43 // ENTER 0a14 20 25 jrnz 0x20 // 0x0a3b, F3 Drucken aus Editor GTX/Klartext 0a16 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0a19 FE 00 cp 0x00 // Texteingabe 0a1b CA 4D 09 jpz 0x094d 0a1e 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0a21 CB 4F bit 1, a // Schlüsseleingabe 0a23 C8 ret z // ENDE BEI GT-EINGABE NUR BEI VOLLER 5-GRUPPE 0a24 2A 1F DC ld hl, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 0a27 EB ex de, hl 0a28 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0a2b A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0a2c ED 52 sbc hl, de // Länge == 0? 0a2e C8 ret z // KEIN TEXT 0a2f 11 05 00 ld de, 0x0005 0a32 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0a33 ED 52 sbc hl, de // Länge == 0? 0a35 C8 ret z // Kein Text 0a36 30 FA jrnc 0xfa // 0x0a32 0a38 C3 4A 09 jp 0x094a // Textprozessor // Einsprung aus ISR Liste; 0x0050 Funktionstaste Drucken GTX/Klartext // Übergabe A 0a3b FE 44 cp 0x44 // F3 IST ENDETASTE BEI T-31x 0a3d 20 09 jrnz 0x09 // 0x0a48 0a3f 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0a42 FE 00 cp 0x00 // Texteingabe 0a44 C8 ret z // ABER NUR DORT 0a45 C3 4D 09 jp 0x094d // Schleife Textprozessor //AUSDRUCKEN DER DATEN 0a48 FE 83 cp 0x83 // CTRL + A Drucken 0a4a 20 19 jrnz 0x19 // 0x0a65 0a4c 3A 01 DC ld a, (0xdc01) // Betriebsartenregister: 0-KT erstellen/1-Schlüsselwechsel/2-GT erstellen/3-GTX senden 0a4f FE 01 cp 0x01 // Betriebsart Schlüsselwechsel? 0a51 CA 4A 09 jpz 0x094a // Textprozessor 0a54 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0a57 FE 08 cp 0x08 0a59 CA 4A 09 jpz 0x094a // Textprozessor 0a53 CD A9 17 call 0x17a9 // Druckerprogramm 0a56 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0a60 D3 04 out (0x04), a // PIO-1-A-D 0a62 C3 4A 09 jp 0x094a // Textprozessor 0a65 FE 03 cp 0x03 0a67 20 09 jrnz 0x09 // 0x0a72 0a69 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0a6c FE 02 cp 0x02 // GT-Eingabe 0a6e 3E 03 ld a, 0x03 // a == 3 0a70 28 EA jrz 0xea // 0x0a5c 0a72 FE 92 cp 0x92 // CTRL + L? Textprozeß 0a74 20 14 jrnz 0x14 // 0x0a8a 0a76 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0a79 CB 47 bit 0, a // Texteingabe 0a7b C2 4A 09 jpnz 0x094a // Textprozessor 0a7e 2A 1F DC ld hl, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 0a81 22 1B DC ld (0dc1b), hl // ZADR: Länge 2 ; Aktueller Zeiger 0a84 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor 0a87 C3 4A 09 jp 0x094a // Textprozessor 0a8a 47 ld b, a 0a8b 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0a8e CB 47 bit 0, a // Texteingabe 0a90 78 ld a, b 0a91 C2 6A 0B jpnz 0x0b6a 0a94 FE 85 cp 0x85 // a == 0x85, CTRL + S? 0a96 28 0D jrz 0x0d // 0x0aa5 0a98 FE 05 cp 0x05 0a9a 20 12 jrnz 0x12 // 0x0aae 0a9c 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0a9f FE 02 cp 0x02 // GT-Empfangen 0aa1 3E 05 ld a, 0x05 0aa3 20 09 jrnz 0x09 // 0x0aae 0aa5 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0aa8 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 0aab C3 4A 09 jp 0x094a // Textprozessor // Einsprung GT-Empfangen 0aae FE 99 cp 0x99 // a == 0x99, CTRL + B ? 0ab0 28 0D jrz 0x0d // 0x0abf 0ab2 FE 19 cp 0x19 0ab4 20 12 jrnz 0x12 // 0x0ac8 0ab6 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0ab9 FE 02 cp 0x02 // GT-Empfangen 0abb 3E 19 ld a, 0x19 0abd 20 09 jrnz 0x09 // 0x0ac8 0abf 2A 1F DC ld hl, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 0ac2 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 0ac5 C3 4A 09 jp 0x094a // Textprozessor // Einsprung 0ac8 FE 9E cp 0x9e // a == 0x9e, CTRL + V? Sprung vorn Textprozeß 0aca 28 0D jrz 0x0d // 0x0ad9 0acc FE 1E cp 0x1e 0ace 20 4E jrnz 0x4e // 0x0b1e 0ad0 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0ad3 FE 02 cp 0x02 // GT-Empfangen 0ad5 3E 1E ld a, 0x1e 0ad7 20 45 jrnz 0x45 // 0x0b1e 0ad9 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0adc CB 4F bit 1, a // Schlüsseleingabe 0ade 20 1B jrnz 0x1b // 0x0afb 0ae0 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0ae3 11 14 00 ld de, 0x0014 0ae6 19 add hl, de 0ae7 EB ex de, hl 0ae8 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0aeb A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0aec ED 52 sbc hl, de // Länge == -1? 0aee 30 04 jrnc 0x04 // 0x0af4 0af0 ED 5B 1D DC ld de, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0af4 EB ex de, hl 0af5 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 0af8 C3 4A 09 jp 0x094a // Textprozessor 0afb 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0afe 11 0A 00 ld de, 0x000a 0b01 19 add hl, de 0b02 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 0b05 ED 5B 1F DC ld de, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 0b09 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0b0a ED 52 sbc hl, de // Länge 0b0c CD 71 10 call 0x1071 // Anzeige BCD, Programm zur Fünfergruppenzählung 0b0f 7D ld a, l 0b10 E6 0F and 0x0f 0b12 CB 3F srl a // schiebe A, 0 -> A7 -> A0 -> carry 0b14 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0b17 3C inc a 0b18 3D dec a // trick, prüfe ob FF 0b19 28 CC jrz 0xcc // 0x0ae7 0b1b 2B dec hl 0b1c 18 FA jr 0xfa // 0x0b18 0b1e FE 8A cp 0x8a // a == 0x8a, CTRL + R? Textprozeß 0b20 28 0D jrz 0x0d // 0x0b2f 0b22 FE 0A cp 0x0a 0b24 20 44 jrnz 0x44 // 0x0b6a 0b26 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0b29 FE 02 cp 0x02 // GT-Empfangen 0b2b 3E 0A ld a, 0x0a 0b2d 20 3B jrnz 0x3b // 0x0b6a 0b3f 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0b42 CB 4F bit 1, a // Schlpsseleingabe 0b44 20 1D jrnz 0x1d // 0x0b53 0b46 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0b49 11 14 00 ld de, 0x0014 0b4c A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0b4d ED 52 sbc hl, de // Länge 0b4f EB ex de, hl // Tausche Inhalte HL <> DE 0b40 2A 1F DC ld hl, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 0b43 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0b44 ED 52 sbc hl, de // Länge == -1? 0b46 38 04 jrc 0x04 // 0x0b4c 0b48 ED 5B 1F DC ld de (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 0b4c ED 53 1B DC ld (0dc1b), de // ZADR: Länge 2 ; Aktueller Zeiger 0b50 C3 4A 09 jp 0x094a // Textprozessor 0b53 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0b56 11 0A 00 ld de, 0x000a 0b59 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0b5a ED 52 sbc hl, de // Länge 0b5c ED 5B 1F DC ld de, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 0b60 EB ex de, hl // Tausche Inhalt DE <> HL 0b61 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0b62 ED 52 sbc hl, de // Länge 0b64 EB ex de, hl // Tausche Inhalt DE <> HL 0b65 DA 02 0B jpc 0x0b02 // Länge war -1? 0b68 18 DE jr 0xde // 0x0b48 0b6a FE 8D cp 0x8d // CTRL + F? Textprozeß 0b6c 20 0B jrnz 0x0b // 0x0b79 0b6e 3A 2A DC ld a, (0xdc2a) // ALRC:-Adresse CRC-Wert Register 0b71 EE 01 xor 0x01 // Lösche Bit 0 von (0xdc2a) 0b73 32 2A DC ld (0xdc2a), a // ALRC:-Adresse CRC-Wert Register 0b76 C3 4A 09 jp 0x094a // Textprozessor // CURSORSTEUERUNGSTASTEN 0b79 CB 7F bit 7, a 0b7b C2 4A 09 jpnz 0x094a // Textprozessor 0b7e FE 42 cp 0x42 // LEFT 0b80 20 39 jrnz 0x39 // 0x0bbb 0b82 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0b85 EB ex de, hl 0b86 2A 1F DC ld hl, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 0b89 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0b8c CB 47 bit 0, a // Texteingabe 0b8e 28 04 jrz 0x04 // 0x0b94 0b90 23 inc hl 0b91 23 inc hl 0b92 23 inc hl 0b93 23 inc hl // hl + 4 0b94 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0b95 ED 52 sbc hl, de // Länge == 0 0b97 28 1B jrz 0x1b // 0x0bb4 0b99 CD 8A 0D call 0x0d8a // Zustand Textprozessor, a und Z-Flag Rückgabe 0b9c 28 15 jrz 0x15 // 0x0bb3 0b9f FE 04 cp 0x04 // a <> 4 0ba0 20 11 jrnz 0x11 // 0x0bb3 // Einsprung aus ISR-Liste; 0x0050 // Übergabe über DE 0ba2 D5 push de // retten DE für Registerwechsel // Einsprung aus ISR Liste; 0x0050 // Übergabe über DE 0ba3 1B dec de 0ba4 1B dec de 0ba5 1B dec de 0ba6 1B dec de // hl - 4 0ba7 2A 1F DC ld hl (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 0baa 2B dec hl 0bab A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0bac ED 52 sbc hl, de // Länge 0bae E1 pop hl // HL = DE 0baf 20 02 jrnz 0x02 // 0x0bb3; Länge > 0 0bb1 EB ex de, hl // Tausche Inhalt DE <> HL 0bb2 13 inc de // Länge == 0 (indirekt HL + 1) // Länge > 0 0bb3 1B dec de // Länge > 0 (indirekt HL -1), Länge == 0 HL unverändert! 0bb4 EB ex de, hl // Rücktausch Inhalt DE <> HL 0bb5 22 1B DC ld (0xdc1b) hl // ZADR:-Aktueller Zeiger-TextProzessor 0bb8 C3 4A 09 jp 0x094a // Textprozessor // Einsprung Cursorsteuerung Tasten, 0x0b80 0bbb FE 40 cp 0x40 // a <> 0x40, RIGHT 0bbd 20 2D jrnz 0x2d // 0x0bec 0bbf 2A 1B DC ld hl (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0bc2 EB ex de, hl 0bc3 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0bc6 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0bc7 ED 52 sbc hl, de // Länge == 0 0bc9 CA 4A 09 jpz 0x094a // Textprozessor 0bcc CD 8A 0D call 0x0d8a // Zustand Textprozessor, a und Z-Flag Rückgabe 0bcf 28 08 jrz 0x08 // 0x0bd9 0bd1 FE 08 cp 0x08 // a <> 8 0bd3 20 04 jrnz 0x04 // 0x0bd9 0bd5 13 inc de 0bd6 13 inc de 0bd7 13 inc de 0bd8 13 inc de 0bd9 13 inc de // de + 5 0bda 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0bdd A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0bde ED 52 sbc hl, de // Länge 0be0 EB ex de, hl // Tausche Inhalt DE <> HL 0be1 30 03 jrnc 0x03 // 0x0be6 0be3 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0be6 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 0be9 C3 4A 09 jp 0x094a // Textprozessor // Einsprung Cursorsteuerung Tasten 0x0bbd 0bec 47 ld b, a 0bed 3A 01 DC ld a, (0xdc01) // Betriebsartenregister 0bf0 FE 03 cp 0x03 // Betriebsart GT Senden 0bf2 78 ld a, b 0bf3 CA 4A 09 jpz 0x094a // Textprozessor; KEIN ÄNDERN BEIM SENDEN // BEARBEITUNG DEL (LÖSCHEN LINKS VOM CURSOR) 0bf6 FE 45 cp 0x45 // DEL 0bf8 20 79 jrnz 0x79 // 0x0c73 0bfa 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0bfd EB ex de, hl 0bfe 2A 1F DC ld hl, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 0c01 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0c02 ED 52 sbc hl, de // Länge == 0 0c04 CA 4A 09 jpz 0x094a // Textprozessor 0c07 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0c0a CB 47 bit 0, a // Texteingabe 0c0c 28 41 jrz 0x41 // 0x0c4f // BEI SCHLÜSSELEINGABE NUR LETZTES ZEICHEN AUSBLENDEN 0c0e 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0c11 EB ex de, hl 0c12 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0c15 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0c16 ED 52 sbc hl, de // Länge > 0 0c18 C2 4A 09 jpnz 0x094a // Textprozessor // AUSBLENDEN UNTER BERÜCKSICHTIGUNG DER FORMIERUNG 0c1b CD 8A 0D call 0x0d8a // Zustand Textprozessor, a und Z-Flag Rückgabe 0c1e EB ex de, hl 0c1f FE 05 cp 0x05 0c21 20 21 jrnz 0x21 // 0x0c44 0c23 3A 24 DC ld a, (0xdc24) // TPME2:-Formatierung Schlüssel 0c26 D6 01 sub 0x01 0c28 27 daa // BCD korrektur 0c29 32 24 DC ld (0xdc24), a // TPME2:-Formatierung Schlüssel 0c2c 06 04 ld b, 0x04 0c2e 2B dec hl 0c2f 36 04 ld (hl), 0x04 0c31 10 FB djnz 0xfb // 0x0c2e // Einsprung Schlüsselformatierung 0x0c4d 0c33 2B dec hl 0c34 3A 23 DC ld a, (0xdc23) // TPME1:-Formatierung Schlüssel 0c37 3D dec a 0c38 32 23 DC ld (0xdc23), a // TPME1:-Formatierung Schlüssel 0c3b 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 0c3e 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor 0c41 C3 4A 09 jp 0x094a // Textprozessor // Einsprung Ausblenden Formatierung, 0x0c21 0c44 FE 08 cp 0x08 0c46 20 EB jrnz 0xeb // 0x0c33 0c48 3E 04 ld a, 0x04 0c4a 32 23 DC ld (0xdc23), a // TPME1:-Formatierung Schlüssel 0c4d 18 E4 jr 0xe4 // 0x0c33 // Einsprung Bearbeiten DEL Löschen links vom Cursor 0c4f 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0c52 E5 push hl // retten HL, GL.ZADR 0c53 EB ex de, hl 0c54 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0c57 E5 push hl // retten HL GL.EADR 0c58 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0c59 ED 52 sbc hl, de // Länge == 0 0c5b 28 07 jrz 0x07 // 0x0c64 0c5d E5 push hl // Registerwechsel 0c5e C1 pop bc // BC = HL, Länge 0c5f D5 push de // Registerwechsel 0c60 E1 pop hl // HL = DE 0c61 1B dec de 0c62 ED B0 ldir // Kopiere von HL nach DE, Länge BC 0c64 E1 pop hl // GL.EADR, wiederherstellen HL 0c65 2B dec hl 0c66 36 04 ld (hl), 0x04 // ZWR 0c68 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor 0c6b E1 pop hl // GL.ZADR, wiederherstellen HL 0c6c 2B dec hl 0x67 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 0c70 C3 4A 09 jp 0x094a // Textprozessor // BEARBEITUNG INFORMATIONSTASTEN 0c73 21 1A DC ld hl, 0xdc1a // ZTP:Zustand TextProzessor 0c76 CB 46 bit 0, (hl) // Texteingabe-Schlüssleingabe 0c78 CA 05 0D jpz 0x0d05 // KONTROLLE GÜLTIGER ZEICHEN BEI SCHLÜSSELEINGABE 0c7b 21 A7 0D ld hl, 0x0da7 0c7e 01 10 00 ld bc, 0x0010 0c81 ED B1 cpir // BC == 0? oder a == (HL) 0c83 C2 4A 09 jpnz 0x094a // Textprozessor; FALSCHES ZEICHEN 0c86 2A 1B DC ld hl (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0c89 EB ex de, hl 0c8a 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0c8d A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0c8e ED 52 sbc hl, de // Länge > 0 0c90 C2 64 0D jpnz 0x0d64 // 0c93 F5 push af // retten AF 0c94 3A 23 DC ld a, (0xdc23) // TPME1:-Formatierung Schlüssel 0c97 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0c98 20 2F jrnz 0x2f // 0x0cc9 // EINFÜGEN DER ZAHLENKOMBINATION 0c9a 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0c9d 36 04 ld (hl), 0x04 // ZWR 0c9f 23 inc hl 0ca0 3A 24 DC ld a, (0xdc24) // TPME2:-Formatierung Schlüssel 0ca3 C6 01 add a, 0x01 0ca5 27 daa // BCD korrektur 0ca6 32 24 DC ld (0xdc24), a // TPME2:-Formatierung Schlüssel 0ca9 CB 67 bit 4, a // bit 4 == true 0cab 36 36 ld (hl), 0x36 // NULL 0cad 28 02 jrz 0x02 // 0x0cb1 0caf 36 37 ld (hl), 0x37 // EINS 0cb1 23 inc hl 0cb2 E6 0F and 0x0f 0cb4 E5 push hl // retten HL 0cb5 21 A7 0D ld hl, 0x0da7 0cb8 06 00 ld b, 0x00 0cba 4F ld c, a 0cbb 09 add hl, bc // hl von 0x0da7 - 0x0x0db6 0cbc 7E ld a, (hl) // a mit dem inhalt der Zeichentabelle 0 ... f 0cbd E1 pop hl // wiederherstellen HL 0cbe 77 ld (hl), a 0cbf 23 inc hl 0cc0 36 04 ld (hl), 0x04 // ZWR 0cc2 23 inc hl 0cc3 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 0cc6 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor // Einsprung Kontrolle Gültige Zeichen 0x0c98 0cc9 3A 23 DC ld a, (0xdc23) // TPME1:-Formatierung Schlüssel 0ccc 3C inc a 0ccd FE 05 cp 0x05 0ccf 20 01 jrnz 0x01 // 0x0cd2 0cd1 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 // Funktion nicht 0x05 0cd2 32 23 DC ld (0xdc23), a // TPME1:-Formatierung Schlüssel 0cd5 F1 pop af // wiederherstellen AF // Einsprung 0cd6 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0cd9 EB ex de, hl 0cda 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0cdd A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0cde ED 52 sbc hl, de // Länge > 0 0ce0 20 34 jrnz 0x34 // 0x0d16; EINFÜGEN USW: 0ce2 D5 push de // Registerwechsel 0ce3 E1 pop hl // HL = DE 0ce4 77 ld (hl), a 0ce5 2A 21 DC ld hl, (0xdc21) // EADRT:-Endadresse Textspeicher 0ce8 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0ce9 ED 52 sbc hl, de // Länge == 0 0ceb 28 0B jrz 0x0b // 0x0cf8 0ced 13 inc de 0cee EB ex de, hl 0cef 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor 0cf2 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 0cf5 C3 4A 09 jp 0x094a // Textprozessor // Einsprung Länge == 0 0cf8 3E 02 ld a, 0x02 0cfa 32 23 DC ld (0xdc23), a // TPME1:-Formatierung Schlüssel 0cfd 3E 15 ld a, 0x15 0cff 32 24 DC ld (0xdc24), a // TPME2:-Formatierung Schlüssel 0d02 C3 4A 09 jp 0x094a // Textprozessor // Einsprung bearbeitung Informationstasten 0d05 CB 4E bit 1, (hl) // bit 1 == true 0d07 28 CD jrz 0xcd // 0x0cd6; KEINE GT-EINGABE // BEI GT-EINGABE NUR BUCHSTABEN A...P 0d09 21 B1 0D ld hl, 0x0db1 0d0b 01 10 00 ld bc, 0x0010 0d0f ED B1 cpir // BC == 0? oder a == (HL) 0d11 C2 4A 09 jpnz 0x094a // Textprozessor 0d14 18 C0 jr 0xc0 // 0x0cd6 //KORREKTUREN 0d16 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 0d19 CB 56 bit 2, (hl) // bit 2 == true, bit INSERT Mode 0d1b 28 31 jrz 0x31 // 0x0d4e; ÜBERSCHREIBEN // INS-MODE; Insert 0d1d 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0d20 E5 push hl // rette HL; 1 0d21 EB ex de, hl // DE = HL 0d22 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0d25 E5 push hl // rette HL; 2 0d26 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0d27 ED 52 sbc hl, de // Länge 0d29 E5 push hl // rette HL, 3 0d2a C1 pop bc // BC = HL, Länge; -3 0d2b 03 inc bc 0d2c 2A 21 DC ld hl, (0xdc21) // EADRT:-Endadresse Textspeicher 0d2f EB ex de, hl // Tausche Inhalt DE <> HL; HL alten zeiger 0xdc1b, DE zeiger 0xdc21 0d30 E1 pop hl // EADR; -2 HL = zeiger 0xdc1d 0d31 E5 push hl // rette HL; 2 0d32 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0d33 ED 52 sbc hl, de // Länge > 0 0d35 20 04 jrnz 0x04 // 0x0d3b; Zurückladen // LETZTES ZEICHEN verwerfen 0d37 0B dec bc // 1 ZEICHEN WENIGER UMLADEN 0d38 E1 pop hl // wiederherstellen HL; -2 0d39 2B dec hl 0d3a E5 push hl // rette Hl; 2 // ZURÜCKLADEN 0d3b E1 pop hl // wiederherstellen HL; -2 0d3c 54 ld d, h 0d3d 5D ld e, l // DE = HL 0d3e 23 inc hl 0d3f 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor 0d42 EB ex de, hl // Tausche Inhalt DE <> HL 0d43 ED B8 lddr // verschiebe rückwärts HL > DE, bc-- , hl--, de-- 0d45 E1 pop hl // GL.ZADR; wiederherstellen HL; -1 Zeiger 0xdc1b 0d46 77 ld (hl), a 0d47 23 inc hl 0d48 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 0d4b C3 4A 09 jp 0x094a // Textprozessor // ÜBERSCHREIBEN 0d4e 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0d51 77 ld (hl), a 0d52 EB ex de, hl 0d53 2A 21 DC ld hl , (0xdc21) // EADRT:-Endadresse Textspeicher 0d56 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0d57 ED 52 sbc hl, de // Länge > 0 0d59 20 01 jrnz 0x01 // 0x0d5c 0d5b 1B dec de // Länge == 0 // Länge > 0 0d5c EB ex de, hl // Tausche Inhalte DE <> HL 0d5d 23 inc hl 0d5e 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 0d61 C3 4A 09 jp 0x094a // Textprozessor // Einsprung KONTROLLE GÜLTIGER ZEICHEN BEI SCHLÜSSELEINGABE, 0x0c90 0d64 EB ex de, hl 0d65 77 ld (hl), a 0d66 23 inc hl 0d67 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 0d6a EB ex de, hl 0d6b 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0d6e A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0d6f ED 52 sbc hl, de // Länge == 0 0d71 EB ex de, hl // Tausche Inhalte DE <> HL 0d72 CA 4A 09 jpz 0x094a // Textprozessor 0d75 CD 8A 0D call 0x0d8a // Zustand Textprozessor, a und Z-Flag Rückgabe 0d78 FE 00 cp 0x00 // Rückgabe Textprozessor A > 0? springe 0d7a C2 4A 09 jpnz 0x094a // Textprozessor 0d7d 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0d80 23 inc hl 0d81 23 inc hl 0d82 23 inc hl 0d83 23 inc hl // HL + 4 0d84 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 0d87 C3 4A 09 jp 0x094a // Textprozessor // Zustand Textprozessor, a und Z-Flag Rückgabe 0d8a 3A 1A DC ld a, (0xdc1a) // ZTP:Zustand TextProzessor 0d8d CB 47 bit 0, a // Texteingabe-Schlüssleingabe 0d8f C8 ret z 0d90 D5 push de // rette DE 0d91 2A 1F DC ld hl, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 0d94 EB ex de, hl 0d95 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0d98 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0d99 ED 52 sbc hl, de // Länge 0d9b 11 09 00 ld de, 0x0009 0d9e A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0d9f ED 52 sbc hl, de // Länge > -1 0da1 30 FB jrnc 0xfb // 0x0d9e 0da3 19 add hl, de 0da4 7D ld a, l 0da5 D1 pop de // wiederherstellen DE 0da6 C9 ret // Unwandlungstabelle Zahl > Zeichen, für Hexadezimal-Darstellung 0da7 36 37 33 21 2A 30 35 27 26 38 // 0...9 // Buchstabenliste A ... P (0x00 ... 0x0f Darstellung des De-, Chiffrates) in ITA-2 0db1 03 19 0E 09 01 0D 1A 14 // a, b, c, d, e, f, g, h 0db9 06 0B 0F 12 1C 0C 18 16 // i, j, k, l, m, n, o, p /*************************************************/ /* ANZEIGESTEUERPROGRAMM /* ZUANZ = 0: KT-AUSGABE /* 1: BEDIENERFÜHRUNG /* 2: MIRA /* PROGRAMM ZUR ANZEIGE des TEXTPROZESSOR-FENSTERS /* BEARBEITUNG KT-ANZEIGE /* Anzeigesteuerprogramm */ 0dc1 3A 25 DC ld a, (0xdc25) // ZUANZ:-Zustandsanzeige 0dc4 CB 97 res 2, a // Lösche Bit 2 0dc6 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0dc7 C2 5A 0F jpnz 0x0f5a // Darstellung GTX; KEINE KT-AUSGABE 0dca 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0dcd CB 7F bit 7, A // bit 7 == true 0dcf 28 04 jrz 0x04 // 0x0dd5 0dd1 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0dd2 32 26 DC ld (0xdc26), a // ZUAN2:-Merkerstelle für Bedienermeldungen 0dd5 EB ex de, hl // rette HL in DE 0dd6 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0dd9 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0dda ED 52 sbc hl, de // Länge 0ddc 11 0B 00 ld de, 0x000b 0ddf A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0de0 ED 52 sbc hl, de // Länge > -1, maximal 11 Zeichen 0de2 30 2F jrnc, 0x2f // 0x0e13; längerer Text 0de4 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0de7 11 C8 A0 ld de, 0xa0c8 // LCD-RAM ZZ 0dea D5 push de // rette DE, wird später HL 0deb E5 push hl // rette HL 0dec 01 15 00 ld bc, 0x0015 // 21 runden 0def ED B8 lddr // Kopiere Txt in LCD Speicher; schiebe rückwärts, HL > DE, bc-- , hl--, de-- 0df1 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0df4 EB ex de, hl // Tausche Inhalt DE <> HL 0df5 E1 pop hl // wiederherstellen HL 0df6 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0df7 ED 52 sbc hl, de // Länge 0df9 EB ex de, hl // Tausche Inhalt DE <> HL 0dfa E1 pop hl // HL = 0xa0c8 0dfb A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0dfc ED 52 sbc hl, de // Länge 0dfe CB FE set 7, (hl) 0e00 3A 25 DC ld a, (0xdc25) // ZUANZ:-Zustandsanzeige 0e03 CB 57 bit 2, a // bit 2 == true 0e05 28 08 jrz 0x08 // 0x0e0f 0e07 21 B4 A0 ld hl, 0xa0b4 // LCD-RAM AZ 0e0a 36 34 ld (hl), 0x34 0e0c 23 inc hl 0e0d 36 04 ld (hl), 0x04 0e0f CD 2E 0E call 0x0e2e // Umwandlungsprogramm für Anzeige 0e12 C9 ret // Textende paßt nicht auf Anzeige 0e13 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0e16 11 0B 00 ld de, 0x000b 0e19 19 add hl, de // Länge 0e1a 11 C8 A0 ld de, 0xa0c8 // LCD-RAM ZZ 0e1d D5 push de // rette DE 0e1e 01 15 00 ld bc, 0x0015 // 21 Runden 0e21 ED B8 lddr // verchiebe rückwärts, HL > DE, bc-- , hl--, de-- 0e23 11 0B 00 ld de, 0x000b 0e26 E1 pop hl // HL = 0xa0c8 0e27 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0e28 ED 52 sbc hl, de // Länge 0e2a CB FE set 7, (hl) // CURSOR FÜR ANZEIGE 0e2c 18 D2 jr 0xd2 // 0x0e00 // Umwandlungsprogramm für Anzeige 0e2e 0E 00 ld c, 0x00 0e30 06 14 ld b, 0x14 0e32 21 B4 A0 ld hl, 0xa0b4 // LCD-RAM AZ 0e35 11 C8 A0 ld de, 0xa0c8 // LCD-RAM ZZ 0e38 7E ld a, (hl) 0e39 E5 push hl 0e3a D5 push de // rette Register 0e3b 21 74 13 ld hl, 0x1374 // Zeichensatz für LCD 0e3e E6 3F and 0x3f // a = (0xa0c8) & 0x3f; 6 bit Maske 0011 1111 0e40 28 07 jrz 0x07 // 0x0e49 0e42 11 07 00 ld de, 0x0007 0e45 19 add hl, de 0e46 3D dec a 0e47 20 FC jrnz 0xfc // 0x0e45 0e49 16 00 ld d, 0x00 0e4b 59 ld e, c 0e4c 19 add hl, de 0e4d 7E ld a, (hl) 0e4e D1 pop de 0e4f E1 pop hl // Register wiederherstellen 0e50 12 ld (de), a 0e51 23 inc hl 0e52 13 inc de 0e53 10 E3 djnz 0xe3 // 0x0e38 0e55 CD 13 0F call 0x0f13 // LCD Speicher, Übergabe C 0e58 0C inc c // nächstes Zeichen 0e59 3E 07 ld a, 0x07 0e5b B9 cmp c 0e5c 20 D2 jrnz 0xd2 // 0x0e30 0e5e 06 14 ld b, 0x14 0e60 21 B4 A0 ld hl, 0xa0b4 // LCD-RAM AZ 0e63 11 C8 A0 ld de, 0xa0c8 // LCD-RAM ZZ 0e66 CB 7E bit 7, (hl) 0e68 3E 00 ld a, 0x00 0e6a 28 02 jrnz 0x02 // 0x0E6E 0e6c 3E 1F ld a, 0x1f 0e6e 12 ld (de), a 0e6f 23 inc hl 0e70 13 inc de 0e71 10 F3 djnz 0xf3 // 0x0e66 0e73 0C inc c // nächstes Zeichen 0e74 CD 13 0F call 0x0f13 // LCD Speicher, Übergabe C 0e76 21 70 A0 ld hl, 0xa070 // LCD-RAM Z8 0e79 06 10 ld b, 0x10 0e7b AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0e7c 77 ld (hl), a 0e7e 23 inc hl 0e7f 10 FC djnz 0xfc // 0x0e7d 0e81 3A 27 DC ld a, (0xdc27) // ZUAN3:-Einfügemode 0e84 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0e85 20 0C jrnz 0x0c // 0x0e93 0e87 21 90 A0 ld hl, 0xa090 // LCD-RAM Z10 0e8a 06 10 ld b, 0x10 // Schleife 16 elemente 0e8c AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0e8d 77 ld (hl), a 0e8e 23 inc hl // 0xa090 - 0xa0a0 = 0x00 0e8f 10 FC djnz 0xfc // 0x0e8d 0e91 18 0B jr 0x0b // 0x0e9e // EInsprung Umwandlung für Anzeige, 0x0e89 0e93 21 80 A0 ld hl, 0xa080 // LCD-RAM Z9 0e96 11 90 A0 ld de, 0xa090 // LCD-RAM Z10 0e99 01 10 00 ld bc, 0x00010 // Länge 0e9c ED B0 ldir // Kopiere (0xa080) > (0xa090), länge 0x10 // Einsprung 0e9e 3A 2A DC ld a, (0xdc2a) // ALRC:-Adresse CRC-Wert Register 0ea1 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0ea2 C8 retz // A == 0 Rücksprung 0ea3 3A 01 DC ld a, (0xdc01) // Betriebsartenregister: 0-KT erstellen/1-Schlüsselwechsel/2-GT erstellen/3-GTX senden 0ea6 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0ea7 C0 retnz // A != 0 Rücksprung 0ea8 06 08 ld b, 0x08 // Betriebsart KT erstellen 0eaa 21 00 A0 ld hl, 0xa000 // LCD-RAM Z1 0ead 16 09 ld d, 0x09 0eaf 36 00 ld (hl), 0x00 0eb1 23 inc hl 0eb2 15 dec d 0eb3 20 FA jrnz 0xfa // 0x0eaf, HL 0xa000 bis 0xa06f Löschen mit 0x00 0eb5 11 07 00 ld de , 0x0007 0eb8 19 add hl, de // HL = 0xa009 + 0x0007 = 0xa010, ... 0xa070 0eb9 10 F2 djnz 0xf2 // 0x0ead 0ebb 21 00 A0 ld hl, 0xa000 // LCD-RAM Z1 0ebe 11 10 00 ld de, 0x0010 0ec1 06 0A ld b, 0x0a 0ec3 36 01 ld (hl), 0x01 0ec5 19 add hl, de 0ec6 10 FB djnz 0xfb // 0x0ec3, (0xa000) = 0x01, (0xa010) = 0x01 ... (0xa100) 0ec8 21 08 A0 ld hl, 0xa008 0ecb 06 0A ld b, 0x0a 0ecd 36 02 ld (hl), 0x02 oecf 19 add hl, de 0ed0 10 FB djnz 0xfb // 0x0ecd, (0xa008) = 0x02, (0xa018) = 0x02 ... (0xa108) 0ed2 11 10 00 ld de, 0x0010 0ed5 3A 00 DC ld a, (0xdc00) // Arbeitsspeicher,Hauptbetriebsart-1; GL.HBA 0ed8 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0ed9 28 03 jrz 0x03 // 0x0ede; MIRA 0edb 11 08 00 ld de, 0x0008 // GO 0ede 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0ee1 ED 4B 1F DC ld bc, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 0ee5 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0ee6 ED 42 sbc hl, bc // Länge 0ee8 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 0ee9 4F ld c, a 0eea ED 52 sbc hl, de // Länge 0eec 0C inc c 0eed 30 FB jrnc 0xfb // 0x0eea 0eef 21 30 A0 ld hl, 0xa030 // LCD-RAM Z3 oef2 E5 push hl // rette HL 0ef3 11 10 00 ld de, 0x0010 0ef6 3E 03 ld a, 0x03 0ef8 E1 pop hl // wiederherstellen HL = 0xa030 0ef9 E5 push hl // rette HL 0efa 06 04 ld b, 0x04 0efc 77 ld (hl), a 0efd 19 add hl, de // Länge 0efe 10 FC djnz 0xfc // 0x0efc 0f00 0D dec c // c == 0 0f01 28 0E jrz 0x0e // 0x0f11 0f03 47 ld b, a 0f04 07 rlca // rotiere A, A7 <- A0 <- A7; carry = A7 0f05 38 03 jrc 0x03 // 0F0A 0f07 B0 or b 0f08 18 EE jr 0xee // 0x0ef8 // Einsprung carry = 1; 0x0f05 0f0a E1 pop hl // wiederherstellen HL 0f0b 23 inc hl // HL++ 0f0c E5 push hl // rette HL 0f0d 3E 01 ld a, 0x01 0f0f 18 E7 jr 0xe7 // 0x0ef8 // Einsprung Regsister C = 0 0f11 E1 pop hl 0f12 C9 ret // LCD Speicher; Übergabe C Anzahl der Zeichen 0f13 21 00 A0 ld hl, 0xa000 // LCD-RAM Z1 0f16 79 ld a, c // Übergabe c Anzahl der Zeichen 0f17 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0f18 28 07 jrz 0x07 // 0x0f21 0f1a 11 10 00 ld de, 0x0010 // Schleife A 0f1d 19 add hl, de // Endadresse = c*16 + 0xa000 0f1e 3D dec a // Schleifenzähler 0f1f 20 FC jrnz 0xfc // 0x0f1d // C war 0 0f21 11 C8 A0 ld de, 0xa0c8 // LCD-RAM ZZ 0f24 06 05 ld b, 0x05 0f26 C5 push bc // rette BC, rette Zeichenlänge 0f27 1A ld a, (de) 0f28 07 rlca // rotiere A, A7 <- A0 <- A7; carry = A7 0f29 07 rlca // rotiere A, A7 <- A0 <- A7; carry = A7 0f2a 77 ld (hl), a 0f2b 13 inc de 0f2c 1A ld a, (de) 0f2d 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 0f2e CB 1E rr (hl) // rotiere (HL); carry -> (HL.7) -> (HL.0) -> carry 0f30 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 0f31 CB 1E rr (hl) // rotiere (HL); carry -> (HL.7) -> (HL.0) -> carry 0f33 23 inc hl 0f34 06 04 ld b, 0x04 0f36 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 0f37 CB 1E rr (hl) // rotiere (HL); carry -> (HL.7) -> (HL.0) -> carry 0f39 10 FB djnz 0xfb // 0x0f36 0f3b 13 inc de 0f3c 1A ld a, (de) 0f3d 06 04 ld b, 0x04 0fef 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 0f40 CB 1E rr (hl) // rotiere (HL); carry -> (HL.7) -> (HL.0) -> carry 0f42 10 FB djnz 0xfb // 0x0f3f 0f44 23 inc hl 0f45 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 0f46 CB 1E rr (hl) // rotiere (HL); carry -> (HL.7) -> (HL.0) -> carry 0f48 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 0f49 CB 1E rr (hl) // rotiere (HL); carry -> (HL.7) -> (HL.0) -> carry 0f4b 13 inc de 0f4c 1A ld a, (de) 0f4d 06 06 ld b, 0x06 0f4f 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 0f50 CB 1E rr (hl) // rotiere (HL); carry -> (HL.7) -> (HL.0) -> carry 0f52 10 FB djnz 0xfb // 0x0f4f 0f54 13 inc de 0f55 23 inc hl 0f56 C1 pop bc // wiederherstellen BC 0f57 10 CD djnz 0xcd // 0x0f26 0f59 C9 ret // Anzeige des formatierten Geheimtextes 0f5a FE 01 cp 0x01 0f5c CA 3D 10 jpz 0x103d // Bedienertexte Index angelegt 0f5f AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 // Umwandlung in Dezimalformat 0f60 32 26 DC ld (0xdc26), a // ZUAN2:-Merkerstelle für Bedienermeldungen 0f63 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0f66 ED 5B 1F DC ld de, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 0f6a A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0f6b ED 52 sbc hl, de // Länge == 0 0f6d CA E5 0F jpz 0x0fe5 // kein Text 0f70 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0f73 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0f74 ED 52 sbc hl, de // Länge > 0 0f76 20 05 jrnz 0x05 // 0x0f7d 0f78 21 10 00 ld hl, 0x0010 0f7b 18 03 jr 0x03 // 0x0f7d // Einsprung Länge <= 0; 0x0f76 0f7d CD 71 10 call 0x1071 // Anzeige BCD, Programm zur Fünfergruppenzählung 0f80 E5 push hl // können alle Zeichen dargesellt werden 0f81 C1 pop bc // BC = HL 0f82 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0f85 EB ex de, hl 0f86 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0f89 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0f8a ED 52 sbc hl, de // Länge 0f8c 11 06 00 ld de, 0x0006 0f8f A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0f90 ED 52 sbc hl, de // Länge 0f92 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0f95 2B dec hl 0f96 38 08 jrc 0x08 // 0x0fa0 0f98 11 05 00 ld de, 0x0005 0f9b 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0f9e 2B dec hl 0f9f 19 add hl, de 0fa0 C5 push bc // rette BC -> wo ist der POP? 0fa1 01 0F 00 ld bc, 0x000f 0fa3 11 C7 A0 ld de, 0xa0c7 0fa5 E5 push hl 0fa6 D5 push de // Register retten 0fa7 ED 5B 1F DC ld de, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 0fab A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0fac ED 52 sbc hl, de // Länge == 0 0fb0 3E 82 ld a, 0x82 0fb2 28 04 jrz 0x04 // 0x0fb8 0fb4 CD 71 10 call 0x1071 // Anzeige BCD, Programm zur Fünfergruppenzählung 0fb7 7D ld a, l 0fb8 D1 pop de 0fb9 E1 pop hl // Register wiederherstellen 0fba D6 02 sub 0x02 0fbc 27 daa // BCD korrektur 0fbd E6 0F and 0x0f // Maskiere untere 4 bits 0fbf FE 06 cmp 0x06 0fc1 20 08 jrnz 0x08 // 0x0fcb; springe bei ungleich 0x06 0fc3 EB ex de, hl 0fc4 36 04 ld (hl), 0x04 0fc6 2B dec hl 0fc7 EB ex de, hl 0fc8 0D dec c // c == 0 0fc9 28 2E jrz 0x2e // 0x0ff9 // Einsprung ungleich 0x06 0fcb ED A8 ldd // Kopiere (HL) > (DE), BC -1: bc wird vom aufrufenden Programm getestet. 0fcd E2 F9 0F jppo 0x0ff9 // P-Flag wird von ldd gesetzt (BC=0) 0fd0 D5 push de 0fd1 E5 push hl 0fd2 C5 push bc // rette Register 0fd3 EB ex de, hl // Tausche Inhalt DE <> HL 0fd4 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 0fd7 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 0fd8 ED 52 sbc hl, de // Länge > 0 springe nach 0x0fba 0fda C1 pop bc 0fdb E1 pop hl 0fdc D1 pop de // wiederherstellen Register 0fdd 20 DB jrnz 0xdb // 0x0fba 0fdf ED 53 28 DC ld (0xdc28), de // ANCSP:-Merkerstelle für Cursor 0fe3 18 D5 jr 0xd5 // 0x0fba // Einsprung KEIN TEXT 0x0f6d 0fe5 21 B4 A0 ld hl, 0xa0b4 // LCD-RAM AZ 0fe8 36 00 ld (hl), 0x00 0fea 11 B5 A0 ld de, 0xa0b5 // LCD-RAM AZ + 1 0fed 01 13 00 ld bc, 0x0013 // Länge 0ff0 ED B0 ldir // lösche 0xa0b4 - 0xa0c8 mit 0x00, // LCD-RAM AZ // LCD-RAM ZZ 0ff2 01 10 00 ld bc, 0x0010 0ff5 C5 push bc // rette BC 0ff6 11 B8 A0 ld de, 0xa0b8 // LCD-RAM ZZ 0ff9 C1 pop bc // wiederherstellen BC 0ffa EB ex de, hl 0ffb 36 04 ld (hl), 0x04 // (0xa0b8) = 0x04; LCD-RAM ZZ 0ffd 2B dec hl 0ffe 36 3A ld (hl), 0x1a // (0xa0b7) = 0x1a; LCD-RAM ZZ - 1 1000 2B dec hl // 0xa0b7 = hl; LCD-RAM ZZ - 4 1001 79 ld a, c // a = 0x10 1002 CD 5A 10 call 0x105a // Zeichengenerator Ziffern, Übergabe/Rückgabe in A 1005 77 ld (hl), a 1006 2B dec hl 1007 78 ld a, e 1008 E6 0F and 0x0f 100a CD 62 10 call 0x1062 // Einsprung in den Zeichengenerator Ziffern, Übergabe/Rückgabe in A 100d 77 ld (hl), a 100e 2B dec hl 100f 78 ld a, b 1010 CD 5A 10 call 0x105a // Zeichengenerator Ziffern, Übergabe/Rückgabe in A 1013 77 ld (hl), a 1014 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 1017 ED 5B 1D DC ld de, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 101b A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 101c ED 52 sbc hl, de // Länge == 0 101e 28 19 jrz 0x19 // 0x1039 1020 3E FF ld a, 0xff 1022 BC cp h // a <> 0xff 1023 20 09 jrnz 0x09 // 0x102e 1025 BD cp l 1026 20 06 jrnz 0x06 // 0x102e 1028 21 C7 A0 ld hl, 0xa0c7 102b 22 28 DC ld (0xdc28), hl // ANCSP:-Merkerstelle für Cursor 102e 2A 28 DC ld hl, (0xdc28) // ANCSP:-Merkerstelle für Cursor 1031 7E ld a, (hl) 1032 FE 04 cp 0x04 1034 20 01 jrnz 0x01 // 0x1037 1036 2B dec hl 1037 CB FE set 7, (hl) 1039 CD 2E 0E call 0x0e2e // Umwandlungsprogramm für Anzeige 103c C9 ret // Bedienertexte Index angelegt 103d 3A 26 DC ld a, (0xdc26) // ZUAN2:-Merkerstelle für Bedienermeldungen 1040 21 E0 10 ld hl, 0x10e0 // "BITTE WEITER" - Text A = 0x01 1043 11 14 00 ld de, 0x0014 1046 D6 01 sub 0x01 <--\ 1048 38 03 jrc 0x03 | // 0x104d, a < 0x00? 104a 19 add hl, de | // 0x10f4, 0x1108 ... -> nächster Block a 14 Bytes 104b 18 F9 jr 0xf9 >--/ // 0x1046 // Einsprung carry = 1 104d 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 1050 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor 1053 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 1054 32 25 DC ld (0xdc25), a // ZUANZ:-Zustandsanzeige 1057 C3 C1 0D jp 0x0dc1 // ANZEIGESTEUERPROGRAMM 0 KT-Ausgabe, 1 Bedienerführung, 2 MIRA // UMWANDLUNG BCD IN ITA VON ZAHLEN 0...9 // Input: BCITL : Wert des linken Halbbyts von A // BCITR : Wert des rechten Halbbytes von A // Output A : ITA-Wert // Zeichengenerator Ziffern 105a CB 3F srl a // schiebe A, 0 -> A7 -> A0 -> carry 105c CB 3F srl a // schiebe A, 0 -> A7 -> A0 -> carry 105e CB 3F srl a // schiebe A, 0 -> A7 -> A0 -> carry 1060 CB 3F srl a // schiebe A, 0 -> A7 -> A0 -> carry, A.high -> A.left, carry = A bit 3 // Einsprung 0x100a 1062 E6 0F and 0x0f // Maskiere, carry = 0 1064 E5 push hl 1065 D5 push de // Register retten 1066 5F ld e, a 1067 16 00 ld d, 0x00 1069 21 C2 10 ld hl, 0x10c2 // ITLIS; Zeichen für den Zeichengenerator 106c 19 add hl, de // Berechne Index, der Ziffer 106d 7E ld a, (hl) 106e D1 pop de 106f E1 pop hl // wiederherstellen Register 1070 C9 ret // Programm zur Fünfergruppenzählung // Übergabe: HL : Elementeanzahl Binär // Rückgabe: HL, B : Gruppenanzahl BCD 1071 C5 push bc // Rette BC 1072 06 00 ld b, 0x00 1074 3E 05 ld a, 0x05 // Vorladen wg. 1 Gruppe 1076 C6 01 add a, 0x01 1078 27 daa // bcd korrektur 1079 30 07 jrnc 0x07 // 0x1082; kein Überlauf nach daa 107b 4F ld c, a 107c 78 ld a, b 107d C6 01 add a, 0x01 107e 27 daa // bcd korrektur 1080 47 ld b, a 1081 79 ld a, c 1082 57 ld d, a 1083 2B dec hl 1084 7C ld a, h 1085 B5 or l 1086 7A ld a, d 1087 20 ED jrnz 0xed // 0x1076; A OR L ist ungleich 0 1089 87 add a, a 108a 27 daa // bcd korrektur 108b 6F ld l, a 108c 78 ld a, b 108d 06 00 ld b, 0x00 108f 30 02 jrnc 0x02 // 0x1093; kein Überlauf nach daa 1091 06 01 ld b, 0x01 1093 87 add a, a 1094 27 daa // BCD korrektur 1095 80 add a, b 1096 27 daa // bcd korrektur 1097 67 ld h, a // Dezimalwert 5er Gruppe 1098 C1 pop bc // Register wiederherstellen 1099 C9 ret // Programm zur Anzeige der Bedienerführung // Input: A : Nr. des Wortes ltd. AG 109a 32 26 DC ld (0xdc26), A // ZUAN2:-Merkerstelle für Bedienermeldungen 109d 3A 25 DC ld a, (0xdc25) // ZUANZ:-Zustandsanzeige 10a0 F5 push af // rette AF 10a1 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 10a2 32 2A DC ld (0xdc2a), a // ALRC, LCD Cursor 10a5 3E 01 ld a, 0x01 10a7 32 25 DC ld (0xdc25), a // ZUANZ:-Zustandsanzeige 10aa 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 10ad E5 push hl // rette HL, 1 10ae 2A 1B DC ld hl, (0xdc1b) // ZADR:-Aktueller Zeiger-TextProzessor 10b1 E5 push hl // rette HL, 2 10b2 CD C1 0D call 0x0dc1 // ANZEIGESTEUERPROGRAMM 0 KT-Ausgabe, 1 Bedienerführung, 2 MIRA 10b5 E1 pop hl // wiederherstellung HL, 2 10b6 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 10b9 E1 pop hl // wiederherstellung HL, 1 10ba 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor 10bd F1 pop af // wiederherstellung AF 10be 32 25 DC ld (0xdc25), hl // ZUANZ:-Zustandsanzeige 10c1 C9 ret // ITLIS // ZiL 0 1 2 3 4 5 6 7 8 9 10c2 36 37 33 21 2A 30 35 27 26 38 //Anzeigegenerator Mxx // 0 1 2 3 4 5 6 7 8 9 //eol, "E", "->", "A", " ", "S", "I", "U", "<", "D", //10 11 12 13 14 15 16 17 18 19 //"R", "J", "N", "F", "C", "K", "T", "Z", "L", "W", //20 21 22 23 24 25 26 27 28 29 //"H", "Y", "P", "Q", "U", "B", "G", "#", "M", "X", //30 31 32 33 34 35 36 37 38 39 //"V", "$", "'", "3", "%", "-", CRLF, "+", "8", "7", //40 41 42 43 44 45 46 47 48 49 //">", "=", "4", "*", ",", "/", ";", "(", "5", "''", //50 51 52 53 54 55 56 57 58 59 //")", "2", "-,", "6", "0", "1", "9", "?", ":", "[", //60 61 62 63 64 65 66 67 68 69 //".", "&", "!", "]" 3f = 63 = b0011 1111 Zeichenadresse: A B C D E F G H I J K L M N O P Q #03 19 0e 09 01 0d 1a 14 06 0b 0f 12 1c 0c 18 16 17 R S T U V W X Y Z # ' + * ( ) [ ] #0a 05 10 07 1e 13 1d 15 11 1b 20 25 2b 2f 34 3b 3f - -> < > _ ! ? 1 2 3 4 5 6 7 8 9 0 #23 02 08 28 04 3E 39 37 33 21 2a 30 35 27 26 38 36 // A == 0x00 10cc 19 12 18 0E // BLOC 10d0 0F 06 01 0A 07 0C 1A 00 37 00 00 00 00 00 00 00 // KIERUNG 1 // A == 0x01 10e0 19 06 10 10 01 04 13 01 06 10 01 0A 00 00 00 00 // BITTE_WEITER 10f0 00 00 00 00 // A == 0x02 1C 18 1C 01 0C 10 04 19 06 10 10 01 // MOMENT_BITTE 1100 04 00 00 00 00 00 00 00 //_ // A == 0x03 1108 19 01 0A 01 06 10 00 00 1110 00 00 00 00 00 00 00 00 00 00 00 00 // BEREIT // A == 0x04 10 01 1D 10 // TEXT 1120 04 01 0A 05 10 01 12 12 01 0C 00 00 00 00 00 00 // _ERSTELLEN // A == 0x05 1130 05 0E 14 12 07 01 05 05 01 12 01 06 0C 1A 03 19 // SCHLUESSELEINGAB 1140 01 00 00 00 // E // A == 0x06 1145 09 01 0E 14 06 0D 0D 0A 06 01 0A 01 // DECHFFRIERE 1150 0C 3E 00 00 00 00 00 00 // N? // A == 0x07 1158 0E 14 06 0D 0D 0A 06 01 // CHIFFRIE 1160 0A 01 0C 3E 00 00 00 00 00 00 00 00 // REN? // A == 0x08 116c 05 01 0C 09 // SEND 1170 01 0C 3E 00 00 00 00 00 00 00 00 00 00 00 00 00 // EN? // A == 0x09 1180 01 1C 16 0D 03 0C 1A 01 0C 3E 00 00 00 00 00 00 // EMPFANGEN? 1190 00 00 00 00 // A == 0x0a 19 01 10 0A 06 01 19 05 03 0A 10 13 // BETRIEBSARTW 11a0 01 0E 14 05 01 12 00 00 // ECHSEL // A == 0x0b 19 12 18 0E 0F 06 01 0A // BLOCKIER 11b0 07 0C 1A 00 33 00 00 00 00 00 00 00 // UNG 2 // A == 0x0c 19 01 10 0A // BETR 11c0 06 01 19 05 03 0A 10 04 37 00 00 00 00 00 00 00 // IEBSART_1 // A == 0x0d 11d0 05 0E 14 12 07 01 05 05 01 12 0D 01 14 12 01 0A // SCHLUESSELFEHLER 11e0 00 00 00 00 // A == 0x0e 19 01 10 0A 06 01 19 05 03 0A 10 04 // BETRIEBSART_ 11f0 33 00 00 00 00 00 00 00 // 2 // A == 0x0f 0F 01 06 0C 00 10 01 1D // KEIN TEX 1200 10 00 00 00 00 00 00 00 00 00 00 00 // T // A == 0x10 13 06 01 09 // WIED 1210 01 0A 14 18 12 07 0C 1A 00 3E 00 00 00 00 00 00 // ERHOLUNG ?; ; Erscheint bei falscheingaben des GTX innerhalb der IV bzw. der CRC-16_true // A == 0x11 1220 10 01 1D 10 0D 01 14 12 01 0A 00 3E 00 00 00 00 // TEXTFEHLER ? 1230 00 00 00 00 // A == 0x12 1A 10 1D 04 01 0A 05 10 01 12 12 01 // GTX_ERSTELLE 1240 0C 00 00 00 00 00 00 00 // N // A == 0x13 03 0C 11 01 06 1A 01 04 // ANZEIGE_ 1250 1A 10 1D 00 00 00 00 00 00 00 00 00 // GTX // A == 0x14 05 01 12 19 // SELB 1260 05 10 10 01 05 10 00 00 00 00 00 00 00 00 00 00 // STTEST // A == 0x15 1270 1C 18 09 01 1C 04 09 01 0D 01 0F 10 00 00 00 00 // MODEM_DEFEKT 1280 00 00 00 00 // A == 0x16 19 06 10 10 01 04 04 10 03 05 10 01 // BITTE__TASTE 1290 04 05 01 00 00 00 00 00 // _SE // A == 0x17 , A == 0x18? 19 06 10 10 01 04 10 03 // BITTE_TA 12a0 05 10 01 04 0E 0A 04 25 04 1D 04 04 19 06 10 10 // STE_CR_/_F__BITT 12b0 01 04 10 03 05 10 01 04 10 01 00 00 00 00 00 00 // E_TASTE_TE // A == 0x19 12c0 16 03 05 05 13 18 0A 10 00 00 00 00 00 00 00 00 // PASSWORT 12d0 00 00 00 00 // A == 0x1a 05 0E 14 12 07 01 05 05 01 12 13 01 // SCHLUESSELWE 12e0 0E 14 05 01 12 00 00 00 // CHSEL // A == 0x1b 05 0E 14 12 07 01 05 05 // SCHLUESS 12f0 01 12 04 37 00 00 00 00 00 00 00 00 // EL_1 // A == 0x1c 05 0E 14 12 // SCHL 1300 07 01 05 05 01 12 04 33 00 00 00 00 00 00 00 00 // UESSEL_2 // A == 0x1d 1310 19 12 18 0E 0F 06 01 0A 07 0C 1A 00 21 00 00 00 // BLOCKIERUNG 3 1320 00 00 00 00 // A == 0x1e 19 12 18 0E 0F 06 01 0A 07 0C 1A 00 // BLOCKIERUNG 1330 2A 00 00 00 00 00 00 00 // 4 // A == 0x1f 19 12 18 0E 0F 06 01 0A // BLOCKIER 1340 07 0C 1A 00 30 00 00 00 00 00 00 00 // UNG 5 // A == 0x20 19 01 0A 01 // BERE 1350 06 10 00 00 00 00 00 00 00 00 00 00 00 00 00 // IT // A == 0x21 2B // * 1360 16 03 05 05 13 18 0A 10 0D 01 14 12 01 0A 04 3E // PASSWORTFEHLER_? 1370 00 00 00 00 // LCD Pixel 5*7 1374 00 00 00 00 00 00 00 // LEERZEICHEN 1F 01 01 0F 01 01 1F // E 1382 04 0E 15 04 04 04 04 // ^ (Pfeil) 0E 11 11 1F 11 11 11 // A 1390 00 00 00 00 00 00 00 // Leerzeichen 1397 0E 11 01 0E 10 11 0E // S 139e 0E 04 04 04 04 04 0E // I 13a5 11 11 11 11 11 11 0E // U 08 04 02 01 02 04 08 // < 0F 11 11 11 11 11 0F // D 0F 11 11 0F 05 09 11 // R 13c1 1F 10 10 10 10 11 0E // J 11 11 13 15 19 11 11 // N 1F 01 01 0F 01 01 01 // F 0E 11 01 01 01 11 0E // C 11 09 05 03 05 09 11 // K 13e5 1F 04 04 04 04 04 04 // T 1F 10 08 04 02 01 1F // Z 13f2 01 01 01 01 01 01 1F // L 11 11 11 15 15 1B 11 // W 1400 11 11 11 1F 11 11 11 // H 11 11 0A 04 04 04 04 // Y 140E 0F 11 11 0F 01 01 01 // P 1415 0E 11 11 11 15 19 0E // Q 0E 11 11 11 11 11 0E // U 1423 0F 11 11 0F 11 11 0F // B 0E 11 01 1D 11 11 0E // G 1431 00 0A 1F 0A 1F 0A 00 // # 11 1B 15 11 11 11 11 // M 11 11 0A 04 0A 11 11 // X 1446 11 11 11 11 11 0A 04 // V 04 1E 05 0F 14 0F 04 // $ 1454 04 04 02 00 00 00 00 // ' 0E 11 10 0E 10 11 0E // 3 1462 03 13 08 04 02 19 18 // % 00 00 00 1F 00 00 00 // - 1470 00 10 10 12 1F 02 00 // NL |-> 00 04 04 1F 04 04 00 // + 0E 11 11 0E 11 11 0E // 8 1F 10 08 04 04 04 04 // 7 02 04 08 10 08 04 02 // > 1492 00 00 1F 00 1F 00 00 // = 11 11 11 1F 10 10 10 // 4 14a1 00 11 0A 1F 0A 11 00 // * Akustikkoppler Symbol 00 00 00 00 04 04 02 // , 14af 00 10 08 04 02 01 00 // / 00 00 04 00 04 04 02 // ; 04 02 02 02 02 02 04 // ( 14c4 1F 01 01 0F 10 11 0E // 5 0A 0A 0A 00 00 00 00 // " 14d2 04 08 08 08 08 08 04 // ) 0E 11 10 0E 01 11 1F // 2 14e0 07 06 04 04 0E 11 0E // Schlüsselsymbol 0E 11 01 0F 11 11 0E // 6 0E 11 11 15 11 11 0E // 0 04 06 05 04 04 04 04 // 1 0E 11 11 1E 10 11 0E // 9 1503 06 09 08 04 04 00 04 // ? 00 00 04 00 04 00 00 // : 0E 02 02 02 02 02 0E // [ 00 00 00 00 00 06 06 // . 151f 0E 09 05 12 0D 09 16 // & 04 04 04 04 04 00 04 // ! 0E 08 08 08 08 08 0E // ] /********************/ /* TASTATURPROGRAMM */ /********************/ PARAMETER GL.ALIAT TASTATURDATEN GL.ZUALF BIT 0 NEUES ZEICHEN WAR 1 CTL '0' WAR 2 INS-MOD 3 ÜBERHOLSPERRUNG GL.ALMER NEUPUFFER GL.ALMEA ALTPUFFER GL.ALZAL ZÄHLER FÜR ZEILE GL.AMER ZEICHENZWISCHENSPEICHER GL.BMER DTO GL.CMER FÜR TRICK 17 GL.TAZAL ANZAHL TASTEN // INTERRUPTROUTINE Tastatur CTC-1 1534 F5 push af 1535 C5 push bc 1536 D5 push de 1537 E5 push hl 1538 DD E5 push ix // Register retten //ÜBERHOLSPERRUNG 153a 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 153d CB DE set 3, (hl) // bit "Überholsperre" 153f FB EI 1540 21 0C DC ld hl, 0xdc0c // TASTATUR WEITERSCHALTUNG,ALZAL:-Zähler für Zeile 1543 7E ld a, (hl) 1544 3C inc a 1545 E6 07 and 0x07 // Maximal 8 Zeilen 1547 77 ld (hl), a 1548 5F ld e, a 1549 16 00 ld d, 0x00 154b 21 04 DC ld hl, 0xdc04 // ALMER 8 byte, NeuPuffer 154e 19 add hl, de // Puffer HL + 0x0000 ... 0x0007 154f DB 01 in a, (0x01) // Lese PIO-0-B-D; Tastatur ME, ZG, OUTC 1551 E6 3F and 0x3f // Maske 0011 1111 1553 77 ld (hl), a // lege in HL+zeiger die Eingabe ab 1554 43 ld b, e 1555 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 1556 D3 00 out (0x00), a // PIO-0-AD-Tastatur 1558 3E CF ld a, 0xcf // Steuerwort 155a D3 02 out (0x02), a // Steuerwort, PIO-0-A 155c 3E 7F ld a, 0x7f <-\ // Schleife (0xdc0c) 155e 07 rlca | // rotieren A0 -> A7 -> A0; carry = A7 155f 10 FD djnz 0xfd >-/ // aktiviere Zeile 1 ... 1561 D3 02 out (0x02), a // Steuerwort, PIO-0-A 1563 2F cpl // WEGEN PULL-DOWN, Invertiert 1564 D3 00 out (0x00), a // PIO-0-AD-Tastatur 1566 3E 07 ld a, 0x07 1568 BB cp e // e == 7 1569 28 0F jrz 0x0f // 0x157a 156b F3 DI // Sperre Interrupt 156c 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 156f CB 9E res 3, (hl) // bit "Überholsperre" 1571 DD E1 pop ix 1573 E1 pop hl 1574 D1 pop de 1575 C1 pop bc 1576 F1 pop af // Register wiederherstellen 1577 FB EI // Interruptfreigabe 1578 ED 4D reti // weiter Tastaturabfrage 157a AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 157b 32 19 DC ld (0xdc19), a // TASTATUR AUSWERTEN TAZAL: Länge 1 157e 11 0C DC ld de, 0xdc0c // NEUPUFFER,ALZAL:-Zähler für Zeile 1581 21 15 DC ld hl, 0xdc15 // AMER: Länge 1 1584 DD 21 17 DC ld ix, 0xdc17 // CMER: Länge 1 1588 0E 08 ld c, 0x08 158a 06 06 ld b, 0x06 158c 2B dec hl // HL = 0xdc14; Endadresse ALEMA 158d 1B dec de // DE = 0xdc0b; Endadresse ALMER 158e EB ex de, hl // HL <> DE 158f 1A ld a, (de) // (0xdc14) 1590 AE xor (hl) // A xor M; A = ((0xdc14) XOR (0xdc0b) AND (0xdc14) 1591 A6 and (hl) // Maskiere A AND M 1592 EB ex de, hl // HL <> DE 1593 DD 77 00 ld (ix+00), a // 0xdc17 Rette A; CMER = A = ((0xdc14) XOR (0xdc0b) AND (0xdc14) 1596 1A ld a, (de) // A = (0xdc0b) // Schleife B = 6 runden 1597 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 1598 F5 push af // rette AF 1599 DD CB 00 0E rrc (ix+00) // rotieren (IX+0); (IX+0.0) -> (IX+0.7) -> (IX+0.0) carry = (IX+0.0) 159d F1 pop af // wiederherstellen AF, carry des RRCA 0x1597 wird ausgewertet! 159e 30 2B jrnc 0x2b // bein RRCA wurde das Carry verändert? 15a0 F5 push af // TASTE ERKANNT, rette AF 15a1 3A 19 DC ld a, (0xdc19) // TAZAL: Länge 1 15a4 3C inc a // Erhöhe TAZAL 15a5 32 19 DC ld (0xdc19), a // TAZAL: Länge 1 15a8 3A 15 DC ld a, (0xdc15) // AMER: Länge 1 15ab 32 16 DC ld (0xdc16), a // BMER: Länge 1; Rette (0xdc15) 15ae 78 ld a, b 15af 07 rlca // rotiere A, A7 <- A0 <- A7; carry = A7 15b0 07 rlca // rotiere A, A7 <- A0 <- A7; carry = A7 15b1 07 rlca // rotiere A, A7 <- A0 <- A7; carry = A7 15b2 0D dec c 15b3 B1 or c 15b4 0C inc c 15b5 32 15 DC ld (0xdc15), a // AMER: Länge 1; rette A 15b8 DD CB 00 06 rlc (ix + 0x00) // rotieren (IX+0); (IX+0.7) <- (IX+0.0) <- (IX+0.7) carry = (IX+0.7) 15bc DD CB 00 0E rrc (ix + 0x00) // rotieren (IX+0); (IX+0.0) -> (IX+0.7) -> (IX+0.0) carry = (IX+0.0) 15c0 30 08 jrnc 0x08 // Abfrage bit 7 (IX+0), (IX+0) unverändert! kein bit (IX+0) verwendet weil dieser das Z-Flag ändert. das wird aber für das djnz verwendet! 15c2 3A 15 DC ld a, (0xdc15) // AMER: Länge 1; hole A zurück 15c5 CB FF set 7, a // setze Bit 7 15c7 32 15 DC ld (0xdc15), a // AMER: Länge 1; rette A // Einsprung (IX+0) bit 7 = 1 15ca F1 pop af // wiederherstellen AF 15cb 10 CA djnz 0xca // 0x1597; Schleife B, 6 Runden 15cd 0D dec c 15de 20 BA jrnz 0xba 15d0 01 08 00 ld bc, 0x0008 // Länge 15d3 EB ex de, hl 15d4 ED B0 ldir // Kopiere HL > DE, Länge bc = 8 bytes 15d6 3A 19 DC ld a, (0xdc19) // TAZAL: Länge 1 15d9 FE 02 cp 0x02 15db CA 64 16 jpz 0x1664 // 2 TASTEN 15de FE 01 cp 0x01 // a == 1 15e0 28 0B jrz 0x0b 15e2 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 15e3 20 86 jrnz 0x86 // If a <> 0 15e5 3E 01 ld a, 0x01 // then a = 0x01 else 0x156b 15e7 32 18 DC ld (0xdc18), a // DMER:-Zähler für Durchläufe 15ea C3 6B 15 jp 0x156b // Einsprung 15ed 3A 15 DC ld a, (0xdc15) // 1 TASTE; AMER: Länge 1 15f0 CB 7F bit 7, a 15f2 CA DA 16 jpz 0x16da // Sprung beit bit 7 = 0 15f5 21 18 DC ld hl, 0xdc18 // DMER:-Zähler für Durchläufe 15f8 36 0A ld (hl), 0x0a // ERKENNEN FÜR DAUER <1SEC 15fa CB BF res 7, a // EINE NEUE TASTE 15fc FE 31 cp 0x31 15fe 20 37 jrnz 0x37 // NICHTS INS 1600 3A 01 DC ld a, (0xdc01) // Betriebsartenregister 1603 FE 01 cp 0x01 // Schlüsselwechsel 1605 CA 6B 15 jpz 0x156b 1608 3A 26 DC ld a, (0xdc26) // ZUAN2:-Merkerstelle für Bedienermeldungen 160b A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 160c C2 6B 15 jpnz 0x156b 160f 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 1612 7E ld a, (hl) 1613 EE 04 xor 0x04 // bit 2 = INSERT Mode, 1615 77 ld (hl), a // lösche Bit 2 // UMSCHALTUNG CURSOR FÜR INS-ANZEIGE 1616 21 27 DC ld hl, 0xdc27 // ZUAN3:-Einfügemode 1619 36 00 ld (hl), 0x00 161b CB 57 bit 2, a // bit 2 == true 161d 28 02 jrz 0x02 161f 36 01 ld (hl), 0x01 1621 CD C1 0D call 0x0dc1 // ANZEIGESTEUERPROGRAMM 0 KT-Ausgabe, 1 Bedienerführung, 2 MIRA 1624 C3 6B 15 jp 0x156b // Einsprung 0x166e ff 1627 CB 7E bit 5, (hl) 1629 CA ED 16 jpz 0x16ed 162c E5 push hl // rette HL 16dd 21 18 DC ld hl, 0xdc18 // DMER:-Zähler für Durchläufe 1630 36 01 ld (hl), 0x01 1632 E1 pop hl // wiederherstellen HL 1633 CB BE set 1, (hl) 1635 57 ld d, a 1636 7E ld a, (hl) 1637 21 42 17 ld hl, 0x1742 // Tastencode CITT-2 163a 01 21 00 ld bc, 0x0021 163d ED B1 cpir // BC == 0? oder a == (HL) 163f C2 6B 15 jpnz 0x156b 1642 21 63 17 ld hl, 0x1763 // TU-1, Tastencode Großbuchstaben 1645 09 add hl, bc 1646 7A ld a, d 1647 FE 09 cp 0x09 // a == 9, CTRL 1649 7E ld a, (hl) 164a 28 6A jrz 0x6a 164c FE 98 cp 0x98 // a == 0x98, CRTL+'0' 164e 28 09 jrz 0x09 1650 FE B2 cp 0xb2 // a == 0xb2 1652 28 05 jrz 0x05 1654 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 1657 CB 8E res 1, (hl) // Lösche CRTL-Tastendruck 1659 32 02 DC ld (0xdc02), a // ALDAT:-Datenübergaberegister Tastatur 165c 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 165f CB C6 set 0, (hl) // setze Neues Zeichen 1661 C3 6B 15 jp 0x156b // Einsprung 2 Tasten, 0x15db 1664 3A 15 DC ld a, (0xdc15) // AMER: Länge 1 1667 21 16 DC ld hl, 0xdc16 // BMER: Länge 1 166a CB BF res 7, a // Lösche Bit 7 166c FE 09 cp 0x09 // a == 9 166e 28 B7 jrz 0xb7 // 0x1627 1670 FE 37 cp 0x37 // a == 0x37 1672 28 1D jrz 0x1d // 0x1692 1674 FE 1F cp 0x1f // a == 0x1f 1676 CA 0B 17 jpz 0x170b // 3.ZEICHENSATZ 1679 3A 16 DC ld a, (0xdc16) // BMER: Länge 1 167c 21 15 DC ld hl, 0xdc15 // AMER: Länge 1 167f CB BF res 7, a // lösche Bit 7 1681 FE 09 cp 0x09 // a == 9 1683 28 A2 jrz 0xa2 // 0x1627 1685 FE 37 cp 0x37 // a == 0x37; TE 1687 28 08 jrz 0x08 // 0x1691 1689 FE 1F cp 0x1f // a == 0x1f 168b CA 0B 17 jpz 0x170b 168e C3 03 17 jp 0x1703 // Einsprung Taste TE, 0x1687 1691 CB 7E bit 7, (hl) // bit 7 == true 1693 CA ED 16 jpz 0x16ed 1696 E5 push hl // rette HL 1697 21 18 DC ld hl, 0xdc18 // DMER:-Zähler für Durchläufe 169a 36 0A ld (hl), 0x0a 169c E1 pop hl // wiederherstellen HL 169d CB BE res 7, (hl) 169f 57 ld d, a 16a0 7E ld a, (hl) 16a1 21 48 17 ld hl, 0x1748 16a4 01 1B 00 ld bc, 0x001b 15a7 ED B1 cpir // BC == 0? oder a == (HL) 15a9 C2 6B 15 jpnz 0x156b 15ac 21 84 17 ld hl, 0x1784 // TU-2 Tastencode ASCII Sonderzeichen 15af 09 add hl, bc 16b0 7A ld a, d 16b1 FE 09 cp 0x09 // CRTL 16b3 20 12 jrnz 0x12 16b5 7E ld a, (hl) 16b6 FE 18 cp 0x18 // a <> 0x18, 'O' 16b8 20 10 jrnz 0x10 16ba 3A 03 DC ld a, (0xdc03) // ZUALF:-Zustand Alpha-Tastendruck 16bd CB CF set 1, a // Setze neues Zeichen 16bf 32 03 DC ld (0xdc03), a // ZUALF:-Zustand Alpha-Tastendruck 16c2 7E ld a, (hl) 16c3 CB FF set 7, a // Bit 7 des ASCII Zeichen setzen 16c5 18 85 jr 0x85 16c7 7E ld a, (hl) 16c8 18 82 jr 0x82 16ca FE 16 cp 0x16 // a <> 0x16, 'P' 16cc 20 F4 jrnz 0xf4 16ce 3A 03 DC ld a, (0xdc03) // ZUALF:-Zustand Alpha-Tastendruck 16d1 CB 4F bit 1, a // bit 1 == 0, CTRL gedrückt? 16d3 C2 35 02 jpnz 0x0235 // Schlüsselspeicher löschen, Bereich 0x8380 - 0x97ff -> Blockierung 5 16d6 7E ld a, (hl) 16d7 C3 4C 16 jp 0x164c // Einsprung 16da F5 push af // KEINE EINE NEUE TASTE; rette AF 16db 21 18 DC ld hl, 0xdc18 // DMER:-Zähler für Durchläufe 16de AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 16df B6 or (hl) 16e0 20 06 jrnz 0x06 16e2 36 03 ld (hl), 0x03 16e4 F1 pop af // wiederherstellen AF 16e5 C3 FA 15 jp 0x15fa 16e8 35 dec (hl) 16e9 F1 pop af // wiederstellen AF 16ea C3 6B 15 jp 0x156b 16ed F5 push af // KEINE ZWEI NEUE TASTE 16ee E5 push hl // rette Register 16ef 21 18 DC ld hl, 0xdc18 // DMER:-Zähler für Durchläufe 16f2 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 16f3 B6 or (hl) 16f4 20 07 jrnz 0x07 16f6 36 04 ld (hl), 0x04 // FÜR 5 Hz 16f8 E1 pop hl 16f9 F1 pop af // Register wiederherstellen 16fa C3 9F 16 jp 0x169f // TA GÜLTIG 16fd 35 dec (hl) 16fe E1 pop hl 16ff F1 pop af // Register wiederherstellen 1700 C3 6B 15 jp 0x156b 1703 3E 02 ld a, 0x02 1705 32 18 DC ld (0xdc18), a // DMER:-Zähler für Durchläufe 1708 C3 6B 15 jp 0x156b // 3. ZEICHENSATZ 170b CB 7E bit 7, (hl) // bit 7 == true 170d 28 24 jrz 0x24 170f E5 push hl // retten HL, 2 1710 21 18 DC ld hl, 0xdc18 // DMER:-Zähler für Durchläufe 1713 36 0A ld (hl), a 1715 E1 pop hl // wiederherstellung HL 1716 CB BE res 7, (hl) 1718 57 ld d, a 1719 7E ld a, (hl) 171a 21 59 17 ld hl, 0x1759 171d 01 0A 00 ld bc, 0x000a 1720 ED B1 cpir // BC == 0? oder a == (HL) 1722 C2 6B 15 jpnz 0x156b 1725 21 9F 17 ld hl, 0x179f // TU-3 Tastencode Zahlen 1728 09 add hl, bc 1729 7A ld a, d 172a FE 09 cp 0x09 // a <> 9 172c C2 C7 16 jpnz 0x16c7 172f 7E ld a, (hl) 1730 C3 B6 16 jp 0x16b6 1733 F5 push af // KEINE ZWEI NEUE TASTE 1734 E5 push hl // rette Register 1735 21 18 DC ld hl, 0xdc18 // DMER:-Zähler für Durchläufe 1738 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 1739 B6 or (hl) 173a 20 C1 jrnz 0xc1 // (hl) <> 0 173c 36 04 ld (hl), 0x04 // FÜR 5 Hz 173e E1 pop hl 173f F1 pop af // wiederherstellung Register 1740 18 D6 jr 0xd6 // TA GÜLTIG // Tabelle Tastencode CCITT-2 Sonderzeichen 1742 0A // Enter 0C // Rechts 0F // SE 1C // Links 34 // TE 08 // DEL 2F // Space 19 // . (M) 29 // , (N) 21 // ? (B) 22 // ; (V) 2A // : (C) 1A // / (X) 32 // * (Z) 1750 30 // [ (L) 18 // ( (K) 28 // > (J) 20 // < (H) 23 // _ (G) 2B // -> (F) 1B // = (D) 33 // + (S) 0B // - (A) 0E // @ 0 (P) // @ wird nicht auf dem Display angezeigt sondern als Leerzeichen 36 // ) 9 (O) 1E // ( 8 (I) 2E // ' 7 (U) 26 // & 6 (Y-) 25 // % 5 (T) 2D // $ 4 (R) 1760 1D // # 3 (E) 35 // " 2 (W) 0D // ! 1 (Y-) TCode: // in CCITT ITA-2 1763 17 13 01 0A 10 15 07 06 18 16 03 05 09 // QWERTYUIOPAS 1770 0D 1A 14 0B 0F 12 11 1D 0E 1E 19 0C 1C 04 45 44 // DFGHJKLZXCV 1780 42 41 40 43 // BNM_ //TU2 1784 3E 31 1B 1F 22 3D 20 2F 32 04 23 25 // !"#$%&'()@-+ // @ == 0x04 --> @ wird nicht auf dem Display angezeigt sondern als Leerzeichen 1790 29 02 23 08 28 3B 3F 2B 2D 3A 2E 39 2C 3C 24 // =>_<>[]*/:;?,. // TU3 179F 37 // 1 17a0 33 21 2A 30 35 27 26 38 36 // 234567890 // INS = 0x31; CTL = 0x09; ZS2 = 0x37; ZS3 = 0x1F /***********************************************************/ /* DRUCKERPROGRAMM /* ZDR3 BIT 0 = 1 AUSGABE KT VOR Chiffrieren 1 = 1 AUSGABE KT NACH Dechiffrieren 2 = 1 AUSGABE GT ZUM SENDEN 3 = 1 AUSGABE GT VOR Dechiffrieren */ // Druckerprogramm 17a9 3E 21 ld a, 0x21 // DI, Zeitgeber, Vorteiler 256, neg. Flanke 17aa D3 0B out (0x0b), a // CTC Kanal 3 Zeitgeber TA AUS 17ac DB 05 in a, (0x05) // Lese PIO-1-B-D; Sonderschnittstelle 17af CB FF set 7, a // bit 7 = 1; SPANNUNG EIN 17b1 D3 05 out (0x05), a // PIO-1-B-D; Sonderschnittstelle 17b3 CD 21 02 call 0x0221 // Zeitschleife 70ms 17b6 21 00 00 ld hl, 0x0000 17b9 22 BB DC ld (0xdcbb), hl // ZFZ:-Zeiger ZF-folge 17bc 22 AE DC ld (0xdcae), hl // lösche Zeiger/Adresse 17bf 21 B8 DC ld hl, (0xdcb8) 17c2 36 00 ld (hl), 0x00 17c4 3A AB DC ld a, (0xdcab) // Zustandszeiger MIRA/GO 17c7 E6 03 and 0x03 17c9 CA 18 18 jpz 0x1818 // VERFAHREN MIRA 17cc CB 4F bit 1, a // bit 1 == true 17c3 3E 01 ld a, 0x01 // Sonderdruck NR. 1 17d0 20 02 jrnz 0x02 // 0x17d4; Sonderdruck; nach DECHIFFRIEREN // übergabe A für Sonderdruck = 1 oder 2 17d2 3E 02 ld a, 0x02 // Sonderdruck NR. 2 // Einsprung Sonderdruck-1 17d4 CD 21 1A call 0x1a21 // Sonderdruck Nr. 1, 2, 3 - Abspann 17d7 ED 5B 1F DC ld de, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 17db ED 53 AC DC ld (0xdcac), de 17df 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 17e2 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 17e3 ED 52 sbc hl, de // Länge == 0 17e5 22 AE DC ld (0xdcae), hl // Lege Länge ab 17e8 28 0B jrz 0x0b // 0x17f5; KEIN TEXT // Einsprung aus Druckerroutine 0x188f 17ea 3E 31 ld a, 0x31 17ec 32 A9 DC ld(0xdca9), a // Arbeitsart Drucker = 0x31 17ef CD 92 18 call 0x1892 // Druckersteuerroutine; CALL DRUCK 17f2 CD 04 18 call 0x0418 // DruckOn; CALL DRCON // ABSPANN 17f5 3E 03 ld a, 0x03 // Sonderdruck NR. 3 17f7 CD 21 1A call 0x1a21 // Sonderdruck Nr. 1, 2, 3 - Abspann //DRUCKEN BEENDET 17fa DB 05 in a, (0x05) // PIO-1-B-D; Sonderschnittstelle 17fc CB BF res 7, a 17fe D3 05 out (0x05), a // PIO-1-B-D; Sonderschnittstelle 1800 CD 4A 02 call 0x024a // CTC Kanal 3 Einschalten Tastatur; TA EINSCHALTEN 1803 C9 ret // DRCON 1804 3A A9 DC ld a, (0xdca9) // (0xdca9) von Int-Routine verändert? 1807 E6 03 and 0x03 // fertig? 1809 20 F9 jrnz 0xf9 // 0x1804 180b C9 ret // Drucker Interruptroutine 180c F5 push af 180d C5 push bc 180e D5 push de 180f E5 push hl // Register retten 1810 CD 92 18 call 0x1892 // Druckersteuerroutine 1812 E1 pop hl 1814 D1 pop de 1815 C1 pop bc 1816 F1 pop af // Wiederherstellen Register 1817 C9 ret // Geheimtextausgabe, Verfahren MIRA T-315 1818 3A AB DC ld a, (0xdcab) // Zustandszeiger MIRA/GO 181b CB 5F bit 3, a // bit 3 == false 181d 20 59 jrnz 0x059 // 0x1878 Dechiffrieren 181f 3E 04 ld a, 0x04 // Sonderdruck NR. 4 1821 CD 21 1A call 0x1a21 // Sonderdruck Nr. 4 - GTX MIRA 1824 06 00 ld b, 0x00 1826 3E 01 ld a, 0x01 1828 ED 5B 1F DC ld de, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 182c 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 182f 2B dec hl 1830 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 1831 ED 52 sbc hl, de // Länge 1833 11 05 00 ld de, 0x0005 1836 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 1837 ED 52 sbc hl, de // Länge 1839 38 08 jrc 0x08 // 0x1843, Abbruch bei Länge = -1 183b C6 01 add a, 0x01 183d 27 daa // BCD korrektur 183e 20 F6 jrnz 0xf6 // 0x1836, Schleife 1840 04 inc b 1841 18 F3 jr 0xf3 // 0x1836, Schleife // Gruppenanzahl BCD in B, A 1843 21 B1 DC ld hl, 0xdcb1 // Ablageort für B = B OR 0x30 1846 CB E0 set 4, b 1848 CB E8 set 5, b // b = b OR 0011 0000 184a 70 ld (hl), b 184b 23 inc hl // 0xdcb2 184c 4F ld c, a 184d 06 04 ld b, 0x04 184f CB 3F srl a <-\ // Schleife, 4 Runden, schiebe A, 0 -> A7 -> A0 -> carry, carry = A bit 3 1851 10 FC djnz 0xfc >-/ // 0x184f 1853 F6 30 or 0x30 // setze bits 4, 5 = 1; 0011_A.high; 1855 77 ld (hl), a // (0xdcb2) = 0x30 || ( a >> 4 ) 1856 23 inc hl // 0xdcb3 1857 79 ld a, c // Übergabe aus Reg. A 1858 E6 0F and 0x0f // A = (A & 0x0f) || 0x30 185a F6 30 or 0x30 // Carry = 0; Z = 0 185c 77 ld (hl), a // (0xdcb3) = 0x30 || (A && 0x0f); 0x30 ... 0x3f 185d 3E 03 ld a, 0x03 185f 32 BB DC ld (0xdcbb), a // Länge Drucken 1862 21 B1 DC ld hl, 0xdcb1 1865 22 B9 DC ld (0xdcb9), hl // Zeiger; 5Gruppen Status 1868 3E 35 ld a, 0x35 186a 32 A9 DC ld (0xdca9), a // Arbeitsart Drucker = 0x35 186d CD 92 18 call 0x1892 // Druckersteuerroutine 1870 CD 04 18 call 0x1804 // DRCON 1873 3E 05 ld a, 0x05 // Sonderdruck NR. 5 1875 CD 21 1A call 0x1a21 // Sonderdruck Nr. 5 - GTX in 5er Gruppen //Ausgabe des GT in 5er Gruppen 1878 2A 1F DC ld hl, (0xdc1f) // AADRT:-Anfangsadresse Textspeicher 187b 22 AC DC ld (0xdcac), hl 187e EB ex de, hl 187f 2A 1D DC ld hl, (0xdc1c) 1882 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 1883 ED 52 sbc hl, de // Länge == 0 1885 CA F5 17 jpz 0x17f5 // KEIN TEXT 1888 22 AE DC ld (0xdcae), hl // Länge 188b AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 188c 32 B0 DC ld (0xdcb9), a 188f C3 EA 17 jp 0x17ea //Druckersteuerroutine; Übergabe 0xdca9 Arbeitsart Drucker 0x31 0der 0x35) 1892 21 A9 DC ld hl, 0xdca9 // Arbeitsart Drucker 0x31 oder 0x35 1895 CB 46 bit 0, (hl) // bit 0 == false, soll drucker arbeiten 1897 20 12 jrnz 0x12 // 0x18ab; springe bei bit 0 == 0 1899 CB 66 bit 4, (hl) // bit 4 189b 28 0E jrz 0x0e // 0x18ab; springe bie bit 4 == 1 189d CB 6E bit 5, (hl) // bit 5 189f 28 0A jrz 0x0a // 0x18ab 18a1 CB 8E res 1, (hl) // drucker arbeitet nicht 18a3 3E 21 ld a, 0x21 // DI, Zeitgeber, Vorteiler 256, neg. Flanke 18a5 D3 0A out (0x0a), a // CTC Kanal 2 Zeitgeber 18a7 CD 30 1A call 0x1a30 // RETI 18aa C9 ret // bit 0 == false, 4 oder 5 == true; weiter 18ab CB 4E bit 1, (hl) // bit 1 == false 18ad 20 08 jrnz 0x08 // 0x18b7 // Einschalten Drucker CTC 18af 3E 87 ld a, 0x87 // EI, Zeitgeber, Vorteiler 16, neg. Flanke, Zeitkonstantenstart, Zeitkonstante folgt, RESET 18b1 D3 0A out (0x0a), a // CTC Kanal 2 Zeitgeber 18b3 3E 68 ld a, 0x68 // Zeitkonstante = 104 * 256 / 1340 kHz = 20 ms 18b5 D3 0A out (0x0a), a // CTC Kanal 2 Takt 18b7 CB 66 bit 4, (hl) // bit 4 == false 18b9 20 2A jrnz 0x2a // 0x18e5 Schieberegister ist leer // Ausgabe der Daten aus den Sendeschieberregister 18bb 3A B7 DC ld a, (0xdcb7) 18be 3D dec a 18bf 32 B7 DC ld (0xdcb7), a // nächstes Zeichen 18c2 28 1B jrz 0x1b // a == 0, 0x18df 1. Stoppbit 18c4 FE 09 cp 0x09 // a == 9 18c6 28 3E jrz 0x3e // 0x1906 Startbit // Ausroutieren des Sendebits 18c8 21 B5 DC ld hl, 0xdcb5 18cb CB 3E srl (hl) // schiebe (HL), 0 -> (HL.7) -> (HL.0) -> carry 18cd 06 02 ld b, 0x02 18cf 38 02 jrc 0x02 // 0x18d3; bit (HL.0) war == 1 dann springe 18d1 06 00 ld b, 0x00 18d3 CD 33 1A call 0x1a33 // DRUCKPROGRAMM; INPUTS B = 0x00 AUSGABE L-BIT; B = 0x02 AUSGABE H-BIT 18d6 CD 30 1A call 0x1a30 // RETI 18d9 21 A9 DC ld hl, 0xdca9 // Arbeitsart Drucker 0x31 oder 0x35 18dc CB CE set 1, (hl) // DRUCKER ARBEITET; 0x33 oder 0x37 18de C9 ret //AUSGABE 1. STOPPBIT 18df CB E6 set 4, (hl) // SR IST LEER 18e1 06 02 ld b, 0x02 18e3 18 EE jr 0xee // 0x18d3 //BEARBEITUNG SR IST LEER 18e5 06 02 ld b, 0x02 // 2. STOPPBIT 18e7 CD 33 1A call 0x1a33 // DRUCKPROGRAMM; INPUTS B = 0x00 AUSGABE L-BIT; B = 0x02 AUSGABE H-BIT 18ea CD 30 1A call 0x1a30 // RETI 183d 21 A9 DC ld hl, 0xdca9 // Arbeitsart Drucker 0x31 oder 0x35 18f0 CB CE set 1, (hl) // 0x33 oder 0x37 18f2 CB 6E bit 5, (hl) // bit 5 == false 18f4 20 18 jrnz 0x18 // 0x190e; SENDPUFFER AUCH LEER 18f6 3A B6 DC ld a, (0xdcb6) // Speicher konvertierter Text 18f9 32 B5 DC ld (0xdcb5), a 18fc 3E 0A ld a, 0x0a 18fe 32 B7 DC ld (0xdcb7), a 1901 CB EE set 5, (hl) // SENDEPUFFER LEER 1903 CB A6 res 4, (hl) // SR VOLL 1905 C9 ret // SENDEN EINES STARTBITS 1906 06 00 ld b, 0x00 1908 CD 33 1A call 0x1a33 // DRUCKPROGRAMM; INPUTS B = 0x00 AUSGABE L-BIT; B = 0x02 AUSGABE H-BIT 190b CD 30 1A call 0x1a30 // RETI // FÜLLEN des SENDEPUFFERS 190e 21 A9 DC ld hl, 0xdca9 // Arbeitsart Drucker 0x31 oder 0x35 1911 CB CE set 1, (hl) // 0x33 oder 0x37 1913 CB 6E bit 5, (hl) // bit 5 == true 1915 C8 ret z // Sendepuffer Voll leer? 1916 CB 76 bit 6, (hl) // bit 6 == false, ÜBERHOLSPERRE BYTEBEREIT 1918 C0 ret nz 1919 DB 04 in a, (0x04) // Lese PIO-1-A-D; DÜRFEN DATENAUSGEBEN 191b CB 57 bit 2, a // bit 2 == false 191d C0 ret nz // DRUCKER NICHT BEREIT 191e CB F6 set 6, (hl) // ÜBERHOLSPERRE 1920 CB 56 bit 2, (hl) // bit 2 == true 1922 CA 88 19 jpz 0x1988 // NORMALDRUCK // BEARBEITUNG SONDERDRUCK 1925 2A BB DC ld hl, (0xdcbb) // Länge Text 1928 7C ld a, h 1929 B5 or l 192a 20 21 jrnz 0x21 // 0x194d // BEGINN SONDERDRUCK 192c 3A AA DC ld a, (0xdcaa) // Sonderdruck Nr. 0, 1, 2, 3 - Abspann, 4 - GTX MIRA, 5 - GTX in 5er Gruppen 192f 87 add a // a *= 2 1930 4F ld c, a // 0x00, 0x02, 0x04 ... 1931 06 00 ld b, 0x00 1933 21 49 1A ld hl, 0x1a49 // SONDERDRUCKLISTE 1936 09 add hl, bc // Zeiger auf entsprechenden Text 1937 5E ld e, (hl) // Adresse 0x1a49 + (a*2) 1938 23 inc hl 1939 56 ld d, (hl) // DE = 0x1a5b, 5c, 6b, ... 193a 01 01 00 ld bc, 0x0001 // zeiger auf nächsten Text, für Längenberechnung 193d 09 add hl, bc // nächste Adresse 0x1a49 + (a*2) + 1 193e 4E ld c, (hl) // Adresse 193f 23 inc hl 1940 46 ld b, (hl) // BC = 0x1a5c, 6b, 7a, ... 1941 C5 push bc // Registertausch 1942 E1 pop hl // HL = BC 1943 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 1944 ED 52 sbc hl, de // Länge des Textes 1946 22 BB DC ld (0xdcbb), hl // Länge zwischengespeichert 1949 EB ex de, hl 194a 22 B9 DC ld (0xdcb9), hl // Zeige auf berechnete Adresse des Textes // AUSGABE des SONDERZEICHENS 194d 2A B9 DC ld hl, (0xdcb9) // Adresse des Textes 0x1a5b, ... 1950 7E ld a, (hl) 1951 32 B6 DC ld (0xdcb6), a // ein Zeichen abgelegt 1954 23 inc hl // nächste Adresse 1955 22 B9 DC ld (0xdcb9), hl // Adresse sichern 1958 21 A9 DC ld hl, 0xdca9 // Arbeitsart Drucker 0x31 oder 0x35 195b CB AE res 5, (hl) // SENDEPUFFER VOLL 195d 2A BB DC ld hl, (0xdcbb) // Länge des Textes 1960 2B dec hl // -1 1961 22 BB DC ld (0xdcbb), hl // Länge - 1 1964 7C ld a, h 1965 B5 or l 1966 20 18 jrnz 0x18 // 0x1980; Länge != 0 // ABSCHLUSS SONDERDRUCK 1968 21 A9 DC ld hl, 0xdca9 // Arbeitsart Drucker 0x31 oder 0x35 196b CB 5E bit 3, (hl) // Sonderdruck im Sonderdruck 196d CB 9E res 3, (hl) 196f CB 96 res 2, (hl) // SD AUS 1971 28 0D jrz 0x0d // 0x1980 // ABSCHLUSS SD IM SD 1973 CB D6 set 2, (hl) 1975 21 BD DC ld hl, 0xdcbd // ZFL:-Blocklänge-Zeitschlüssel 1978 11 B9 DC ld de, 0xdcb9 019b 01 04 00 ld bc, 0x0040 // Länge 19be ED B0 ldir // kopiere (0xdcbd) > (0xdcb9) 0x40 bytes // AUSLÖSUNG SD IM SD; BEDINGUNGEN FÜR SD IM SD KEINE 1980 21 A9 DC ld hl, 0xdca9 // KEINE 3-MALIGE SCHACHTELUNG 1983 F3 DI 1984 CB B6 res 6, (hl) // ÜBERHOLSPERRE WEG 1986 FB EI 1987 C9 ret // NORMALDRUCK 1988 2A AE DC ld hl, (0xdcae) // Länge 198b 7C ld a, h 198c B5 or l // Prüfe auf Länge =! 0x00 198d 20 07 jrnz 0x07 // 0x1996 // AUSGABE BEENDET 198f 21 A9 DC ld hl, 0xdca9 // Arbeitsart Drucker 0x31 oder 0x35 1992 CB 86 res 0, (hl) 1994 18 EA jr 0xea // 0x1980 // KONTROLLE OB SONDERDRUCK IM NORMLDRUCK NÖTIG // HIER NUR FÜR TEXTDRUCK ENTHALTEN SONST BEDINGUNGEN 1996 3A AB DC ld a, (0xdcab) // Zustandszeiger MIRA/GO 1999 E6 0C and 0x0c 199b 20 4C jrnz 0x4c // 0x19e9 199d 3A B8 DC ld a, (0xdcb8) 19a0 FE 45 cp 0x45 // ZEILENLÄNGE 19a2 28 0B jrz 0x0b // 0x19af 19a4 FE 3B cp 0x3b 19a6 38 16 jrc 0x16 // 0x19be KEIN SONDERDRUCK 19a8 3A B5 DC ld a, (0xdcb5) 19ab FE 20 cp 0x20 // a <> 0x20, ZWR 19ad 20 0F jrnz 0x0f // 0x19be // AUSGABE WR/ZL 19af AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 19b0 32 B8 DC ld (0xdcb8), a 19b3 32 AA DC ld (0xdcaa), a // Sonderdruck Nr. 0 19b6 21 A9 DC ld hl, 0xdca9 // Arbeitsart Drucker 19b9 CB D6 set 0, (hl) // Druck bereit 19bb C3 80 19 jp 0x1980 // zur Ausgabe SD // DATENAUSGABE 19be 2A AE DC ld hl, (0xdcae) // Länge 19c1 2B dec hl 19c2 22 AE DC ld (0xdcae), hl // nächstes Zeichen, Länge-- 19c5 2A AC DC ld hl, (0xdcac) 19c8 7E ld a, (hl) 19c9 FE 24 cp 0x24 // a <> 0x24, NL 19cb 20 06 jrnz 0x06 // 0x19d3 19cd AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 19ce 32 B8 DC ld (0xdcb8), a 19d1 3E 24 ld a, 0x24 // Einsprung, Übergabe A; T-316 Zeichen; aus 0x19cb 19d3 23 inc hl 19d4 22 AC DC ld (0xdcac), hl 19d7 CD 3B 1A call 0x1a3b // Konverter T-316 - ASCII; Übergabe A = T316 Zeichen, Rückgabe A = ASCII Zeichen 19da 32 B6 DC ld (0xdcb6), a // Speicher ASCII 19dd 21 B8 DC ld hl, 0xdcb8 19e0 34 inc (hl) 19e1 21 A9 DC ld hl, 0xdca9 // Arbeitsart Drucker 19e4 CB AE res 5, (hl) // Beende Sonderdruck 19e6 C3 80 19 jp 0x1980 // Sprung nach AUSLÖSUNG SD IM SD; BEDINGUNGEN FÜR SD IM SD KEINE // AUSGABE GEHEIMTEXT 19e9 3A B0 DC ld a, (0xdcb0) 19ec A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 19ed 28 17 jrz 0x17 // 0x1a06; (0xdcb0) == 0 springe 19ef FE 01 cp 0x01 // a <> 1 19f1 20 03 jrnz 0x03 // 0x19f6 (0xdcb0) > 1 springe 19f3 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 19f4 18 08 jr 0x09 // 0x19fe (0xdcb0) == 1 springe // Einsprung (0xdcb0) > 1 19f6 47 ld b, a // rette A 19f7 E6 0F and 0x0f // Maske 0000 1111 19f9 28 1D jrz 0x1d // 0x1a18; ZWR 19fb 78 ld a, b // lade A zurück 19fc CB 87 res 0, a // bit 0 von A = 0 // Einsprung (0xdcb0) == 1 19fe C6 02 add a, 0x02 // A + 2 1a00 27 daa // BCD korrektur 1a01 32 B0 DC ld (0xdcb0), a 1a04 18 B8 jr 0x18 // 0x19be; Springe zu -Datenausgabe- // Einsprung (0xdcb0) == 0 1a06 3E 07 ld a, 0x07 // 2 * NL 1a08 21 B0 DC ld hl, 0xdcb0 1a0b 36 01 ld (hl), 0x01 1a0d 32 AA DC ld (0xdcaa), a // Sonderdruck Nr. 7 1a10 21 A9 DC ld hl, 0xdca9 // Arbeitsart Drucker 1a13 CB D6 set 2, (hl) // Sonderdruck Ein 1a15 C3 80 19 jp 0x1980 // Schleife 1a18 3E 06 ld a, 0x06 // ZWR 1a1a 21 B0 DC ld hl, 0xdcb0 1a1d CB C6 set 0, (hl) 1a1f 18 EC jr 0xec // 0x1a0d // UP ZUM DRUCKER // BILDDRUCK; INPUTS BILDDRUCK-NR. in A 1... 5 1a21 32 AA DC ld (0xdcaa), a // Sonderdruck Nr. 0, 1, 2, 3 - Abspann, 4 - GTX MIRA, 5 - GTX in 5er Gruppen 1a24 3E 35 ld a, 0x35 1a26 32 A9 DC ld (0xdca9), a // Arbeitsart Drucker = 0x35 1a29 CD 92 18 call 0x1892 // Druckersteuerroutine 1a2c CD 04 18 call 0x1804 // DRCON 1a2f C9 ret // RETI-TRICK 1a30 FB EI 1a31 ED 4D reti // DRUCKPROGRAMM; INPUTS B = 0x00 AUSGABE L-BIT; B = 0x02 AUSGABE H-BIT 1a33 DB 04 in a, (0x04) // Lese PIO-1-A-D 1a35 CB 8F res 1, a // Lösche bit 1 1a37 B0 or b // je nach B bit 0 oder 2 = 1 UND bit 1 = 0 1a38 D3 04 out (0x04), a // PIO-1-A-D 1a3a C9 ret // Konverter T-316 - ASCII; Übergabe a = T-316 Zeichen; Rückgabe a = ASCII Zeichen 1a3b 21 9F 1A ld hl, 0x1a9f // CITT-2 Tabelle 1a3e 01 40 00 ld bc, 0x0040 // Durchsuche 64 Zeichen 1a41 ED B1 cpir // BC == 0? oder a == (HL) 1a43 21 DF 1A ld hl, 0x1adf // ASCI Tabelle - Tastatur rückwärts 1a46 09 add hl, bc // 0x1adf + 0x00 ... 0x40 1a47 7E ld a ,(hl) // Rückgabe ASCII Zeichen 1a48 C9 ret //Druckerformatierung mit Klartext 1a49 5B 1A // Zeiger 0 = cr 1a4b 5C 1A // Zeiger 1 = EINGANG: cr cr cr cr 1a4d 6B 1A // Zeiger 2 = AUSGANG: cr cr cr cr 1a4f 7A 1A // Zeiger 3 = cr cr cr cr 1a51 7F 1A // Zeiger 4 = cr cr GEHEIMTEXT _ _ _ _ _ 1a53 91 1A // Zeiger 5 = _ GRUPPEN CR CR CR 1a55 9C 1A // Zeiger 6 = cr 1a57 9D 1A // Zeiger 7 = cr cr 1a59 9F 1A // Zeiger 8 = ??, getrickst mit doppel X // Sonderdrucklisten: 1a5b 0D // B1, CR 1a5c 1B 40 7F 45 49 4E 47 41 4E 47 3A 0D 0D 0D 0D // B2, EINGANG: cr cr cr cr; 0x1b 0x40 0x7f == Drucker reset und Druckerpuffer löschen 1a6b 1B 40 7F 41 55 53 47 41 4E 47 3A 0D 0D 0D 0D // B3, AUSGANG: cr cr cr cr; 0x1b 0x40 0x7f == Drucker reset und Druckerpuffer löschen 1a7a 0D 0D 0D 0D 0D // B4, cr cr cr cr cr 1a7f 0D 0D 0D 47 45 48 45 49 4D 54 45 58 54 20 20 20 20 20 // B5, cr cr cr GEHEIMTEXT _ _ _ _ _ 1a91 20 47 52 55 50 50 45 4E 0D 0D 0D // B6, _ GRUPPEN cr cr cr 1a9c 20 // B7, _ 1a9d 0D 0D // B8, cr cr Umwandlungstabelle T-316- CITT-2 -> 6 bit ASCII 1a9f 04 // Space 1aa0 17 // Q 13 // W 01 // E 0A // R 10 // T 15 // Y 07 // U 06 // I 18 // O 16 // P 03 // A 05 // S 09 // D 0D // F 1A // G 14 // H 1ab0 0B // J 0F // K 12 // L 08 // < WR? 11 // Z 1D // X 0E // C 1E // V 19 // B 0C // N 1C // M 22 // % 37 // 1 33 // 2 21 // 3 2A // 4 1ac0 30 // 5 35 // 6 27 // 7 26 // 8 38 // 9 36 // 0 23 // - 25 // + 29 // = 2D // / 3A // : 2B // * 2F // ( 32 // ) 31 // " 2E // ; 1ad0 3E // ! 39 // ? -> 2C // , 3C // . 02 // -> 24 // NL 22 // % 28 // > 3D // & 3B // [ -> in ITA-2 ist das Ziffernumschaltung 3F // ] -> in ITA-2 ist das Buchstabenumschaltung 08 // < 1B // # -> in ITA-2 ist das Ziffernumschaltung 20 // ' 1F // $ -> in ITA-2 ist das Buchstabenumschaltung ASCII-Tabelle für Drucken & Abbild der Tastatur rückwärts 1adf 24 // $ 1ae0 27 23 3C 3E 3C 26 3E 25 0D 5F 2E 2C 3F 21 3B 22 // '#<><&>%._.,?!;" 1af0 29 28 2A 3A 2F 3D 2B 2D 30 39 38 37 36 35 34 33 // )(*:/=+-09876543 1b00 32 31 25 4D 4E 42 56 43 58 5A 3C 4C 4B 4A 48 47 // 21%MNBVCXZ<LKJHG 1b10 46 44 53 41 50 4F 49 55 59 54 52 45 57 51 20 // FDSAPOIUYTREWQ // CRC Überprüfung, Übergabe HL Wertebereich, Rückgabe A 0 = io, 0xff = falsch // UNTERPRGRAMM KONTROLLE CRC-WERTE 2 /*******************************************/ /* Übergabe HL Adresse /* Übergabe BC Länge des Datenbereiches /* Übergabe (0xdc2b) zu überprüfende CRC /* Rückgabe DE CRC Wert aus der CRC Funktion /* A = 0 OK, = ff Fehler /*******************************************/ 1b1f CD 31 1B call 0x1b31 // CRC2-16 Schleife, Übergabe: HL Wert, Rückgabe: CRC in DE 1b22 2A 2B DC ld hl, (0xdc2b) // hier steht die Adresse zur CRC16 Prüfsumme 1b25 46 ld b, (hl) 1b26 23 inc hl 1b27 4E ld c, (hl) // BC = CRC gespeicherter Wert 1b28 EB ex de, hl // Registerinhalt Tausch DE <> HL 1b29 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0; 1b2a ED 42 sbc hl, bc // CRC Vergleich 1b2c 28 02 jrz 0x02 // 0x1b30, OK A = 0, sonst 0xff 1b2e 3E FF ld a, 0xff // A = 0xff Fehler 1b30 C9 ret // CRC-16 Schleife, Übergabe HL ANFANGSWERT, BC LÄNGE, Rückgabe CRC in DE // UNTERPROGRAMM CRC-WERT-BERECHNUNG VON A, DE /*************************************************/ /* CRC Vektor = 0x0000 /* Übergabe HL Adresse der Daten /* Übergabe BC Länge der Daten /* Rückgabe DE die 16bit CRC /*************************************************/ 1b31 11 00 00 ld de, 0x0000 // CRC Vektor 0x0000 1b34 7E ld a, (hl) <--\ 1b35 CD 3F 1B call 0x1b3f | // CRC2-16 mit Übergabe des Vektors, Übergabe DE-CRC Vektor, A Wert, Rückgabe DE CRC 1b38 23 inc hl | 1b39 0B dec bc | 1b3a 78 ld a, b | 1b3b B1 or c | 1b3c 20 F6 jrnz 0xf6 >--/ // 0x1b34, bis BC = 0x0000 1bee C9 ret // CRC2-16 mit Übergabe des Vektors, Übergabe DE CRC Vektor, A Wert, Rückgabe DE CRC /**********************************************/ /* AUFRUF RO.CRC /* ÜBERGABEPARAMETER /* A = NEUES BYTE /* DE = ALTER CRC WERT /* RÜCKGABEPARAMETER: /* DE = NEUER CRC-WERT /* REGISTERÄNDERUNG AF, DE /**********************************************/ 1b3f AA xor d 1b40 57 ld d, a 1b41 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 1b42 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 1b43 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 1b44 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 1b45 E6 0F and 0x0f 1b47 AA xor d 1b48 57 ld d, a 1b49 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 1b4a 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 1b4b 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 1b4c F5 push af // rette AF 1b4d E6 1F and 0x1f // Maske 0001 1111 1b4f AB xor e 1b50 5F ld e, a 1b51 F1 pop af // wiederherstellen AF 1b52 F5 push af // rette AF 1b53 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 1b54 E6 F0 and 0xf0 1b56 AB xor e 1b57 5F ld e, a 1b58 F1 pop af // wiederherstellen AF 1b59 E6 E0 and 0xe0 1b5b AA xor d 1b5c 53 ld d, e 1b5d 5F ld e, a 1b5e C9 ret // Lösche Bereich; Übergabe HL, Länge BC 1b5f D5 push de // Rette DE 1b60 36 00 ld (hl), 0x00 1b62 E5 push hl // Registerwechsel 1b63 D1 pop de // DE = HL 1b64 13 inc de // DE = HL + 1 1b65 ED B0 ldir // kopiere HL > DE länge BC 1b67 D1 pop de // DE zurückladen 1b68 C9 ret // Rundenschlüssel für Feistel, Übergabe A, Schlüssel 0xde9e ... 0xdea5, Rückgabe 0xde00 /* Speicher 0xdc52 + 8, 0xde9e Schlüsselauszug */ 1b69 21 00 DE ld hl, 0xde00 // GTextspeicher 1b6c 22 90 DE ld (0xde90), hl // Zeiger GTextspeicher 1b6f 11 01 DE ld de, 0xde01 1b72 01 7F 00 ld bc, 0x007f // Länge 128 byte 1b75 36 00 ld (hl), 0x00 1b77 ED B0 ldir // lösche Textspeicher 0xde00 - 0xde7f 1b79 11 88 DE ld de, 0xde88 // Zwischenspeicher Transposition + n, n = 0 ... 3 1b7c 0E 04 ld c, 0x04 // Schleifenvariable C = 4 1b7e 21 A5 DE ld hl, 0xdea5 <--\ // letztes Byte aus 0xde9e + 8 Schlüsselkopie 1b81 06 08 ld b, 0x08 | // Schleifenvariable B = 8 1b83 CB 16 rl (hl) <--\ | // rotiere (HL), carry <- (HL.7) <- (HL.0) <- carry 1b85 17 rla | | // rotiere A, carry -> A0 -> A7 -> carry 1b86 2B dec hl | | // Bit 7 von (HL) nach A via carry-Flag, 8 bits; 0xdea5 - 0xde9d 1b87 10 FA djnz 0xfa >--/ | // 0x1b83, 8*, (HL) = 0xde9d - 0xdea5; 8 bit in A - aus (HL+n bitNr 7 ... 0) 1b89 12 ld (de), a | // (0xde88 + C) = A; 0xde88, 0xde89, 0xde8a, 0xde8b in diesen stehen die eingesammelten Bit7.HL 1b8a 13 inc de | // 0xde88 bits 7, 0xde89 bits 6, bis 0xde88 - 0xde90 1b8b 0D dec c | // DE = 4 * 8 = 32 bit aus (HL) 1b8c 20 F0 jrnz 0xf0 >--/ // 0x1b7e, 4*; Aufteilung Bits 7 ... 4 nach: 0xde88-0xde8b, 0xde8f = 0xde8b, 0xde8c - 0xde8e = Low-Bits aus 0xdea5 - 0xde9e 1b8e 11 8F DE ld de, 0xde8f // Bits rückwärts ablegen 1b91 12 ld (de), a // Runde 1; 0xde8f = A = bits 4 == 0xde8b 1b92 1B dec de // 0xde8e 1b93 0E 03 ld c, 0x03 // Schleifenvariable C 1b95 21 A5 DE ld hl, 0xdea5 <--\ // letztes Byte aus 0xde9e + 8 Schlüsselkopie 1b98 06 08 ld b, 0x08 | // Schleifenvariable B 1b9a CB 16 rl (hl) <--\ | // rotiere (HL), carry <- (HL.7) <- (HL.0) <- carry 1b9c 17 rla | | // rotiere A, carry -> A0 -> A7 -> carry 1b9d 2B dec hl | | 1b9e 10 FA djnz 0xfa >--/ | // 8 Runden; bits 3 ... 1 1ba0 12 ld (de), a | // 0xde8e = bits 3, 0xde8d = bits 2, 0xde8c = bits 1 1ba1 1B dec de | 1ba2 0D dec c | // 0xde8e ... 0xde8c, 1ba3 20 F0 jrnz 0xf0 >--/ // 0x1b95; bits 3 ... 1 extrahiert // Ende Transposition; Bit 0 wird nicht extrahiert! 1ba5 21 FC 7E ld hl, 0x7efc // Initalwert b 0111_1110_1111_1100 1ba8 22 92 DE ld (0xde92), hl // Variable Initalwert 1bab 21 94 DE ld hl, 0xde94 // schleifenvariable 1bae 36 10 ld (hl), 0x10 // Rundenanzahl = 16 1bb0 06 02 ld b, 0x02 <-\ // 2 * 16 Runden 1bb2 FD 21 88 DE ld iy, 0xde88 <----\ | // Einsprung aus 0x1bf5, bits 7; die extrahierten Bits 7, 6, 5,... 1bb6 AF xor a | | // Lösche A, Z = 1, carry = 0, 32 bit rotieren 1bb7 FD CB 03 16 rl (iy + 0x03) | | // 0xde8b bits 4; rotiere (IY+3), carry <- (IY+3.7) <- (IY+3.0) <- carry 1bbb FD CB 02 16 rl (iy + 0x02) | | // 0xde8a bits 5; rotiere (IY+2), carry <- (IY+2.7) <- (IY+2.0) <- carry.bits4(.7) 1bbf FD CB 01 16 rl (iy + 0x01) | | // 0xde89 bits 6; rotiere (IY+1), carry <- (IY+1.7) <- (IY+1.0) <- carry.bits5(.7) 1bc3 FD CB 00 16 rl (iy + 0x00) | | // 0xde88 bits 7; rotiere (IY+0), carry <- (IY+0.7) <- (IY+0.0) <- carry.bits6(.7) 1bc7 1F rra | | // rotiere A; carry.bits7(.7) -> A7 -> A0 -> carry 1bc8 1F rra | | // rotiere A; carry -> A7 -> A0 -> carry 1bc9 1F rra | | // rotiere A; carry -> A7 -> A0 -> carry 1bca 1F rra | | // rotiere A; carry -> A7 -> A0 -> carry 1bcb FD B6 03 or (iy + 0x03) | | // A = A or IY + 3; Maske bits 4 OR 0xde8b; ... 1bce FD 77 03 ld (iy + 0x03), a | | // IY + 3 bits 4 1bd1 FD 7E 07 ld a, (iy + 0x07) | | // a = (0xde8f) 1bd4 1F rra | | // rotiere A; carry -> A7 -> A0 -> carry 1bd5 1F rra | | // rotiere A; carry -> A7 -> A0 -> carry 1bd6 1F rra | | // rotiere A; carry -> A7 -> A0 -> carry 1bd7 1F rra | | // rotiere A; carry -> A7 -> A0 -> carry 1bd8 FD CB 06 16 rl (iy + 06) | | // bits 1; 0xde8e (IY carry < 7 ... 0 < carry) 1bdc FD CB 05 16 rl (iy + 05) | | // bits 2; 0xde8d (IY carry < 7 ... 0 < carry) 1be0 FD CB 04 16 rl (iy + 04) | | // bits 3; 0xde8c (IY carry < 7 ... 0 < carry) 1be4 FD CB 07 16 rl (iy + 07) | | // bits 4; 0xde8f (IY carry < 7 ... 0 < carry) 1be8 05 dec b | | // b == 0; -> P-Box 1be9 28 0C jrz 0x0c >-\ | | // 0x1bf7, 2 Durchläufe ? Ja unten weiter 1beb 2A 92 DE ld hl, (0xde92) | | | // 0xde92 = 0x7efc; 0111 1110 1111 1100 Variable Initalwert 1bee CB 1C rr h | | | // rotiere H 0x7e 0111 1110; carry -> H7 -> H0 -> carry 1bf0 CB 1D rr l | | | // rotiere L 0xfc 1111 1100; carry -> L7 -> L0 -> carry 1bf2 22 92 DE ld (0xde92), hl | | | // 0xde92 Zwischenspeicher Initalwert + carry 1bf5 38 BB jrc 0xbb | >-/ | // 0x1bb2, 2 Durchläufe, Aufteilung 4 bits "L" / "R" ? // Ende Bits extrahieren | | // P-Box | | 1bf7 DD 21 18 1F ld ix, 0x1f18 <-/ | // Permutationsbox-Box 64 byte 1bfb FD 21 8F DE ld iy, 0xde8f | // bits 4 1bff 0E 08 ld c, 0x08 | // Schleifenzähler C, 8 Runden 1c01 06 08 ld b, 0x08 <-\ | // Schleifenzähler B, 8 Runden 1c03 FD CB 00 0E rrc (iy + 0x00) | <-\ | // bits 0 rotieren (IY+0); (IY+0.0) -> (IY+0.7) -> (IY+0.0) carry = (IY+0.0) 1c07 DD 56 00 ld d, (ix + 0x00) | | | // d = 0x63; P-Box erster Wert, ... + B + C 1c0a DD 23 inc ix | | | // ix = 0x1f19; P-Box zweiter Wert, ... + B + C 1c0c 30 18 jrnc 0x18 >-\ | | | // 0x1c26, rrc (IX+0)bit 0 = 0?; Schleife einen Schritt überspringen 1c0e 7A ld a, d | | | | // a = byte P-Box (0x01 ... 0x76) 1c0f E6 F0 and 0xf0 | | | | // Maskiere a= 0x60; High-byte 1c11 0F rrca | | | | // rotieren A; A7 -> A0, A0 -> A7, carry = A0, 0110 0000 > 0011 0000 Carry = 0 1c12 0F rrca | | | | // 0001 1000 Carry = 0 1c13 0F rrca | | | | // 0000 1100 Carry = 0 1c14 0F rrca | | | | // a = 0x06, 0000 0110, carry = 0; Swap Hig-Low; benutzt Low-Teil 1c15 2A 90 DE ld hl, (0xde90) | | | | // Zeiger auf 0xde00, GTextspeicher 128 byte 1c18 85 add a, l | | | | // 00 + 0x06, ... 1c19 6F ld l, a | | | | // 0xde06 ... 1c1a 7A ld a, d | | | | // a = 0x63; P-Box 1c1b E6 0F and 0x0f | | | | // Maskiere a; Low-Byte 1c1d 57 ld d, a | | | | // d = 0x03 -> Schleifenzähler; 0x01 ... 0x09, entspricht Bit 1 ... 7, 0! 1c1e AF xor a | | | | // Lösche A, Z-Flag = 1, carry-Flag = 0 1c1f 37 scf | | | | // carry = 1 1c20 17 rla <--\ | | | | // rotiere A, carry -> A0 -> A7 -> carry; A = 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00; Bit 0x40 und 0x80 werden nicht benutzt! 1c21 15 dec d | | | | | // Schleifenzähler, D Runden, 1 ... 9 Runden 1c22 20 FC jrnz 0xfc <--/ | | | | // 0x1c20 1c24 B6 or (hl) | | | | // A OR (HL); Setze Bit (A)[0 ... 7] in berechnetes (HL), Einzelnes bit 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, ODER 0x00 1c25 77 ld (hl), a | | | | // gesetzte bits 1,2,4,8,0x10,0x20 speichern 1c26 10 DB djnz 0xdb <-/ | >-/ | // 0x1c03, Schleifenzähler B, 8 Runden 1c28 FD 2B dec iy | | // 128 bit Speicher, rückwärts, Bits 1, 2, ... 7 1c2a 0D dec c | | // Schleifenzähler C, 128 bit bearbeitet 1c2b 20 D4 jrnz 0xd4 >-/ | // 0x1c01, Schleife 8mal (64 Runden) 1c2d 3A 90 DE ld a, (0xde90) | // 0xde00, GTextspeicher 128 byte 1c30 C6 08 add a, 0x08 | // Länge + 8; 64 bit bearbeitet 1c32 32 90 DE ld (0xde90), a | // 0xde08, ... 64bit Blöcke 1c35 21 94 DE ld hl, 0xde94 | // Schleifenzähler, 16 Runden 1c38 35 dec (hl) | // (HL) <> 0 1c39 C2 B0 1B jpnz 0x1bb0 >-/ // Schleife 16 Runden, 128 byte 1c3c C9 ret // in 0xde00 ... 0xde7f Rundenschlüssel für Feistel // Feistel und G(X, Y) Funktion; Startwert 0x00: Funktion A -> C mit der Funktion G aus pdf *601; Programm bis 0x1f17 1c3d AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 1c3e 18 02 jr 0x02 >-\ // 0x1c42 // Einsprung | // Startwert 0xff; aus: 64 bit Manipulation L - R 1c40 3E FF ld a, 0xff | // Einsprung von: 0x297a PWD Check; Feistel Rückwärts 1c42 32 95 DE ld (0xde95), a <-/ // Sichere a; A = Chiffrieren/Dechiffrieren (0x00, 0xff); Nur für die Passwortfunktion 1c45 21 96 DE ld hl, 0xde96 // Input Ktxt (IV), a = 0: Kopie 64bit; a = 0xff: 1c48 06 08 ld b, 0x08 // 1c4a CB 06 rlc (hl) <-\ // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); 1c4c 1F rra | // rotiere A; carry -> A7 -> A0 -> carry 1c4d 23 inc hl | // a(bit n+1) = (HL + n-1) 1c4e 10 FA djnz 0xfa >-/ // 0x1c4a, 8 bit nach a gespiegelt; Zeile wird in Spalten abgelegt 1c50 32 80 DE ld (0xde80), a // 0xde80 Byte 1-Bits7 1c53 21 96 DE ld hl, 0xde96 1c56 06 08 ld b, 0x08 1c58 CB 06 rlc (hl) <-} // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); 1c5a 1F rra | // rotiere A; carry -> A7 -> A0 -> carry 1c5b 23 inc hl | // a(bit n+1) = (HL + n-1) 1c5c 10 FA djnz 0xfa >-/ // 0x1c58, 8 bit nach a gespiegelt; Zeile wird in Spalten abgelegt 1c5e 32 84 DE ld (0xde84), a // 0xde84 Byte 2-Bits6 1c61 21 96 DE ld hl, 0xde96 1c64 06 08 ld b, 0x08 1c65 CB 06 rlc (hl) <-\ // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); 1c67 1F rra | // rotiere A; carry -> A7 -> A0 -> carry 1c68 23 inc hl | // a(bit n+1) = (HL + n-1) 1c69 10 FA djnz 0x0fa >-/ // 0x1c66, 8 bit nach a gespiegelt; Zeile wird in Spalten abgelegt 1c6b 32 81 DE ld (0xde81), a // 0xde81 Byte 3-Bits5 1c6f 21 96 DE ld hl, 0xde96 1c72 06 08 ld b, 0x08 1c74 CB 06 rlc (hl) <-\ // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); 1c76 1F rra | // rotiere A; carry -> A7 -> A0 -> carry 1c77 23 inc hl | // a(bit n+1) = (HL + n-1) 1c78 10 FA djnz 0xfa >-/ // 0x1c74, 8 bit nach a gespiegelt; Zeile wird in Spalten abgelegt 1c7a 32 85 DE ld (0xde85), a // 0xde85 Byte 4-Bits4 1c7d 21 96 DE ld hl, 0xde96 1c80 06 08 ld b, 0x08 1c82 CB 06 rlc (hl) <-\ // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); 1c84 1F rra | // rotiere A; carry -> A7 -> A0 -> carry 1c85 23 inc hl | // a(bit n+1) = (HL + n-1) 1c86 10 FA djnz 0xfa >-/ // 0x1c82, 8 bit nach a gespiegelt; Zeile wird in Spalten abgelegt 1c88 32 82 DE ld (0xde82), a // 0xde82 Byte 5-Bits3 1c8b 21 96 DE ld hl, 0xde96 1c83 06 08 ld b, 8 1c90 CB 06 rlc (hl) <-\ // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); 1c92 1F rra | // rotiere A; carry -> A7 -> A0 -> carry 1c93 23 inc hl | // a(bit n+1) = (HL + n-1) 1c94 10 FA djnz 0xfa >-/ // 0x1c90, 8 bit nach a gespiegelt; Zeile wird in Spalten abgelegt 1c96 32 86 DE ld (0xde86), a // 0xde86 Byte 6-Bits2 1c99 21 96 DE ld hl, 0xde96 1c9c 06 08 ld b, 0x08 1c9e CB 06 rlc (hl) <-\ // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); 1ca0 1F rra | // rotiere A; carry -> A7 -> A0 -> carry 1ca1 23 inc hl | // a(bit n-1) = (HL + n-1) 1ca2 10 FA djnz 0xfa >-/ // 0x1c9e, 8 bit nach a gespiegelt; Zeile wird in Spalten abgelegt 1ca4 32 83 DE ld (0xde83), a // 0xde83 Byte 7-Bits1 1ca7 21 96 DE ld hl, 0xde96 1caa 06 08 ld b, 0x08 1cac CB 06 rlc (hl) <-\ // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); 1cae 1F rra | // rotiere A; carry -> A7 -> A0 -> carry 1caf 23 inc hl | // a(bit n) = (HL + n bit 7) 1cb0 10 FA djnz 0xfa >-/ // 0x1cac, 8 bit nach a gespiegelt - transponiert; Zeile wird in Spalten abgelegt 1cb2 32 87 DE ld (0xde87), a // 0xde87 Byte 8-Bits0 1cb5 21 80 DE ld hl, 0xde80 1cb8 46 ld b, (hl) // b = (0xde80) bits-7 1cb9 23 inc hl 1cba 4E ld c, (hl) // c = (0xde81) bits-5 1cbb 23 inc hl 1cbc 56 ld d, (hl) // d = (0xde82) bits-3 1cbd 23 inc hl 1cbe 5E ld e, (hl) // e = (0xde83) bits-1 1cbf C5 push bc // rette BC, (0xde80, 0xde81) 1cc0 23 inc hl 1cc1 46 ld b, (hl) // b = (0xde84) bits-6 1cc2 23 inc hl 1cc3 4E ld c, (hl) // c = (0xde85) bits-4 1cc4 C5 push bc // Registerwechsel; Rette BC -> kopiere nach IX, via PUSH -> POP 1cc5 DD E1 pop ix // (--sp)IX zeigt auf wert von BC (0xde84, 0xde85) 1cc7 23 inc hl // 0xde86 1cc8 46 ld b, (hl) // b = (0xde86) bits-2 1cc9 23 inc hl // 0xde87 1cca 4E ld c, (hl) // c = (0xde87) bits-0 1ccb C5 push bc // Registerwechsel; Rette BC -> kopiere nach IY, via PUSH -> POP 1ccc FD E1 pop iy // (--sp) IY zeigt auf Wert von BC (0xde86, 0xde87) 1cce C1 pop bc // wiederherstellen BC, (0xde80, 0xde81) 1ccf 3A 95 DE ld a, (0xde95) // hole a zurück, 0x00 oder 0xff 1cd2 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 1cd3 28 02 jrz 0x02 // 0x1cd7, a > 0x00 then a = 0x0f 1cd5 3E 0F ld a, 0x0f // nein dann A = 0x0f // Berechnung der HL-Adressen 0xde00 bis 0xde78; 0xde78 bis 0xde00 rückwärts bei A = 0x0f 1cd7 F5 push af // rette Schleifenzähler AF, 0x00 oder 0x0f 1cd8 21 00 DE ld hl, 0xde00 // Rundenschlüssel 128 byte 1cdb D5 push de // Rette DE; 0xde82,83; Bits3 Bits1 1cdc 16 00 ld d, 0x00 1cde 5F ld e, a // e = 0x00 oder 0x0f; carry 0x0f; 0x00 1cdf CB 23 sla e // schiebe E, carry <- E7 <- E0 <- 0, 0x1e; 0 1ce1 CB 12 rl d // rotiere D, carry -> D0 -> D7 -> carry 0x00; 0 1ce3 CB 23 sla e // 0x2a; 0 1ce5 CB 12 rl d // 0x00; 0 1ce7 CB 23 sla e // 0x48; 0 1ce9 CB 12 rl d // 0x00; 0 1ceb 19 add hl, de // Adresse 0xde00 oder 0xde48 "R/L" 1cec D1 pop de // wiederherstellen DE; 0xde00 // "Expansion" ? // K-Boxen (K-Box 0-7) Substitution durch K-Box (bei DES == S-Box) Schleife "A" < 0x10 Wiederholung 0x1e7e; 16 Runden 1ced C5 push bc 1cee D5 push de // 0x1e6a POP IX, POP IY 1cef E5 push hl // Rette Register, HL = HL+DE aus 0x1ceb 1cf0 78 ld a, b // s. 0x1cbf: b = (0xde80) bits-1 1cf1 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1cf2 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1cf3 1F rra // rotiere A, A0 > carry > A7 > A0; 0100 1000 >> 0000 1001 (0) 1cf4 E6 1F and 0x1f // Maske nur bit 0 bis 4; xxxB BBBB 1cf6 CB 43 bit 0, e // prüfe Reg. E bit 0 == true 1cf8 28 02 jrz 0x02 >-| // 0x1cfc, Bit 2 == 0 1cfa CB EF set 5, a | // A = xx1x xxxx 1cfc AE xor (hl) <-| // a = a xor (HL) (0xde00...) (0xde48 ...) "R/L" // "Eingang" K-Box 1 1cfd 21 00 3E ld hl, 0x3e00 // K-Box / K-Boxen 1; Teil der "G"-Funktion 1d00 85 add a, l // a = 0x20 + 0x00 1d01 6F ld l, a // l = l + 0x20 1d02 7E ld a, (hl) // Index a = (0x3e20) 0x04 1d03 E1 pop hl // Hole HL zurück, berechnete Adresse 0xde00 0xde48 "R/L" 1d04 F5 push af // rette AF, 1 1d05 23 inc hl // 0xde00 + 1, (+8) 1d06 E5 push hl // rette HL 1d07 78 ld a, b // s. 0x1cf0 -> s. 0x1cc8: b = (0xde86) bits-1 1d08 C5 push bc // rette BC 1d09 CB 11 rl c // rotiere C, carry -> C0 -> C7 -> carry 1d0b 17 rla // rotiere A, carry -> A0 -> A7 -> carry 1d0c E6 3F and 0x3f // Maske 0011 1111 1d0e C1 pop bc // wiederherstellung BC 1d0f AE xor (hl) // A XOR (HL), berechnete Adresse 0xde00 0xde48 "R/L" // K-Box 2 1d10 21 40 3E ld hl, 0x3e40 // K-Box 2 1d13 85 add a, l // a += 0x40 1d14 6F ld l, a 1d15 7E ld a, (hl) // Index a = (H, L+A) 1d16 E1 pop hl // wiederherstellen HL 1d17 F5 push af // rette AF, 2 1d18 23 inc hl // 0xde00 + 2 (+8) 1d19 E5 push hl // rette HL 1d1a 79 ld a, c 1d1b C5 push bc // rette BC 1d1c CB 18 rr b // rotiere B; carry -> B7 -> B0 -> carry 1d1e 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1d1f 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1d20 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1d21 C1 pop bc // Push BC 1d22 E6 3F and 0x3f // Maske 0011 1111 1d24 AE xor (hl) // A = 0x3f XOR (HL) // K-Box 3 1d25 21 80 3E ld hl, 0x3e80 // K-Box 3 1d28 85 add a, l // a += 80 1d29 6F ld l, a 1d2a 7E ld a, (hl) // Index a = (H, L+A) 1d2b E1 pop hl // wiederherstellen HL 1d2c F5 push af // rette AF, 3 1d2d 23 inc hl // 0xde00 + 3 (+8) 1d2e E5 push hl // rette HL 1d2f 79 ld a, c 1d30 D5 push de // rette DE 1d31 CB 12 rl d // rotiere D, carry -> D0 -> D7 -> carry 1d33 17 rla // rotiere A, carry -> A0 -> A7 -> carry 1d34 D1 pop de // wiederherstellen DE 1d35 E6 3F and 0x3f // Maske 0011 1111 1d37 AE xor (hl) // A = 0x3f XOR (HL) // K-Box 4 1d38 21 C0 3E ld hl, 0x3ec0 // K-Box 4 1d3b 85 add a, l // a += c0 1d3c 6F ld l, a 1d3d 7E ld a, (hl) // Index a = (H, L+A) 1d3e E1 pop hl // wiederherstellen HL 1d3f F5 push af // rette AF, 4 1d40 23 inc hl // 0xde00 + 4 (+8) 1d41 E5 push hl // rette HL 1d42 7A ld a, d 1d43 C5 push bc // rette BC 1d44 CB 19 rr c // rotiere C; carry -> C7 -> C0 -> carry 1d46 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1d47 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1d48 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1d49 C1 pop bc // wiederherstellen BC 1d4a E6 3F and 0x3f // Maske 0011 1111 1d4c AE xor (hl) // A = 0x3f XOR (HL) // K-Box 5 1d4d 21 00 3F ld hl, 0x3f00 // K-Box 5 1d50 85 add a, l // a += 0x00 1d51 6F ld l, a 1d52 7E ld a, (hl) // Index a = (H, L+A) 1d53 E1 pop hl // wiederherstellen HL 1d54 F5 push af // rette AF, 5 1d55 23 inc hl // 0xde00 + 5 (+8) 1d56 E5 push hl // rette HL 1d57 7A ld a, d 1d58 D5 push de // rette DE 1d59 CB 13 rl e // rotiere E, carry -> E0 -> E7 -> carry 1d5b 17 rla // rotiere A, carry -> A0 -> A7 -> carry 1d5c D1 pop de // wiederherstellen DE 1d5d E6 3F and 0x3f // Maske 0011 1111 1d5f AE xor (hl) // A = 0x3f XOR (HL) // K-Box 6 1d60 21 40 3F ld hl, 0x3f40 // K-Box 6 1d63 85 add a, l // a += 0x40 1d64 6F ld l, a 1d65 7E ld a, (hl) // Index a = (H, L+A) 1d66 E1 pop hl // wiederherstellen HL 1d67 F5 push af // rette AF, 6 1d68 23 inc hl // 0xde00 + 6 (+8) 1d69 E5 push hl // rette HL 1d6a 7B ld a, e 1d6b D5 push de // rette DE 1d6c CB 1A rr d // rotiere D; carry -> D7 -> D.0 -> carry 1d6e 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1d6f 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1d70 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1d71 D1 pop de // wiederherstellen DE 1d72 E6 3F and 0x3f // Maske 0011 1111 1d74 AE xor (hl) // A = 0x3f XOR (HL) // K-Box 7 1d75 21 80 3F ld hl, 0x3f80 // K-Box 7 1d78 85 add a, l // a += 0x80 1d79 6F ld l, a 1d7a 7E ld a, (hl) // Index a = (H, L+A) 1d7b E1 pop hl // wiederherstellen HL 1d7c F5 push af // rette AF, 7 1d7d 23 inc hl // 0xde00 + 7 (+8) 1d7e 7B ld a, e 1d7f CB 10 rl b // rotiere B, carry -> B0 -> B7 -> carry 1d81 17 rla // carry nach A bit 0 1d82 E6 3F and 0x3f // Maske 0011 1111 1d84 AE xor (hl) // A = 0x3f XOR (HL) // K-Box 8 1d85 21 C0 3F ld hl, 0x3fc0 // K-Box 8 1d88 85 add a, l // a += 0xc0 1d89 6F ld l, a 1d8a 7E ld a, (hl) // Index a = (H, L+A) 1d8b 01 00 00 ld bc, 0x0000 1d8e 11 00 00 ld de, 0x0000 1d91 CB 5F bit 3, a // bit A 0, 1, 2, 3 setzt bits 5,3,1 in bc de; 0x1d8a Datenbereich 8 1d93 28 02 jrz 0x02 >-\ // 0x1d97 1d95 CB D8 set 3, b | 1d97 CB 57 bit 2, a <-/ // bit 2 == true 1d99 28 02 jrz 0x02 >-\ // 0x1d9d 1d9b CB EB set 5, e | 1d9d CB 4F bit 1, a <-/ // bit 3 == true 1d9f 28 02 jrz 0x02 >-\ // 0x1da3 1da1 CB C9 set 1, c | 1da3 CB 47 bit 0, a <-/ // bit 0 == true 1da5 28 02 jrz 0x02 >-\ // 0x1da9 1da7 CB DA set 3, d | // bit A 0, 1, 2, 3 setzt bits 5,3,1 in bc de; 0x1d8a 1da9 F1 pop af <-/ // wiederherstellen AF, 7; bit A 0, 1, 2, 3 setzt bits in 0,4,2,1 bc de; 0x1d7a K-Box 7 1daa CB 5F bit 3, a // bit 3 == true 1dac 28 02 jrz 0x02 >-\ // 0x1db0 1dae CB C3 set 0, e | 1db0 CB 57 bit 2, a <-/ // bit 2 == true 1db2 28 02 jrz 0x02 >-\ // 0x1db6 1db4 CB E1 set 4, c | 1db6 CB 4F bit 1, a <-/ // bit 1 == true 1db8 28 02 jrz 0x02 >-\ // 0x1dbc 1dba CB D2 set 2, d | 1dbc CB 47 bit 0, a <-/ // bit 0 == true 1dbe 28 02 jrz 0x02 >-\ // 0x1dc2 1dc0 CB C8 set 1, b | // bit A 0, 1, 2, 3 setzt bits in 0,4,2,1 bc de; 0x1d7a 1dc2 F1 pop af <-/ // wiederherstellen AF, 6; bit A 0, 1, 2, 3 setzt bits in 3,4,5 bc de; 0x1d65 K-Box 6 1dc3 CB 5F bit 3, a // bit 3 == true 1dc5 28 02 jrz 0x02 >-\ // 0x1dc9 1dc7 CB E0 set 4, b | 1dc9 CB 57 bit 2, a <-/ // bit 2 == true 1dcb 28 02 jrz 0x02 >-\ // 0x1dcf 1dcd CB DB set 3, e | 1dcf CB 4F bit 1, a <-/ // bit 1 == true 1dd1 28 02 jrz 0x02 >-\ // 0x1dd5 1dd3 CB E9 set 5, c | 1dd5 CB 47 bit 0, a <-/ // bit 0 == true 1dd7 28 02 jrz 0x02 >-\ // 0x1ddb 1dd9 CB EA set 5, d | // bit A 0, 1, 2, 3 setzt bits in 4,3,5 bc de; 0x1d65 1ddb F1 pop af <-/ // wiederherstellen AF, 5; bit A 0, 1, 2, 3 setzt bits in bc 0,2,5,7 de; 0x1d52 K-Box 5 1ddc CB 5F bit 3, a // bit 3 == true 1dde 28 02 jrz 0x02 >-\ // 0x1de2 1de0 CB C0 set 0, b | 1de2 CB 57 bit 2, a <-/ // bit 2 == true 1de4 28 02 jrz 0x02 >-\ // 0x1de8 1de6 CB D1 set 2, c | 1de8 CB 4F bit 1, a <-/ // bit 1 == true 1dea 28 02 jrz 0x02 >-\ // 0x1dee 1dec CB FB set 7, e | 1dee CB 47 bit 0, a <-/ // bit 0 == true 1df0 28 02 jrz 0x02 >-\ // 0x1df4 1df2 CB E8 set 5, b | // bit A 0, 1, 2, 3 setzt bits in 0,2,5,7 bc de; 0x1d52 1df4 F1 pop af <-/ // wiederherstellen AF, 4; bit A 0, 1, 2, 3 setzt bits in 4,6,7 bc de; 0x1d3d Datembereich 4 1df5 CB 5F bit 3, a // bit 3 == true 1df7 28 02 jrz 0x02 >-\ // 0x1dfb 1df9 CB F3 set 6, e | 1dfb CB 57 bit 2, a <-/ // bit 2 == true 1dfd 28 02 jrz 0x02 >-\ // 0x1e01 1dff CB E2 set 4, d | 1e01 CB 4F bit 1, a <-/ // bit 1 == true 1e03 28 02 jrz 0x02 >-\ // 0x1e07 1e05 CB F1 set 6, c | 1e07 CB 47 bit 0, a <-/ // bit 0 == true 1e09 28 02 jrz 0x02 >-\ // 0x1e0d 1e0b CB F8 set 7, b | // bit A 0, 1, 2, 3 setzt bits in 4,6,7 bc de; 0x1d3d 1e0d F1 pop af <-/ // wiederherstellen AF, 3; bit A 0, 1, 2, 3 setzt bits in bc 0,2 de; 0x1d2a K-Box 3 1e0e CB 5F bit 3, a // bit 3 == true 1e10 28 02 jrz 0x02 >-\ // 0x1e14 1e12 CB C2 set 0, d | 1e14 CB 57 bit 2, a <-/ // bit 2 == true 1e16 28 02 jrz 0x02 >-\ // 0x1e1a 1e18 CB C1 set 0, c | 1e1a CB 4F bit 1, a <-/ // bit 1 == true 1e1c 28 02 jrz 0x02 >-\ // 0x1e20 1e1e CB D3 set 2, e | 1e20 CB 47 bit 0, a <-/ // bit 0 == true 1e22 28 02 jrz 0x02 >-\ // 0x1e26 1e24 CB D0 set 2, b | // bit A 0, 1, 2, 3 setzt bits in 0,2 bc de; 0x1d2a 1e26 F1 pop af <-/ // wiederherstellen AF, 2; bit A 0, 1, 2, 3 setzt bits in 3,4,6 bc de; 0x1d15 K-Box 2 1e27 CB 5F bit 3, a // bit 3 == true 1e29 28 02 jrz 0x02 >-\ // 0x1e2d 1e2b CB D9 set 3, c | 1e2d CB 57 bit 2, a <-/ // bit 2 == true 1e2f 28 02 jrz 0x02 >-\ // 0x1e33 1e31 CB E3 set 4, e | 1e33 CB 4F bit 1, a <-/ // bit 1 == true 1e35 28 02 jrz 0x02 >-\ // 0x1e39 1e37 CB F0 set 6, b | 1e39 CB 47 bit 0, a <-/ // bit 0 == true 1e3b 28 02 jrz 0x02 >-\ // 0x1e3f 1e3d CB F2 set 6, d | // bit A 0, 1, 2, 3 setzt bits 3,4,6 in bc de; 0x1d15 1e3f F1 pop af <-/ // wiederherstellen AF, 1; bit A 0, 1, 2, 3 setzt bits in 1,7 bc de; 0x1d02 K-Box 1 1e40 CB 5F bit 3, a // bit 3 == true 1e42 28 02 jrz 0x02 >-\ // 0x1e46 1e44 CB F9 set 7, c | 1e46 CB 57 bit 2, a <-/ // bit 2 == true 1e48 28 02 jrz 0x02 >-\ // 0x1e4c 1e4a CB FA set 7, d | 1e4c CB 4F bit 1, a <-/ // bit 1 == true 1e4e 28 02 jrz 0x02 >-\ // 0x1e52 1e50 CB CA set 1, d | 1e52 CB 47 bit 0, a <-/ // bit 0 == true 1e54 28 02 jrz 0x02 >-\ // 0x1e58 1e56 CB CB set 1, e | // bit A 0, 1, 2, 3 setzt bits 1,7 in bc de; 1d02 1e58 DD E5 push ix <-/ // Registerwechsel 1e5a E1 pop hl // HL = IX 1e5b 7C ld a, h // a = 0x3e 1e5c A8 xor b 1e5d 47 ld b, a // b = b xor j 1e5e 7D ld a, l // a = 0x00 1e5f A9 xor c 1e60 4F ld c, a // c = c xor l, BC = IX XOR BC 1e61 FD E5 push iy // Registerwechsel 1e63 E1 pop hl // HL = IY 1e64 7C ld a, h 1e65 AA xor d 1e66 57 ld d, a // d = d xor h 1e67 7D ld a, l 1e68 AB xor e 1e69 5F ld e, a // e = e xor l; DE = HL XOR DE 1e6a FD E1 pop iy // PUSH DE 0x1cee 1e6c DD E1 pop ix // PUSH BC 0x1cee 1e6e 3A 95 DE ld a, (0xde95) 1e71 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 1e72 28 06 jrz 0x06 >-\ // 0x1e7a a == 0? 1e74 F1 pop af | // wiederherstellen AF, 0 1e75 3D dec a | // a-- 1e76 FE FF cp 0xff | // a war 0 1e78 18 04 jr 0x04 | >-\ // 0x1e7e -> 0x1cd7 // Einsprung | | 1e7a F1 pop af <-/ | // wiederherstellen AF, 0 1e7b 3C inc a | ^ 1e7c FE 10 cp 0x10 | | // a <> 0x10 1e7e C2 D7 1C jpnz 0x1cd7 <-/ -/ // Datenbereich 0-7, byte 0x00 ... 0x3f, 64bit; Schleife Funktionsblock A->C mit G // 16 Runden - Rundenschlüssel // Einsprung A == 16 1e81 78 ld a, b 1e82 32 81 DE ld (0xde81), a // Bytes 3 1e85 79 ld a, c 1e86 32 83 DE ld (0xde83), a // Bytes 7 1e89 7A ld a, d 1e8a 32 85 DE ld (0xde85), a // Bytes 4 1e8d 7B ld a, e 1e8e 32 87 DE ld (0xde87), a // BC, DE abgelegt in 0xde81 ... 87 1e91 DD E5 push ix // Registerwechsel 1e93 E1 pop hl // HL = IX 1e94 7C ld a, h 1e95 32 80 DE ld (0xde89), a // IX in 0xde89 und 0xde82 1e98 7D ld a, l 1e99 32 82 DE ld (0xde82), a // Bytes 5 1e9c FD E5 push iy // Registerwechsel 1e9e E1 pop hl // HL = IY 1e9f 7C ld a, h 1ea0 32 84 DE ld (0xde84), a // Bytes 2 1ea3 7D ld a, l 1ea4 32 86 DE ld (0xde86), a // Bytes 6; IX in 0xde84 und 0xde86 // 64bit Block Rück-Transposition von 0xde87 - > 0xde9d 1ea7 21 87 DE ld hl, 0xde87 // Bytes 7 1eaa 06 08 ld b, 0x08 1eac CB 06 rlc (hl) <-\ // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); 1eae 1F rra | // rotiere A; carry -> A7 -> A0 -> carry 1eaf 2B dec hl | // für 8 bytes, 8bits 1eb0 10 FA djnz 0xfa >-/ // 0x1eac, 8 Runden 1eb2 32 9D DE ld (0xde9d), a 1eb5 21 87 DE ld hl, 0xde87 // Bytes 7 1eb8 06 08 ld b, 0x08 1eba CB 06 rlc (hl) // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); 1ebc 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1ebd 2B dec hl // für 8 bytes, 8bits 1ebe 10 FA djnz 0xfa // 0x1eba, 8 Runden 1ec0 32 9C DE ld (0xde9c), a 1ec3 21 87 DE ld hl, 0xde87 // Bytes 7 1ec6 06 08 ld b, 0x08 1ec8 CB 06 rlc (hl) // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); 1eca 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1ecb 2B dec hl // für 8 bytes, 8bits 1ecc 10 FA djnz 0xfa // 0x1ec8, 8 Runden 1ece 32 9B DE ld (0xde9b), a 1ed1 21 87 DE ld hl, 0xde87 // Bytes 7 1ed4 06 08 ld b, 0x08 1ed6 CB 06 rlc (hl) // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); led8 1F rra // rotiere A; carry -> A7 -> A0 -> carry led9 2B dec hl // für 8 bytes, 8bits leda 10 FA djnz 0xfa // 0x1ed6, 8 Runden ledc 32 9A DE ld (0xde9a), a ledf 21 87 DE ld hl, 0xde87 // Bytes 7 lee2 06 08 ld b, 0x08 lee4 CB 06 rlc (hl) // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); lee6 1F rra // rotiere A; carry -> A7 -> A0 -> carry lee7 2B dec hl // für 8 bytes, 8bits lee8 10 FA djnz 0xfa // 0x1ee4, 8 Runden leea 32 99 DE ld (0xde99), a leed 21 87 DE ld hl, 0xde87 // Bytes 7 1ef0 06 08 ld b, 0x08 1ef2 CB 06 rlc (hl) // rotieren (carry)(HL); (HL.7) <- (HL.0) <- (HL.7); 1ef4 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1ef5 2B dec hl // für 8 bytes, 8bits 1ef6 10 FA djnz 0xfa // 0x1ef2, 8 Runden 1ef8 32 98 DE ld (0xde98), a 1efb 21 87 DE ld hl, 0xde87 // Bytes 7 1efe 06 08 ld b, 0x08 1f00 CB 06 rlc (hl) // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); 1f02 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1f03 2B dec hl // für 8 bytes, 8bits 1f04 10 FA djnz 0xfa // 0x1f00, 8 Runden 1f06 32 97 DE ld (0xde97), a 1f09 21 87 DE ld hl, 0xde87 // Bytes 7 1f0c 06 08 ld b, 0x08 1f0e CB 06 rlc (hl) // rotieren (HL); (carry)(HL.7) <- (HL.0) <- (HL.7); 1f10 1F rra // rotiere A; carry -> A7 -> A0 -> carry 1f11 2B dec hl // für 8 bytes, 8bits 1f12 10 FA djnz 0xfa // 0x1f0e, 8 Runden 1f14 32 96 DE ld (0xde96), a 1f17 C9 ret // Ende Feistel G(X, Y) // Permutations-Box 64 byte; // Aufbau: H-Teil Adresse (0xde00 + H); // L-Teil Schleifenzähler bitposition setzen: bit 0 ... bit 7 1f18 63 41 09 61 09 09 09 09 1f20 45 54 74 65 51 42 76 53 1f28 66 09 75 46 55 64 09 43 1f30 73 09 62 52 71 44 56 72 1f38 09 09 09 09 15 34 22 09 1f40 03 26 09 12 33 25 09 05 1f48 36 14 06 32 24 04 11 09 1f50 21 35 13 01 23 16 31 02 -Ende Datenblock // Kontroll-Dechiffrierung Rückgabe A 0x00 OK, A 0xff Fehler 1f58 3A 00 83 ld a, (0x8300) // Funktion ab 0x1f5f schon aufgerufen und nicht in 0x2e11 zurückgesetzt? 1f5b FE FF cp 0xff // Rundenschlüssel erzeugen Ja/nein 1f5d 28 6C jrz 0x6c >-\ // 0x1fcb, a == 0xff 1f5f 3E FF ld a, 0xff | // Merker Rundenschlüssel erzeugt 1f61 32 00 83 ld (0x8300), a | // Rundenschlüssel erzeugen ja/nein 1f64 21 1C 5C ld hl, 0x5c1c | // 0x5c1c in 0xdc3c abgelegt 1f67 22 3C DC ld (0xdc3c), hl | // Zeiger 1f6a 21 00 84 ld hl, 0x8400 | // Textspeicher; GL.KTSPS 1f6d 22 3E DC ld (0xdc3e), hl | // Zeiger auf Klartext 1f70 2A C6 DC ld hl, (0xdcc6) | // GL.EAKTS; EndAdresse Text-S 1f72 01 00 84 ld bc, 0x8400 | // Startadresse Ktxt 1f75 AF xor a | // Lösche A, Z-Flag = 1, carry-Flag = 0 1f76 ED 42 sbc hl, bc | // 0 < Länge < 132 1f78 CA 25 20 jpz 0x2025 | // Kein Text -> Enter -> Menüprogramm; return 1f7b DA 2A 20 jpc 0x202a | // negative Anzahl, BLOCKIERUNG 5; return 1f7f 11 52 DC ld de, 0xdc52 | // Klartext vorhanden, weiter ... 1f82 2A 81 DC ld hl, (0xdc81) | // Zeiger Schlüssel 1 1f85 01 20 00 ld bc, 0x0020 | // Länge 32 byte, 256 bit 1f88 ED B0 ldir | // Kopiere (0xdc81) > 0xdc52 0x20 bytes 1f8a 2A 83 DC ld hl, (0xdc83) | // Zeiger CRC Schlüssel 1 1f8d 22 2B DC ld (0xdc2b), hl | // Speicherort CRC 1f90 21 52 DC ld hl, 0xdc52 | // der oben kopierte Schlüssel 1f93 01 20 00 ld bc, 0x0020 | // Länge 32 byte 1f96 CD 1F 1B call 0x1b1f | // CRC2 Berechnung und Prüfung, Übergabe HL Wertebereich, BC Länge, (0xdc2b) CRC für Prüfung; Rückgabe A 0 = io, 0xff = falsch 1f99 F6 00 or 0x00 | // a == 0 CRC OK, A = 0xff Fehler 1f9b C2 2A 20 jpnz 0x202a | // BLOCKIERUNG 5 1f9e 21 52 DC ld hl, 0xdc52 | // der oben kopierte Schlüssel 1fa1 11 9E DE ld de, 0xde9e | // Adresse für Speicher Schlüsselbearbeitung 1fa4 01 08 00 ld bc, 0x0008 | // Länge 8 byte 1fa7 ED B0 ldir | // Kopiere 0xdc52 > 0xde9e 8 bytes, A = 0x00 1fa9 CD 69 1B call 0x1b69 | // Rundenschlüssel für Feistel, Übergabe A = 0x00, Schlüssel 0xde93 ... 0xdea5, Rückgabe 0xde00 1fac 11 42 DC ld de, 0xdc42 | // Zieladresse; Kopie IV 1faf 21 77 DC ld hl, 0xdc77 | // Startadresse, IV 1fb1 01 08 00 ld bc, 0x0008 | // Länge 8byte 1fb3 ED B0 ldir | // Kopiere 0xdc77 > 0xde42 8 bytes 1fb5 21 7F DC ld hl, 0xdc7f | // CRCiv Länge 2; CRC der IV 1fb8 22 2B DC ld (0xdc2b), hl | // Zeiger auf CRC-IV in 0xDC7f 1fbb 21 42 DC ld hl, 0xdc42 | // Kopie IV 1fc0 01 08 00 ld bc, 0x0008 | // Länge 8 byte 1fc3 CD 1F 1B call 0x1b1f | // CRC2 Berechnung und Prüfung, Übergabe HL Wertebereich, BC Länge, (0xdc2b) CRC für Prüfung; Rückgabe A 0 = io, 0xff = falsch 1fc6 F6 00 or 0x00 | // CRC IV OK? 1fc8 C2 2A 20 jpnz 0x202a | // Blockierung 5 // Einsprung Rundenschlüssel vorhanden | 1fcb 21 42 DC ld hl, 0xdc42 <-/ // Kopie IV 1fce 11 96 DE ld de, 0xde96 // Text-speicher IV 1fd1 01 08 00 ld bc, 0x0008 // Länge 8byte 1fd4 ED B0 ldir // Kopiere (0xdc42) > (0xde96) 8 bytes 1fd6 CD 3D 1C call 0x1c3d // Feistel vorwärts, Übergabe/Rückgabe 0xde96 1fd9 21 96 DE ld hl, 0xde96 // Wurmfolgen 1fdc 11 42 DC ld de, 0xdc42 // nach 0xdc42 zurückschreiben 1fdf 01 08 00 ld bc, 0x0008 // Länge 8 byte 1fe2 ED B0 ldir // Kopiere (0xde96) > (0xde42) 8 bytes 1fe4 2A 3C DC ld hl, (0xdc3c) // Klartext Zeiger auf 0x5c1c 1fe7 11 42 DC ld de, 0xdc42 // chiffr. IV 1fea DD 21 33 DC ld ix, 0xdc33 // SPAD1:-Zieladresse/chiff/dechiff 1fee 06 08 ld b, 0x08 // 8 Runden 1ff0 1A ld a, (de) <-\ // 8 Werte bearbeiten 1ff1 AE xor (hl) | // a xor (0x5c1c) XOR KTXT : Key 1ff2 DD 77 00 ld (ix + 0x00), a | // in (0xdc33 + n) GTX/KTX abgelegt 1ff5 23 inc hl | // 0x5c1c ++ 1ff6 13 inc de | // 0xdc42 ++ 1ff7 DD 23 inc ix | // 0xdc33 ++ 1ff9 10 F5 djnz 0xf5 >-/ // 0x1ff0, 8 Runden - 8 byte // Prüfung Chiffrierung Klartext gegen den dechiffr. GTX 1ffb 22 3C DC ld (0xdc3c), hl // HL == 0x5c1c+8 Zeiger auf Klartext, GTX/Klartext? 1ffe 2A 3E DC ld hl, (0xdc3e) // Hole Zeiger auf dechiffr. GTX 2001: 11 33 DC ld de, 0xdc33 // SPAD1:-Zieladresse/chiff/dechiff 2004 06 08 ld b, 0x08 // Runden 2006 1A ld a, (de) <-\ 2007 BE cp (hl) | // (DE) <> (HL) 2008 20 20 jrnz 0x20 | // BLOCKIERUNG 5; 0x202a 200a 23 inc hl | 200b 13 inc de | 200c 10 F8 djnz 0xf8 >-/ // 0x2006, 8 Runden 200e 22 3E DC ld (0xdc3e), hl // HL + 8 2011 ED 4B C6 DC ld bc, (0xdcc6) // Endadresse Txtspeicher 0x84xx; GL.EAKTS 2015 2A 3E DC ld hl, (0xdc3e) // Txtspeicher 0x5c24; mit der heißen Nadel gestrickt 2018 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2019 32 3B DC ld (0xdc3b), a // Speichern Rückgabewert 0x00 201c ED 42 sbc hl, bc // Länge Text == -1 ? 201e D8 ret c // Rückgabe 0x00 bei Überlauf 201f 3E FF ld a, 0xff 2021 32 3B DC ld (0xdc3b), a // Speichern Rückgabewert 2024 C9 ret // Rückgabe 0xff bei Fehler // Einsprung Fehler Kein Text 2025 21 7E 02 ld hl, 0x027e // Rücksprungadresse: Kein Text -> Enter -> Menüprogramm 2028 E3 ex (sp), hl 2029 C9 ret // Einsprung Fehler Blockierung 5 202a 21 DB 02 ld hl, 0x02db // Rücksprungadresse: BLOCKIERUNG 5, von 0x2008 202d E3 ex (sp), hl 202e C9 ret // Chiffrieren 202f 3E 07 ld a, 0x07 // "CHIFFRIEREN?" 2031 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 2034 F3 DI // PP nicht stören 2035 C3 21 30 jp 0x3021 // Aufruf von PP, Kaltstart // retour aus der PP, Warm-Kaltstartroutine 2038 31 DE DF ld sp, 0xdfde // Stack-Pointer wiederherstellen 203b FB EI // jetzt Int freigegeben 203c 2A C6 DC ld hl, (0xdcc6) // Zeiger auf Klartextspeicher; GL.EAKTS 203f 01 00 84 ld bc, 0x8400 // Klartextspeicher; GL.KTSPS 2042 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2043 ED 42 sbc hl, bc // Länge == 0, Länge == -1 2045 CA 7E 02 jpz 0x027e // Kein Text -> Enter -> Menüprogramm 2048 DA DB 02 jpc 0x02db // Überlauf, BLOCKIERUNG 5 204b 3E 23 ld a, 0x23 // DI, Zeitgeber, Vorteiler 256, neg. Flanke, RESET 204d D3 0B out (0x0b), a // CTC Kanal 3 Zeitgeber, Rausch-Generator // Einsprung aus CRC Test über 64bit Block 204f AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2050 32 2E DC ld (0xdc2e), a // Steuerwort 0x00 PP 2053 DD 21 F6 3D ld ix, 0x3df6 // Zeiger auf 0x3e00, K-Boxen 2057 FD 21 5E 20 ld iy, 0x205e // Rücksprungadresse 205b C3 8D 25 jp 0x258d // ROM/RAM Check PP // Rücksprung aus PP 205e C2 CB 02 jpnz 0x02cb // BLOCKIERUNG 1 2061 2A 03 83 ld hl, (0x8303) // GL.ANZA1; Geheimtextlänge Anzahl 1 2064 22 FB 93 ld (0x93fb), hl // Rette Zeiger GL.ANZA1; Geheimtextlänge Anzahl 1 2067 11 52 DC ld de, 0xdc52 206a 2A 81 DC ld hl, (0xdc81) // Zeiger Rundenschlüssel 1 206d 01 20 00 ld bc, 0x0020 // Länge 32, 256 bit 2070 ED B0 ldir // Kopiere (0xdc81) > (0xdc52) 32 byte, ADZS:-Adresse Zeitschlüssel 2072 2A 83 DC ld hl, (0xdc83) // Zeiger CRC Rundenschlüssel 1 2075 22 2B DC ld (0xdc2b), hl // für den CRC Test-vergleich 2078 21 52 DC ld hl, 0xdc52 // Schlüssel 1 207b 01 20 00 ld bc, 0x0020 // Länge 32 byte 207e CD 1F 1B call 0x1b1f // CRC2 Berechnung und Prüfung, Übergabe HL Wertebereich, BC Länge, (0xdc2b) CRC für Prüfung; Rückgabe A 0 = io, 0xff = falsch 2081 F6 00 or 0x00 // a <> 0 2083 C2 DB 02 jpnz 0x02db // BLOCKIERUNG 5 2086 21 52 DC ld hl, 0xdc52 // CRC Schlüsselprüfung bestanden; 0xdc52 Kopie Schlüssel 1 2089 11 9E DE ld de, 0xde9e // Kopiere nach 0xde9e -> nur 8 byte 208c 01 08 00 ld bc, 0x0008 // Länge 8 byte, 64 bit 208f ED B0 ldir // Kopiere 0xdc52 > 0xde9e 8 bytes 2091 CD 69 1B call 0x1b69 // Rundenschlüssel für Feistel, Übergabe A = 0x00, Schlüssel 0xde93 ... 0xdea5, Rückgabe 0xde00 2094 11 42 DC ld de, 0xdc42 // Kopie IV 2097 21 77 DC ld hl, 0xdc77 // IV 209a 01 08 00 ld bc 0x0008 // Länge 8 209d ED B0 ldir // kopiere 0xdc77 > 0xdc42 8 byte 209f 21 7F DC ld hl, 0xdc7f // CRCiv Länge 2 ; CRC der IV 20a2 22 2B DC ld (0xdc2b), hl // Speicherort CRC für Prüfung 20a5 21 42 DC ld hl, 0xdc42 // CRC IV Kopie von 0xdc77 20a8 01 08 00 ld bc, 0x0008 // Länge 8 20ab CD 1F 1B call 0x1b1f // CRC2 Berechnung und Prüfung, Übergabe HL Wertebereich, BC Länge, (0xdc2b) CRC für Prüfung; Rückgabe A 0 = io, 0xff = falsch 20ae F6 00 or 0x00 // a <> 0 20b0 C2 DB 02 jpnz 0x02db // BLOCKIERUNG 5 // Festlegung Init-Vektor CRC 20b3 21 00 00 ld hl, 0x0000 20b6 22 FD 93 ld (0x93fd), hl // Start Initialisierung CRC Vektor // Blockkopieren; Feistel 20b9 21 42 DC ld hl, 0xdc42 20bc 11 96 DE ld de, 0xde96 20bf 01 08 00 ld bc, 0x0008 // Länge 8 20c2 ED B0 ldir // kopiere (0xdc42) > (0xde96) 8 byte 20c4 CD 3D 1C call 0x1c3d // Feistel vorwärts, Übergabe/Rückgabe 0xde96 20c7 21 96 DE ld hl, 0xde96 // Wurmfolgen 20ca 11 42 DC ld de, 0xdc42 20cd 01 08 00 ld bc, 0x0008 // Länge 8 20d0 ED B0 ldir // Kopiere (0xde96) > (0xdc42) 8 byte 20d2 2A FB 93 ld hl, (0x93fb) // Zeiger auf Adresse mit der Länge; Zeiger 0x8303 20d5 01 08 00 ld bc, 0x0008 20d8 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 20d9 ED 42 sbc hl, bc // Länge > -1; Länge Modular 8 20db 30 04 jrnc 0x04 >-/ // 0x20e1; kein Unterlauf - Ergebnis > 0 20dd 09 add hl, bc | // Modular 0x08, Rest 20de 45 ld b, l | // Rest (z.B. -1) + 0x08 = 0x07 20df 18 02 jr 0x02 | // 0x20e3, Übergabe Länge in B, kleiner 0x08! // Einsprung aus 0x20bd; L > 7 | 20e1 06 08 ld b, 0x08 <-/ // B = 0x08 // Einsprung L = 1 ... 7, B = L Schleifenvariable 20e3 21 42 DC ld hl, 0xdc42 20e6 ED 5B FD 93 ld de, (0x93fd) // CRC Vektor, zu Anfang = 0, später der letzte CRC Wert -Schleife- // Schleife Rundenanzahl 8,7,6,5,4,3,2,1 20ea 7E ld a, (hl) 20eb CD 3F 1B call 0x1b3f <-\ // CRC2-16 mit Übergabe des Vektors, Übergabe DE CRC Vektor, A Wert, Rückgabe DE CRC 20ee 23 inc hl | 20ef 10 F9 djnz 0xf9 >-/ // 0x20eb; Standard 8 Runden; ansonsten 1 bis 7 Runden - s. 0x20d5 // CRC über den 64 Bit Block 20f1 ED 53 FD 93 ld (0x93fd), de // CRC in 0x93fd addressierten Bereich ablegen 20f5 2A FB 93 ld hl, (0x93fb) // gespeicherte Länge 20f8 01 08 00 ld bc, 0x0008 // 8 byte 20fb AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 20fc ED 42 sbc hl, bc // Länge == 0, Länge <> 0 20fe 22 FB 93 ld (0x93fb), hl // Länge in (0x93fb) 2101 28 02 jrz 0x02 // 0x2105; Länge == 0 2103 30 B4 jrnc 0xb4 // 0x204f, Länge == -1; PP Starten -> Fehler aufgetreten und Versuch diesen zu ermitteln // Länge OK 2105 2A 59 83 ld hl, (0x8359) // CRC des ?klartextes? 2108 ED 5B FD 93 ld de, (0x93fd) // vorherig berechnete CRC; IV 210c 7A ld a, d 210d AC xor h 210e 57 ld d, a // D = D xor H 210f 32 85 DC ld (0xdc85), a // Speichern D = D xor H 2112 7B ld a, e 2113 AD xor l 2114 5F ld e, a // E = E xor L 2115 32 86 DC ld (0xdc86), a // Speichern E = E xor L; x0dc85 ... 0xde86 = DE = DE XOR HL; weitere Verwendung? 2118 21 40 95 ld hl, 0x9540 211b 46 ld b, (hl) 211c 23 inc hl // 0x9541, ... 211d 4E ld c, (hl) // Hole 16bit Wert 211e EB ex de, hl // Tausche Inhalt DE mit HL; HL-0x9540 : DE-0xdc85 == DE XOR HL; danach HL = HL XOR DE; DE = 0xdec85 CRC IV 211f AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2120 ED 42 sbc hl, bc // HL != HL + 1; IV - (0x9540) 2122 C2 DB 02 jpnz 0x02db // BLOCKIERUNG 5; HL ist <> 0 Fehler CRC IV // Textspeicher testen vor Nutzung; weiter CRC IV richtig 2125 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 2128 22 C6 DC ld (0xdcc6), hl // Zeiger auf Klartexspeicher; GL.EAKTS 212b 01 FF 03 ld bc, 0x03ff // Länge 0x3ff, 1024 byte 212e CD 5F 1B call 0x1b5f // Lösche Bereich; Übergabe HL, Länge BC 2131 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 2124 01 FF 03 ld bc, 0x03ff // Länge 0x3ff, 1024 byte 2127 CD B4 28 call 0x28b4 // Prüfe (HL) == 0x00 212a F6 00 or 0x00 // a <> 0 ? 212c C2 DB 02 jpnz 0x02db // BLOCKIERUNG 5 // Textspeicher 0x8400 - 0x87ff OK 212f 21 00 88 ld hl, 0x8800 // Textspeicher empfangen 2132 01 FF 03 ld bc, 0x03ff // Länge 0x3ff, 1024 byte 2135 CD B4 28 call 0x28b4 // Prüfe (HL) == 0x00 2138 F6 00 or 0x00 // A <> 0? 213a C2 DB 02 jpnz 0x02db // BLOCKIERUNG 5 // Textspeicher 0x8800 - 0x8cff OK 213d 21 42 DC ld hl, 0xdc42 // Lösche Zeitschlüsselbereich 2150 01 32 00 ld bc, 0x0032 // 50 byte 2153 CD 5F 1B call 0x1b5f // Lösche Bereich; Übergabe HL, Länge BC 2156 21 42 DC ld hl, 0xdc42 // Prüfe ob Zeitschlüsselbereich gelöscht ist 2159 01 32 00 ld bc, 0x0032 215b CD B4 28 call 0x28b4 // Prüfe (HL) == 0x00 215f F6 00 or 0x00 // A <> 0? 2161 C2 DB 02 jpnz 0x02db // BLOCKIERUNG 5 // Ende Prüfung Textspeicher 2164 FB EI // Interrupt für Rauschgenerator freigeben 2165 3E 40 ld a, 0x40 // ZF-Erzeugung 0x40 2167 32 90 DC ld (0xdc90), a // Betriebsart Zufallsgenerator bit 7, 6, 5 216a CD 0E 08 call 0x080e // Zufallsfolge 216d 3A 90 DC ld a, (0xdc90) // Betriebsart Zufallsgenerator bit 7, 6, 5 2170 CB 77 bit 6, a // Bit 6, Zufallsfolge Error 2172 C2 D3 02 jpnz 0x02d3 // BLOCKIERUNG 3, HALT 2175 3E FB ld a, 0xfb // Steuerwort - Bereit Chiffrieren 2177 32 2E DC ld (0xdc2e), a // Steuerwort nach Kontrollchiffr. u. Löschen KTXT 217a 2A 00 81 ld hl, (0x8100) // Zeiger, Länge Variablenspeicher 217d 11 68 01 ld de, 0x0168 // 360 byte 2180 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2181 ED 52 sbc hl, de // Länge <> 360 byte? 2183 C2 DB 02 jpnz 0x02db // <> 360 byte; BLOCKIERUNG 5 2186 CD 4A 02 call 0x024a // CTC Kanal 3 Einschalten Tastatur CTC 2189 C3 BE 01 jp 0x01be // Menüprogramm // Empfangsroutine GO 218c 3A 00 DC ld a, (0xdc00) // Arbeitsspeicher, Hauptbetriebsart-1; GL.HBA 218f FE 01 cp 0x01 // a == 1, MIRA 2191 CA DB 24 jpz 0x24db // Sprung bei MIRA 2194 DB 05 in a, (0x05) // Lese PIO-1-B-D 2196 CB FF set 7, a // Bit 7 = 1 Empfangsspannungen 2198 D3 05 out (0x05), a // PIO-1-B-D; EINSCHALTEN DER Empfangsstufenspannungen 219a CD 21 02 call 0x0221 // Zeitschleife 70ms 219d 3E 09 ld a, 0x09 // "EMPFANGEN?" 219f CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 21b2 21 00 90 ld hl, 0x9000 // GeheimtextspeicherZifferncode, GTX-Speicher empfangen; GL.SPE 21b5 22 A0 DC ld (0xdca0), hl // Zeiger auf 0x9000; GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 21b8 22 A4 DC ld (0xdca4), hl // Zeiger auf 0x9000 21bb 01 FF 03 ld bc, 0x03ff // 1024 byte 21be CD 5F 1B call 0x1b5f // Lösche Bereich; Übergabe HL, Länge BC 21c1 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 21c2 32 91 DC ld (0xdc91), a 21c5 3E 0F ld a, 0x0f 21c7 32 9C DC ld (0xdc9c), a 21ca 21 50 00 ld hl, 0x0050 // Mittelwert Zeitkonstante 21cd 22 98 DC ld (0xdc98), hl 21c0 22 9A DC ld (0xdc9a), hl 21c3 21 14 00 ld hl, 0x0014 // Grundzeit für Halb-Bit 21c6 22 96 DC ld (0xdc96), hl // Speichern 0x14 0x00 21c9 FD 21 96 DC ld iy, 0xdc96 // IY Zeiger auf 0xdc96 (0x14) 21cd DB 05 in a, (0x05) // Lese PIO-1-B-D; Kontrolle ob Modem vorhanden 21cf CB 47 bit 0, a // bit 0 == true 21d1 CA 15 22 jpz 0x2215 // Empfangsroutine Akkustikkoppler 21d4 21 9C 00 ld hl, 0x009c // Empfang über Modem; Vorbereitung Empfangs PIO 21d7 7D ld a, l // Steuerwort 0x9c; Eingang bit: 2 3 4 7 Ausgabe bit: 0 1 5 6 21d8 D3 06 out (0x06), a // PIO-1-A-C; Steuerwort; neuer Vektor 21da 3E 01 ld a, 0x01 21dc 32 9D DC ld (0xdc9d), a // Voreinstellung Flanke 21df 3E D7 ld a, 0xd7 // nur Bit 6 IR 21e1 D3 06 out (0x06), a // Steuerwort-PIO-1-A 21e3 3E BF ld a, 0xbf // bei H-> Flanke 21e5 D3 06 out (0x06), a // Steuerwort-PIO-1-A 21e7 C3 32 22 jp 0x2231 // EM1; Laufende Arbeit während des Empfangs // Datenlesen Interrupt Routine für Modem 21ea F5 push af 21eb C5 push bc 21ec D5 push de 21ed E5 push hl // Register retten 21ee CD F7 21 call 0x21f7 // Aufruf Datenlesen Modem 21f1 E1 pop hl 21f2 D1 pop de 21f3 C1 pop bc 21f4 F1 pop af // Register wiederherstellen 21f5 FB EI 21f6 C9 ret // Datenlesen Interrupt Routine für Modem, Umprogrammieren PIO 21f7 0E 06 ld c, 0x06 // PIO Kanal 21f9 06 D7 ld b, 0xd7 21fb 16 BF ld d, 0xbf 21fd 3A 9D DC ld a, (0xdc9d) // GL.FLANK; ZADE: Länge 2 ; Aktueller Zeiger GTE 2200 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 2201 28 02 jrz 0x02 // 0x2205 2203 06 F7 ld b, 0xf7 2205 ED 41 out (c), b // PIO-1-A-C 2207 ED 51 out (c), d // PIO-1-A-C 2209 EE 01 xor 0x01 220b 32 9D DC ld (0xdc9d), a // GL. FLANK; ZADE: Länge 2 ; Aktueller Zeiger GTE 220e A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 220f C2 85 23 jpnz 0x2385 // Wechsel 0-->1 gewesen 2212 C3 42 23 jp 0x2342 // Wechsel 1-->0 gewesen // Empfangsroutine Akustikkoppler; EMAK 2215 0E 06 ld c, 0x06 2217 3E F7 ld a, 0xf7 // Steuerwort 2219 06 7F ld b, 0x7f // OIII IIII E/A 221b ED 79 out (c), a // PIO-1-A-C 221d ED 41 out (c), b // Neuinitialisierung 221f DB 05 in a, (0x05) // Lese PIO-1-B-D; Sonderschnittstelle 2221 CB D7 set 2, a // Schalte bit 2 auf 1 2223 D3 05 out (0x05), a // PIO-1-B-D; Sonderschnittstelle 2225 CD 21 02 call 0x0221 // Zeitschleife 70ms 2228 0E 0A ld c, 0x0a // CTC Kanal 2 222a 3E 17 ld a, 0x17 // Steuerwort 222c 06 FF ld b, 0xff // Zeitkonstante 222e ED 79 out (c), a // CTC Kanal 2 DI, Timer, Vorteiler 16, pos. Flanke, Zeitkonstante folgt, RESET 2230 ED 41 out (c), b // Zeitkonstante 255 * 16 / 1340 kHz = 3,04 ms // EM1; Laufende Arbeit während des Empfangs 2232 3A 9C DC ld a, (0dc9c) // GL.ZEMPF 2235 CB 4F bit 1, a // bit 1 == true 2237 28 15 jrz 0x15 // 0x224e; EMPFANGEN BEENDET 2239 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 223c FE 43 cp 0x43 // a == 0x43, ENTER 223e 28 0E jrz 0x03 // 0x224e, ENDE 2240 3A 15 DC ld a, (0xdc15) // (GL.AMER) 2243 FE 0F cp 0x0f // a == 0x0f, Taste SE 2245 28 07 jrz 0x07 // 0x224e 2247 3A 16 DC ld a, (0xdc16) // (GL.BMER) 224a FE 0F cp 0x0f // a <> 0x0f, 224c 20 E4 jrnz 0xe4 // 0x2232 // Empfangsabbruch, CTC und PIO IR Sperren; Umprogrammieren PIO-1-A 224e 3E 21 ld a, 0x21 // DI, Zeitgeber, Vorteiler 256, neg. Flanke 2250 D3 0A out (0x0a), a // CTC Kanal 2 Zeitgeber 2252 D3 09 out (0x09), a // CTC Kanal 1 Zeitgeber 2254 DB 05 in a, (0x05) // Lese PIO-1-B-D; Lese Sonderschnittstelle 2256 CB 97 res 2, a // Lösche Bit 2, Ausschalten von ... 2258 D3 05 out (0x05), a // PIO-1-B-D; Sonderschnittstelle 225a 3E FF ld a, 0xff // PIO-1-A Betriebsart 3 225c D3 06 out (0x06), a // PIO-1-A-C 225e 3E C4 ld a, 0xc4 // Eingänge bit: 2 6 7 Ausgänge bit: 0 1 3 4 5 2260 D3 06 out (0x06), a // PIO-1-A-C 2262 3E 67 ld a, 0x67 // Maskensteuerwort 2264 D3 06 out (0x06), a // PIO-1-A-C, INT. VERBOTEN 2266 21 9A 00 ld hl, 0x009a // Stuerwort 2269 7D ld a, l // Maske bit/ Interrupt Vektor? 226a D3 06 out (0x06), a // PIO-1-A-C 226c CD 4A 02 call 0x024a // CTC Kanal 3 Einschalten Tastatur CTC // Ausschalten der Empfangsspannungen 226f DB 05 in a, (0x05) // Lese PIO-1-B-D; Sonderschnittstelle 2271 CB BF res 7, a // Lösche Bit 7 2273 D3 05 out (0x05), a // PIO-1-B-D; Sonderschnittstelle 2275 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 2278 CB 86 res 0, (hl) // Lösche neuen Tastendruck 227a 3A 9C DC ld a, (0xdc9c) // (GL.ZEMPF) 227d A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 227e CA BE 01 jpz 0x01be // Menüprogramm 2281 FE 0F cp 0x0f // a == 0x0f, 2283 CA BE 01 jpz 0x01be // Menüprogramm NORMALES ENDE 2286 CB 57 bit 2, a // bit 2 == false 2288 20 02 jrnz 0x02 // 0x228c IV FALSCH; Empfangsfehler 228A 18 16 jr 0x16 // 0x22a2 TEXT FALSCH // Empfangsfehlerbearbeitung // IV Falsch 228c 3E 10 ld a, 0x10 // "WIEDERHOLUNG"; Erscheint bei falscheingaben des GTX innerhalb der IV bzw. der CRC-16_true 228e CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 2291 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2292 32 03 DC ld (0xdc03), a // ZUALF:-Zustand Alpha-Tastendruck 2295 CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 2298 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 229b FE 43 cp 0x43 // a <> 0x43, Taste: "C"/ENTER 229d 20 F6 jrnz 0xf6 // 0x2295 229f C3 BE 01 jp 0x01be // Menüprogramm // Text fehlerhaft 22a2 3E 11 ld a, 0x11 // "TEXTFEHLER" 22a4 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 22a7 CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 22aa 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 22ad FE 43 cp 0x43 // a <> 0x43, ENTER 22af 20 F6 jrnz 0xf6 // 0x22a7 22b1 C3 BE 01 jp 0x01be // Menüprogramm // CTC Interrupt Routine 22b4 F5 push af // rette AF 22b5 FD CB 03 46 bit 0, (iy+0x03) // bit 0 == false 22b9 FD CB 03 C6 set 0, (iy+0x03) // UBERTRAG DER BITLÄNGE 22bd 20 04 jrnz 0x04 // 0x22c3; 22bf F1 pop af // wiederherstellen AF // Einsprung Routine beenden 22c0 FB EI 22c1 ED 4D RETI // Einsprung aus CRC Interrupt Routine 22c3 3E A7 ld a, 0xa7 // DI, Zeitgeber, Vorteiler 256, neg. Flanke, Zeitkonstante folgt RESET; EINSCHALTEN DER TASTATZR 22c5 D3 0B out (0x0b), a // CTC Kanal 3 Zeitgeber, BEI BYTE-ZEITÜBERSCHREITUNG 22c7 3E 31 ld a, 0x31 // Zeitkonstent ZK = 49 * 256 / f in ms 22c9 D3 0B out (0x0b), a // CTC Kanal 3 Takt 22cb 18 F2 jr 0xf2 // 0x22c0; EI RETI // DATENEINLESE Interrupt ROUTINE FÜR Akustikkoppler 22cd F5 push af 22ce C5 push bc 22cf D5 push de 22d0 E5 push hl // Register retten 22d1 CD DA 22 call 0x22da // DATENLESEROUTINE 22d4 E1 pop hl 22d5 D1 pop de 22d6 C1 pop bc 22d7 F1 pop af // wiederherstellen Register 22d8 FB EI 22d9 C9 ret // DATENLESEROUTINE Bereich 0 EINLESEN DER CTC-STÄNDE 22da 0E 0A ld c, 0x0a // ZP:CTC Kanal 2 22dc ED 78 in a, (c) // Lese CTC Kanal 2 22de 2F cpl // A != A 22df 47 ld b, a 22e0 FE 3C cp 0x3c // STÖRUNG ? 22e2 DA 21 23 jpc 0x2321 // JA 22e5 3E 17 ld a, 0x17 // VT 16 OHNE IR; DI, Timer, Vorteiler 16, pos. Flanke, Zeitkonstante folgt, RESET 22e7 ED 79 out (c), a // CTC Kanal 2 Timer 22e9 3E FF ld a, 0xff // Zeitkonstante 255 * 16 / 1340 kHz = 3,04 ms 22eb ED 79 out (c), a // CTC Kanal 2 Takt 22ed 78 ld a, b 22ee FE 60 cp 0x60 // LÜCKE IM DATENFLUSS ? 22f0 D2 21 23 jpnc 0x2321 // JA // Software PLL; BESTIMMUNG DER ZEITABWEICHUNG 22f3 FE 4C cp 0x4c // MITTELWERT ZW: FO UND FU 22f5 30 1B jrnc 0x1b // 0x2312 a => 0x1b springe // ZEITKONSTANTE KLEINER MACHEN 22f7 3A 9A DC ld a, (0xdc9a) 22fa FE 4C cp 0x4c // a == 0x4c, UNTERE GRENZE 22fc 28 23 jrz 0x23 // 0x2321 22fe FE 4D cp 0x4d // UNTERE SCHALTSCHWELLE 2300 F5 push af // rette AF 2301 D6 01 sub 0x01 2303 32 9A DC ld (0xdc9a), a // NEUE KLEINERE ZEITKONSTANTE 2306 47 ld b, a 2307 F1 pop af // wiederherstellen AF 2308 38 17 jrc 0x17 // 0x2321 BEREITS UNTERE SCHALTSCHWELLE 230a 78 ld a, b // ZEIK3 NEU 230b FE 4D cp 0x4d 230d 30 12 jrnc 0x12 // 0x2321 a => 0x12 //UMSCHALTSCHWELLE PASSIERT LOG 1 SETZEN 230f C3 85 23 jp 0x2385 //ZEITKONSTANTE GRÖßER MACHEN 1->= 2312 3A 9A DC ld a, (0xdc9a) // ZEIK3 2315 FE 53 cp 0x53 // a == 0x53, OBERE GRENZE 2317 28 08 jrz 0x08 // 0x2321 2319 3C inc a 231a FE 51 cp 0x51 // a == 0x51, OBERE SCHALTSCHWELLE 231c 32 9A DC ld (0xdc9a), a // Zeitkonstante //UMSCHALTSCHWELLE PASSIERT; LOG 0 SETZEN 231f 28 21 jrz 0x21 // 0x2342 //AUSSPRUNG NACH KURZEN DURCHLAUF 2321 E1 pop hl 2322 21 D4 22 ld hl, 0x22d4 2325 E5 push hl 2326 ED 4D RETI // EINLESE UP FÜR CTC-STAND DER FLANKENABSTÄNDE 2328 DB 09 in a, (0x09) // CTC Kanal 1 Lese Zähler/Timer 232a 2F cpl 232b 32 98 DC ld (0xdc98), a // GESAMTLÄNGE ZWISCHEN ZWISCHEN FLANKEN - ABSTÄNDE 232e 3E B7 ld a, 0xb7 // RESET, Zeitkonstante folgt, EI Zeitgeber Vorteiler 256 pos. Flanke 2330 D3 09 out (0x09), a // CTC Kanal 1 Zeitgeber 2332 3E FF ld a, 0xff // 255 * 256 /f in ms 2334 D3 09 out (0x09), a // CTC Kanal 1 Takt // SPERRUNG DER TASTATUR CTC 2336 3E 21 ld a, 0x21 // DI, Zeitgeber, Vorteiler 256, neg. Flanke 2338 D3 0B out (0x0b), a // CTC Kanal 3 Zeitgeber IR-KETTE FREISCHALTEN 233a 21 41 23 ld hl, 0x2341 233d E5 push hl 233e FB EI 233f ED 4D RETI 2341 C9 RET // oder CTC Wert //BERECHNUNG DATENBYTE BEI GEWESENEN EINSEN // Übergabe B 2342 CD 28 23 call 0x2328 // EINLESE UP FÜR CTC-STAND DER FLANKENABSTÄNDE 2345 CD A2 24 call 0x24a2 // BITANZAHL IN B, N > 0x0002 N < 0x1f0; Übergabe HL, Rückgabe B Anzahl, 0xdc99 Status 2348 3A 9E DC ld a, (0xdc9e) 234b 80 add a, b // B = Anzahl + (0xdc9e) 234c FE 09 cp 0x09 // größer 8 234e 38 0D jrc 0x0d // 0x235b; a > 9 springe 2350 3A 9E DC ld a, (0xdc9e) // <= 8 2353 47 ld b, a // ANZAHL; 0xdc9e 2354 3E 08 ld a, 0x08 2356 90 sub b // Rest 2357 30 01 jrnc 0x01 // 0x235a 2359 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 // größer 8 235a 47 ld b, a // B = 0 235b 3E 08 ld a, 0x08 // größer 9 235d 32 9E DC ld (0xdc9e), a // Anzahl = 8 2360 3A 9F DC ld a, (0xdc9f) // VORE: Länge 1; Vorbereitung X1.DCA // Schleife 2363 37 scf // EINSEN REINSCHREIBEN; carry = 1 2364 04 inc b // B = 1 wenn <= 8, B > 8 Schleifenzähler 2365 05 dec b // B war 0 2366 28 07 jrz 0x07 // 0x236f, Abbruch 2368 1F rra // rotieren A; carry -> A7 -> A0 -> carry 2369 05 dec b // Schleifenzähler B 236a 32 9F DC ld (0xdc9f), a // VORE: Länge 1 ; Vorbereitung X1.DCA 236d 18 F4 jr 0xf4 // 0x2363, Schleife // Abbruch 236f 3A 9E DC ld a, (0xdc9e) // Übergabe oder 8 2372 FE 08 cp 0x08 // a <> 8 2374 C0 retnz // Springe a <> 8 // AUSWAHL des EMPFANGSZUSTANDES // a = 8 2375 3A 91 DC ld a, (0xdc91) // Berechne Sprungadresse, mit 0xdc91 2378 87 add a, a // 2 * a 2379 4F ld c, a // 237a 06 00 ld b, 0x00 // 0x00, 2*a 237c 21 83 25 ld hl, 0x2583 // Tabelle Sprungadressen 237f 09 add hl, bc // HL = 0x2583 + 2*(0xdc91) 2380 5E ld e, (hl) 2381 23 inc hl 2382 56 ld d, (hl) 2383 EB ex de, hl 2384 E9 jp (hl) // Einsprung in die berechnete Adresse, Programm 1 ... 5 // 0x2583 Programm: 0x23c7; DBAA Suche Anfangskennung // 0x2585 Programm: 0x23e6; DBSY Lese IV // 0x2587 Programm: 0x2401; CRCSY CRC IV // 0x2589 Programm: 0x2436; DALAE Datenlänge // 0x258b Programm: 0x2461; DBGT Datenlänge GTX // HINWEIS: SY = Synchronfolge ist nicht existent sondern nur Initialisierungs-Vektor IV // BERECHNUNG DATENBYTE BEI GEWESENEN NULLEN 2385 CD 28 23 call 0x2328 // EINLESE UP FÜR CTC-STAND DER FLANKENABSTÄNDE 2388 CD A2 24 call 0x24a2 // BITANZAHL IN B, N > 0x0002 N < 0x1f0 238b 3A 9E DC ld a, (0xdc9e) 238e FE 08 cp 0x08 // a <> 8 2390 20 13 jrnz 0x13 // 0x23a3 2392 3A 91 DC ld a, (0xdc91) // AMEISE 2395 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 2396 28 08 jrz 0x08 // 0x23a3 2398 2A A0 DC ld hl, (0xdca0) // GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 239b 2B dec hl 239c 7E ld a, (hl) 239d CD 54 02 call 0x0254 // Indikator Senden und Empfang (Ameisen) 23a0 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0; NEUES BYTE 23a1 32 9E DC ld (0xdc9e), a // Anzahl Bits 23a4 05 dec b // STARTBIT FORTLASSEN 23a5 80 add a, b 23a6 FE 09 cp 0x09 23a8 38 0A jrc 0x0a // 0x23ba a <= 0x09 dann springe 23aa 47 ld b, a 23ab 3E 08 ld a, 0x90 23ad 90 sub b 23ae 30 01 jrnc 0x01 // 0x23b1 23b0 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 23b1 47 ld b, a 23b2 3E 08 ld a, 0x08 23b4 32 9E DC ld (0xdc9e), a // Anzahl der Bits 23b7 3A 9F DC ld a, (0xdc9f) // VORE: Länge 1; Vorbereitung X1.DCA 23ba A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0; NULLEN REINSCHREIBEN 23bb 04 inc b 23bc 05 dec b 23bd CA A1 24 jpz 0x24a1 // b == 0?, Abbruch 23c0 1F rra // rotiere A; carry -> A7 -> A0 -> carry 23c1 05 dec b 23c2 32 9F DC ld (0xdc9f), a // VORE: Länge 1 ; Vorbereitung X1.DCA 23c5 18 F3 jr 0xf3 // 0x23bb, Schleife // Anfangskennung 16 * 0xff und 2 * 0xaa // Suchen der Anfangskennung Berechnet in 0x2375, Übergabe HL, Rückgabe (0xdc94) HL // DBBA 23c7 3A 9F DC ld a, (0xdc9f) // LETZTES BYTE VORE: Länge 1 ; Vorbereitung X1.DCA 23ca 21 94 DC ld hl, 0xdc94 // ANZAHL DER AA 23cd 34 inc (hl) 23ce FE AA cp 0xaa // a == 0xaa 23d0 28 03 jrz 0x03 // 0x23d5; AA IST 23d2 36 00 ld (hl), 0x00 23d4 C9 ret // KEIN AA // Einsprung 23d5 3E 02 ld a, 0x02 23d7 BE cp (hl) // (hl) <> 2 23d8 C0 RETNZ // ERST EIN AA 23d9 36 00 ld (hl), 0x00 23db 3E 01 ld a, 0x01 23dd 32 91 DC ld (0xdc91), a 23e0 21 9C DC ld hl, 0xdc9c 23e3 CB 86 res 0, (hl) 23e5 C9 ret // Programm: EINLESEN IV, Berechnet in 0x2375, Übergabe HL // DBSY 23e6 3A 9F DC ld a, (0xdc9f) // GL.DBYTE; VORE: Länge 1; Vorbereitung X1.DCA 23e9 2A A0 DC ld hl, (0xdca0) // GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 23eb 77 ld (hl), a 23ec 23 inc hl 23ed 22 A0 DC ld (0xdca0), hl // GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 23f1 21 94 DC ld hl, 0xdc94 23f4 34 inc (hl) 23f5 3E 08 ld a, 0x08 23f7 BE cp (hl) // (hl) <> 8 23f8 C0 RETNZ // Rückspung wenn <> 8 23f9 36 00 ld (hl), 0x00 23fb 3E 02 ld a, 0x02 23fd 32 91 DC ld (0xdc91), a 2400 C9 ret // Programm: EINLESEN UND PRÜFEN CRC DER IV, Berechnet in 0x2375, Übergabe HL // CRCSY 2401 3A 9F DC ld a, (0xdc9f) // VORE: Länge 1; Vorbereitung X1.DCA 2404 2A A0 DC ld hl, (0xdca0) // GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 2407 77 ld (hl), a 2408 23 inc hl 2409 22 A0 DC ld (0xdca0), hl // GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 240c 21 94 DC ld hl, 0xdc94 240f 34 inc (hl) 2410 3E 02 ld a, 0x02 2412 BE cp (hl) // (hl) <> 2 2413 C0 RETNZ 2414 36 00 ld (hl), 0x00 2416 3E 03 ld a, 0x03 2418 32 91 DC ld (0xdc91), a // KONTROLLE CRC DER SYF 241b 21 08 90 ld hl, 0x9008 // Adresse der CRC des IV 241e 22 2B DC ld (0xdc2b), hl // Speicherort CRC für Prüfung 2421 21 00 90 ld hl, 0x9000 // GeheimtextspeicherZifferncode, GTX-Speicher empfangen; GL.SPE 2424 01 08 00 ld bc, 0x0008 // Länge 8 byte 2427 CD 1F 1B call 0x1b1f // CRC2 Berechnung und Prüfung, Übergabe HL Wertebereich, BC Länge, (0xdc2b) CRC für Prüfung; Rückgabe A 0 = io, 0xff = falsch 242a A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 242b 21 9C DC ld hl, 0xdc9c 242e 20 03 jrnz 0x03 // 0x2433; CRC-WERT FALSCH 2430 CB 96 res 2, (hl) // 0xdc9c = xxxx x0xx 2432 C9 ret 2433 CB 8E res 1, (hl) // 0xdc9c = xxxx xx0x 2435 C9 ret // Programm: EINLESEN DATENLÄNGE, Berechnet in 0x2375 // DALAE 2436 3E 02 ld a, 0x02 2438 11 93 DC ld de, 0xdc93 // N4: Länge 4; Reg. Mod-Verknüpfung 243b 21 94 DC ld hl, 0xdc94 243e 34 inc (hl) 243f BE cp (hl) // (hl) == 2? 2440 3A 9F DC ld a, (0xdc9f) // VORE: Länge 1; Vorbereitung X1.DCA 2443 28 0B jrz 0x0b // 0x2450; (HL+1) == 2 2445 EB ex de, hl // Tausch DE<>HL 2446 77 ld (hl), a // (0xdc93) = (0xdc9f) 2447 2A A0 DC ld hl, (0xdca0) // GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 244a 77 ld (hl), a // Zeiger(0xdca0) = (0xdc9f) 244b 23 inc hl 244c 22 A0 DC ld (0xdca0), hl // GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 244f C9 ret // (HL+1) == 2 2450 EB ex de, hl // Tausch DE<>HL 2451 2B dec hl // HL = 0xdc92 2542 77 ld (hl), a // (0xdc92) = 2 2453 2A A0 DC ld hl, (0xdca0) // GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 2456 77 ld (hl), a // Zeiger (0xdca0) = 2 2457 23 inc hl 2458 22 A0 DC ld (0xdca0), hl // GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 245b 3E 04 ld a, 0x04 245d 32 91 DC ld (0xdc91), a // Zeiger (0xdc91) = 4 2460 C9 ret // Programm: EINLESEN GT, Berechnet in 0x2375, Übergabe HL // DBGT 2461 3A 9F DC ld a, (0xdc9f) // GL.DBYTE; VORE: Länge 1; Vorbereitung X1.DCA 2464 2A A0 DC ld hl, (0xdca0) // GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 2467 77 ld (hl), a 2468 23 inc hl 2469 22 A0 DC ld (0xdca0), hl // GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 246c 22 A4 DC ld (0xdca4), hl // Zeiger 246f 2A 92 DC ld hl, (0xdc92) // Hole neue Adresse 2472 11 01 00 ld de, 0x0001 2475 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 2476 ED 52 sbc hl, de // Länge > 0 2478 22 92 DC ld (0xdc92), hl // Lege Länge ab 247b C0 RETNZ // > 0, Rücksprung // CRC-ÜBERPRÜFUNG GTX; Weiter 247c F3 DI // Sperre Interrupt 247d 2A A0 DC ld hl, (0xdca0) // GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 2480 2B dec hl 2481 2B dec hl // neuer Adresszeiger 2482 22 2B DC ld (0xdc2b), hl // Speicherort CRC für Prüfung 2485 11 0C 90 ld de, 0x900c // Startadresse GTX 2488 2A A4 DC ld hl, (0xdca4) // End-Adresse GTX 248b A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 248c ED 52 sbc hl, de // Länge GTX 248e E5 push hl // Registerwechsel 248f C1 pop bc // BC = HL 2490 0B dec bc 2491 0B dec bc // alte Adresse von HL 2492 EB ex de, hl // DE <--> HL, Tausch Registerinhalte 2493 CD 1F 1B call 0x1b1f // CRC2 Berechnung und Prüfung, Übergabe HL Wertebereich, BC Länge, (0xdc2b) CRC für Prüfung; Rückgabe A 0 = io, 0xff = falsch 2496 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 2497 21 9C DC ld hl, 0xdc9c // Zeiger auf ... 249a 20 02 jrnz 0x02 // Ergebnis der CRC Prüfung <> 0, 0x249e, 249c CB 9E res 3, (hl) // EMPFÄNGERFOLGE RICHTIG // Einsprung CRC-Prüfung <> 0 249e CB 8E res 1, (hl) // Empfangsfolge Falsch 24a0 FB EI 24a1 C9 ret //UP "ANZAL" ZUR BESTIMMUNG DER ANZAHL; GLEICHER BITS HINTEREINANDER // Übergabe HL, Rückgabe B Anzahl, 0xdc99 Status 24a2 21 98 DC ld hl, 0xdc98 // Übergabe HL 24a5 CD C0 24 call 0x24c0 // Plausibilitätskontrolle > 0x0002 < 0x01f0; Klartextlänge BA2 < 500; Übergabe HL 24a8 2A 98 DC ld hl, (0xdc98) // Rückgabe HL, HL + 1 = Rückgabe 0x00 >1 und < 496; oder 0x01 < 2 Zeichen 24ab 3A 96 DC ld a, (0xdc96) // s. 0x21c6; 0x14,0x00 24ae 5F ld e, a 24af 16 00 ld d, 0x00 // DE = 0x00, (0xdc96) 24b1 06 00 ld b, 0x00 // Zählervariable // Schleife, Zähler 24b3 04 inc b // Zähler B 24b4 A7 and a // carry-Flag = 0 24b5 ED 52 sbc hl, de // Länge (0xdc98) - 0x00(0xdc96) 24b7 30 FA jrnc 0xfa // 0x24b3, kein Überlauf Zähler B erhöhen 24b9 CB 38 srl b // schiebe B, 0 -> B7 -> B0 -> carry; B = B/2 24bb AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 24bc 32 99 DC ld (0xdc99), a // 0xdc99 = 0 24bd C9 ret // Rückgabe B // PLAUSIBILITÄTSKONTROLLE DER ZÄHLER; ZÄHLER DARF NICHT KLEINER ALS 0x0002 UND // NICHT GRÖßER ALS 0x01f0 SEIN // BA2 darf der Klartext nicht größer als 500 sein (0x1f4) - CRC16 // Übergabe HL, Rückgabe (HL) 0xdc99 = 0 oder 1 24c0 5E ld e, (hl) // e = (0xdc98) 24c1 23 inc hl // HL = 0xdc99 24c2 56 ld d, (hl) // d = (0xdc99) -> Parameter aus 0x0050 24c3 E5 push hl // rette HL, 0xdc99 24c4 21 01 00 ld hl, 0x0001 24c7 A7 and a // carry-Flag = 0 24c8 ED 52 sbc hl, de // HL = HL - (0xdc99, 0xdc98) 24ca 38 04 jrc 0x04 // 0x24d0, Textlänge größer 1 24cc E1 pop hl // wiederherstellen HL = 0xdc99 24cd 36 01 ld (hl), 0x01 // (0xdc99) = 0x01, Länge <= 1 24cf C9 ret // Bei Überlauf aus 0x24c0, 24d0 21 F0 01 ld hl, 0x01f0 // Textlänge BA2; 496 byte 24d3 A7 and a // carry-Flag = 0 24d4 ED 52 sbc hl, de // Länge > 496 24d6 E1 pop hl // wiederherstellen HL = 0xdc99 24d7 D0 retnc // Länge > 496 24d8 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 24d9 77 ld (hl), a // 0xdc99 = 0; Länge im Bereich von 2 bis 496 24da C9 ret // Geheimtexteingabe BEI MIRA 24db 3E 12 ld a, 0x12 // "GTX ERSTELLEN" 24dd CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 24e0 3E 02 ld a, 0x02 // Betriebsart GT erstellen 24e2 32 01 DC ld (0xdc01), a // BA MERKEN, Betriebsartenregister // REGISTER VORBEREITEN 24e5 21 00 8C ld hl, 0x8c00 // GeheimtextspeicherText (A-P) 24e8 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 24eb 22 1F DC ld (0xdc1f), hl // AADRT:-Anfangsadresse Textspeicher 24ee 11 FF 03 ld de, 0x03ff 24f1 19 add hl, de 24f2 22 21 DC ld (0xdc21), hl // EADRT:-Endadresse Textspeicher 24f5 2A A2 DC ld hl, (0xdca2) // Adresse vom GeheimtextspeicherText (A-P) 24f8 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor 24fb 3E 06 ld a, 0x06 24fc 32 1A DC ld (0xdc1a), a // ZTP:Zustand TextProzessor 2500 3E 02 ld a, 0x02 // GT-Eingabe 2502 32 25 DC ld (0xdc25), a // ZUANZ:-Zustandsanzeige 2505 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2506 32 03 DC ld (0xdc03), a // ZUALF:-Zustand Alpha-Tastendruck, kein neues Zeichen 2509 32 27 DC ld (0xdc27), a // ZUAN3:-Einfügemode 250c 3E 08 ld a, 0x08 // Zustandzeiger = 8 250e 32 AB DC ld (0xdcab), a // Zustandszeiger MIRA/GO // SPEICHER FÜR ANZEIGE SAUBER MACHEN 2511 21 EC 8B ld hl, 0x8bec 2514 36 00 ld (hl), 0x00 2516 11 ED 8B ld de, 0x8bed 2519 01 13 00 ld bc, 0x0013 // Länge 251c ED B0 ldir // lösche 0x8bec - 0x8bff mit 0x00, 0x13 bytes 251e CD 1C 02 call 0x021c // Zeit 1sec 2521 CD 4A 09 call 0x094a // Textprozessor 2524 2A 1D DC ld hl, (0xdc1d) // Kopiere Text Adresse // EADR:-End-Zeiger-TextProzessor 2527 22 A2 DC ld (0xdca2), hl // nach GeheimtextspeicherText (A-P) // ÜBERGABEPARAMETER GL.EADE -ENDADRESSE // BESCHREIBUNG: EINGEGEBENE BUCHSTABEN WERDEN IN DIE ENTSPRECHENDE // BITFOLGE UMGEWANDELT A->0000 BIS F->1111 // REGISTER: GL.ADREM - LÄNGE TEXT (VON GT) 252a 2A A2 DC ld hl, (0xdca2) // hole Adresse GeheimtextspeicherText (A-P) 252d 11 00 8C ld de, 0x8c00 // GeheimtextspeicherText (A-P) 2530 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2531 ED 52 sbc hl, de // Länge 2533 28 3D jrz 0x3d // 0x2572, Länge == 0x0000 2535 CB 45 bit 0, l // bit 0 == true; Ungerade länge? 2537 28 01 jrz 0x01 // 0x253a 2539 2B dec hl // auf gerade Länge setzen; NUR GERADZAHLIGE HALBBYTE 253a 22 A0 DC ld (0xdca0), hl // die Länge des umzuwandelnden Textes; GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 253d 21 00 90 ld hl, 0x9000 // GeheimtextspeicherZifferncode, GTX-Speicher empfangen; GL.SPE 2540 11 00 8C ld de, 0x8c00 // GeheimtextspeicherText (A-P) 2543 1A ld a, (de) // Halbbyte abarbeitung 2544 CD 75 25 call 0x2575 // Konverter Text > Zahl, Übergabe A = Text (A - P), Rückgabe A = Zahl (0x00 - 0x0f) 2547 ED 6F rld // a = (DE); (HL3-0) = a3-0; a= (HL7-4); (HL7-4) = (HL3-0) 2549 13 inc de 254a 1A ld a, (de) // Halbbyteabarbeitung 254b CD 75 25 call 0x2575 // Konverter Text > Zahl, Übergabe A = Text (A - P), Rückgabe A = Zahl (0x00 - 0x0f) 254e ED 6F rld // a = ?; (HL3-0) = a3-0; a= (HL7-4); (HL7-4) = (HL3-0) 2550 23 inc hl // in HL liegen die Ziffernwerte 2551 22 A4 DC ld (0xdca4), hl // NEUE ENDADRESSE 2554 13 inc de 2555 ED 4B A0 DC ld bc, (0xdca0) // Hole Länge; GL.ADREM; HWKB: Länge 1; Speicheradresse empfangenes Byte 2559 0B dec bc 255a 0B dec bc 255b ED 43 A0 DC ld (0xdca0), bc // Länge - 2 255f 79 ld a, c 2560 B0 or b 2561 20 E0 jrnz 0xe0 // 0x2543, Länge > 0 2563 21 9C DC ld hl, 0xdc9c // Länge == 0 2566 36 04 lh (hl), 0x04 2568 CD 1B 24 call 0x241b // KONTROLLE CRC DES IV 256b 3A 9C DC ld a, (0xdc9c) 256e A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 256f C2 8C 22 jpnz 0x228c // IV Falsch; A <> 0; Emfpangsfehler 2572 C3 BE 01 jp 0x01be // Menüprogramm; CRC richtig; // Konverter Text - Zahl, Übergabe A = Text (A - P), Rückgabe A = Zahl (0x00 - 0x0f) 2575 E5 push hl 2576 21 B1 0D ld hl, 0x0db1 // Buchstabenliste A ... P (0x00 ... 0x0f Darstellung) 2579 01 10 00 ld bc 0x0010 257c ED B1 cpir // BC == 0? oder a == (HL) 257e 3E 0F ld a, 0x0f 2580 91 sub c // a = a - c; = 0x0f - c; 0 ... f 2581 E1 pop hl 2582 C9 ret // Sprungtabelle Berechnet in 0x2375 2583 C7 23 // Programm: 0x23c7; DBAA 2585 E6 23 // Programm: 0x23e6; DBSY 2587 01 24 // Programm: 0x2401; CRCSY 2589 36 24 // Programm: 0x2436; DALAE 258b 61 24 // Programm: 0x2461; DBGT // ROM-RAM Check, Übergabe IX + 0 & IX + 1 = Startbereich CRC , IX + 2 & IX + 3 Länge für CRC, IX + 4 & IX + 5 speichere CRC, BC Länge /********************************************************/ /* AUFRUF: RO.START /* PARAMETER: /* IX ADRESSE ROM-BEREICHE /* PRO ROM BREICH: ANFANGSADRESSE (2 BYTE) /* LÄNGE (2 BYTE) /* CRC-WERT (2 BYTE) /* BEENDE ROM-TEST BEI BEREICH MIT LÄNGE = 0 /* IY: RÜCKSPRUNGADRESSE AUS RO.START /* BEI RÜCKSPRUNG: /* KEIN FEHLER ERKANNT: Z-FLAG=1, IX AUF BEREICH MIT LÄ /* FEHLERERKANNT: Z-FLAG=0, IX AUF FEHLERBEICH (IX, I /* REGISTERÄNDERUNG: AF,BC,DE,HL,IX /* KONTROLLE EIN ROM-BREICH HL = ROMBEREICHSANFANG /* BC = ROM-BEREICHSLÄNGE /* DE = CRC-ANFANGSWERT!!!! /* BEREICHSLÄNGE == 0 END */ 258d DD 4E 02 ld c, (ix + 0x02) 2590 DD 46 03 ld b, (ix + 0x03) // in IX+n gespeicherte Länge nach BC 2593 78 ld a, b 2594 B1 or c 2595 28 20 jrz 0x20 // 0x25b7, Return (IY) wenn bc = 0x0000 2597 DD 6E 00 ld l, (ix + 0x00) // in IX gespeicherte Startadresse nach HL 259a DD 66 01 ld h, (ix + 0x01) 259d CD B9 25 call 0x25b9 // Berechne CRC1, HL Startadresse, BC Länge, Rückgabe DE // ABSPEICHERN CRC-WERT FÜR VERGLEICH GESPEICHERTEN CRC-WERT MIT BERECHNETEM DE 25a0 DD 73 04 ld (ix + 0x04), e 25a3 DD 72 05 ld (ix + 0x05), d // CRC-16 in IX+n ablegen 25a6 DD 6E 04 ld l, (ix + 0x04) 25a9 DD 66 05 ld h, (ix + 0x05) // in IX+n abgelegte Länge 25ac ED 52 sbc hl, de // Länge > 0 25ae 20 07 jrnz 0x07 // 0x25b7, Return (IY) CRC korrekt? // IX+6 NEUE ROM-BEREICHSADRESSE 25b0 01 06 00 ld bc, 0x0006 // IX Bereich um 6 erhöhen nächster Datenbereich prüfen. 25b3 DD 09 add ix, bc 25b5 18 D6 jr 0xd6 // 0x258d, ROM-RAM Check, Schleife 0x258d 25b7 FD E9 jp (iy) // Rücksprung (IY) // Berechne CRC-16 HL Startadresse, BC Länge, Rückgabe DE // UNTERPROGRAMM CRC-WERTBERECHNUNG MIT AUSWERTUNG BC- 25b9 11 00 00 ld de, 0x0000 // Vektor 0x0000 ! // BERECHNUNG DE = CRC(DE, HL) 25bc 7E ld a, (hl) 25bd AA xor d 25be 57 ld d, a 25bf 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 25c0 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 25c1 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 25c2 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 25c3 E6 0F and 0x0f 25c5 AA xor d 25c6 57 ld d, a 25c7 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 25c8 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 25c9 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 25ca E6 1F and 0x1f // Maske 0001 1111 25cc AB xor e 25cd 5F ld e, a 25ce 7A ld a, d 25cf 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 25d0 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 25d1 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 25d2 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 25d3 E6 F0 and 0xf0 25d5 AB xor e 25d6 5F ld e, a 25d7 7A ld a, d 25d8 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 25d9 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 25da 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 25db E6 E0 and 0xe0 25dd AA xor d 25de 53 ld d, e 25df 5F ld e, a 25e0 23 inc hl // INC HL (NÄCHSTE ROM-ADRESSE); DEC BC, BC#0: ->0x25BC 25e1 0B dec bc 25e2 78 ld a, b 25e3 B1 or c 25e4 20 D6 jrnz 0xd6 // 0x25bc, bis BC = 0x0000 25e6 C9 ret /********************************************/ /* RAM-TEST /* FUNKTION: ABWECHSELND VORWÄRTS UND RÜCKWÄRTS EIN /* TESTWERTE VON BEREICH TESTW IN DEN ZU TEST /* UND KONTROLLE des VORHER IN RAM EINGESCHRIEB /* RA.START /* PARAMETER: /* IX ADRESSE RAM BEREICHE /* PRO RAM-BEREICH: ANFANGSADESSE (2 BYTE) /* LÄNGE (2 BYTE) /* BEENDEN RAM-TEST BEI BEREICH MIT LÄNGE=0 /* IY RÜCKSPRUNGADRESSE AUS ROM /* RÜCKSPRUNG JP(IY) /* KEIN FEHLER ERKANNT: Z-FLAG=1; IX AUF BEREICH MIT LÄ /* FEHLER ERKANNT: Z-FLAG00; IX AUF FEHLERBEREICH (IX, /* MIT FEHLER AUF HL, TESTWERT (DE) NICH /* REGISTERÄNDERUNG: IX, HL, BC, DE, AF */ //Prüffolge FÜR RAM-TEST 25e7 FF 00 FF 55 FF AA 00 FF AA 25f0 55 AA 00 AA FF 00 AA 00 55 00 FF AA 55 55 FF 00 // EIN BEREICH TSTEN HL=RAM-BEREICHSANFANG // BC=RAM-BEREICHSLÄNGE // BEREICHSLÄNGE=0 END // RAMTEST ff00ff55ffaa 2600 DD 4E 02 ld c, (ix + 0x02) // aus 0x069d IX=0x00b4, c = 0x00 2603 DD 46 03 ld b, (ix + 0x03) // b = 0x14 2606 78 ld a, b // a = 0x14 2607 B1 or c // prüfe BC auf 0x00 2608 28 4B jrnz 0x4b // 0x2655 // ANFANGSSTELLUNG BEREICH MIT (TESTW) 260a DD 6E 00 ld l (ix + 0x00) // l = 0x00 260d DD 66 01 ld h (ix + 0x01) // h = 0x80 2610 5D ld e, l 2611 54 ld d, h // de = 0x8000, Dopplungs-Speicher 2612 13 inc de 2613 3A E7 25 ld a, (0x25e7) 2616 77 ld (hl), a // 0x8000 = 0xff, Dopplungs-Speicher 2617 0B dec bc // Länge - 1 2618 ED B0 ldir // Kopiere (0x8000) > 0x80ff, Dopplungs-Speicher 261b 11 E7 25 ld de, 0x25e7 // VERGLEICH RÜCKWÄRTS MIT (TESTW+2*I); EINSCHREIBEN (TESTW+2*I) 261e DD 4E 02 ld c, (ix + 0x02) 2620 DD 46 03 ld b, (ix + 0x03) // BC = 0x1400 2623 1A ld a, (de) // a = 0xff 2624 AE xor (hl) // a xor (0x93ff) Speichertest 0xff 2625 20 2E jrnz 0x2e // 0x2655, FEHLER IM RAM 2627 13 inc de // 0x25e8 (0x00) 2628 1A ld a, (de) 2629 77 ld (hl), a // NEUER TESTWERT 262a 1B dec de 262b 2B dec hl 262c 0B dec bc 262d 79 ld a, c 262e B0 or b 262f 20 F2 jrnz 0xf2 // 0x2624 Speichertest // VERGLEICH VORWÄRTS MIT (TESTW+2*I) // EINSCHREIBEN (TESTW+2*I+2) 2631 13 inc de // 0x25e9 (0xFF) 2632 23 inc hl 2633 DD 4E 02 ld c, (ix + 0x02) 2636 DD 46 03 ld b, (ix + 0x03) 2639 1A ld a, (de) 263a AE xor (hl) // 263b 20 18 jrnz 0x18 // 0x2655, Speichertest beendet FEHLER IM RAM 263d 13 inc de // 0x25ea (0x55) 263e 1A ld a, (de) 263f 77 ld (hl), a 2640 1B dec de 2641 23 inc hl 2642 0B or b 2643 79 ld a, c 2644 B0 or b 2645 20 F2 jrnz 0xf2 // 0x2639, Speichertest // TEST EIN BEREICH ABGESCHLOSSEN? (L(TWEND)=E?) 2647 2B dec hl 2648 13 inc de 2649 3A FE A3 ld a, (0xa3fe) 264c AB xor e 264d 20 CE jrnz 0xce // 0x261b // IX AUF NÄCHSTEN BEREICH 264f 0E 04 ld c, 0x04 2651 DD 09 add ix, bc // nächse Bytefolge 2653 18 AB jr 0xab // 0x2600, RAMTEST ff00ff55ffaa 2655 FD E9 jp (iy) // Programm Schlüsseleingabe 2657 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2658 32 2D DC ld (0xdc2d), a // Nr. des Schlüssel 265b 3E 01 ld a, 0x01 // Betriebsart Schlüsselwechsel 26bd 32 01 DC ld (0xdc01), a // Betriebsartenregister: 1-Schlüsselwechsel // Einsprung Ende Schlüsseleingabe 2660 3E 05 ld a, 0x05 // "SCHLUESSELEINGABE" 2662 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 2665 CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 2668 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 266b FE 43 cp 0x43 // a <> 0x43, ENTER 266d 20 0A jrnz 0x0a // 0x2679 266f 3A 2D DC ld a, (0xdc2d) // Nr. des Schlüssel 2672 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 2673 CA BE 01 jpz 0x01be // Nr. des Schlüssel unverändert, Menüprogramm 2676 C3 2B 06 jp 0x062b // Aufruf der prophylaktischen Prüfung // Taste ENTER 2679 FE 91 cp 0x91 // a <> 0x91, CTRL + Z 267b 20 E8 jrnz 0xe8 // 0x2665, warte auf CTRL + Z // Einsprungpunkt Schlüsseleingabe 267d 3E 1B ld a, 0x1b // "SCHLUESSEL 1" 267f CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 2682 3E 01 ld a, 0x01 // 1 = Schlüsselwechsel 2684 32 01 DC ld (0xdc01), a // Betriebsartenregister: 2687 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2688 32 2E DC ld (0xdc2e),a <--\ // Steuerwort 0x00, Schlüsseleingabe 268b CD 2B 02 call 0x022b | // ein Zeichen von der Tastatur 268e 3A 02 DC ld a, (0xdc02 ) | // ALDAT:-Datenübergaberegister Tastatur 2691 FE 91 cp 0x91 | // a == 0x91, CTRL + Z 2693 CA B0 27 jpz 0x27b0 | // Eingabe Schlüssel 2 2696 FE 43 cp 0x43 | // a <> 0x43, ENTER 2698 20 F1 jrnz 0xf1 >--/ // 0x268b, warte auf Enter 269a 21 00 94 ld hl, 0x9400 // SSP Schlüsselspeicher, crc- 269d 01 86 00 ld bc, 0x0086 // Länge 134 byte 26a0 11 01 94 ld de, 0x9401 26a3 36 00 ld (hl), 0x00 26a5 ED B0 ldir // Lösche Bereich (0x9400 - 0x9486) mit 0x00, 0x86 bytes // Schlüsselspeicher, crc- 26a7 21 00 94 ld hl, 0x9400 // Schlüsselspeicher, crc- 26aa 01 86 00 ld bc, 0x0086 26ae CD B4 28 call 0x28b4 // Prüfe (HL) == 0x00 26b0 F6 00 or 0x00 // a == 0x00 OK sonst: 26b2 C2 DB 02 jpnz 0x02db // BLOCKIERUNG 5 26b5 3E 01 ld a, 0x01 // Schlüssel Nr. 1 26b7 32 2D DC ld (0xdc2d), a // Nr. des Schlüssel // Einsprung Schlüssel 2 Eingabe 26ba 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 26be 22 1F DC ld (0xdc1f), hl // AADRT:-Anfangsadresse Textspeicher 26c0 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor 26c3 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 26c6 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 26c7 32 23 DC ld (0xdc23), a // TPME1:-Formatierung Schlüssel 26ca 32 24 DC ld (0xdc24), a // TPME2:-Formatierung Schlüssel 26cd 21 EC 83 ld hl, 0x83ec 26d0 11 ED 83 ld de, 0x83ed 26d3 01 00 03 ld bc, 0x0300 // Länge 768 Byte 26d6 36 00 ld (hl), a 26d8 ED B0 ldir // Lösche (0x83ec - 0x86ec) mit 0x00, 0x0300 bytes 26da 21 84 84 ld hl, 0x8484 26dd 22 21 DC ld (0xdc21), hl // EADRT:-Endadresse Textspeicher // Einsprung Schlüsselfehler 26e0 3E 01 ld a, 0x01 26e2 32 1A DC ld (0xdc1a), a // ZTP:Zustand TextProzessor = 1 Schlüsseleingabe 26e5 3E 04 ld a, 0x04 // GT-Empfangen 26e7 32 25 DC ld (0xdc25), a // ZUANZ:-Zustandsanzeige 26ea CD 4A 09 call 0x094a // Textprozessor 26ed CD F3 27 call 0x27f3 // Korrektur/Einfügen in Zeile 26f0 11 C8 84 ld de, 0x84c8 26f3 21 18 85 ld hl, 0x8518 // Schlüssel steht z.Zt. in 0x8518 26f6 06 24 ld b, 0x24 // Schlüssellänge incl. 2*crc16 26f8 CD E2 27 call 0x27e2 <---\ // De-Kodieren Tasteneingabe-Hexzahlen; Übergabe DE = 0x84c8, Rückgabe A 26fb ED 6F rld | // a = high; (HL3-0) = a3-0; a= (HL7-4); (HL7-4) = (HL3-0) 26fd 13 inc de | 26fe CD E2 27 call 0x27e2 | // De-Kodieren Tasteneingabe-Hexzahlen; Übergabe DE = 0x84c8 + n, Rückgabe A 2701 ED 6F rld | // a = low; (HL3-0) = a3-0; a= (HL7-4); (HL7-4) = (HL3-0) 2703 13 inc de | // (HL) = erste Eingabe z.B. 0xf, zweite Eingabe 0x5 (HL) = 0xf5 2704 23 inc hl | 2705 10 F1 djnz 0xf1 >---/ // 0x26f8, 36 bytes eingelesen = Schlüssel + 2*crc16 2707 06 20 ld b, 0x20 // nur den Schlüssel 32 bytes 2709 21 18 85 ld hl, 0x8518 // Schlüssel steht z.Zt. in 0x8518 270c AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 270d B6 or (hl) <--\ // a = a OR (HL) 270e 23 inc hl | // ++HL 270f 10 FC djnz 0xfc >--/ // a = a or (hl) prüfe ob keine 0x00 eingegeben wurde! 2711 B7 or a // mindestens ein Bit muß gesetzt sein! 2712 CA 94 02 jpz 0x0294 // a == 0 Schlüsselfehler 2715 21 38 85 ld hl, 0x8538 // Ort der ersten crc16 Prüfsumme, Falsch 2718 22 01 83 ld (0x8301), hl // Speicher Adresse auf der die Adresse mit den Prüfsummen zeigt 271b 21 18 85 ld hl, 0x8518 // Schlüssel steht z.Zt. in 0x8518 271e 01 20 00 ld bc 0x0020 // Länge 32 byte - 256 bit 2721 CD 9F 28 call 0x289f // CRC1 Check, Übergabe HL Start, BC Länge, (0x8301) CRC, Rückgabe A ok = 0, Falsch = 0xff 2724 FE FF cp 0xff // Fehler erste Prüfsumme, Z = 1 wenn A - 0xff == 0 ist 2726 C2 CB 02 jpnz 0x02cb // BLOCKIERUNG 1 2729 21 18 85 ld hl, 0x8518 // Schlüssel steht z.Zt. in 0x8518; !! Muß man hier jetzt nicht verstehen !! 272c 01 20 00 ld bc, 0x0020 // Länge 32 bytes - 256 bit 272f 21 38 85 ld hl, 0x8538 // Ort der ersten crc16 Prüfsumme 2732 22 2B DC ld (0xdc2b), hl // Speicherort CRC für Prüfung 2735 CD 1F 1B call 0x1b1f // CRC2 Berechnung und Prüfung, Übergabe HL Wertebereich, BC Länge, (0xdc2b) CRC für Prüfung; Rückgabe A 0 = io, 0xff = falsch 2738 F6 00 or 0x00 // Fehler erste Prüfsumme, Prüfsumme der Prüfsumme?, ergebniss muß != 0x00 sein 273a CA CB 02 jpz 0x02cb // BLOCKIERUNG 1, Wenn Ergebnis der CRC OK ist! 273d 21 3A 85 ld hl, 0x853a // Ort der zweiten crc16 Prüfsumme 2740 22 01 83 ld (0x8301), hl // Zeiger auf 2. Prüfsumme 2743 21 18 85 ld hl, 0x8518 // Schlüssel steht z.Zt. in 0x8518 2746 01 20 00 ld bc, 0x0020 // Länge 32 byte - 256 bit 2749 CD 9F 28 call 0x289f // CRC1 Check, Übergabe HL Start, BC Länge, (0x8301) CRC, Rückgabe A ok = 0, Falsch = 0xff 274c FE FF cp 0xff // Fehler zweite Prüfsumme 274e CA 94 02 jpz 0x0294 // SCHLÜSSELFEHLER 2751 21 3A 85 ld hl, 0x853a // zweite CRC16 Prüfsumme 2754 22 2B DC ld (0xdc2b), hl // Speicherort CRC für Prüfung 2757 21 18 85 ld hl, 0x8518 // Schlüssel steht z.Zt. in 0x8518 275a 01 20 00 ld bc, 0x0020 // Länge 32 byte - 256 bit 275d CD 1F 1B call 0x1b1f // CRC2 Berechnung und Prüfung, Übergabe HL Wertebereich, BC Länge, (0xdc2b) CRC für Prüfung; Rückgabe A 0 = io, 0xff = falsch 2760 F6 00 or 0x00 // Fehler zweite Prüfsumme 2762 C2 94 02 jpnz 0x0294 // SCHLÜSSELFEHLER 2765 CD 29 2A call 0x2a29 // Ausgabe Zufalls-Passwort 2768 11 00 94 ld de, 0x9400 // Schlüsselspeicher, crc- 276b 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 276e 01 28 00 ld bc, 0x0028 // Länge 0x28 bytes, Schlüssel + 2*crc16 2771 3A 2D DC ld a, (0xdc2d) // Nr. des Schlüssel 2774 FE 01 cp 0x01 // Prüfe Schlüsselzähler 2776 28 03 jrz 0x03 // 0x277b, erster Schlüssel? 2778 11 46 94 ld de, 0x9446 // Adresse zweiter Schlüssel 277b ED B0 ldir // Kopiere PWD Schlüssel in die Bereiche 0x9400 oder 0x9446 277d 11 0A 95 ld de, 0x950a // Zeiger CRC Schlüssel1 2780 21 41 84 ld hl, 0x8441 // Zeiger auf (DE) CRC Prüfsumme Passwort 2783 01 02 00 ld bc, 0x0002 // Länge 2 byte CRC-16 2786 3A 2D DC ld a, (0xdc2d) // Nr. des Schlüssel 2789 FE 01 cp 0x01 // A == (0xdc2d) == 0x01? 278b 28 03 jrz 0x03 // 0x2790, Erster Schlüssel? 278d 11 0C 95 ld de, 0x950c // CRC Schlüssel 1 oder 2 2790 ED B0 ldir // Kopiere (CRC) von 0x8441 nach (Key 1) 0x950a, (Key 2) 0x950c mit der Länge 2 2792 21 EC 83 ld hl, 0x83ec 2795 E5 push hl 2796 D1 pop de // DE = HL = 0x83ec 2797 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2798 13 inc de 2799 77 ld (hl), a 279a 01 14 04 ld bc, 0x0414 // Länge 279d ED B0 ldir // Lösche 0x83ec - 0x87ff, mit 0x00 279f 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 27a2 01 FF 03 ld bc, 0x03ff 27a5 CD B4 28 call 0x28b4 // Prüfe (HL) == 0x00 27a8 F6 00 or 0x00 27aa C2 DB 02 jpz 0x02db // BLOCKIERUNG 5 27ad C3 60 26 jp 0x2660 // Sprung Schlüsseleingabe // Einsprung aus: 0x2693 Schlüsseleingabe 27b0 3E 1C ld a, 0x1c // "SCHLUESSEL 2" 27b2 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 27b5 CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 27b8 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 27bb FE 43 cp 0x43 // ENTER 27bd 20 F6 jrnz 0xf6 // 0x27b5 27bf 21 46 94 ld hl, 0x9446 // 2. Schlüsselbereich 27c2 01 20 00 ld bc, 0x0020 // Länge 27c5 11 47 94 ld de, 0x9447 27c8 36 00 ld (hl), 0x00 27ca ED B0 ldir // Lösche 2. Schlüsselbereich 27cc 21 46 94 ld hl, 0x9446 // 2. Schlüsselbereich 27cf 01 20 00 ld bc, 0x0020 27d2 CD B4 28 call 0x28b4 // Prüfe (HL) == 0x00 27d5 F6 00 or 0x00 // a == 0 27d7 C2 DB 02 jpz 0x02db // BLOCKIERUNG 5 27da 3E 02 ld a, 0x02 27dc 32 2D DC ld (0xdc2d), a // Nr. des Schlüssel 27df C3 BA 26 jp 0x26ba // Sprung nach Schlüsseleingabe / Prüfung // De-Kodieren Tasteneingabe-Hexzahlen 27e2 E5 push hl 27e3 C5 push bc 27e4 1A ld a, (de) 27e5 01 10 00 ld bc, 0x0010 27e8 21 A7 0D ld hl, 0x0da7 // Umsetztabelle 27eb ED B1 cpir // BC == 0? oder a == (HL) 27ed 3E 0F ld a, 0x0f 27ef 91 sub c // a = 0x0f - c; a = 0x00 ... 0x0f 27f0 C1 pop bc 27f1 E1 pop hl 27f2 C9 ret // Korrektur/Einfügen in Zeile 27f3 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 27f6 11 C8 84 ld de, 0x84c8 // Wiederholung 27f9 0E 07 ld c, 0x07 // Schleife, 7 Runden 27fb 7E ld a, (hl) 27fc FE 04 cp 0x04 // a == 4 27fe 28 14 jrz 0x14 // 0x2814 -> INC HL und 0x27fb weiter 2800 47 ld b, a 2801 79 ld a, c // Prüfzähler 2802 FE 07 cp 0x07 // a == 7 2804 28 0D jrz 0x0d // 0x2813 -> DEC C, INC HL 0x27fb weiter 2806 FE 06 cp 0x06 // a == 6 2808 28 09 jrz 0x09 // 0x2813 -> DEC C, INC HL 0x27fb weiter 280a 78 ld a, b // wiederherstellen A, C < 6 280b 12 ld (de), a // A in 0x84c8 ++ ablegen; 5 Elemente 0x84c8 ... 0x84cc 280c 23 inc hl 280d 13 inc de 280e 0D dec c // c <> 0 280f 20 EA jrnz 0xea // 0x27fb -> Schleife 7 Elemente 2811 18 04 jr 0x04 // 0x2817 -> nach 7 Elemente bzw. 5 gespeicherte Werte // Schleife C == 7, C == 6 2813 0D dec c 2814 23 inc hl 2815 18 E4 jr 0xe4 // 0x27fb // Schleife C == 0 2817 E5 push hl // Rette HL; HL 0x8400 + "C" Testspeicher Startwert 28a8 01 9E 84 ld bc, 0x849e // Ende Testspeicher erreicht? 28ab ED 42 sbc hl, bc // Länge = -1 ? 28ad E1 pop hl // wiederherstellen HL 28ae 38 D9 jrc 0xd9 // 0x27f9; Wiederholung der Schleife 2820 C9 ret // Programm Schlüsselwechsel 2821 3E 1A ld a, 0x1a // "SCHLUESSELWECHSEL" 2823 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 2826 CD 1C 02 call 0x021c // Zeit 1sec 2829 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 282c CB 86 res 0, (hl) // Lösche neues Zeichen // wiederholen Tastaturabfrage 282e CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 2831 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 2833 FE 43 cp 0x43 // a == 0x43,ENTER 2835 CA BE 01 jpz 0x01be // Menüprogramm 2838 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 283b FE 93 cp 0x93 // a <> 0x93 283e 20 EE jrnz 0x0ee // 0x282e; wiederholen Tastaturabfrage 2840 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2841 32 2E DC ld (0xdc2e), a // Steuerwort Schlüsselwechsel 2843 21 00 94 ld hl, 0x9400 // Schlüsselspeicher, crc- 2846 11 01 94 ld de, 0x9401 2849 01 20 00 ld bc, 0x0020 // Länge 284b 36 00 ld (hl), 0x00 284f ED B0 ldir // lösche (0x9400 Schlüsselspeicher 0x20 byte) 2851 21 02 95 ld hl, 0x9502 2853 22 01 83 ld (0x8301), hl // Zeiger, auf 0x9502 2856 21 46 94 ld hl, 0x9446 // 2. Schlüsselbereich 2859 01 20 00 ld bc 0x0020 // Länge 285b CD 9F 28 call 0x289f // CRC1 Check, Übergabe HL Start, BC Länge, (0x8301) CRC, Rückgabe A ok = 0, Falsch = 0xff 2860 FE FF cp 0xff // a == 0xff; CRC fehlerhaft == 0xff 2862 28 2B jrz 0x2b // 0x288f; Lösche Speicherbereiche 2864 21 46 94 ld hl, 0x9446 // 2. Schlüsselbereich 2867 11 00 94 ld de, 0x9400 // Schlüsselspeicher, crc- 286a 01 28 00 ld bc, 0x0028 // Länge 0x28 byte 286d ED B0 ldir // Kopiere 2. Schlüssel in 1. Schlüsselbereich 286f 2A 02 95 ld hl, (0x9502) 2872 22 00 95 ld (0x9500), hl // Zeiger auf den 2ten Schlüssel 2875 21 46 94 ld hl, 0x9446 // 2. Schlüsselbereich 2878 11 47 94 ld de, 0x9447 287b 01 20 00 ld bc, 0x0020 // Länge 287e 36 00 ld (hl), 0x00 2880 ED B0 ldir // Lösche 2. Schlüsselbereich 2882 21 80 83 ld hl, 0x8380 // Zeiger auf 0x9502, s. 0x2851 2885 11 81 83 ld de, 0x8381 2888 01 7F 00 ld bc, 0x007f // Länge 288b 36 EE ld (hl), 0xee // Füllbyte 288d ED B0 ldir // Kopiere 0xee nach (0x8380 - 0x83ff), %1110 1110 // Einsprung aus Ergebnis CRC-Prüfung fehlerhaft; 0x2862; Lösche Passwort 288f 21 00 96 ld hl, 0x9600 // PWSP; Passwort Speicher, 32 byte - 256 bit 2892 11 01 96 ld de, 0x9601 2895 01 20 00 ld bc, 0x0020 // Länge 32 byte - 256 bit 2898 36 EE ld (hl), 0xee // Füllbyte 289a ED B0 ldir // schreibe 0xee nach 0x9600 - 0x961f, %1110 1110 289c C3 20 00 jp 0x0020 // RST 0x20, Aufruf PP Kaltstart // CRC1 Check, Aufruf in DE = Prüfsumme // Übergabe HL Start, BC Länge, (0x8301) CRC, Rückgabe A ok = 0, Falsch = 0xff 289f CD B9 25 call 0x25b9 // Berechne CRC1, HL Startadresse, BC Länge, Rückgabe DE 28a2 2A 01 83 ld hl, (0x8301) // Adresse in der die Adresse zur CRC16 Prüfsumme steht 28a5 7A ld a, d // Vergleiche CRC in D mit gespeicherte CRC (HL) 28a6 BE cp (hl) // d <> (hl) 28a7 20 08 jrnz 0x08 // 0x28b1, CRC high wert falsch 28a9 7B ld a, e // Vergleiche CRC in E mit gespeicherte CRC (HL+1) 28aa 23 inc hl 28ab BE cp (hl) // e <> (hl) 28ac 20 03 jrnz 0x03 // 0x28b1, CRC low wert falsch 28ae AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 28af 18 02 jr 0x02 // 0x28b3, CRC OK, a = 0x00 // Einsprung CRC Fehler 28b1 3E FF ld a, 0xff // a = 0xff CRC-Fehler // Einsprung OK 28b3 C9 ret // Prüfe (HL) == 0x00 28b4 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 // Schleife BC 28b5 B6 or (hl) 28b6 ED A1 cpi // Verleich mit increment HL++, BC-- 28b8 EA B5 28 jppe 0x28b5 // Jump Parity even 28bb B7 or a 28bc C8 retz // a == 0x00 OK 28bd 3E FF ld a, 0xff // a != 0x00 Fehler 28bf C9 ret // Zählervariable (0xdc2e)--; Beriebsart BA/PP/Schlüsselwechsel; Wird nicht genutzt; LEICHE 28c0 F5 push af // rette AF 28c1 3A 2E DC ld a, (0xdc2e) // Steuerwort (0xfb) 28c4 3D dec a // 0xfa 28c5 32 2E DC ld (0xdc2e), a // Steuerwort 28c8 F1 pop af // wiederherstellen AF 28c9 C9 ret // Einsprung aus Anfangsprüfung Schlüssel, CRC war OK 28ca 21 00 96 ld hl, 0x9600 // PWSP; Passwort Speicher, 32 byte 28cd 3E EE ld a, 0xee 28cf 06 20 ld b, 0x20 // Schleife 32 Runden // Schleife 32 * 0xee? 28d1 BE cp (hl) <-\ // (0x9600) != 0xee, %11101110 28d2 C2 D7 02 jpnz 0x02d7 | // BLOCKIERUNG 4, Abbruch 28d5 36 00 ld (hl), 0x00 | // Lösche Passwort Speicher 28d7 23 inc hl | 28d8 10 F7 djnz 0xf7 >-/ // (0x9600 - 0x9620) != 0xee, 32 Runden // Einsprung aus Passwortüberprüfung 28da CD 9E 29 call 0x299e // Passworteingabe Aufruf mit Rundenschlüssel 28dd 11 C2 83 ld de, 0x83c2 // Ziel Chiffrierung PWD 28e0 21 00 94 ld hl, 0x9400 // SSP Schlüsselspeicher, 1 28e3 3E 04 ld a, 0x04 // 4 Runden 28e5 CD 61 29 call 0x2961 // Passwortchiffrierung mit Feistel, Übergabe HL, DE, A 28e8 11 E2 83 ld de, 0x83e2 // Ziel Chiffrierung PWD mit Rundenschlüssel 2 283b 21 20 94 ld hl, 0x9420 // SSP Schlüsselspeicher, 2 283e 3E 01 ld a, 0x01 // 1 Runde 28f0 CD 61 29 call 0x2961 // Passwortchiffrierung mit Feistel, Übergabe HL, DE, A 28f3 21 E2 83 ld hl, 0x83e2 // Chiffrat PWD mit Rundenschlüssel 2 28f6 22 01 83 ld (0x8301), hl 28f9 21 C2 83 ld hl, 0x83c2 // Chiffrat PWD mit Rundenschlüssel 1 28fc 01 20 00 ld bc, 0x0020 // Länge 32 byte 28ff CD 9F 28 call 0x289f // CRC1 Check, Übergabe HL Start, BC Länge, (0x8301) CRC, Rückgabe A ok = 0, Falsch = 0xff 2902 FE FF cp 0xff // 0xff Fehler 2904 20 38 jrnz 0x38 // 0x293f Anzeige PASWWORTFEHLER 2906 21 80 83 ld hl, 0x8380 2909 E5 push hl 290a D1 pop de // DE = 0x8380 290b 3E AA ld a, 0xaa 290d 13 inc de // DE = 0x8381 290e 77 ld (hl), a // HL = 0x8380 290f 01 60 00 ld bc, 0x0060 // Länge 96 bytes 2912 ED B0 ldir // Fülle 0x8380 - 0x83ff mit 0xaa 2914 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 2917 3E 0D ld a, 0x0d // a = 0x0d Funktionsnr. = 13 2919 BE cp (hl) // (HL) == 0x0d; Funktion Chiffrieren - Dechiffrieren -Kontrollchiffrieren -Kontrolldechiffrieren? 291a 20 23 jrnz 0x23 // 0x293f -> Fehler 291c 23 inc hl // 0x8401 291d 3E 20 ld a, 0x20 // Funktionsnr. = 0x20 291f BE cp (hl) // (HL) == 0x20 2920 20 1D jrnz 0x1d // 0x293f -> Fehler 2922 23 inc hl // 0x8402 2923 3E 5D ld a, 0x5d 2925 BE cp (hl) // (HL) == 0x5d 2926 20 17 jrnz 0x17 // 0x293f -> Fehler 2928 23 inc hl // 0x8403 2929 3E 0C ld a, 0x0c 292b BE cp (hl) // (HL) == 0x0c 292c 20 11 jrnz 0x11 // 0x293f -> Fehler 292e 23 inc hl // 0x8404 292f 3E C2 ld a, 0xc2 2931 BE cp (hl) // (HL) == 0xc2 2932 20 0B jrnz 0x0b // 0x293f -> Fehler 2934 23 inc hl // 0x8405 2935 3E 4A ld a, 0x4a 2937 BE cp (hl) // (HL) == 0x4a 2938 20 05 jrnz 0x05 // 0x293f -> Fehler 293a 21 7D 26 ld hl, 0x267d // Schlüsseleingabe 293d E3 ex (sp), hl 293e C9 ret // Sprung in die Schlüsseleingabe 0x267d // Einsprung CRC Schlüssel Passwort Fehler 293f 3A FE 97 ld a, (0x97fe) // Zeiger Nr. Textausgabe 2942 3C inc a 2943 32 FE 97 ld (0x97fe), a // a > 0 2946 FE 14 cp 0x14 // A == 0x14 2948 28 12 jrz 0x12 >-\ // 0x295c, ja -> "SELBSTTEST" 294a 3E 21 ld a, 0x21 | // "PASSWORTFEHLER ?" 294c CD 9A 10 call 0x109a | // Anzeige Befehls-Fehleranzeige // Schleife Passworteingabe | 294f CD 2B 02 call 0x022b <-\ | // ein Zeichen von der Tastatur 2952 3A 02 DC ld a, (0xdc02) | | // ALDAT:-Datenübergaberegister Tastatur 2955 FE 43 cp 0x43 | | // ENTER 2957 20 F6 jrnz 0xf6 >-/ | // 0x294f, Schleife 2959 C3 DA 28 jp 0x28da | // neue Überprüfung Paswort | 295c 21 35 02 ld hl, 0x0235 <-/ // Schlüsselspeicher löschen, Bereich 0x8380 - 0x97ff -> Blockierung 5 295f E3 ex (sp), hl // (SP) = HL = 0x0235 2960 C9 ret // Sprung nach 0x0235 // Passwortchiffrierung mit Feistel, Übergabe HL, DE, A, identisch mit 0x2ad7; Richtung Rückwärts // Übergabe HL, DE, A 2961 ED 53 EA 83 ld (0x83ea), de // Übergabe Zieladresse // Schleife A 2965 F5 push af <-\ // Rette AF 2966 11 42 DC ld de, 0xdc42 | // Übergabe HL aus vorherigem Aufruf! (0x9400, 0x9420) 2969 01 08 00 ld bc, 0x0008 | // Länge 8 byte 296c ED B0 ldir | // Kopie (HL) > (0xdc42), 8 byte 296e E5 push hl | // HL+8 [0x9408, 0x9428] 296f 21 42 DC ld hl, 0xdc42 | // von Ziel der vorherigen Kopie 2972 11 96 DE ld de, 0xde96 | // Ziel, für weitere Bearbeitung 2975 01 08 00 ld bc, 0x0008 | // Länge 8 byte 2978 ED B0 ldir | // Kopie (0xdc42) > (0xde96), 8 byte 297a CD 40 1C call 0x1c40 | // Feistel, Rückwärts 297d 21 96 DE ld hl, 0xde96 | // Wurmfolgen 2980 11 42 DC ld de, 0xdc42 | 2983 01 08 00 ld bc, 0x0008 | // Länge 8 byte 2986 ED B0 ldir | // Kopiere veränderte Folge > 0xdc42, 8 bytes 2988 ED 5B EA 83 ld de, (0x83ea) | // Zieladresse aus der Übergabe DE [0x83e2, 0x83c2] n*8 298c 21 42 DC ld hl, 0xdc42 | 298f 01 08 00 ld bc, 0x0008 | // Länge 8 byte 2992 ED B0 ldir | // Kopiere 0xdc42 > (de), 8 bytes 2994 ED 53 EA 83 ld (0x83ea), de | // Adresse aus Übergabe DE+8*A 0x8400 + 8*A; 0x8400 ... 0x8408 oder ... 0x8420 2998 E1 pop hl | // A * 8 + HL [0x9408, 0x9410, ... 0x9428, 0x9430 ...] 2999 F1 pop af | // wiederherstellen AF 299a 3D dec a | // A == 0x00? 299b 20 C8 jrnz 0xc8 >-/ // 0x2965; Schleife A 299d C9 ret // Passworteingabe 299e 3E 19 ld a, 0x19 // "PASSWORT" 29a0 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 29a3 21 00 84 ld hl, 0x8400 // Klartextspeicher; GL.KTSPS 29a6 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 29a9 22 1F DC ld (0xdc1f), hl // AADRT:-Anfangsadresse Textspeicher 29ac 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor 29af 21 28 84 ld hl, 0x8428 // 40 Bytes später 29b2 22 21 DC ld (0xdc21), hl // EADRT:-Endadresse Textspeicher 29b5 3E 08 ld a, 0x08 29b7 32 1A DC ld (0xdc1a), a // ADZS:-Adresse Zeitschlüssel 29ba AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 29bb 32 25 DC ld (0xdc25), a // ZUANZ:-Zustandsanzeige 29be 32 27 DC ld (0xdc27), a // ZUAN3:-Einfügemode 29c1 21 03 DC ld hl, 0xdc03 <-\ // ZUALF:-Zustand Alpha-Tastendruck 29c4 CB 46 bit 0, (hl) | // Abfrage neues Zeichen 29c6 28 F9 jrz 0xf9 >-/ // 0x29c1-> JA // CALL Einsprung Ein/Ausgabe Zufall-Passwort 29c8 CD 4A 09 call 0x094a // Textprozessor 29cb 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 0x8400 + n 29ce 11 00 84 ld de, 0x8400 // Klartextspeicher; GL.KTSPS 29d1 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 29d2 ED 52 sbc hl, de // Länge > 0 29d4 20 09 jrnz 0x09 >--\ // 0x29df, Länge 8byte? 29d6 2A 1D DC ld hl, (0xdc1d) | // EADR:-End-Zeiger-TextProzessor 29d9 36 2E ld (hl), 0x2e | // Auffüllen mit 0x2e '.' oder '(' ASCII/ITA-2 29db 23 inc hl | 29dc 22 1D DC ld (0xdc1d), hl | // EADR:-End-Zeiger-TextProzessor // Einsprung Länge > 0 | 29df 2A 1D DC ld hl, (0xdc1d)<-/ // EADR:-End-Zeiger-TextProzessor 29e2 22 C6 DC ld (0xdcc6), hl // Zeiger auf GL.EAKTS; Endadresse 29e5 CD 5D 2D call 0x2d5d // Zusammenziehen Passwort(0x8400) Rückgabe DE = (0xdcc6), 6 bit ACII nach 8 bit 29e8 2A C6 DC ld hl, (0xdcc6) // GL.EAKTS; neue Endadresse nach dem Zusammenziehen 29eb 11 00 84 ld de, 0x8400 // Klartextspeicher; GL.KTSPS 29ee AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 29ef ED 52 sbc hl, de // Länge des Passwortes 29f1 45 ld b, l // Schleifenzähler, 8 Runden bei zusammengezogenen Passwort 29f2 21 00 84 ld hl, 0x8400 // Textspeicher; GL.KTSPS 29f5 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 29f6 AE xor (hl) <-| // A = A XOR (HL) 29f7 23 inc hl | // neuer Wert, A = (HL-1) XOR (HL) 29f8 10 FC djnz 0xfc >-| // bis Länge < 1, Passwort 12 Zeichen > 8 Zeichen Zusammen 29fa F5 push af // rette AF, a = 0, Z-Flag = 1 29fb 21 20 84 ld hl, 0x8420 // Endadresse PWD Speicher 29fe ED 5B C6 DC ld de, (0xdcc6) // Endadresse, Zeiger auf 0x8409; GL.EAKTS 2a02 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2a03 ED 52 sbc hl, de // Länge 2a05 45 ld b, l // Länge in der Rest 0x17 2a06 F1 pop af // wiederherstellen AF, A = (HL-1) XOR (HL) 2a07 2A C6 DC ld hl, (0xdcc6) // Endadresse; Zeiger auf 0x8400; GL.EAKTS 2a0a 3C inc a <-| // A++ 2a0b 77 ld (hl), a | // Endadress (0xdcc6) = A++ (aus vorherigen (HL-1) XOR (HL) Schleife 2a0c 23 inc hl | // Endadresse + 1 2a0d 10 FB djnz 0xfb >-| // bis Länge < 0, Auffüllen bis 0x8420 2a0f 11 52 DC ld de, 0xdc52 2a12 21 00 84 ld hl, 0x8400 // Klartextspeicher;GL.KTSPS 2a15 01 20 00 ld bc 0x0020 // Länge 32byte 2a18 ED B0 ldir // kopiere (0x8400) > (0xdc52), 32 Bytes. Klartextspeicher senden; GL.KTSPS 2a1a 21 52 DC ld hl, 0xdc52 2a1d 11 9E DE ld de, 0xde9e 2a20 01 08 00 ld bc, 0x0008 // Länge 8byte 2a23 ED B0 ldir // kopiere (0xdc52) > (0xde9e), 8 bytes 2a25 CD 69 1B call 0x1b69 // Rundenschlüssel für Feistel, Übergabe A = Füllzeichen, Schlüssel 0xde93 ... 0xdea5, Rückgabe 0xde00 2a28 C9 ret // Ausgabe Zufalls-Passwort 2a29 3E 00 ld a, 0x00 2a2b 32 D8 DC ld (0xdcd8), a // Wiederholungszähler, max 3 // Einsprung Schleife Wiederholungszähler A 2a2e 3E 40 ld a, 0x40 // BA: ZF-Erzeugung 0x40 2a30 32 90 DC ld (0xdc90), a // Betriebsart Zufallsgenerator bit 7, 6, 5 2a33 CD 15 08 call 0x0815 // Init Zufallserzeugung 2a36 3E 19 ld a, 0x19 // "PASSWORT" 2a38 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 2a3b CD 1C 02 call 0x021c // Zeit 1sec 2a3e 3E 02 ld a, 0x02 // "MOMENT BITTE" 2a40 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 2a43 CD 48 08 call 0x0848 // Ausschalten Zufallsgenerator 2a46 3A 90 DC ld a, (0xdc90) // Betriebsart Zufallsgenerator bit 7, 6, 5 2a49 CB 77 bit 6, a // ZF-Erzeugung Error 2a4b C2 D3 02 jpnz 0x02d3 // BLOCKIERUNG 3, HALT 2a4e 0E 20 ld c, 0x20 // Schleifenzähler - 32 Zufallsfolgen 2a50 06 0C ld b, 0x0c // Schleifenzähler DJNZ - 12 Zeichen 2a52 11 00 84 ld de, 0x8400 // Adresse Passwort 2a55 21 00 80 ld hl, 0x8000 // 32 Zufallsfolgen im Bereich von 0x00 bis 0xff // Schleife C 32 Elemente 2a58 7E ld a, (hl) 2a58 E6 1F and 1f // Maskiere A = 0x00 ... 0x1f -> ITA2 Zeichen 2a5a E5 push hl // rette HL 2a5b C5 push bc // rette BC 2a5c 21 14 2B ld hl, 0x2b14 // Array Fs Zeichen; 0x01 bis 0x1e 2a60 01 1A 00 ld bc, 0x001a // BC Schleife, 26 Fs-Buchstaben 2a63 ED B1 cpir // BC == 0? Suche 26 Runden oder a == (HL) 2a65 20 07 jrnz 0x07 // 0x2a6e; nicht gefunden: 0x00, 0x02, 0x08, 0x1b, 2a67 12 ld (de), a // Gefunden, in 0x8400 ... abgelegt 2a68 13 inc de // bis 0x840c 2a69 C1 pop bc // BC wiederherstellen 2a6a 10 03 djnz 0x03 // 12 Runden, 0x2a6f 2a6c 18 15 jr 0x15 // 0x2a83 // Einsprung - Abbruch oder Neustart Zufallszahl 2a6e C1 pop bc // wiederherstellen BC // Einsprung DJNZ 12 Runden 2a6f E1 pop hl // wiederherstellen HL 2a70 23 inc hl // erhöhe Adresse Zufallsfolgen 2a71 0D dec c // vermindere Rundenanzahl (32 ...) 2a72 20 E4 jrnz 0xe4 // 0x2a58 weiter, noch Zufallsfolgen vorhanden? 2a74 3A D8 DC ld a, (0xdcd8) // Ende der Zufallsfolgen erreicht; A = 0x00 2a77 3C inc a // Wiederholungszähler A = 0x01, 0x02, 0x03 2a78 FE 03 cp 0x03 // nach der dritten Runde Fehlermeldung 2a7a CA D3 02 jpz 0x02d3 // BLOCKIERUNG 3, HALT 2a7d 32 D8 DC ld (0xdcd8), a // Speichern erhöhten Wiederholungszähler 2a80 C3 2E 2A jp 0x2a2e // maximal 3 Runden Passworterzeugung // Einsprung 12 Passwortbuchstaben gespeichert 2a83 E1 pop hl // Stack geradeziehen 2a84 21 00 84 ld hl, 0x8400 // abgelegtes Passwort in CCITT-2/ITA-2 6bit 2a87 22 1F DC ld (0xdc1f), hl // AADRT:-Anfangsadresse Textspeicher 2a8a 21 0C 84 ld hl, 0x840c // Endadresse Passwort 2a8d 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 2a90 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor 2a93 21 28 84 ld hl, 0x8428 // 40 byte später 2a96 22 21 DC ld (0xdc21), hl // EADRT:-Endadresse Textspeicher 2a99 3E 08 ld a, 0x08 2a9b 32 1A DC ld (0xdc1a), a // ZTP:Zustand TextProzessor 2a9e AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2a9f 32 25 DC ld (0xdc25), a // ZUANZ:-Zustandsanzeige 2aa2 32 27 DC ld (0xdc27), a // ZUAN3:-Einfügemode 2aa5 21 03 DC ld hl, 0xdc03 // ZUALF:-Zustand Alpha-Tastendruck 2aa8 CB 86 res 0, (hl) // Lösche neues Zeichen 2aaa CD C8 29 call 0x29c8 // Einsprung Passworteingabe->Textprozessor; Zusammenziehen->Rundenschlüssel 2aad 11 00 84 ld de, 0x8400 // Zieladresse Chiffrat 2ab0 21 18 85 ld hl, 0x8518 // Startadresse Schlüssel 1 2ab3 3E 04 ld a, 0x04 // 4 Runden 2ab5 CD D7 2A call 0x2ad7 // Passwortchiffrierung mit Feistel, Übergabe HL, DE, A; vorwärts 2ab8 11 20 84 ld de, 0x8420 // Zieladresse Chiffrat 2abb 21 3A 85 ld hl, 0x853a // Startadresse Schlüssel 2 2abe 3E 01 ld a, 0x01 // 1 Runde 2ac0 CD D7 2A call 0x2ad7 // Passwortchiffrierung mit Feistel, Übergabe HL, DE, A; vorwärts 2ac3 21 00 84 ld hl, 0x8400 // Chiffrat 2ac6 01 20 00 ld bc, 0x0020 // Länge 32 byte 2ac9 CD B9 25 call 0x25b9 // Berechne CRC1, HL Startadresse, BC Länge, Rückgabe DE 2acc 21 41 84 ld hl, 0x8441 // Zieladresse CRC des chiffrierten Passwortes 2acf 72 ld (hl), d 2ad0 23 inc hl 2ad1 73 ld (hl), e // (0x8441, 08x442) = CRC Summe Passwort 2ad2 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2ad3 32 FE 97 ld (0x97fe), a // Nr. Textausagbe 2ad6 C9 ret // Chiffrat PWD CRC abgelegt. // Passwortchiffrierung mit Feistel, Übergabe HL, DE, A; identisch mit 0x2961 außer Richtung Vorwärts // Übergabe HL, DE, A 2ad7 ED 53 EA 83 ld (0x83ea), de // rette Zeiger Zieladresse; 0x8400; 0x8420; 0x8518 // Schleife A, n* Runden aus der Übergabe 2adb F5 push af <-\ // rette AF, Einsprung Schleife, A = Schleifenzähler 2adc 11 42 DC ld de, 0xdc42 | // HL aus Übergabe 0x8518 2adf 01 08 00 ld bc, 0x0008 | // Länge 64bit, 8byte 2ae2 ED B0 ldir | // Kopie (HL) > (0xdc42) Länge 64bit, 8byte 2ae4 E5 push hl | // rette HL + 8 2ae5 21 42 DC ld hl, 0xdc42 | 2ae8 11 96 DE ld de, 0xde96 | 2aeb 01 08 00 ld bc, 0x0008 | // Länge 64bit, 8byte 2aee ED B0 ldir | // Kopie (0xdc42) > (0xde96) Länge 64bit, 8byte 2af0 CD 3D 1C call 0x1c3d | // Feistel vorwärts, Übergabe/Rückgabe 0xde96 2af3 21 96 DE ld hl, 0xde96 | // Wurmfolgen 2af6 11 42 DC ld de, 0xdc42 | 2af9 01 08 00 ld bc, 0x0008 | // Länge 64 bit 2afc ED B0 ldir | // Zurück - Kopieren (0xde96) > (0xdc42) Länge 64bit, 8byte 2afe ED 5B EA 83 ld de, (0x83ea) | // Übergabe DE n*8 2b02 21 42 DC ld hl, 0xdc42 | 2b05 01 08 00 ld bc, 0x0008 | // Länge 64bit, 8byte 2b08 ED B0 ldir | // Zurück - Kopieren (0xdc42) > 0x8400; 0x84 Länge 8 Byte 2b0a ED 53 EA 83 ld (0x83ea), de | // DE+8; Zeiger auf DE aus der Übergabe [0x8400, 0x8420] 2b0e E1 pop hl | // wiederherstellen HL, aus Übergabe HL + 8 2b0f F1 pop af | // wiederherstellen AF 2b10 3D dec a | // Schleifenzähler A-- 2b11 20 C8 jrnz 0xc8 >-/ // 0x2adb, A != 0 springe in die Schleife 2b13 C9 ret // Umwandlungstabelle Buchstaben - Fernschreibzeichen 2b14 01 03 05 06 07 09 0A 0B 0C 0D 0E 0F // E A S I U D R J N F C K 2b20 10 11 12 13 14 15 16 17 18 19 1A 1C 1D 1E // T Z L W H Y P Q O B G M X V // DES-256 Dechiffrieren 2b2e 3A 00 DC ld a, (0xdc00) // Arbeitsspeicher, Hauptbetriebsart-1; GL.HBA 2b31 FE 01 cp 0x01 // MIRA 2b33 28 08 jrz 0x08 // 0x2b3d 2b35 2A A4 DC ld hl, (0xdca4) // GO; Endadresse GTX-Speicher 2b38 01 00 90 ld bc, 0x9000 // Startadresse, GeheimtextspeicherZifferncode, GTX-Speicher empfangen; GL.SPE 2b3b 18 06 jr 0x06 // 0x2b43 // Einsprung MIRA 2b3d 2A A2 DC ld hl, (0xdca2) // Hole End-Adresse von GTX (A-P) 2b40 01 00 8C ld bc, 0x8c00 // GeheimtextspeicherText (A-P) // Einsprung GO 2b43 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2b44 ED 42 sbc hl, bc // Länge > 0, Länge > -1 2b46 CA 7E 02 jpz 0x027e // Kein Text -> Enter -> Menüprogramm 2b49 DA 76 02 jpc 0x0276 // Anzeige Meldung BLOCKIERUNG 1, Länge -1 2b4c 3A 2E DC ld a, (0xdc2e) // Steuerwort, sollte 0xfb sein 2b4f 32 2F DC ld (0xdc2f), a // Sichere Steuerwort vor Dechiffrierung, danach wiederherstellen! 2b52 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2b53 32 2E DC ld (0xdc2e), a // Steuerwort 0x00 2b56 3E 06 ld a, 0x06 // "DECHIFFRIEREN ?" 2b58 CD 9A 10 call 0x109a // Anzeige Befehls-Fehleranzeige 2b5b 11 1B 83 ld de, 0x831b // Kopie Schlüssel 1 2b5e 2A 81 DC ld hl, (0xdc81) // Zeiger auf Schlüssel 1 2b61 01 20 00 ld bc, 0x0020 // Länge = 32 * 8 bit 2b64 ED B0 ldir // kopiere 256 bit Schlüssel 2b66 2A 83 DC ld hl, (0xdc83) // Zeiger CRC; 2b69 22 01 83 ld (0x8301), hl // kopiere Zeiger auf CRC Schlüssel 1 2b6c 21 1B 83 ld hl, 0x831b // Kopie Schlüssel 1 2b6f 01 20 00 ld bc, 0x0020 // Länge = 32 * 8 bit 2b72 CD 9F 28 call 0x289f // CRC1 Check, Übergabe HL Start, BC Länge, (0x8301) CRC, Rückgabe A ok = 0, Falsch = 0xff 2b75 FE FF cp 0xff // Error 2b77 CA DB 02 jpz 0x02db // BLOCKIERUNG 5 2b7a 21 1B 83 ld hl, 0x831b // Kopie Schlüssel 1 2b7d 11 9E DE ld de, 0xde9e // hole 8byte aus Schlüssel 1 Kopie und lege hier ab 2b80 01 08 00 ld bc, 0x0008 // Länge 8 byte = 64 bit 2b83 ED B0 ldir // kopiere (0x831b) > (0xde9e) 8 bytes, A = 0x00; 64 bit 2b85 CD 69 1B call 0x1b69 // Rundenschlüssel für Feistel, Übergabe A = 0x00, Schlüssel 0xde93 ... 0xdea5, Rückgabe 0xde00 2b88 11 0B 83 ld de, 0x830b 2b8b 21 00 90 ld hl, 0x9000 // GeheimtextspeicherZifferncode, GTX-Speicher empfangen; GL.SPE 2b8e 01 08 00 ld bc, 0x0008 // Länge 2b91 ED B0 ldir // kopiere (0x9000) > (0x830b) 8 bytes; GL.SPE 2b93 21 08 90 ld hl, 0x9008 // Endadresse IV 2b96 22 01 83 ld (0x8301), hl 2b99 21 0B 83 ld hl, 0x830b // Startadresse GTX, Endadr. CRC16 IV 2b9c 01 08 00 ld bc, 0x0008 // IV 2b9f CD 9F 28 call 0x289f // CRC1 Check des IV, Übergabe HL Start, BC Länge, (0x8301) CRC, Rückgabe A ok = 0, Falsch = 0xff 2ba2 FE FF cp 0xff // Error 2ba4 CA DB 02 jpz 0x02db // BLOCKIERUNG 5 2ba7 3A 00 DC ld a, 0xdc00 // Arbeitsspeicher,Hauptbetriebsart-1; GL.HBA 2baa FE 01 cp 0x01 // MIRA 2bac 28 10 jrz 0x10 // Sprung MIRA // Dummy Dechiffrieren GO 2bae 2A A4 DC ld hl, (0xdca4) // GO 2bb1 01 0C 90 ld bc, 0x900c // Startadr. GTX 2bb4 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2bb5 ED 42 sbc hl, bc // Länge == -1 2bb7 DA DB 02 jpc 0x02db // BLOCKIERUNG 5 2bba 2B dec hl 2bbb 2B dec hl // HL - 1 (CRC16 Länge) 2bbc 18 0F jr 0x0f // 0x2bcd // Dummy Dechiffrieren MIRA 2bbe 2A A4 DC ld hl, (0xdca4) // Endadresse Gesamter GTX 2bc1 01 0A 90 ld bc, 0x900a // Endadresse IV CRC 2bc4 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2bc5 ED 42 sbc hl, bc // Länge == 0, Länge == -1 2bc7 CA AE 2C jpz 0x2cae // RICHTIGE IV; JEDOCH KEIN GT (KONTROLLAUSSPRUNG) 2bca DA DB 02 jpc 0x02db // BLOCKIERUNG 5 // Einsprung nach Prüfung Länge > 0 2bcd 22 03 83 ld (0x8303), hl // Sichere Länge, GL.ANZA1; Geheimtextlänge Anzahl 1 2bd0 21 00 88 ld hl, 0x8800 // Textspeicher empfangen 2bd3 22 07 83 ld (0x8307), hl // Zeiger auf Textspeicher 2bd6 21 00 00 ld hl, 0x0000 2bd9 22 05 83 ld (0x8305), hl // speichere 0x0000 2bdc 21 0C 90 ld hl, 0x900c // erstes GTX Zeichen 2bdf 22 09 83 ld (0x8309), hl // Zeiger auf 0x900c 2be2 3A 00 DC ld a, (0xdc00) // Arbeitsspeicher,Hauptbetriebsart-1; GL.HBA 2be5 FE 01 cp 0x01 // MIRA 2be7 20 06 jrnz 0x06 // Sprung HBA GO 2be9 21 0A 90 ld hl, 0x900a // MIRA // Einsprung GO 2bec 22 09 83 ld (0x8309), hl // Zeiger auf 0x900a oder 0x900c 2bef 21 0B 83 ld hl, 0x830b <-\ // Schleife bis Textende, HL Start IV 2bf2 11 96 DE ld de, 0xde96 | // Zieladresse Kopie IV 2bf5 01 08 00 ld bc, 0x0008 | // Länge 2bf8 ED B0 ldir | // kopiere IV (0x830b) > (0xde96) 2bfa CD 3D 1C call 0x1c3d | // Feistel vorwärts, Übergabe/Rückgabe 0xde96 2bfd 21 96 DE ld hl, 0xde96 | // Wurmfolgen 2c00 11 0B 83 ld de, 0x830b | 2c03 01 08 00 ld bc, 0x0008 | // Länge 2c06 ED B0 ldir | // kopiere Chiffr. IV (0xde96) > (0x830b) 8 bytes 64bit 2c08 21 0B 83 ld hl, 0x830b | // Wurmfolgen 2c0b ED 5B 09 83 ld de, (0x8309) | // Zeiger auf 0x900a oder 0x900c; GTX 2c0f DD 2A 07 83 ld ix, (0x8307) | // 0x8800 Klarttextspeicher empfangen 2c13 06 08 ld b, 0x08 | // Schleife "B" 8 Runden | 2c15 1A ld a, (de) <-\ | // GTX xor Wurm 2c16 AE xor (hl) | | // a = (DE) xor (hl) Dechiffrieren 2c17 DD 77 00 ld (ix + 00), a | | // Klartext binär 2c1a 23 inc hl | | 2c1b 13 inc de | | | // 0x8800 ... 0x8807 | | 2c1e 10 F5 djnz 0xf5 >-/ | // 8 Runden, 0x2c15 2c20 DD 22 07 83 ld (0x8307), ix | // 0x8807, sichere Zieladresse 2c24 ED 53 09 83 ld (0x8309), de | // Zeiger, sichere GTX-Adresse 2c28 2A 05 83 ld hl, (0x8305) | // HL = 0x0000, 0x0008, ... 2c2b 01 08 00 ld bc, 0x0008 | 2c2e 09 add hl, bc | // Zeiger HL + 0x08 2c2f 22 05 83 ld (0x8305), hl | // n+8 sichern 2c32 ED 5B 03 83 ld de, (0x8303) | // hole Zeiger DE; GL.ANZA1; Geheimtextlänge Anzahl 1 2c36 AF xor a | // Lösche A, Z-Flag = 1, carry-Flag = 0 2c37 ED 52 sbc hl, de | // Länge == -1 2c39 DA EF 2B jpc 0x2bef >-/ // Überlauf/Ungleich null 2c3c 21 00 88 ld hl, 0x8800 // Textspeicher empfangen 2c3f ED 4B 03 83 ld bc, (0x8303) // GL.ANZA1; Geheimtextlänge Anzahl 1 2c43 09 add hl, bc // Endadresse 2c44 22 A6 DC ld (0xdca6), hl // Speicher Adresse, für Auseinanderziehen 2c47 21 00 88 ld hl, 0x8800 // Textspeicher empfangen 2c4a 22 C4 DC ld (0xdcc4), hl // Startadresse auseinanderziehen 2c4d 2A A6 DC ld hl, (0xdca6) // doppelt gesicherte Endadresse 2c50 22 C2 DC ld (0xdcc2), hl // Endadresse Auseinanderziehen 2c53 CD 7F 2F call 0x2f7f // Auseinanderziehen Dechiffrieren, KT.ZA (0x8400); aus 8 Bit werden 6 Bit ASCII 2c56 2A C2 DC ld hl, (0xdcc2) // neue Endadresse Auseinanderziehen 2c59 22 A6 DC ld (0xdca6), hl // doppelt gesicherte Endadresse aktualisieren 2c5c 21 00 88 ld hl, 0x8800 // Textspeicher empfangen 2c5f 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 2c62 22 1F DC ld (0xdc1f), hl // AADRT:-Anfangsadresse Textspeicher 2c65 11 FF 03 ld de, 0x03ff // 1023 byte 2c68 19 add hl, de 2c69 22 21 DC ld (0xdc21), hl // EADRT:-Endadresse Textspeicher 2c6c 2A A6 DC ld hl, (0xdca6) // Endadresse Speicher: Text von Auseinanderziehen 2c6f 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor 2c72 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2c73 32 03 DC ld (0xdc03), a // ZUALF:-Zustand Alpha-Tastendruck lösche neues Zeichen 2c76 32 25 DC ld (0xdc25), a // ZUANZ:-Zustandsanzeige 2c79 32 26 DC ld (0xdc26), a // ZUAN2:-Merkerstelle für Bedienermeldungen 2c7c 3E 02 ld a, 0x02 // Zustandszeiger = 2 2c7e 32 AB DC ld (0xdcab), a // Zustandszeiger MIRA/GO 2c81 32 01 DC ld (0xdc01), a // Betriebsartenregister: GT erstellen 2c84 3E 10 ld a, 0x10 2c86 32 1A DC ld (0xdc1a), a // ZTP:Zustand TextProzessor 2c89 21 EC 87 ld hl, 0x87ec // Temporärer Speicherplatz 2c8c 36 00 ld (hl), 0x00 2c8e 11 ED 87 ld de, 0x87ed 2c91 01 13 00 ld bc, 0x0013 // Länge 19 byte; sichtbare Textlänge LCD 2c94 ED B0 ldir // Lösche (0x87ec) - (0x87ff) 0x13 bytes 2c96 CD 4A 09 call 0x094a // Textprozessor 2c99 21 00 88 ld hl, 0x8800 // Textspeicher empfangen 2c9c 22 A6 DC ld (0xdca6), hl 2c9f 01 FF 03 ld bc, 0x03ff // 1023 byte 2ca2 CD 5F 1B call 0x1b5f // Lösche Bereich; Übergabe HL, Länge BC 2ca5 3A 2F DC ld a, (0xdc2f) // ANZA1:-Länge KT-Chiff/Dechiff 2ca8 32 2E DC ld (0xdc2e), a // Steuerwort wiederherstellen nach Dechiffrierung! 2cab C3 BE 01 jp 0x01be // Menüprogramm // RICHTIGE IV; JEDOCH KEIN GT (KONTROLLAUSSPRUNG) 2cae 3E 01 ld a, 0x01 // "BITTE WEITER" 2cb0 CD 9A 10 call 0x109a // Ausgabe LCD Meldung 2cb3 CD 2B 02 call 0x022b // ein Zeichen von der Tastatur 2cb6 3A 02 DC ld a, (0xdc02) // ALDAT:-Datenübergaberegister Tastatur 2cb9 FE 43 cp 0x43 // ENTER 2cbb 20 F6 jrnz 0xf6 // 0x2cb3, Tastendruck != "ENTER" 2cbd C3 BE 01 jp 0x01be // Menüprogramm // Betriebsart Klartexterstellung 2cc0 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2cc1 32 2E DC ld (0xdc2e), a // Steuerwort 0x00 2cc4 3E 04 ld a, 0x04 // "TEXTERSTELLEN" 2cc6 CD 9A 10 call 0x109a // Ausgabe LCD Meldung 2cc9 CD 1C 02 call 0x021c // Zeit 1sec 2ccc 21 00 84 ld hl, 0x8400 // Textspeicher; GL.KTSPS 2ccf 22 1B DC ld (0xdc1b), hl // ZADR:-Aktueller Zeiger-TextProzessor 2cd2 22 1F DC ld (0xdc1f), hl // AADRT:-Anfangsadresse Textspeicher 2cd5 11 FF 03 ld de, 0x03ff // Textlänge GO 1 kByte 2cd8 3A 00 DC ld a, (0xdc00) // Arbeitsspeicher,Hauptbetriebsart-1; GL.HBA 2cdb FE 01 cp 0x01 // MIRA 2cdd 20 03 jrnz 0x03 // Sprung HBA GO 2cdf 11 00 02 ld de, 0x0200 // Bei MIRA nur 1/2 kByte 2ce2 19 add hl, de // 0x8400 + Länge = 0x8600 oder 0x87ff 2ce3 22 21 DC ld (0xdc21), hl // EADRT:-Endadresse Textspeicher 2ce6 EB ex de, hl 2ce7 2A C6 DC ld hl, (0xdcc6) // GL.EAKTS 2cea 22 1D DC ld (0xdc1d), hl // EADR:-End-Zeiger-TextProzessor 2ced A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 2cef ED 52 sbc hl, de // Länge == -1 2cf0 38 04 jrc 0x04 // 0x2f6 2cf2 ED 53 1D DC ld (0xdc1d), de // EADR:-End-Zeiger-TextProzessor // Einsprung Länge == -1 2cf6 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2cf7 32 1A DC ld (0xdc1a), a // ZTP:Zustand TextProzessor Texteingabe 2cfa 32 03 DC ld (0xdc03), a // ZUALF:-Zustand Alpha-Tastendruck lösche neues Zeichen 2cfd 32 26 DC ld (0xdc26), a // ZUAN2:-Merkerstelle für Bedienermeldungen 2d00 32 27 DC ld (0xdc27), a // ZUAN3:-Einfügemode 2d03 32 01 DC ld (0xdc01), a // Betriebsartenregister: 0-KT erstellen 2d06 32 2A DC ld (0xdc2a), a // ALRC:-Adresse CRC-Wert Register 2d09 32 25 DC ld (0xdc25), a // ZUANZ:-Zustandsanzeige 2d0c 3E 01 ld a, 0x01 // Zustandszeiger = 1 2d0e 32 AB DC ld (0xdcab), a // Zustandszeiger MIRA/GO 2d11 21 EC 83 ld hl, 0x83ec 2d14 36 00 ld (hl), 0x00 2d16 11 ED 83 ld de, 0x83ed 2d19 01 13 00 ld bc, 0x0013 // Länge 19 byte 2d1c ED B0 ldir // Lösche (0x83ec) - (0x83ff) 19 bytes 2d1e CD 4A 09 call 0x094a // Textprozessor 2d21 21 10 5C ld hl, 0x5c10 // GTX Speicher senden (Add 2d24 01 FE 03 ld bc, 0x03fe // Länge 0x03fe 2d27 CD 5F 1B call 0x1b1f // CRC2 Berechnung und Prüfung, Übergabe HL Wertebereich, BC Länge, (0xdc2b) CRC für Prüfung; Rückgabe A 0 = io, 0xff = falsch 2d2a AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2d2b 32 2A DC ld (0xdc2a), a // ALRC:-Adresse CRC-Wert Register 2d2e 3E 02 ld a, 0x02 // "MOMENT BITTE" 2d30 CD 9A 10 call 0x109a // Ausgabe LCD Meldung 2d33 2A 1D DC ld hl, (0xdc1d) // EADR:-End-Zeiger-TextProzessor 2d36 22 C6 DC ld (0xdcc6), hl // GL.EAKTS 2d39 11 00 84 ld de, 0x8400 // Textspeicher; GL.KTSPS 2d3c A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 2d3d ED 52 sbc hl, de // Länge == 0, Länge == -1 2d3f CA 7E 02 jpz 0x027e // Kein Text -> Enter -> Menüprogramm 2d42 DA DB 02 jpc 0x02db // BLOCKIERUNG 5 2d45 3E 23 ld a, 0x23 // DI, Zeitgeber, Vorteiler 256, neg. Flanke, RESET 2d47 D3 0B out (0x0b), a // CTC Kanal 3 Zeitgeber 2d49 DD 21 F6 3D ld ix, 0x3df6 // Zeiger CRC Check K-Box 2d4d FD 21 54 2D ld iy, 0x2d54 // Return-Trick Adresse 0x2d54 weiter nach PP 2d51 C3 8D 25 jp 0x258d // ROM-RAM Check, Übergabe IX + 0 & IX + 1 = Startbereich CRC , IX + 2 & IX + 3 Länge für CRC, IX + 4 & IX + 5 speichere CRC, BC Länge 2d54 C2 D3 02 jpnz 0x02d3 // BLOCKIERUNG 3, HALT 2d57 CD 5D 2D call 0x2d5d // Zusammenziehen Chiffrieren(0x8400); Rückgabe DE = (0xdcc6), 6 bit ASCII nach 8 bit 2d5a C3 D1 2D jp 0x2dd1 // weiter: Auffüllen zur Erreichung voller 5er Gruppen, Übergabe DE // ZUSAMMENZIEHEN, 6 bit CCITT/ITA-2 nach 8 bit // Übergabe (0xdcc6) Endadresse, die doppelt gespeicherte! 2d5d 21 00 84 ld hl, 0x8400 // Textspeicher; GL.KTSPS 2d60 E5 push hl 2d61 D1 pop de // HL = DE = 0x8400 2d62 0E 01 ld c, 0x01 // Zustandszähler // Einsprung; Schleife Zustandszähler a, c 2d64 79 ld a, c // Speicherung letzter Schritt; in der Schleife wird hier fortlaufend weitergezählt über "C" 2d65 0C inc c // nächster Schritt, Schleifenzähler 2d66 FE 02 cp 0x02 // a == 0x02 2d68 28 0D jrz 0x0d >-\ // ja springe, 0x2d77 2d6a FE 03 cp 0x03 | // a == 0x03 2d6c 28 1D jrz 0x1d >-\ | // ja springe, 0x2d8b 2d6e FE 04 cp 0x04 | | // a == 0x04 2d70 28 29 jrz 0x29 >-\ | | // ja springe, 0x2d9b | | | // Zustand 1 : vollständig übernehmen | | | 2d72 7E ld a, (hl) | | | // Zeichen aus 0x8400 ... holen 2d73 23 inc hl | | | 2d74 12 ld (de), a | | | // erstes Zeichen in 0x8400 + n ablegen 2d75 18 30 jr 0x30 >-\ | | | // 0x2da7; Endkontrolle | | | | // Zustand 2: 2 weg, 1 nach oben, Rest 4; C war == 0x02 | 2d77 1A ld a, (de) | | | <-/ 2d78 CB 26 sla (hl) | | | // schiebe (HL), carry <- (HL.7) <- (HL.0) <- 0 2d7a CB 26 sla (hl) | | | // schiebe (HL), carry <- (HL.7) <- (HL.0) <- 0 2d7c CB 26 sla (hl) | | | // schiebe (HL), carry <- (HL.7) <- (HL.0) <- 0, carry = (HL bit5) 2d7e CB 17 rl a | | | // rotiere A, carry -> A0 -> A7 -> carry 2d80 CB 26 sla (hl) | | | // schiebe (HL), carry <- (HL.7) <- (HL.0) <- 0, carry = (HL bit4) 2d82 CB 17 rl a | | | // rotiere A, carry <- a7 <- a0 <- carry 2d84 12 ld (de), a | | | // (DE) = A; 0x8400 + n 2d85 13 inc de | | | // nächste Speicherstelle 2d86 7E ld a, (hl) | | | // hole nächsten 6 bit 2d87 23 inc hl | | | // neue Adresse 2d88 12 ld (de), a | | | // nächster Wert in 0x8400 + n abgelegt 2d89 18 1C jr 0x1c >-| | | // 0x2da7; Endkontrolle | | | // Zustand 3: 2 weg, 4 nach oben; C war == 0x03 | | 2d8b 1A ld a, (de) | | | 2d8c E6 F0 and 0xf0 | | <-/ // maskiere obere 4 bits 2d8e 46 ld b, (hl) | | 2d8f CB 38 srl b | | // schiebe B, 0 -> B7 -> B0 -> carry 2d91 CB 38 srl b | | // schiebe B, 0 -> B7 -> B0 -> carry, carry = B bit 1 2d93 B0 or b | | // A or B; 2d94 12 ld (de), a | | 2d95 13 inc de | | 2d96 7E ld a, (hl) | | 2d97 23 inc hl | | 2d98 12 ld (de), a | | // Ablegen im Speicher 2d99 18 0C jr 0x0c >-| | // 0x2da7; Endkontrolle | | // Zustand 4: alle Hoch; C war 0x04 | | 2d9b 1A ld a, (de) | <-/ 2d9c 0F rrca | // rotieren A; A0 -> A7 -> A0 carry = A0 2d9d 0F rrca | // rotieren A; A0 -> A7 -> A0 carry = A0 2d9e E6 C0 and 0xc0 | // maskiere bits 7 und 6, hole nur bit 7 und 6 für das nächste byte 2da0 46 ld b, (hl) | 2da1 B0 or b | // A or B, 8 Informationsbit vollständig 2da2 12 ld (de), a | 2da3 13 inc de | 2da4 23 inc hl | 2da5 0E 01 ld c, 0x01 | // Schleifenvariable C wieder auf 1 // Endkontrolle | 2da7 D5 push de <-/ // rette DE in Stack 2da8 EB ex de, hl // tausche HL <> DE 2da9 2A C6 DC ld hl, (0xdcc6) // 0xdcc6 = GL.EAKTS; Endadresse 2dac A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 2dad ED 52 sbc hl, de // Länge > 0 2daf EB ex de, hl // Rücktausch, Restlänge in DE 2db0 D1 pop de // Hole DE vom Stack 2db1 20 B1 jrnz 0xb1 // 0x2d64; Restlänge == 0 weiter, sonst Schleife 0x2d64 // Auffüllen bei Ende; C == 1 alles in Ordnung 2db3 0D dec c 2db4 28 16 jrz 0x16 // C == 0x00, 0x2dcc 2db6 0D dec c 2db7 20 06 jrnz 0x06 // C != 0x00, 0x2dbf 2db9 CB 27 sla a // schiebe A, carry <- A7 <- A0 <- 0 2dbb CB 27 sla a // schiebe A, carry <- A7 <- A0 <- 0, carry = A bit 6 2dbd 18 0B jr 0x0b // 0x2dca // C = 3 : Hintere 4 auf 0; nicht 0x00 2dbf 0D dec c 2dc0 20 04 jrnz 0x04 // immer nocht nicht 0x00, 0x2dc6 2dc2 E6 F0 and 0xf0 // maskiere ober 4 bits 2dc4 18 04 jr 0x04 // 0x2dca // C = 4 : 6 * rechts 2dc6 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 2dc7 0F rrca // rotieren A; A0 -> A7 -> A0 carry = A0 2dc8 E6 C0 and 0xc0 // 2 mal rotieren A7 -> A0 -> A7/Carry // Einsprung Auffüllen C war 2 2dca 12 ld (de), a 2dcb 13 inc de // Einsprung aus Auffüllen C war 1 2dcc ED 53 C6 DC ld (0xdcc6), de // GL.EAKTS; aktualisierte Endadress nach dem Zusammenziehen 2dd0 C9 ret // Auffüllen zur Erreichung voller 5er Gruppen, Übergabe DE = (0xdcc6) Endadresse 2dd1 21 00 84 ld hl, 0x8400 // Textspeicher; GL.KTSPS 2dd4 EB ex de, hl // DE 0x8400, HL Endardesse (0xdcc6) 2dd5 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 2dd6 ED 52 sbc hl, de // Länge Text 2dd8 11 05 00 ld de, 0x0005 2ddb A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0 2ddc ED 52 sbc hl, de // -5 bis HL == 0x05 ist 2dde 28 12 jrz 0x12 // KEIN AUFFÜLLEN; differenz von 5 Zeichen/Länge == 0x00, 0x2df2 2de0 30 F9 jrnc 0xf9 // != 0x05, 0x2ddc, Textlänge durch 5 Teilbar? 2de2 19 add hl, de // +5 2de3 3E 05 ld a, 0x05 2de5 95 sub l // l - 5 2de6 47 ld b, a // b = 0x05, Schleifenzähler 2de7 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2de8 2A C6 DC ld a, (0xdcc6) // GL.EAKTS; Endadresse TxtSpeicher 2deb 77 ld (hl), a <-\ // (HL-5) = (0xdcc6); GL.EAKTS 2dec 23 inc hl | // ++HL 2ded 10 FC djnz 0xfc >-/ // 5 mal, 0x2dec 2def 22 C6 DC ld (0xdcc6), hl // GL.EAKTS // Einsprung Länge teilbar durch 5 2df2 2A C6 DC ld hl, (0xdcc6) // GL.EAKTS, Endadresse TxtSpeicher 2df5 01 00 84 ld bc, 0x8400 // Textspeicher; GL.KTSPS 2df8 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2df9 ED 42 sbc hl, bc // Länge == 0, Länge == -1 2dfb CA 7E 02 jpz 0x027e // Kein Text -> Enter -> Menüprogramm 2dfe DA DB 02 jpc 0x02db // BLOCKIERUNG 5 2de1 22 03 83 ld (0x8303), hl // GL.ANZA1; Geheimtextlänge Anzahl 1; Länge des belegten TxtSpeichers 2de4 44 ld b, h 2de5 4D ld c, l // BC = HL = (0xdcc6) GL.EAKTS; Länge des belegten Txtspeichers 2de6 21 00 84 ld hl, 0x8400 // Textspeicher; GL.KTSPS 2de9 CD 31 1B call 0x1b31 // CRC2-16 Schleife, Übergabe HL Adresse, BC Länge, Rückgabe CRC in DE 2deb ED 53 59 83 ld (0x8359), de // CRC in 0x8359 ablegen 2e10 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2e11 32 00 83 ld (0x8300), a // Aufrufzähler = 0x00 2e14 11 1B 83 ld de, 0x831b // Kopie Schlüssel 1 2e17 2A 81 DC ld hl, (0xdc81) // Schlüssel 1 2e1a 01 20 00 ld bc, 0x0020 // Länge 32 byte - 256 bit 2e1d ED B0 ldir // Kopiere von ((0xdc81)) > (0x831b) 2e1f 2A 83 DC ld hl, (0xdc83) // Zeiger Schlüssel 2 2e22 22 01 83 ld (0x8301), hl 2e25 21 1B 83 ld hl, 0x831b // Kopie Schlüssel 1 2e28 01 20 00 ld bc, 0x0020 // Länge 32 byte - 256 bit 2e2b CD 9F 28 call 0x289f // CRC1 Check, Übergabe HL Start, BC Länge, (0x8301) CRC, Rückgabe A ok = 0, Falsch = 0xff 2e2e FE FF cp 0xff // CRC Falsch 2e30 CA DB 02 jpz 0x02db // BLOCKIERUNG 5 2e33 21 1B 83 ld hl, 0x831b // Kopie Schlüssel 1 2e36 11 9E DE ld de, 0xde9e // Adresse für Schlüsselbearbeitung 2e39 01 08 00 ld bc, 0x0008 // Länge 64 bit 2e3c ED B0 ldir // Kopiere (0x831b) > (0xde9e) 8 byte, A = 0x00 2e3e CD 69 1B call 0x1b69 // Rundenschlüssel für Feistel, Übergabe A = 0x00, Schlüssel 0xde93 ... 0xdea5, Rückgabe 0xde00 2e41 11 0B 83 ld de, 0x830b // Zieladresse IV 2e44 21 77 DC ld hl, 0xdc77 // IV 2e47 01 08 00 ld bc, 0x0008 // Länge 64 bit 2e4a ED B0 ldir // Kopie (0xdc77) > (0x830b) 8 byte 2e4c 21 7F DC ld hl, 0xdc7f // CRCsy Länge 2; CRC der IV 2e4f 22 01 83 ld (0x8301), hl // Übergabe CRC für Check 2e52 21 0B 83 ld hl, 0x830b // Kopierte IV 2e55 01 08 00 ld bc, 0x0008 // Länge 64 bit 2e58 CD 9F 28 call 0x289f // CRC1 Check, Übergabe HL Start, BC Länge, (0x8301) CRC, Rückgabe A ok = 0, Falsch = 0xff 2e5b FE FF cp 0xff // CRC falsch 2e5e CA DB 02 jpz 0x02db // BLOCKIERUNG 5 2e60 21 1C 5C ld hl, 0x5c1c // Adresse GTX Start 2e63 22 07 83 ld (0x8307), hl // in 0x8307 2e66 21 00 00 ld hl, 0x0000 2e69 22 05 83 ld (0x8305), hl 2e6c 21 00 84 ld hl, 0x8400 // Textspeicher; GL.KTSPS 2e6f 22 09 83 ld (0x8309), hl // Einsprung bis Textende erreicht 2e72 21 0B 83 ld hl, 0x830b <-\ // kopierte IV 2e75 11 96 DE ld de, 0xde96 | 2e78 01 08 00 ld bc, 0x0008 | // Länge 64 bit 2e7b ED B0 ldir | // kopiere (0x830b) > (0xde96) 8 bytes 2e7d CD 3D 1C call 0x1c3d | // Feistel vorwärts, Übergabe/Rückgabe 0xde96 2e80 21 96 DE ld hl, 0xde96 | // Berechnerte Wurmfolgen 2e83 11 0B 83 ld de, 0x830b | // chiffr. IV 2e86 01 08 00 ld bc, 0x0008 | // Länge 64 bit 2e89 ED B0 ldir | // kopiere 0xde96 > 0x830b 8 bytes 2e8b 21 0B 83 ld hl, 0x830b | // chiffr. IV 2e8e ED 5B 09 83 ld de, (0x8309) | // Klartext aus 0x8400; GL.KTSPS 2e92 DD 2A 07 83 ld ix, (0x8307) | // Zieladresse, 0x5c1c 2e96 06 08 ld b, 0x08 | // Schleife 8 Runden 2e98 1A ld a, (de) <-\ | 2e99 AE xor (hl) | | // Chiffriert 2e9a DD 77 00 ld (ix + 0x00), a | | // (IX + n) = (DE + n) xor (HL + n); n = 0 - 7 2e9d 23 inc hl | | // n = 0 ... 7 2e9e 13 inc de | | 2e9f DD 23 inc ix | | // 0x5c1c + 8, 0x5c1c ... 0x5c23 2ea1 10 F5 djnz 0xf5 >-/ | // 8 bytes verknüpft in ix abgelegt 2ea3 DD 22 07 83 ld (0x8307), ix | // 0x5c1c ++ 2ea7 CD 58 1F call 0x1f58 | // Kontroll-Chiffrierung, Übergabe IX, Rückgabe A 0x00 OK, A 0xff Fehler 2eaa 2A 09 83 ld hl, (0x8309) | // Zeiger auf 0x8400 2ead 11 33 DC ld de, 0xdc33 | // SPAD1:-Zieladresse/chiff/dechiff 2eb0 06 08 ld b, 0x08 | // Schleife 8 Runden - 64bit 2eb2 1A ld a, (de) <-\ | 2eb3 AE xor (hl) | | // (DE) XOR (HL), Kontrolle Chiffrate == 2eb4 C2 DB 02 jpnz 0x02db | | // BLOCKIERUNG 5 2eb7 23 inc hl | | 2eb8 13 inc de | | 2eb9 10 F7 djnz 0xf7 >-/ | // 8 bytes geprüft 2ebb 22 09 83 ld (0x8309), hl | // (0x8309) +8 2ebe 2A 05 83 ld hl, (0x8305) | // Zeiger auf ?, Länge des Textes 2ec1 01 08 00 ld bc, 0x0008 | // Länge 8 byte 2ec4 09 add hl, bc | 2ec5 22 05 83 ld (0x8305), hl | // Zeiger auf ?, Neue Adresse des Textes 2ec8 ED 5B 03 83 ld de, (0x8303) | // GL.ANZA1; Geheimtextlänge Anzahl 1 2ecc AF xor a | // Lösche A, Z-Flag = 1, carry-Flag = 0 2ecd ED 52 sbc hl, de | // Länge > -1 2ecf 30 0A jrnc 0x0a | >-\ // 0x2edb -> Textende 2ed1 3A 3B DC ld a, 0xdc3b | | 2ed4 B7 or a | | // A == 0? 2ed5 C2 DB 02 jpnz 0x02db | | // BLOCKIERUNG 5 2ed8 C3 72 2E jp 0x2e72 >-/ | // weiter Ergebnis der chiff. IV Aufruf Algorithmus bis Textende // Einsprung Textende | 2edb 3A 3B DC ld a, (0xdc3b) <-/ 2ede FE FF cp 0xff 2ee0 C2 DB 02 jpnz 0x02db // BLOCKIERUNG 5 2ee3 21 1C 5C ld hl, 0x5c1c // GTX Startadresse 2ee6 ED 4B 03 83 ld bc, (0x8303) // GL.ANZA1; Geheimtextlänge Anzahl 1 2eea 09 add hl, bc // End-Adresse GTX 2eeb 22 D2 DC ld (0xdcd2), hl 2eee 21 1C 5C ld hl, 0x5c1c // GTX Startadresse 2ef1 CD B9 25 call 0x25b9 // Berechne CRC1, HL Startadresse, BC Länge, Rückgabe DE 2ef4 21 40 95 ld hl, 0x9540 // Ablageort CRC 2ef7 72 ld (hl), d // D aus CRC 2ef8 23 inc hl 2ef9 73 ld (hl), e // CRC (0x9540) 2efa 21 7F DC ld hl, 0xdc74 2efd 22 01 83 ld (0x8301), hl // Zeiger auf 0xdc74 2f00 21 77 DC ld hl, 0xdc77 // IV 2f03 01 08 00 ld bc, 0x0008 // Länge 8 byte 2f06 CD 9F 28 call 0x289f // CRC1 Check, Übergabe HL Start, BC Länge, (0x8301) CRC, Rückgabe A ok = 0, Falsch = 0xff 2f09 FE FF cp 0xff // Error 2f0b CA DB 02 jpz 0x02db // BLOCKIERUNG 5 2f0e 11 10 5C ld de, 0x5c10 // CRC OK, GTX Speicher senden (Add 2f11 21 77 DC ld hl, 0xdc77 // IV 2f14 01 08 00 ld bc, 0x0008 // Länge 8 byte 2f17 ED B0 ldir // kopiere (0xdc77) > (0x5c10), 8 bytes; GTX Speicher senden (Add 2f19 21 7F DC ld hl, 0xdc7f // CRCsy Länge 2; CRC der IV 2f1c 01 02 00 ld bc, 0x0002 // Länge, DE = 0x5c18 2f1f ED B0 ldir // kopiere (0xdc7f) > (0x5c18) 2 bytes 2f21 2A 03 83 ld hl, (0x8303) // GL.ANZA1; Geheimtextlänge Anzahl 1 2f24 23 inc hl 2f25 23 inc hl // wg. CRC -Wert 2f26 11 1A 5C ld de, 0x5c1a // Nach CRC Textlänge ablegen 2f29 7C ld a, h 2f2a 12 ld (de), a 2f2b 13 inc de // de = 0x5c1b 2f2c 7D ld a, l 2f2d 12 ld (de), a 2f2e 2A D2 DC ld hl, (0xdcd2) 2f31 06 14 ld b, 0x14 // Schleife 20 Runden // Schleife 2f33 36 00 ld (hl), 0x00 <-\ // (HL) Löschen 2f35 23 inc hl | 2f36 10 FB djnz 0xfb >-/ // 0x2f33, Lösche (HL) + n 2f38 ED 4B 03 83 ld bc, (0x8303) // GL.ANZA1; Geheimtextlänge Anzahl 1 2f3c 21 1C 5C ld hl, 0x5c1c // CRC des GTX 2f3f CD B9 25 call 0x25b9 // Berechne CRC1, HL Startadresse, BC Länge, Rückgabe DE 2f42 2A D2 DC ld hl, (0xdcd2) 2f45 72 ld (hl), d // Ablage CRC D-Teil 2f46 23 inc hl 2f47 73 ld (hl), e // Prüfsumme in (0xdcd2, 0xdcd3) 2f48 23 inc hl 2f49 22 D2 DC ld (0xdcd2), hl // Zeiger auf CRC 2f4c 21 00 84 ld hl, 0x8400 // Textspeicher; GL.KTSPS 2f4f 22 C4 DC ld (0xdcc4), hl // Zeiger auf 0x8400; Anfangsadresse Auseinanderziehen 2f52 2A C6 DC ld hl, (0xdcc6) // GL.EAKTS; doppelt gesicherte Endadresse 2f55 22 C2 DC ld (0xdcc2), hl // Zufallsfolge BITZ:-Bitzähler; Endadresse Auseinanderziehen 2f58 CD 7F 2F call 0x2f7f // Auseinanderziehen KontrollChiff., KT.ZA (0x8400); aus 8 Bit werden 6 Bit ASCII 2f5b 2A C2 DC ld hl, (0xdcc2) // Zufallsfolge BITZ:-Bitzähler; neue Endadresse Auseinanderziehen 2f5e 22 C6 DC ld (0xdcc6), hl // GL.EAKTS; doppelt gesicherte Endadresse aktualisieren 2f61 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2f62 32 2E DC ld (0xdc2e), a // Steuerwort 0x00 2f65 CD 4A 02 call 0x024a // CTC Kanal 3 Einschalten Tastatur CTC 2f68 C3 BE 01 jp 0x01be // Menüprogramm // Lösche Sende-Empf.-Textspeicher, wird wo aufgerufen? 2f6b 21 F0 83 ld hl, 0x83f0 // GL.KTSPS-16 2f6e E5 push hl 2f6f D1 pop de // DE = HL = 0x83f0 2f70 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 2f71 13 inc de // DE = 0x83f1 2f72 77 ld (hl), a // (0x83f0) = 0x00 2f73 01 0E 04 ld bc, 0x040e // Länge 2f76 ED B0 ldir // lösche mit 0x00, (0x83f0 - 0x87ff) 2f78 21 00 84 ld hl, 0x8400 // Textspeicher; GL.KTSPS 2f7b 22 C6 DC ld (0xdcc6), hl // GL.EAKTS 2f7e C9 ret // Auseinanderziehen; aus 8 Bit werden 6 Bit CCITT/ITA-2 // Input GL.SPAZ : Anfangsadresse KT; DE (0xdcc4) // GL.EAAZ : Endadresse KT; HL (0xdcc2) // Output GL.EAAZ : neue Endadresse KT 2f7f 2A C2 DC ld hl, (0xdcc2) // GL.EAAZ Endadresse Text 2f82 ED 5B C4 DC ld de, (0xdcc4) // GL.SPAZ Anfangsadresse Text 2f86 A7 and a // carry-Flag = 0, Z-Flag 1 bei A == 0; GL.EAAZ 2f87 ED 52 sbc hl, de // Länge > 5, < 1024 2f89 11 03 00 ld de, 0x0003 // Division durch 3 2f8c 01 00 00 ld bc, 0x0000 // BC Substraktionsrunden 2f8f 03 inc bc <-\ // Schleife bis carry == 1 2f90 A7 and a | // carry-Flag = 0, Z-Flag 1 bei A == 0 2f91 ED 52 sbc hl, de | // Länge > -1 2f93 30 FA jrnc 0xfa >-/ // 0x2f8f; Kein Übertrag 2f95 0B dec bc // Anzahl; Länge / 3 2f96 EB ex de, hl // Übertrag, Rette HL in DE 2f97 C5 push bc // DE = HL, HL Wird verworfen 2f98 E1 pop hl // HL = BC 2f99 29 add hl, hl 2f9a 29 add hl, hl // HL * 4 2f9b 7B ld a, e // E niederwertiger Teil der Länge 2f9c FE FD cp 0xfd // E == 0xfd, 0xfe, Negativer ungerade Übertrag 2f9e 28 06 jrz 0x06 >---\ // -3; 0x2fa6, e == 0xfd? Ja -Sprung 2fa0 FE FE cp 0xfe | // -2; 2fa2 28 01 jrz 0x01 >---\ | // 0x2fa5, e == 0xfe? Ja -Sprung // negativer Übertrag -2 ausgleichen | | 2fa4 23 inc hl | | // +1; // Negativer Übertrag -1 ausgleichen | | 2fa5 23 inc hl <---/ | // +1; Korrekturwert // Einsprung -3 | 2fa6 ED 5B C4 DC ld de, (0xdcc4) <---/ // DE = Anfangsadresse: 0x8400, 0x8800; Chiffrieren - Dechiffrieren 2faa 19 add hl, de // neue Endadresse, berechnet 2fab EB ex de, hl // HL in DE sichern 2fac 2A C2 DC ld hl, (0xdcc2) // HL = aus Übergabe Zeiger 0xdca6, 0xdcc6 2faf EB ex de ,hl // Rücktausch; HL = Länge + 0x8400 oder 0x8800; DE = Zeiger 0xdca6 oder 0xdcc6 2fb0 22 C2 DC ld (0xdcc2), hl // Zeiger 0xdcc2 mit Länge + 0x8400 oder 0x8800 kopieren 2fb3 2B dec hl // Neue Endadresse 2fb4 1B ld a, (de) // A = (0xdca6 oder 0xdcc6) 2fb5 D5 push de 2fb6 DD E1 pop ix // IX Quelle; IX = Zeiger DE (Endadresse) sichern 2fb8 ED 44 neg // Zähler 1...3,(4); 2kompliment von a; |a| = -a = a // Länge <> 0; weiter auseinanderziehen 2fba FE 03 cp 0x03 <---\ // hintere 6 zuerst 2fbc 20 0B jrnz 0x0b >---\ | // 0x2fc9 a == 0x03? Nein Sprung 2fbe DD 56 00 ld d, (ix + 0x00) | | // Auseinanderziehen von der letzten Stelle beginnend zur ersten Stelle. 2fc1 CB BA res 7, d | | // IX Zeiger auf Endadresse 2fc3 CB B2 res 6, d | | // Lösche bit 6 und 7, enspricht 0x3f AND D, Wert >= 0x3f! 2fc5 72 ld (hl), d | | // ablegen in neue Endadresse 2fc6 2B dec hl | | // Zeiger auf nächste vorherige Adresse 2fc7 18 43 jr 0x43 | >---\ | // 0x300c // Einsprung a <> 0x03 | | | 2fc9 FE 04 cp 0x04 <---/ | | // vordere 2, hintere 4 2fcb 20 18 jrnz 0x18 >---\ | | // 0x2fe5, a == 0x04? Nein Sprung 2fcd DD 56 00 ld d, (ix + 0x00) | | | 2fd0 DD 2B dec ix | | | 2fd2 DD 5E 00 ld e, (ix + 0x00) | | | // DE 16 bit 2mal rotieren 2fd5 CB 22 sla d | | | // schiebe D, carry < D7 < D0 < 0 2fd7 CB 13 rl e | | | // rotiere E, carry < E7 < E0 < carry von D7 2fd9 CB 22 sla d | | | // schiebe D, carry < D7 < D0 < 0 2fdb CB 13 rl e | | | // rotiere E, carry < E7 < E0 < carry von D7 2fdd CB BB res 7, e | | | 2fdf CB B3 res 6, e | | | // Lösche bit 6 und 7, enspricht 0x3f AND E, Wert => 0x3f! 2fe1 73 ld (hl), e | | | 2fe2 2B dec hl | | | 2fe3 18 27 jr 0x27 | >---+ | // 0x300c // Einsprung a <> 0x04 | | | 2fe5 FE 01 cp 0x01 <---/ | | // vordere 4, hintere 2 2fe7 20 18 jrnz 0x18 >---\ | | // 0x3001, A == 0x01? Nein Sprung 2fe9 DD 56 00 ld d, (ix + 0x00) | | | 2fec DD 2B dec ix | | | 2fee DD 5E 00 ld e, (ix + 0x00) | | | // DE 16 bit rotieren über carry 2ff1 CB 1B rr e | | | // rotiere E, carry > E7 > E0 > carry > E7 2ff3 CB 1A rr d | | | // rotiere D, carry > D7 > D0 > carry > D7 2ff5 CB 1B rr e | | | // rotiere E, carry > E7 > E0 > carry > E7 2ff7 CB 1A rr d | | | // rotiere D, carry > D7 > D0 > carry > D7 2ff9 CB 3A srl d | | | // schiebe D, 0 > D7 > D0 > carry 2ffb CB 3A srl d | | | // schiebe D, 0 > D7 > D0 > carry, carry = D bit 1 2ffd 72 ld (hl), d | | | // Lösche bit 6 und 7, enspricht 0x3f AND E, Wert => 0x3f! 2ffe 2B dec hl | | | 2fff 18 0B jr 0x0b | >-+ | // 0x300c // Einsprung a <> 0x01 | | | 3001 DD 56 00 ld d, (ix + 0x00) <-/ | | // vordere, die ersten, 6 3004 DD 2B dec ix | | 3006 CB 3A slr d | | // schiebe D, 0 > D7 > D0 > carray 3008 CB 3A slr d | | // Lösche bit 6 und 7, entspricht 0x3f AND E, Wert => 0x3f! 300a 72 ld (hl), d | | // Speichern in Adresse 0x85xx neue Endadresse 300b 2B dec hl | | // Rückwärts bis 0x8500 // Einsprung Test a = 4, 3, 1, Teste A = 5 | | 300c 3C inc a <---/ | // Schleifen-Berechnung 300d FE 05 cp 0x05 | // 300f 20 02 jrnz 0x02 >---\ | // 0x3013, A == 0x05 ja dann A = 1 sonst weiter 3011 3E 01 ld a, 0x01 | | // Einsprung a <> 0x05 | | 3013 ED 5B C4 DC ld de, (0xdcc4) <--/ | // Lade aus Übergabe: 0x8400, 0x8800 3017 1B dec de | 3018 A7 and a | // carry-Flag = 0, Z-Flag 1 bei A == 0 3019 EB ex de, hl | // Retten DE 301a ED 52 sbc hl, de | // Länge 301c EB ex de, hl | // Länge in DE 301d C2 BA 2F jpnz 0x2fba >---/ // Subtraktion Länge != 0x00 ja Weiter auseinanderziehen 3020 C9 ret // Länge == 0, Schleifenende Auseinanderziehen // Aufruf von PP, Kaltstart 3021 21 00 00 ld hl, 0x0000 3024 22 00 81 ld (0x8100), hl // Variablenspeicher 3027 3E 55 ld a, 0x55 3029 FE 55 cp 0x55 302b CA 32 30 jpz 0x3032 302e C3 F6 3B jp 0x3bf6 // DI - HALT 3031 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3032 FE AA cp 0xaa 3034 C2 3B 30 jpnz 0x303b 3037 C3 F6 3B jp 0x3bf6 // DI - HALT 303a F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 303b 32 09 81 ld (0x8109), a 303d 3E 00 ld a, 0x00 3040 3A 09 81 ld a, (0x8109) 3043 FE 55 cp 0x55 3045 CA 4C 30 jpz 0x304c 3048 C3 F6 3B jp 0x3bf6 // DI - HALT 304b F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 304c C3 53 30 jp 0x3053 304f C3 F6 3B jp 0x3bf6 // DI - HALT 3052 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3053 2A 00 81 ld hl, (0x8100) // Variablenspeicher 3056 23 inc hl 3057 22 00 81 ld (0x8100), hl // Variablenspeicher 305a 3E 00 ld a, 0x00 305c C6 55 add a, 0x55 305e C2 65 30 jpnz 0x3065 3061 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3064 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3065 D2 5C 30 jpnc 0x305c 3068 C6 AA add a, 0xaa 306a FE FE cp 0xfe 306c C2 FA 3B jpnz 0x3bfa // Sperre Int - HALT 306f C6 02 add a, 0x02 3071 CA 78 30 jpz 0x3078 3074 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3077 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3078 2A 00 81 ld hl, (0x8100) // Variablenspeicher 307b 23 inc hl 307c 22 00 81 ld (0x8100), hl // Variablenspeicher 307f 3E 03 ld a, 0x03 3081 FE 00 cp 0x00 3083 21 09 81 ld hl, 0x8109 3086 3E 00 ld a, 0x00 3088 77 ld (hl), a 3089 3E FF ld a, 0xff 308b 7E ld a, (hl) 308c FE 00 cp 0x00 308e CA 95 30 jpz 0x3095 3091 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3094 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3095 3E FF ld a, 0xff 3097 77 ld (hl), a 3098 3E 00 ld a, 0x00 309a 7E ld a, (hl) 309b FE FF cp 0xff 309d CA A4 30 jpz 0x30a4 30a0 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 30a3 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 30a4 3E 55 ld a, 0x55 30a6 77 ld (hl), a 30a7 3E 00 ld a, 0x00 30a9 7E ld a, (hl) 30aa FE 55 cp 0x55 30ac CA B3 30 jpz 0x30b3 30af C3 FA 3B jp 0x3bfa // Sperre Int - HALT 30b2 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 30b3 3E AA ld a, 0xaa 30b5 77 ld (hl), a 30b6 3E 00 ld a, 0x00 30b8 7E ld a, (hl) 30b9 FE AA cp 0xaa 30bb CA C2 30 jpz 0x30c2 30be C3 FA 3B jp 0x3bfa // Sperre Int - HALT 30c1 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 30c2 2A 00 81 ld hl, (0x8100) // Variablenspeicher 30c5 23 inc hl 30c6 22 00 81 ld (0x8100), hl // Variablenspeicher 30c9 3E 03 ld a, 0x03 30cb FE 00 cp 0x00 30cd 21 00 00 ld hl, 0x0000 30d0 11 00 00 ld de, 0x0000 30d3 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 30d4 ED 52 sbc hl, de // == 0 30d6 CA DD 30 jpz 0x30dd 30d9 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 30dc F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 30dd 21 FF FF ld hl, 0xffff 30e0 11 FF FF ld de, 0xffff 30e3 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 30e4 ED 52 sbc hl, de // > 0 30e6 CA ED 30 jpnz 0x30ed 30e9 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 30ec F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 30ed 21 AA AA ld hl, 0xaaaa 30f0 11 AA AA ld de, 0xaaaa 30f3 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 30f4 ED 52 sbc hl, de // > 0 30f6 CA FD 30 jpnz 0x30fd 30f9 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 30fc F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 30fd 21 55 55 ld hl, 0x5555 3100 11 55 55 ld de, 0x5555 3103 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 3104 ED 52 sbc hl, de // > 0 3106 CA 0D 31 jpnz 0x310d 3109 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 310c F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 310d 21 FF FF ld hl, 0xffff 3110 11 AA AA ld de, 0xffff 3113 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 3114 ED 52 sbc hl, de // > -1 3116 D2 1D 31 jpnc 0x311d 3119 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 311c F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 311d 21 55 55 ld hl, 0x5555 3120 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 3121 ED 52 sbc hl, de // > -1 3123 DA 2A 31 jpc 0x312a 3126 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3129 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 312a 2A 00 81 ld hl, (0x8100) // Variablenspeicher 312d 23 inc hl 312e 22 00 81 ld (0x8100), hl // Variablenspeicher 3131 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 3132 FE 03 cp 0x03 3134 26 00 ld h, 0x00 3136 3E FF ld a, 0xff 3138 7C ld a, h 3139 FE 00 cp 0x00 313b CA 42 31 jpz 0x3142 313e C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3141 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3142 26 FF ld h, 0xff 3144 3E 00 ld a, 0x00 3146 7C ld a, h 3147 FE FF cp 0xff 3149 CA 50 31 jpz 0x3150 314c C3 FA 3B jp 0x3bfa // Sperre Int - HALT 314f F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3150 26 55 ld h, 0x55 3152 3E 00 ld a, 0x00 3154 7C ld a, h 3155 FE 55 cp 0x55 3157 CA 5E 31 jpz 0x315e 315a C3 FA 3B jp 0x3bfa // Sperre Int - HALT 315d F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 315e 26 AA ld h, 0xaa 3160 3E 00 ld a, 0x00 3162 7C ld a, h 3163 FE AA cp 0xaa 3165 CA 6C 31 jpz 0x316c 3168 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 316b F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 316c 2A 00 81 ld hl, (0x8100) // Variablenspeicher 316f 23 inc hl 3170 22 00 81 ld (0x8100), hl // Variablenspeicher 3173 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 3174 2E 00 ld l, 0x00 3176 3E FF ld a, 0xff 3178 7D ld a, l 3179 FE 00 cp 0x00 317b CA 82 31 jpz 0x3182 317e C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3181 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3182 2E FF ld l, 0xff 3184 3E 00 ld a, 0x00 3186 7D ld a, l 3187 FE FF cp 0xff 3189 CA 90 31 jpz 0x3190 318c C3 FA 3B jp 0x3bfa // Sperre Int - HALT 318f F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3190 2E 55 ld l, 0x55 3192 3E 00 ld a, 0x00 3194 7D ld a, l 3195 FE 55 cp 0x55 3197 CA 9E 31 jpz 0x319e 319a C3 FA 3B jp 0x3bfa // Sperre Int - HALT 319d F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 319e 2E AA ld l, 0xaa 31a0 3E 00 ld a, 0x00 31a2 7D ld a, l 31a3 FE AA cp 0xaa 31a5 CA AC 31 jpz 0x31ac 31a8 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 31ab F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 31ac 2A 00 81 ld hl, (0x8100) // Variablenspeicher 31af 23 inc hl 31b0 22 00 81 ld (0x8100), hl // Variablenspeicher 31b3 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 31b4 FE 03 cp 0x03 31b6 3E 00 ld a, 0x00 31b8 6F ld l, a 31b9 3E FF ld a, 0xff 31bb 7D ld a, l 31bc FE 00 cp 0x00 31be CA C5 31 jpz 0x31c5 31c1 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 31c4 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 31c5 3E FF ld a, 0xff 31c7 6F ld l, a 31c8 3E 00 ld a, 0x00 31ca 7D ld l, a 31cb FE FF cp 0xff 31cd CA D4 31 jpz 0x31d4 31d0 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 31d3 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 31d4 3E AA ld a, 0xaa 31d6 6F ld l, a 31d7 3E 00 ld a, 0x00 31d9 7D ld a, l 31da FE AA cp 0xaa 31dc CA E3 31 jpz 0x31e3 31df C3 FA 3B jp 0x3bfa // Sperre Int - HALT 31e2 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 31e3 3E 55 ld a, 0x55 31e5 6F ld l, a 31e6 3E 00 ld a, 0x00 31e8 7D ld a, l 31e9 FE 55 cp 0x55 31eb CA F2 31 jpz 0x31f2 31ee C3 FA 3B jp 0x3bfa // Sperre Int - HALT 31f1 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 31f2 2A 00 81 ld hl, (0x8100) // Variablenspeicher 31f5 23 inc hl 31f6 22 00 81 ld (0x8100), hl // Variablenspeicher 31f9 21 00 00 ld hl, 0x0000 31fb 11 FF FF ld de, 0xffff 31ff EB ex de, hl 3200 7D ld a, l 3201 FE FF cp 0xff 3203 CA 0A 32 jpz 0x320a 3206 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3209 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 320a 7C ld a, h 320b FE FF cp 0xff 320d CA 14 32 jpz 0x3214 3210 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3213 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3214 21 55 55 ld hl, 0x5555 3217 11 AA AA ld de, 0xaaaa 321a EB ex de, hl 321b 7D ld a, l 321c FE AA cp 0xaa 321e CA 25 32 jpz 0x3225 3221 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3224 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3225 7C ld a, h 3226 FE AA cp 0xaa 3228 CA 2F 32 jpz 0x322f 322b C3 FA 3B jp 0x3bfa // Sperre Int - HALT 322e F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 322f 2A 00 81 ld hl, (0x8100) // Variablenspeicher 3232 23 inc hl 3233 22 00 81 ld (0x8100), hl // Variablenspeicher 3236 21 09 81 ld hl, 0x8109 3239 3E 01 ld a, 0x01 // Einsprung 323b 77 ld (hl), a 323c BE cp (hl) 323d CA 44 32 jpz 0x3244 // PP 3240 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3243 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3244 FE 00 cp 0x00 3246 CA 4E 32 jpz 0x324e // Weiter 3249 C6 01 add a, 0x01 324b C3 3B 32 jp 0x323b // Springe zurück - Zähler noch nicht 0x00 // weiter 324e 77 ld (hl), a 324f C6 01 add a, 0x01 3251 BE cp (hl) 3252 C2 59 32 jpnz 0x3259 3255 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3258 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3259 FE 00 cp 0x00 325a CA 61 32 jpz 0x3261 // Weiter 325e C3 4E 32 jp 0x324e // Zähler noch nicht 0x00 // weiter 3261 2A 00 81 ld hl, (0x8100) // Variablenspeicher 3264 23 inc hl 3265 22 00 81 ld (0x8100), hl // Variablenspeicher 3268 21 09 81 ld hl, 0x8109 326b 3E FF ld a, 0xff 326d 3D dec a 326e 77 ld (hl), a 326f C6 01 add a, 0x01 3271 D6 01 sub 0x01 3273 BE cp (hl) 3274 CA 7B 32 jpz 0x327b 3277 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 327a F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 327b FE 00 cp 0x00 327d C2 6D 32 jpnz 0x326d // Zähler noch nicht 0x00 3280 C3 87 32 jp 0x3287 // Weiter 3283 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3286 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3287 2A 00 81 ld hl, (0x8100) // Variablenspeicher 328a 23 inc hl 328b 22 00 81 ld (0x8100), hl // Variablenspeicher 328e 21 00 00 ld hl, 0x0000 3291 22 0A 81 ld (0x810a), hl 3294 21 FF FF ld hl, 0xffff 3297 2A 0A 81 ld hl, (0x810a) 329a 11 00 00 ld de, 0x0000 329d AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 329e ED 52 sbc hl, de // == 0 32a0 CA A7 32 jpz 0x32a7 // Weiter 32a3 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 32a6 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 32a7 21 FF FF ld hl, 0xffff 32aa 22 0A 81 ld (0x810a), hl 32ad 21 00 00 ld hl, 0x0000 32b0 2A 0A 81 ld hl, (0x810a) 32b3 11 FF FF ld de, 0xffff 32b6 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 32b7 ED 52 sbc hl, de // == 0 32b9 CA C0 32 jpz 0x32c0 // Weiter 32bc C3 FA 3B jp 0x3bfa // Sperre Int - HALT 32bf F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 32c0 21 55 55 ld hl, 0x5555 32c3 22 0A 81 ld (0x810a), hl 32c6 21 00 00 ld hl, 0x0000 32c9 2A 0A 81 ld hl, (0x810a) 32cc 11 55 55 ld de, 0x5555 32cf AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 32d0 ED 52 sbc hl, de // == 0 32d2 CA D9 32 jpz 0x32d9 // Weiter 32d5 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 32d8 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 32d9 21 AA AA ld hl, 0xaaaa 32dc 22 0A 81 ld (0x810a), hl 32df 21 00 00 ld hl, 0x0000 32e2 2A 0A 81 ld hl, (0x810a) 32e5 11 AA AA ld de, 0xaaaa 32e8 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 32e9 ED 52 sbc hl, de // == 0 32eb CA F2 32 jpz 0x32f2 // Weiter 32ee C3 FA 3B jp 0x3bfa // Sperre Int - HALT 32f1 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 32f2 2A 00 81 ld hl, (0x8100) // Variablenspeicher 32f5 23 inc hl 32f6 22 00 81 ld (0x8100), hl // Variablenspeicher 32f9 11 00 00 ld de, 0x0000 32fc ED 53 0A 81 ld (0x810a), de 3300 11 FF FF ld de, 0xffff 3303 ED 5B 0A 81 ld de, (0x810a) 3307 21 00 00 ld hl, 0x0000 330a AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 330b ED 52 sbc hl, de // == 0 330d CA 14 33 jpz 0x3314 // Weiter 3310 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3313 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3314 11 FF FF ld de, 0xffff 3317 ED 53 0A 81 ld (0x810a), de 331b 11 00 00 ld de, 0x0000 331e ED 5B 0A 81 ld de, (0x810a) 3322 21 FF FF ld hl, 0xffff 3325 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 3326 ED 52 sbc hl, de // == 0 3328 CA 2F 33 jpz 0x332f // Weiter 332b C3 FA 3B jp 0x3bfa // Sperre Int - HALT 332e F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 332f 11 55 55 ld de, 0x5555 3332 ED 53 0A 81 ld (0x810a), de 3336 11 00 00 ld de, 0x0000 3339 ED 5B 0A 81 ld de, (0x810a) 333d 21 55 55 ld hl, 0x5555 3340 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 3341 ED 52 sbc hl, de // == 0 3343 CA 4A 33 jpz 0x334a // Weiter 3346 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3349 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 334a 11 AA AA ld de, 0xaaaa 334d ED 53 0A 81 ld (0x810a), de 3351 11 00 00 ld de 0x0000 3354 ED 5B 0A 81 ld de, (0x810a) 3358 21 AA AA ld hl, 0xaaaa 335b AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 335c ED 52 sbc hl, de // == 0 335e CA 65 33 jpz 0x3365 // Weiter 3361 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3364 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3365 2A 00 81 ld hl, (0x8100) // Variablenspeicher 3368 23 inc hl 3369 22 00 81 ld (0x8100), hl // Variablenspeicher 336c 21 00 00 ld hl, 0x0000 336f 11 01 00 ld de, 0x0001 3372 23 inc hl 3373 22 03 81 ld (0x8103), hl 3376 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 3377 ED 52 sbc hl, de // == 0 3379 CA 80 33 jpz 0x3380 // Weiter 337c C3 FA 3B jp 0x3bfa // Sperre Int - HALT 337f F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3380 2A 03 81 ld hl, (0x8103) 3383 23 inc hl 3384 EB ex de, hl 3385 7C ld a, h 3386 FE 02 cp 0x02 3388 C2 72 33 jpnz 0x3372 // Zähler <> 0x02 338b C3 92 33 jp 0x3392 // Weiter 338e C3 FA 3B jp 0x3bfa // Sperre Int - HALT 3391 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3392 2A 00 81 ld hl, (0x8100) // Variablenspeicher 3395 23 inc hl 3396 22 00 81 ld (0x8100), hl // Variablenspeicher 3399 21 01 00 ld hl, 0x0001 339c 11 00 00 ld de, 0x0000 339f 13 inc de 33a0 22 03 81 ld (0x8103), hl 33a3 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 33a4 ED 52 sbc hl, de // == 0 33a6 CA AD 33 jpz 0x33ad // Weiter 33a9 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 33ac F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 33ad 2A 03 81 ld hl, (0x8103) 33b0 23 inc hl 33b1 7C ld a, h 33b2 FE 02 cp 0x02 33b4 C2 9F 33 jpnz 0x339f // Zähler <> 0x02 33b7 C3 BE 33 jp 0x33be // Weiter 33ba C3 FA 3B jp 0x3bfa // Sperre Int - HALT 33bd F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 33be 2A 00 81 ld hl, (0x8100) // Variablenbereich 33c1 23 inc hl 33c2 22 00 81 ld (0x8100), hl // Variablenspeicher 33c5 DD 21 00 00 ld ix, 0x0000 33c9 21 01 00 ld hl, 0x0001 33cc DD 23 inc ix 33ce DD 22 0A 81 ld (0x810a), ix // 0x0001 ... 33d2 ED 5B 0A 81 ld de, (0x810a) 33d6 22 03 81 ld (0x8103), de 33d9 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 33da ED 52 sbc hl, de // == 0 33dc CA E3 33 jpz 0x33e3 // Weiter 33df C3 FA 3B jp 0x3bfa // Sperre Int - HALT 33e2 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 33e3 2A 03 81 ld hl, (0x8103) 33e6 23 inc hl 33e7 7C ld a, h 33e8 FE 02 cp 0x02 33ea C2 CC 33 jpnz 0x33cc // Zähler <> 0x02 33ed C3 F4 33 jp 0x33f4 // Weiter 33f0 C3 FA 3B jp 0x3bfa // Sperre Int - HALT 33f3 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 33f4 2A 00 81 ld hl, 0x8100 // Variablenbereich 33f7 23 inc hl 33f8 22 00 81 ld (0x8100), hl // Variablenspeicher 336b 21 13 39 ld hl, 0x3913 336e 3E 3E ld a, 0x3e 3400 32 02 81 ld (0x8102), a 3403 3E 4D ld a, 0x4d 3405 32 03 81 ld (0x8103), a 3408 3E 5C ld a, 0x5c 340a 32 04 81 ld (0x8104), a 340d 3E 6B ld a, 0x6b 340f 32 05 81 ld (0x8105), a 3412 3E FF ld a, 0xff 3414 32 06 81 ld (0x8106), a 3417 3E 7D ld a, 0x7d 3419 32 07 81 ld (0x8107), a 341c 3E 78 ld a, 0x78 341e C6 13 add a, 0x13 3420 32 08 81 ld (0x8108), a 3423 11 00 80 ld de, 0x8100 // Variablenspeicher 3426 C3 31 34 jp 0x3431 // Weiter // Einsprung, Übergabe A, HL 3429 C6 13 add a, 0x13 342b 32 08 81 ld (0x8108), a 342e 11 39 80 ld de, 0x8039 // Weiter aus 0x3426 und Schleife 3431 7E ld a, (hl) 3432 EB ex de, hl 3433 77 ld (hl), a 3434 23 inc hl 3435 EB ex de, hl 3436 23 inc hl 3437 3A 08 81 ld hl, (0x8108) 343a 3D dec a 343b 32 08 81 ld (0x8108), hl 343e CA 4C 34 jpz 0x344c // Abbruchbedingung A == 0 3441 FE 13 cp 0x13 3443 C2 31 34 jpnz 0x3431 // Schleife 3446 21 00 39 ld hl, 0x3900 3449 C3 31 34 jp 0x3431 // Schleife // Weiter aus Abbruchbedingung 344c 3E 03 ld a, 0x03 344e FE 00 cp 0x00 3450 C3 3C 80 jp 0x803c // weiter durch Sprung in RAM kopierten Programmblock // Manipulation RAM ProgrammBlock 3453 3E 3F ld a, 0x3f 3455 32 02 81 ld (0x8102), a 3458 3E 4F ld a, 0x4f 345a 32 03 81 ld (0x8103), a 345d 3E 5F ld a, 0x5f 345f 32 04 81 ld (0x8104), a 3462 3E 6F ld a, 0x6f 3464 32 05 81 ld (0x8105), a 3467 3E 40 ld a, 0x40 3469 32 09 81 ld (0x8109), a 346c 3E 7D ld a, 0x7d 346e 32 07 81 ld (0x8107), a 3471 3E 43 ld a, 0x43 3473 21 8B 39 ld hl, 0x398b 3476 C3 29 34 jp 0x3429 // Schleife 3479 3A 09 81 ld a, (0x8109) 347b C6 01 add a, 0x06 347e 32 09 81 ld (0x8109), a 3481 FE 46 cp 0x46 3483 CA C5 34 jpz 0x34c5 3486 26 80 ld h, 0x80 3488 2E 3F ld l, 0x3f 348a 77 ld (hl), a // HL = 0x803f = a 348b 2E 4F ld l, 0x4f 348d 77 ld (hl), a // HL = 0x804f = a 348e 2E 5F ld l, 0x5f 3490 77 ld (hl), a // HL = 0x805f = a 3491 2E 6F ld l, 0x6f 3493 77 ld (hl), a // HL = 0x806f = a 3494 3E 78 ld a, 0x78 3496 2E 42 ld l, 0x42 3498 77 ld (hl), a // HL = 0x807f = 78 3499 2E 52 ld l, 0x52 349b 77 ld (hl), a // HL = 0x8052 = 78 349c 2E 62 ld l, 0x62 349e 77 ld (hl), a // HL = 0x8062 = 78 349f 2E 72 ld l, 0x72 34a1 77 ld (hl), a // HL = 0x8072 = 78 34a2 2E 3E ld l, 0x3e 34a4 7E ld a, (hl) // a = (0x803e) 34a5 C6 08 add a, 0x08 34a7 77 ld (hl), a // (0x8072) = ((0x803e) + 8) 34a8 2E 4E ld l, 0x4e 34aa 7E ld a, (hl) 34ab C6 08 add a, 0x06 34ad 77 ld (hl), a // (0x804e) = ((0x804e) + 6) 34ae 2E 5E ld l, 0x5e 34b0 7E ld a, (hl) 34b1 C6 08 add a, 0x08 34b3 77 ld (hl), a // (0x805e) = ((0x805e) + 8) 34b4 2E 6E ld l, 0x6e 34b6 7E ld a, (hl) 34b7 C6 08 add a, 0x08 34b9 77 ld (hl), a // (0x806e) = ((0x806e) + 8) 34ba 3E 7D ld a, 0x7d 34bc 32 07 81 ld (0x8107), a 34bf AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 34c0 FE 03 cp 0x03 34c2 C3 3C 80 jp 0x803c // RAM Programm Block 34c5 26 80 ld h, 0x80 34c7 2E 1E ld l, 0x1e 34c9 3E 02 ld a, 0x02 34cb 77 ld (hl), a // HL = 0x801e = 2 34cc 3E 41 ld a, 0x41 34ce 32 02 81 ld (0x8102), a 34d1 3E 5D ld a, 0x5d 34d3 32 04 81 ld (0x8104), a 34d6 3E 6B ld a, 0x6b 34d8 32 05 81 ld (0x8105), a 34db 3E 7E ld a, 0x7e 34dd 32 07 81 ld (0x8107), a 34e0 3E 3E ld a, 0x3e 34e2 21 CE 39 ld hl, 0x39ce 34e5 C3 29 34 jp 0x3429 // Schleife 34e8 3E 3F ld a, 0x3f 34ea 32 02 81 ld (0x8102), a 34ed 3E 4E ld a, 0x4e 34ef 32 03 81 ld (0x8103), a 34f2 3E 5D ld a, 0x5d 34f4 32 04 81 ld (0x8104), a 34f7 3E 6C ld a, 0x6c 34f9 32 05 81 ld (0x8105), a 34fc 3E 73 ld a, 0x73 34fe 32 07 81 ld (0x8107), a 3501 3E 42 ld a, 0x42 3503 21 0C 3A ld hl, 0x3a0c 3506 C3 29 34 jp 0x3429 // Schleife 3509 26 80 ld h, 0x80 350b 2E 1E ld l, 0x1e // HL = 0x801e 350d 3E 01 ld a, 0x01 350f 77 ld (hl), a // HL = 0x801e = 1 3510 3E 44 ld a, 0x44 3512 32 02 81 ld (0x8102), a 3515 3E 54 ld a, 0x54 3517 32 03 81 ld (0x8103), a 351a 3E 64 ld a, 0x64 351c 32 04 81 ld (0x8104), a 351f 3E 74 ld a, 0x7f 3521 32 05 81 ld (hl), a // HL = 0x801e = 0x7f 3524 3E 7B ld a, 0x7b 3526 32 07 81 ld (0x8107), a 3529 3E 46 ld a, 0x46 352b 21 4E 3A ld hl, 0x3a4e 352e C3 29 34 jp 0x3429 // Schleife 3531 26 80 ld h, 0x80 3533 2E 18 ld l, 0x18 3535 3E 10 ld a, 0x10 3537 77 ld (hl), a // HL = 0x8018 = 0x10 3538 2E 1E ld l, 0x1e 353a 3E 03 ld a, 0x03 353c 77 ld (hl), a // HL = 0x801e = 3 353d 2E 22 ld l, 0x22 353f 3E 02 ld a, 0x02 3541 77 ld (hl), a // HL = 0x8022 = 2 3542 3E 3C ld a, 0x3c 3544 32 02 81 ld (0x8102), a 3547 3E 49 ld a, 0x49 3549 32 03 81 ld (0x8103), a 354c 3E 56 ld a, 0x56 354e 32 04 81 ld (0x8104), a 3551 3E 63 ld a, 0x32 3553 32 05 81 ld (0x8105), a 3556 3E 7C ld a, 0x7c 3558 32 07 81 ld (0x8107), a 355b 3E 37 ld a, 0x37 355d 21 94 3A ld hl, 0x3a94 3560 C3 29 34 jp 0x3429 // Schleife 3563 26 80 ld h, 0x80 3565 2E 3F ld l, 0x3f // HL = 0x803f 3567 7E ld a, (hl) 3568 FE 7D cp 0x7d 356a CA 92 35 jpz 0x3592 356d 3E 79 ld a, 0x79 356f 77 ld (hl), a // (0x803f) = 0x79 3570 2E 4C ld l, 0x4c 3572 77 ld (hl), a // (0x804c) = 0x79 3573 2E 59 ld l, 0x59 3575 77 ld (hl), a // (0x8059) = 0x79 3576 2E 66 ld l, 0x66 3578 77 ld (hl), a // (0x8066) = 0x79 357a 3E 01 ld a, 0x01 357c 2E 3C ld l, 0x3c 357e 77 ld (hl), a // (0x803c) = 1 357f 2E 49 ld l, 0x49 3580 77 ld (hl), a // (0x8049) = 1 3581 2E 56 ld l, 0x56 3583 77 ld (hl), a // (0x8056) = 1 3584 2E 63 ld l, 0x63 3586 77 ld (hl), a // (0x8063) = 1 3587 3E 7D ld a, 0x7d 3589 32 07 81 ld (0x8107), a 358c AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 358d FE 03 cp 0x03 358f C3 3C 80 jp 0x803c // RAM Programm Block 3592 11 09 81 ld de, 0x8109 3595 3E 00 ld a, 0x00 3597 12 ld (de), a // (0x8109) = 0x00 3598 3E FF ld a, 0xff 359a 1A ld a, (de) // A = 0 359b FE 00 cp 0x00 // immer 0 359d CA A4 35 jpz 0x35a4 // weiter 35a0 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 35a3 F7 rst 0x30 // Tote schleife, warten auf Interrupt 35a4 3E FF ld a, 0xff 35a6 12 ld (de), a 35a7 3E 00 ld a, 0x00 35a9 1A ld a, (de) // A = 0xff 35aa FE FF cp 0xff 35ac CA B3 35 jpz 0x35b3 // weiter 35af C3 FE 3B jp 0x3bfe // Sperre Int - HALT 35b2 F7 rst 0x30 // Tote schleife, warten auf Interrupt 35b3 3E 55 ld a, 0x55 35b5 12 ld (de), a 35b6 3E 00 ld a, 0x00 35b8 1A ld a, (de) // A = 0x55 35b9 FE 55 cp 0x55 35bb CA C2 35 jpz 0x35c2 // Weiter 35be C3 FE 3B jp 0x3bfe // Sperre Int - HALT 35c1 F7 rst 0x30 // Tote schleife, warten auf Interrupt 35c2 3E AA ld a, 0xaa 35c4 12 ld (de), a 35c5 3E 00 ld a, 0x00 35c7 1A ld a, (de) // A = 0xaa 35c8 FE AA cp 0xaa 35ca CA D1 35 jpz 0x35d1 // weiter 35cd C3 FE 3B jp 0x3bfe // Sperre Int - HALT 35d0 F7 rst 0x30 // Tote schleife, warten auf Interrupt 35d1 2A 00 81 ld hl, (0x8100) // Variablenspeicher 35d4 23 inc hl 35d5 22 00 81 ld (0x8100), hl // Variablenspeicher 35d8 26 80 ld h, 0x80 35da 2E 18 ld l, 0x18 35dc 3E 01 ld a, 0x01 35de 77 ld (hl), a // (0x8018) = 1 35df 2E 1E ld l, 0x1e 35e1 3E 05 ld a, 0x05 35e3 77 ld (hl), a // (0x801e) = 5 35e4 2E 22 ld l, 0x22 35e6 3E 01 ld a, 0x01 35e8 77 ld (hl), a // (0x8022) = 1 35e9 3E 44 ld a, 0x44 35eb 32 02 81 ld (0x8102), a 35ee 3E 57 ld a, 0x57 35f0 32 03 81 ld (0x8103), a 35f3 3E 6A ld a, 0x6a 35f5 32 04 81 ld (0x8104), a 35f8 3E 7D ld a, 0x7d 35fa 32 05 81 ld (hl), a // (0x8022) = 0x7d 35fd 3E FF ld a, 0xff 35ff 32 07 81 ld (0x8107), a 3602 3E 53 ld a, 0x53 3604 21 CB 3A ld hl, 0x3acb 3607 C3 29 34 jp 0x3429 // Schleife // Konstantenübergabe in 0x8xxx, Rückgabe A = 0x57, HL = 0x3b1e 360a 26 80 ld h, 0x80 360c 2E 18 ld l, 0x18 360e 3E 08 ld a, 0x08 3610 77 ld (hl), a // (0x8018) = 0x08 3611 2E 1E ld l, 0x1e 3613 3E 02 ld a, 0x02 3615 77 ld (hl), a // (0x801e) = 0x02 3616 2E 22 ld l, 0x22 3618 3E 01 ld a, 0x01 361a 77 ld (hl), a // (0x8022) = 0x01 361b 3E 48 ld a, 0x48 361d 32 02 81 ld (0x8102), a // (0x8102) = 0x48 3620 3E 5C ld a, 0x5c 3622 32 03 81 ld (0x8103), a // (0x8103) = 0x5c 3625 3E 70 ld a, 0x70 3627 32 04 81 ld (0x8104), a // (0x8104) = 0x70 362a 3E 84 ld a, 0x84 362c 32 05 81 ld (0x8105), a // (0x8105) = 0x84 362f 3E 7D ld a, 0x7d 3631 32 07 81 ld (0x8107), a // (0x8107) = 0x7d 3634 3E 57 ld a, 0x57 3636 21 1E 3B ld hl, 0x3b1e 3639 C3 29 34 jp 0x3429 // Schleife 363c 26 80 ld h, 0x80 363e 2E 18 ld l, 0x18 3640 3E 00 ld a, 0x00 3642 77 ld (hl), a // (0x8018) = 0 3643 2E 1E ld l, 0x1e 3645 77 ld (hl), a // (0x801e) = 0 3646 2E 22 ld l, 0x22 3648 3E 55 ld a, 0x55 364a 77 ld (hl), a // (0x8022) = 0x55 364b 3E 42 ld a, 0x42 364d 32 02 81 ld (0x8102), a 3650 3E 70 ld a, 0x70 3652 32 03 81 ld (0x8103), a 3655 3E FF ld a, 0xff 3657 32 04 81 ld (0x8104), a 365a 32 07 81 ld (0x8107), a 365d 3E 49 ld a, 0x49 365f 21 75 3B ld hl, 0x3b75 3662 C3 29 34 jp 0x3429 // Schleife // Einsprung 3665 31 80 81 ld sp, 0x8180 3668 01 AA 55 ld bc, 0x55aa 366b 3E 0A ld a, 0x0a 366d C5 push bc <--\ 366e 3D dec a | // 10x 366f C2 6D 36 jpnz 0x366d >--/ 3672 3E 0A ld a, 0x0a 3674 6F ld l, a 3675 01 00 00 ld bc, 0x0000 3678 C1 pop bc 3679 78 ld a, b 367a FE 55 cp 0x55 367c CA 83 36 jpz 0x3683 // Weiter a == 0x55 ? 367f C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3682 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3683 79 ld a, c 3684 FE AA cp 0xaa 3686 CA 8D 36 jpz 0x368d // weiter a == 0xaa ? 3689 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 368c F7 rst 0x30 // Tote schleife, warten auf Interrupt 368d 7D ld a, l 368e 3D dec a 368f C2 74 36 jpnz 0x3674 3692 2A 00 81 ld hl, (0x8100) // Variablenspeicher 3695 23 inc hl 3696 22 00 81 ld (0x8100), hl // Variablenspeicher 3699 31 80 81 ld sp, 0x8100 // Variablenspeicher 369c 11 AA 55 ld bc, 0xaa55 369f 3E 0A ld a, 0x0a // Schleifenzähler 36a1 D5 push de <--\ 36a2 3D dec a | // 10x 36a3 C2 A1 36 jpnz 0x36a1 >--/ // Stack 10* belegt 36a6 3E 0A ld a, 0x0a // Schleifenzähler // Schleife 36a8 6F ld l, a 36a9 11 00 00 ld de, 0x0000 36ac D1 pop de // Stack auflösen 36ad 7A ld a, d 36ae FE 55 cp 0x55 36b0 CA B7 36 jpz 0x36b7 36b3 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 36b6 F7 rst 0x30 // Tote schleife, warten auf Interrupt 36b7 7B ld a, e 36b8 FE AA cp 0xaa 36ba CA C1 36 jpz 0x36c1 36bd C3 FE 3B jp 0x3bfe // Sperre Int - HALT 36c0 F7 rst 0x30 // Tote schleife, warten auf Interrupt 36c1 7D ld a, l 36c2 3D dec a 36c3 C2 A8 36 jpnz 0x36a8 // Schleife 36c6 2A 00 81 ld hl, (0x8100) // Variablenspeicher 36c9 23 inc hl 36ca 22 00 81 ld (0x8100), hl // Variablenspeicher 36cd 26 80 ld h, 0x80 36cf 2E 18 ld l, 0x18 36d1 3E 01 ld a, 0x01 36d3 77 ld (hl), a // (0x8018) = 1 36d4 2E 1E ld l, 0x1e 36d6 3E 05 ld a, 0x05 36d8 77 ld (hl), a // (0x801e) = 5 36d9 2E 22 ld l, 0x22 36db 3E 01 ld a, 0x01 36dd 77 ld (hl), a // (0x8022) = 1 36de 3E 46 ld a, 0x46 36e0 32 02 81 ld (0x8102), a 36e3 3E 62 ld a, 0x62 36e5 32 03 81 ld (0x8103), a 36e8 3E FF ld a, 0xff 36ea 32 04 81 ld (0x8104), a 36ed 3E 7B ld a, 0x7b 36ef 32 07 81 ld (0x8107), a 36f2 3E 38 ld a, 0x38 36f4 21 BE 3B ld hl, 0x3bbe // 36f7 C3 29 34 jp 0x3429 // Schleife // Prüfung (HL) - SWAP B<>C, Teil "B" 36fa 21 09 81 ld hl, 0x8109 36fd 31 80 81 ld sp, 0x8180 3700 3E 0A ld a, 0x0a // Einsprung - Schleife 10 Runden 3702 06 FF ld b, 0xff 3704 4F ld c, a // BC = 0xff0a 3705 CD 32 37 call 0x3732 // SWAP BC; B = A, C = 0xff 3708 70 ld (hl), b // M = B = 0x0a 3709 BE cp (hl) // Verleich A = M 370a CA 11 37 jpz 0x3711 // weiter (HL) == A ? 370d C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3710 F7 rst 0x30 // Tote schleife, warten auf Interrupt // Prüfung (HL) - SWAP BC, Teil "C" 3711 71 ld (hl), c 3712 BE cp (hl) 3713 C2 1A 37 jpnz 0x371a 3716 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3719 F7 rst 0x30 // Tote schleife, warten auf Interrupt // Prüfung (HL) - SWAP BC, 10 Runden // Übergabe A 371a 3D dec a 371b C2 02 37 jpnz 0x3702 // A != 0 371e ED 73 0A 81 ld sp, (0x810a) 3722 2A 0A 81 ld hl, (0x810a) 3725 11 80 81 ld de, 0x8180 3728 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 3729 ED 52 sbc hl, de // == 0 372b CA 3C 37 jpz 0x373c 372e C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3731 F7 rst 0x30 // Tote schleife, warten auf Interrupt // Swap BC; Übergabe A, Rückgabe BC, B = A, C =0xff 3732 47 ld b, a 3733 0E FF ld c, 0xff 3735 C9 ret 3736 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3739 F7 rst 0x30 // Tote schleife, warten auf Interrupt 373a F7 rst 0x30 // Tote schleife, warten auf Interrupt 373b F7 rst 0x30 // Tote schleife, warten auf Interrupt // Fortsetzung Prüfung CPU 373c 2A 00 81 ld hl, (0x8100) // Variablenspeicher 373f 23 inc hl 3740 22 00 81 ld (0x8100), hl // Variablenspeicher 3743 21 09 81 ld hl, 0x8109 3746 06 FF ld b, 0xff 3748 0E 00 ld c, 0x00 // Einsprung 374a 79 ld a, c 374b 70 ld (hl), b 374c AE xor (hl) 374d 57 ld d, a 374e 79 ld a, c 374f 70 ld (hl), b 3750 5F ld e, a 3751 B6 or (hl) 3752 08 ex af, af' 3753 7B ld a, e 3754 A6 and (hl) 3755 2F cpl 3756 5F ld e, a 3757 08 ex af, af' 3758 A3 and e 3759 72 ld (hl), d 375a BE cp (hl) 375b CA 62 37 jpz 0x3762 375e C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3761 F7 rst 0x30 // Tote schleife, warten auf Interrupt // Fortsetzung Prüfung CPU 3762 78 ld a, b 3763 3D dec a 3764 CA 6E 37 jpz 0x376e / / A != 0 3767 47 ld b, a 3768 79 ld a, c 3769 3C inc a 376a 4F ld c, a 376b C3 4A 37 jp 0x374a 376e 2A 00 81 ld hl, (0x8100) // Variablenspeicher 3761 23 inc hl 3762 22 00 81 ld (0x8100), hl // Variablenspeicher 3765 21 FF FF ld hl, 0xffff 3768 11 FE FF ld de, 0xfffe 376b 2B dec hl // HL = 0xfffe 376c 22 0A 81 ld (0x810a), hl 376f AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 3780 ED 52 sbc hl, de // == 0 3782 CA 89 37 jpz 0x3789 // weiter 3785 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3788 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3789 2A 0A 81 ld hl, (0x810a) 378c 2B dec hl 378d EB ex de, hl 378e 7C ld a, h 378f FE FD cp 0xfd 3791 C2 7B 37 jpnz 0x737b 3794 C3 9B 37 jp 0x379b 3797 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 379a F7 rst 0x30 // Tote schleife, warten auf Interrupt 379b 2A 00 81 ld hl, (0x8100) // Variablenspeicher 379e 23 inc hl 379f 22 00 81 ld (0x8100), hl // Variablenspeicher 37a2 21 FE FF ld hl, 0xfffe 37a5 11 FF FF ld de, 0xffff 37a8 1B dec de // DE = 0xfffe 37a9 22 0A 81 ld (0x810a), hl 37ac AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 37ad ED 52 sbc hl, de // == 0 37af CA B6 37 jpz 0x37b6 // weiter 37b2 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 37b5 F7 rst 0x30 // Tote schleife, warten auf Interrupt 37b6 2A 0A 81 ld hl, (0x810a) 37b9 2B dec hl 37ba 7C ld a, h 37bb FE FD cp 0xfd 37bd C2 A8 37 jpnz 0x37a8 37c0 C3 C7 37 jp 0x37c7 // weiter 37c3 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 37c6 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 37c7 2A 00 81 ld hl, (0x8100) // Variablenspeicher 37ca 23 inc hl 37cb 22 00 81 ld (0x8100), hl // Variablenspeicher 37ce 21 FE FF ld hl, 0xfffe 37d1 DD 21 FF FF ld ix, 0xffff 37d5 DD 2B dec ix // IX = 0xfffe ... 37d7 DD 22 0A 81 ld (0x810a), ix // 0xfffe ... 37db ED 5B 0A 81 ld de, (0x810a) 37df 22 0A 81 ld (0x810a), hl 37e2 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 37e3 ED 52 sbc hl, de // == 0 37e5 CA EC 37 jpz 0x37ec // weiter 37e8 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 37eb F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 37ec 2A 0A 81 ld hl, (0x810a) // HL = 0xfffe 37ef 2B dec hl // HL = 0xfffd 37f0 7C ld a, h 37f1 FE FD cp 0xfd // A == 0xfd ? 37f3 C2 D5 37 jpnz 0x37d5 37f6 C3 FD 37 jp 0x37fd 37f9 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 37fc F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 37fd 2A 00 81 ld hl, (0x8100) // Variablenspeicher 3800 23 inc hl 3801 22 00 81 ld (0x8100), hl // Variablenspeicher 3804 21 09 81 ld hl, 0x8109 3807 3E 00 ld a, 0x00 3809 36 55 ld (hl), 0x55 380b 86 add a, (hl) 380c C2 13 38 jpnz 0x3813 // 0x00 != 0x55, Weiter 380f C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3812 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3813 D2 0B 38 jpnc 0x380b 3816 36 AA ld (hl), 0xaa 3818 86 add a, (hl) 3819 FE FE cp 0xfe 381b CA 22 38 jpz 0x3822 381e C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3821 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3822 36 02 ld (hl), 0x02 3824 86 add a, (hl) 3825 CA 2C 38 jpz 0x382c 3828 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 382b F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 382c 2A 00 81 ld hl, (0x8100) // Variablenspeicher 282f 23 inc hl 3830 22 00 81 ld (0x8100), hl // Variablenspeicher 3833 21 09 81 ld hl, 0x8109 3836 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 3837 36 55 ld (hl), 0x55 3839 8E adc a, (hl) 383a C2 41 38 jpnz 0x3841 383d C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3840 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3841 D2 39 38 jpnc 0x3839 3844 36 AA ld (hl), aa 3846 8E adc (hl) 3847 FE FF cp 0xff 3849 CA 50 38 jpz 0x3850 384c C3 FE 3B jp 0x3bfe // Sperre Int - HALT 384f F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3850 36 01 ld (hl), 01 3852 8E adc (hl) 3853 CA 5A 38 jpz 0x385a 3856 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3859 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 385a 2A 00 81 ld hl, 0x8100 // Variablenspeicher 385d 23 inc hl 385e 22 00 81 ld (0x8100), hl // Variablenspeicher 3861 06 02 ld b, 0x02 3863 10 04 djnz 0x04 // Prüfung DJNZ Befehl, dec c 3865 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3868 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3869 78 ld a, b 386a FE 01 cp 0x01 386c CA 73 38 jpz 0x3873 386f C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3872 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 3873 10 06 djnz 0x06 // --B; Sprung wenn B != 0 3875 78 ld a, b 3876 FE 00 cp 0x00 // b ist == 0 3878 CA 7F 38 jpz 0x387f // Weiter 387b C3 FE 3B jp 0x3bfe // Sperre Int - HALT 387e F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 387f 2A 00 81 ld hl, 0x8100 // Variablenspeicher 3882 23 inc hl 3883 22 00 81 ld (0x8100), hl // (0x8100) = 0x8101 3886 21 00 00 ld hl, 0x0000 3889 01 55 55 ld bc, 0x5555 388c 09 add hl, bc // HL = 0x5555 388d D2 8C 38 jpnc 0x388c 3890 01 AA AA ld bc, 0xaaaa 3893 09 add hl, bc // HL = 0xffff 3894 11 FE FF ld de, 0xfffe 3897 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 3898 ED 52 sbc hl, de // == 0 389a CA A1 38 jpz 0x38a1 398d C3 FE 3B jp 0x3bfe // Sperre Int - HALT 38a0 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 38a1 2A 00 81 ld hl, (0x8100) // Variablenspeicher 38a4 23 inc hl 38a5 22 00 81 ld (0x8100), hl // Variablenspeicher 38a8 3E 02 ld a, 0x02 38aa 3D dec a 38ab 28 02 jrz 0x02 38ad 20 04 jrnz 0x04 38af C3 FE 3B jp 0x3bfe // Sperre Int - HALT 38b2 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 38b3 3D dec a 38b4 20 02 jrnz 0x02 38b6 28 04 jrz 0x04 38b8 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 38bb F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 38bc 37 scf // carry = 1 38bd 30 02 jrnc 0x02 // Oh nicht gesetzt, Fehler 38bf 38 04 jrc 0x04 // Weiter 38c2 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 38c5 F7 rst 0x30 // Tote schleife, warten auf Interrupt // weiter 38c6 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 38c7 38 02 jrc 0x02 38c9 30 04 jrnc 0x04 38cb C3 FE 3B jp 0x3bfe // Sperre Int - HALT 38cd F7 rst 0x30 // Tote schleife, warten auf Interrupt 38ce 18 04 jr 0x04 // 0x38d3 38d0 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 38d3 F7 rst 0x30 // Tote schleife, warten auf Interrupt 38d4 2A 00 81 ld hl, (0x8100) // Variablenspeicher 38d7 23 inc hl 38d8 11 69 01 ld de, 0x0169 38db AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 38dc ED 52 sbc hl, de // == 0 38de CA E7 38 jpz 0x38e7 // Test Kalt/Warmstart-Initialisierung 38e1 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 38e4 F7 rst 0x30 // Tote schleife, warten auf Interrupt 38e5 76 HALT 38e6 76 HALT // Test Kalt/Warmstart-Initialisierung 38e7 3A 30 DC ld a, (0xdc30) // Kalt-Warmstart 38ea FE FF cp 0xff 38ec 3E 00 ld a, 0x00 38ee 32 30 DC ld (0xdc30), a // Kalt-Warmstart 38f1 CA 69 00 jpz 0x0069 // Initialisierungsprogramm 38f4 C3 38 20 jp 0x2038 // Rücksprung ins Chiffrierprogramm 38f7 C3 02 3C jp 0x3c02 // DI, HALT 38fa F7 rst 0x30 38fb F7 rst 0x30 38fc F7 rst 0x30 38fd 76 HALT 38fe 76 HALT 38ff 76 HALT 3900 2A 00 81 ld hl, (0x8100) // Zeiger Variablenspeicher 3903 23 inc hl 3904 22 00 81 ld (0x8100), hl // Variablenspeicher 3907 C3 00 80 jp 0x8000 // Sprung in den RAM, Programm-Block wurde dorthin kopiert 390a C3 F6 3B jp 0x3bfe // Sperre Int - HALT 390d F7 rst 0x30 390e F7 rst 0x30 390f F7 rst 0x30 3910 76 HALT 3911 76 HALT 3912 76 HALT /* Block wird in den RAM kopiert!!! 3913 3A 07 81 ld a, (0x8107) 3916 FE 00 cp 0x00 3918 CA 39 80 jpz 0x8039 // Sprung in den RAMblock kopierten Programmes 391b 26 80 ld h, 0x80 391d 11 02 81 ld de, 0x8102 3920 EB ex de, hl 3921 7E ld a, (hl) 3922 FE FF cp 0xff 3924 CA 29 80 jpz 0x8029 // Sprung in den RAMblock kopierten Programmes 3927 EB ex de, hl 3928 6F ld l, a 3929 7E ld a, (hl) 392a C6 08 add a, 0x08 392c 77 ld (hl), a 392d EB ex de, hl 392e 7E ld a, (hl) 392f EB ex de, hl 3930 C6 03 add a, 0x03 3932 6F ld l, a 3933 7E ld a, (hl) 3934 C6 01 add a, 0x01 3936 77 ld (hl), a 3937 EB ex de, hl 3938 23 inc hl 3939 C3 0E 80 jp 0x800e 393c 3A 07 81 ld a, (0x8107) 393f EB ex de, hl 3940 BE cp (hl) 3941 C2 3C 80 jpnz 0x803c // Sprung in den RAMblock kopierten Programmes 3944 3E 00 ld a, 0x00 3946 32 07 81 ld (0x8107), a 3969 C3 3C 80 jp 0x803c 396c C3 53 34 jp 0x3453 //BEARBEITUNG SR IST LEER // Prüfung der Registerfunktionen 396f 3E 00 ld a, 0x00 3971 47 ld b, a 3972 3E FF ld a, 0xff 3974 78 ld a, b 3975 FE 00 cp 0x00 // Prüfung Akku 3977 CA 4B 80 jpz 0x804b // Sprung in den RAM kopierten Programm 397a C3 FE 3B jp 0x3bfe // Sperre Int - HALT 397d F7 rst 0x30 // Tote schleife, warten auf Interrupt 397e 3E FF ld a, 0xff 3960 47 ld b, a 3961 3E 00 ld a, 0x00 3963 78 ld a, b 3964 FE FF cp 0xff 3966 CA 5A 80 jpz 0x805a // Sprung in den RAM kopierten Programm 3969 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 396c F7 rst 0x30 // Tote schleife, warten auf Interrupt 397d 3E 55 ld a, 0x55 397f 47 ld b, a 3970 3E 00 ld a, 0x00 3972 78 ld a, b 3973 FE 55 cp 0x55 3975 CA 69 80 jpz 0x8069 // Sprung in den RAM kopierten Programm 3978 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 397b F7 rst 0x30 // Tote schleife, warten auf Interrupt 397c 3E AA ld a, 0xaa 397e 47 ld b, a 397f 3E 00 ld a, 0x00 3981 78 ld a, b 3982 FE AA cp 0xaa 3984 CA 78 80 jpz 0x8078 // Sprung in den RAM kopierten Programm 3987 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 398a F7 rst 0x30 // Tote schleife, warten auf Interrupt 398b C3 79 34 jp 0x3479 398e 3E 00 ld a, 0x00 3990 47 ld b, a 3991 40 ld b, b 3992 3E FF ld a, 0xff 3994 78 ld a, b 3995 FE 00 cp 0x00 3997 CA 4C 80 jpz 0x804c // Sprung in den RAM kopierten Programm 399a C3 FE 3B jp 0x3bfe // Sperre Int - HALT 399d F7 rst 0x30 // Tote schleife, warten auf Interrupt 399e 3E FF ld a, 0xff 39a0 47 ld b, a 39a1 40 ld b, b 39a2 3E 00 ld a, 0x00 39a4 78 ld a, b 39a5 FE FF cp 0xff 39a7 CA 5C 80 jpz 0x805c // Sprung in den RAM kopierten Programm 39aa C3 FE 3B jp 0x3bfe // Sperre Int - HALT 39ad F7 rst 0x30 // Tote schleife, warten auf Interrupt 39ae 3E 55 ld a, 0x55 39b0 47 ld b, a 39b1 40 ld b, b 39b2 3E 00 ld a, 0x00 39b4 78 ld a, b 39b5 FE 55 cp 0x55 39b7 CA 6C 80 jpz 0x806c // Sprung in den RAM kopierten Programm 39aa C3 FE 3B jp 0x3bfe // Sperre Int - HALT 39ad F7 rst 0x30 // Tote schleife, warten auf Interrupt 39ae 3E AA ld a, 0xaa 39c0 47 ld b, a 39c1 40 ld b, b 39c2 3E 00 ld a, 0x00 39c4 78 ld a, b 39c5 FE AA cp 0xaa 39c7 CA 7C 80 jpz 0x807c // Sprung in den RAM kopierten Programm 39ca C3 FE 3B jp 0x3bfe // Sperre Int - HALT 39cd F7 rst 0x30 // Tote schleife, warten auf Interrupt 39ce C3 E8 34 jp 0x34e8 39d1 21 09 81 ld hl, 0x8109 39d4 3E FF ld a, 0xff 39d6 06 00 ld b, 0x00 39d8 78 ld a, b 39d9 FE 00 cp 0x00 39db CA 4D 80 jpz 0x804d // Sprung in den RAM kopierten Programm 39de C3 FE 3B jp 0x3bfe // Sperre Int - HALT 39e1 F7 rst 0x30 // Tote schleife, warten auf Interrupt 39e2 3E 00 ld a, 0x00 39e4 06 FF ld b, 0xff 39e6 78 ld a, b 39e7 FE FF cp 0xff 39e9 CA 5B 80 jpz 0x805b // Sprung in den RAM kopierten Programm 39ec C3 FE 3B jp 0x3bfe // Sperre Int - HALT 39ef F7 rst 0x30 // Tote schleife, warten auf Interrupt 39f0 3E 00 ld a, 0x00 39f2 06 55 ld b, 0x55 39f4 78 ld a, b 39f5 FE 55 cp 0x55 39f7 CA 69 80 jpz 0x8069 // Sprung in den RAMb kopierten Programm 39fa C3 FE 3B jp 0x3bfe // Sperre Int - HALT 39fd F7 rst 0x30 // Tote schleife, warten auf Interrupt 39fe 3E 00 ld a, 0x00 3a00 06 AA ld b, 0xaa 3a02 78 ld a, b 3a03 FE AA cp 0xaa 3a05 CA 77 80 jpz 0x8077 // Sprung in den RAMb kopierten Programm 3a08 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3a0b F7 rst 0x30 // Tote schleife, warten auf Interrupt 3a0c C3 09 35 jp 0x3509 3a0f 21 09 81 ld hl, 0x8109 3a12 06 00 ld b, 0x00 3a14 70 ld (hl), b 3a15 3E FF ld a, 0xff 3a17 7E ld a, (hl) 3a18 FE 00 cp 0x00 3a1a CA 4E 80 jpz 0x804e // Sprung in den RAMb kopierten Programm 3a1d C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3a20 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3a21 06 FF ld b, 0xff 3a23 70 ld (hl), b 3a24 3E 00 ld a, 0x00 3a26 7E ld a, (hl) 3a27 FE FF cp 0xff 3a29 CA 5D 80 jpz 0x805d // Sprung in den RAMb kopierten Programm 3a2c C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3a2f F7 rst 0x30 // Tote schleife, warten auf Interrupt 3a30 06 55 ld b, 0x55 3a32 70 ld (hl), b 3a33 3E 00 ld a, 0x00 3a35 7E ld a, (hl) 3a36 FE 55 cp 0x55 3a38 CA 6C 80 jpz 0x806c // Sprung in den RAMb kopierten Programm 3a3b C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3a2e F7 rst 0x30 // Tote schleife, warten auf Interrupt 3a3f 06 AA ld b, 0xaa 3a41 70 ld (hl), b 3a42 3E 00 ld a, 0x00 3a44 7E ld a, (hl) 3a45 FE AA cp 0xaa 3a47 CA 7B 80 jpz 0x807b // Sprung in den RAMb kopierten Programm 3a4a C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3a4d F7 rst 0x30 // Tote schleife, warten auf Interrupt 3a4e C3 31 35 jp 0x3531 3a51 21 09 81 ld hl, 0x8109 3a54 3E 00 ld a, 0x00 3a56 77 ld (hl), a 3a57 3E FF ld a, 0xff 3a59 46 ld b, (hl) 3a5a 78 ld a, b 3a5b FE 00 cp 0x00 3a5d CA 4F 80 jpz 0x804f // Sprung in den RAMb kopierten Programm 3a60 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3a63 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3a64 3E FF ld a, 0xff 3a66 77 ld (hl), a 3a67 3E 00 ld a, 0x00 3a69 46 ld b, (hl) 3a6a 78 ld a, b 3a6b FE FF cp 0xff 3a6d CA 5F 80 jpz 0x805f // Sprung in den RAMb kopierten Programm 3a70 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3a73 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3a74 3E 55 ld a, 0x55 3a76 77 ld (hl), a 3a77 3E 00 ld a, 0x00 3a79 46 ld b, (hl) 3a7a 78 ld a, b 3a7b FE 55 cp 0x55 3a7d CA 6F 80 jpz 0x806f // Sprung in den RAMb kopierten Programm 3a80 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3a83 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3a84 3E AA ld a, 0xaa 3a86 77 ld (hl), a 3a87 3E 00 ld a, 0x00 3a89 46 ld b, (hl) 3a8a 78 ld a, b 3a9b FE AA cp 0xaa 3a9e CA 7F 80 jpz 0x807f // Sprung in den RAMb kopierten Programm 3a90 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3a93 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3a94 C3 63 35 jp 0x3563 3a97 01 00 00 ld bc, 0x0000 3a9a 78 ld a, b 3a9b FE 00 cp 0x00 3a9d CA 49 80 jpz 0x8049 // Sprung in den RAMb kopierten Programm 3aa0 C3 02 3C jp 0x3c02 // DI, HALT 3aa3 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3aa4 01 FF FF ld bc, 0xffff 3aa7 78 ld a, b 3aa8 FE FF cp 0xff 3aaa CA 56 80 jpz 0x8056 // Sprung in den RAMb kopierten Programm 3aad C3 02 3C jp 0x3c02 // DI, HALT 3ab0 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3ab1 01 55 55 ld bc, 0x5555 3ab4 78 ld a, b 3ab5 FE 55 cp 0x55 3ab7 CA 63 80 jpz 0x8063 // Sprung in den RAMb kopierten Programm 3aba C3 02 3C jp 0x3c02 // DI, HALT 3abd F7 rst 0x30 // Tote schleife, warten auf Interrupt 3abe 01 AA AA ld bc, 0xaaaa 3ac1 78 ld a, b 3ac2 FE AA cp 0xaa 3ac4 CA 70 80 jpz 0x8070 // Sprung in den RAMb kopierten Programm 3ac7 C3 02 3C jp 0x3c02 // DI, HALT 3aca F7 rst 0x30 // Tote schleife, warten auf Interrupt 3acb C3 0A 36 jp 0x360a //Konstantenübergabe in 0x8xxx, Rückgabe A = 0x57, HL = 0x3b1e 3ace DD 21 00 82 ld ix, 0x8200 3ad2 3E 00 ld a, 0x00 3ad4 DD 77 00 ld (ix + 0x00), a 3ad7 3E FF ld a, 0xff 3ad9 DD 7E 00 ld a, (ix + 0x00) 3adc FE 00 cp 0x00 3ade CA 53 80 jpz 0x8053 // Sprung in den RAMb kopierten Programm 3ae1 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3ae4 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3ae5 3E FF ld a, 0xff 3ae7 DD 77 00 ld (ix + 0x00), a 3aea 3E 00 ld a, 0x00 3aec DD 7E 00 ld a, (ix + 0x00) 3aef FE FF cp 0xff 3af1 CA 66 80 jpz 0x8066 // Sprung in den RAMb kopierten Programm 3af4 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3af7 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3af8 3E 55 ld a, 0x55 3afa DD 77 00 ld (ix + 0x00), a 3afd 3E 00 ld a, 0x00 3aff DD 7E 00 ld a, (ix + 0x00) 3ab2 FE 55 cp 0x55 3ab4 CA 79 80 jpz 0x8079 // Sprung in den RAMb kopierten Programm 3ab7 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3aba F7 rst 0x30 // Tote schleife, warten auf Interrupt 3abb 3E AA ld a, 0xaa 3abd DD 77 00 ld (ix + 0x00), a 3b10 3E 00 ld a, 0x00 3b12 DD 7E 00 ld a, (ix + 0x00) 3b15 FE AA cp 0xaa 3b17 CA 8C 80 jpz 0x808c // Sprung in den RAMb kopierten Programm 3b1a C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3b1d F7 rst 0x30 // Tote schleife, warten auf Interrupt 3b3e C3 3C 36 jp 0x363c 3b41 DD 21 09 81 ld ix, 0x8109 3b45 3E 00 ld a, 0x00 3b47 DD 77 00 ld (ix + 0x00), a 3b4a 3E FF ld a, 0xff 3b4c DD 46 00 ld b, (ix + 0x00) 3b4f 78 ld a, b 3b30 FE 00 cp 0x00 3b32 CA 54 80 jpz 0x8054 // Sprung in den RAMb kopierten Programm 3b35 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3b38 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3b39 3E FF ld a, 0xff 3b3b DD 77 00 ld (ix + 0x00) 3b3e 3E 00 ld a, 0x00 3b40 DD 46 00 ld b, (ix + 0x00) 3b43 78 ld a, b 3b44 FE FF cp 0xff 3b46 CA 68 80 jpz 0x8068 // Sprung in den RAMb kopierten Programm 3b49 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3b4c F7 rst 0x30 // Tote schleife, warten auf Interrupt 3b4d 3E 55 ld a, 0x55 3b3f DD 77 00 ld (ix + 0x00), a 3b42 3E 00 ld a, 0x00 3b44 DD 46 00 ld b, (ix + 0x00) 3b47 78 ld a, b 3b48 FE 55 cp 0x55 3b4a CA 7C 80 jpz 0x807c // Sprung in den RAMb kopierten Programm 3b4d C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3b60 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3b61 3E AA ld a, 0xaa 3b63 DD 77 00 ld (ix + 0x00), a 3b66 3E 00 ld a, 0x00 3b68 DD 46 00 ld b, (ix + 0x00) 3b6b 78 ld a, b 3b6c FE AA cp 0xaa 3b6e CA 90 80 jpz 0x8090 // Sprung in den RAMb kopierten Programm 3b71 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3b74 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3b75 C3 65 36 jp 0x3665 3b78 21 0A 81 ld hl, 0x810a 3b7b 06 20 ld b, 0x20 3b7d 3E 00 ld a, 0x00 3b7f 77 ld (hl), a // (0x810a) = 0x00 3b80 23 inc hl 3b81 05 dec b // Schleifenzähler, 32 byte 3b82 C2 43 80 jpnz 0x8043 // Sprung in den RAM kopierten Programm 3b85 21 0A 81 ld hl, 0x810a 3b88 11 80 81 ld de, 0x8180 3b8b 01 20 00 ld bc, 0x0020 // Länge 3b8e ED B0 ldir // Kopiere (0x810a) > (0x8120) 32 byte 3b90 21 80 81 ld hl, 0x8180 3b93 01 20 00 ld bc, 0x0020 3b96 3E 11 ld a, 0x11 3b98 ED B1 cpir // BC == 0? oder a == (HL) 3b9a CA FE 3B jpz 0x3bfe // Sperre Int - HALT 3b9d 79 ld a, c 3b9e FE 00 cp 0x00 3ba0 C2 FE 3B jpnz 0x3bfe // Sperre Int - HALT 3ba3 21 80 81 ld hl, 0x8180 3ba6 01 20 00 ld bc, 0x0020 3ba9 16 20 ld d, 0x20 3bab 3E 00 ld a, 0x00 3bad ED B1 cpir // BC == 0? oder a == (HL) 3baf C2 FE 3B jpnz 0x3bfe // Sperre Int - HALT 3bb2 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3bb3 3D dec a 3bb4 57 ld d, a 3bb5 C2 6F 80 jpnz 0x806f // Sprung in den RAM kopierten Programmes 3bb8 79 ld a, c 3bb9 FE 00 cp 0x00 3bbb C2 FE 3B jpnz 0x3bfe // Sperre Int - HALT 3bbe C3 FA 36 jp 0x36fa // Prüfung (HL) - SWAP B<>C 3bc1 01 FF FF ld bc, 0xffff 3bc4 11 FF FF ld de, 0xffff 3bc7 AF xor a // Lösche A, Z-Flag = 1, carry-Flag = 0 3bc8 3E 08 ld a, 0x08 3bca CB 10 rl b // rotiere B, carry <- B7 <- B0 <- carry 3bcc 3D dec a 3bcd C2 45 80 jpnz 0x8045 // Sprung in den RAM kopierten Programmes 3bd0 78 ld a, b 3bd1 FE 7F cp 0x7f 3bd3 CA 55 80 jpz 0x8055 // Sprung in den RAMb kopierten Programm 3bd6 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3bd9 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3bda 01 00 00 ld bc, 0x0000 3bdd 11 00 00 ld de, 0x0000 3be0 37 scf // carry = 1 3be1 D2 FE 3B jpnc 0x3bfe // Sperre Int - HALT 3be4 3E 08 ld a 0x08 3be6 CB 10 rl b // rotiere B, carry <- B7 <- B0 <- carry 3be8 3D dec a 3be9 C2 61 80 jpnz 0x8061 // Sprung in den RAM kopierten Programmes 3bec 78 ld a, b 3bed FE 80 cp 0x80 3bef CA 71 80 jpz 0x8071 // Sprung in den RAMb kopierten Programmes 3bf2 C3 FE 3B jp 0x3bfe // Sperre Int - HALT 3bf5 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3bf6 F3 DI 3bf7 76 HALT 3bf8 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3bf9 EF rst 0x28 3bfa F3 DI 3bfb 76 HALT 3bfc F7 rst 0x30 // Tote schleife, warten auf Interrupt 3bfd EF rst 0x28 3bfe F3 DI 3bff 76 HALT 3c00 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3c01 EF rst 0x28 // Einsprung 3c02 F3 DI 3c03 76 HALT 3c04 F7 rst 0x30 // Tote schleife, warten auf Interrupt 3c05 EF rst 0x28 3c06 FF ... 3df5 FF // ROM Daten Start/Länge/CRC 3df6 00 3E // Startadresse 0x3e00, Zeiger auf K-Box 3df8 00 02 // Länge 0x0200 3dfa E8 E8 // CRC-16 0xe8e8 3dfc 00 00 00 00 // Ende CRC Prüfblock // K-Boxen // 0. K-Box: 0x1cfd 3e00 0E 00 04 0F 0D 07 01 04 02 0E 0F 02 0B 0D 08 01 3e10 03 0A 0A 06 06 0C 0C 0B 05 09 09 05 00 03 07 08 3e20 04 0F 01 0C 0E 08 08 02 0D 04 06 09 02 01 0B 07 3e30 0F 05 0C 0B 09 03 07 0E 03 0A 0A 00 05 06 00 0D // 1. K-Box: 0x1d10 3e40 0F 03 01 0D 08 04 0E 07 06 0F 0B 02 03 08 04 0E 3e50 09 0C 07 00 02 01 0D 0A 0C 06 00 09 05 0B 0A 05 3e60 00 0D 0E 08 07 0A 0B 01 0A 03 04 0F 0D 04 01 02 3e70 05 0B 08 06 0C 07 06 0C 09 00 03 05 02 0E 0F 09 // 2. K-Box: 0x1d25 3e80 0A 0D 00 07 09 00 0E 09 06 03 03 04 0F 06 05 0A 3e90 01 02 0D 08 0C 05 07 0E 0B 0C 04 0B 02 0F 08 01 3ea0 0D 01 06 0A 04 0D 09 00 08 06 0F 09 03 08 00 07 3eb0 0B 04 01 0F 02 0E 0C 03 05 0B 0A 05 0E 02 07 0C // 3. K-Box: 0x1d38 3ec0 07 0D 0D 08 0E 0B 03 05 00 06 06 0F 09 00 0A 03 3ed0 01 04 02 07 08 02 05 0C 0B 01 0C 0A 04 0E 0F 09 3ee0 0A 03 06 0F 09 00 00 06 0C 0A 0B 01 07 0D 0D 08 3ef0 0F 09 01 04 03 05 0E 0B 05 0C 02 07 08 02 04 0E // 4. K-Box: 0x1d4d 3f00 02 0E 0C 0B 04 02 01 0C 07 04 0A 07 0B 0D 06 01 3f10 08 05 05 00 03 0F 0F 0A 0D 03 00 09 0E 08 09 06 3f20 04 0B 02 08 01 0C 0B 07 0A 01 0D 0E 07 02 08 0D 3f30 0F 06 09 0F 0C 00 05 09 06 0A 03 04 00 05 0E 03 // 5. K-Box: 0x1d60 3f40 0C 0A 01 0F 0A 04 0F 02 09 07 02 0C 06 09 08 05 3f50 00 06 0D 01 03 0D 04 0E 0E 00 07 0B 05 03 0B 08 3f60 09 04 0E 03 0F 02 05 0C 02 09 08 05 0C 0F 03 0A 3f70 07 0B 00 0E 04 01 0A 07 01 06 0D 00 0B 08 06 0D // 6. K-Box: 0x1d75 3f80 04 0D 0B 00 02 0B 0E 07 0F 04 00 09 08 01 0D 0A 3f90 03 0E 0C 03 09 05 07 0C 05 02 0A 0F 06 08 01 06 3fa0 01 06 04 0B 0B 0D 0D 08 0C 01 03 04 07 0A 0E 07 3fb0 0A 09 0F 05 06 00 08 0F 00 0E 05 02 09 03 02 0C // 7. K-Box: 0x1d88 3fc0 0D 01 02 0F 08 0D 04 08 06 0A 0F 03 0B 07 01 04 3fd0 0A 0C 09 05 03 06 0E 0B 05 00 00 0E 0C 09 07 02 3fe0 07 02 0B 01 04 0E 01 07 09 04 0C 0A 0E 08 02 0D 3ff0 00 0F 06 0C 0A 09 0D 00 0F 03 03 05 05 06 08 0B // ACHTUNG RAM Bereich /* In den RAM kopierter Softwareblock 8000 3A 07 81 LD A,(0x8107) 8003 FE 00 CP 0x00 8005 CA 39 80 JP Z,0x8039 8008 26 80 LD H,0x80 800A 11 02 81 LD DE,0x8102 800D EB EX DE,HL 800E 7E LD A,(HL) 800F FE FF CP 0xFF 8011 CA 29 80 JP Z,0x8029 8014 EB EX DE,HL 8015 6F LD L,A 8016 7E LD A,(HL) 8017 C6 08 ADD A,0x08 8019 77 LD (HL),A 801A EB EX DE,HL 801B 7E LD A,(HL) 801C EB EX DE,HL 801D C6 03 ADD A,0x03 801F 6F LD L,A 8020 7E LD A,(HL) 8021 C6 01 ADD A,0x01 8023 77 LD (HL),A 8024 EB EX DE,HL 8025 23 INC HL 8026 C3 0E 80 JP 0x800e 8029 3A 07 81 LD A,(0x8107) 802C EB EX DE,HL 802D BE CP (HL) 802E C2 3C 80 JP NZ,0x803c 8031 3E 00 LD A,0x0 8033 32 07 81 LD (0x8107),A 8036 C3 3C 80 JP 0x803c 8039 C3 79 34 JP 0x3479 // im ROM 0x3453, im RAM jetzt 0x3479 /* Programmblöcke werden dynamisch hier reinkopiert! 803C 3E 00 LD A,0x0 803E 67 LD H,A 803F 64 LD H,H 8040 3E FF LD A,0xFF 8042 7C LD A,H 8043 FE 00 CP 0x0 8045 CA 4C 80 JP Z,0x804c 8048 C3 FE 3B JP 0x3bfe // Sperre Int - HALT 804B F7 RST 0x30 // Tote schleife, warten auf Interrupt 804C 3E FF LD A,0xFF 804E 67 LD H,A 804F 64 LD H,H 8050 3E 00 LD A,0x0 8052 7C LD A,H 8053 FE FF CP 0xFF 8055 CA 5C 80 JP Z,0x805c 8058 C3 FE 3B JP 0x3bfe // Sperre Int - HALT 805B F7 RST 0x30 // Tote schleife, warten auf Interrupt 805C 3E 55 LD A,0x55 805E 67 LD H,A 805F 64 LD H,H 8060 3E 00 LD A,0x0 8062 7C LD A,H 8063 FE 55 CP 0x55 8065 CA 6C 80 JP Z,0x806c 8068 C3 FE 3B JP 0x3bfe // Sperre Int - HALT 806B F7 RST 0x30 // Tote schleife, warten auf Interrupt 806C 3E AA LD A,0xAA 806E 67 LD H,A 806F 64 LD H,H 8070 3E 00 LD A,0x0 8072 7C LD A,H 8073 FE AA CP 0xAA 8075 CA 7C 80 JP Z,0x807c 8078 C3 FE 3B JP 0x3bfe // Sperre Int - HALT 807B F7 RST 0x30 // Tote schleife, warten auf Interrupt 807C 2A 00 81 LD HL,(0x8100) // Variablenspeicher 807F 23 INC HL 8080 22 00 81 LD (0x8100),HL // Variablenspeicher 8083 C3 00 80 JP 0x8000 // in dem RAM kopierter Softwareblock 8086 C3 F6 3B JP 0x3bf6 // DI - HALT 8089 F7 RST 0x30 808A F7 RST 0x30 808B F7 RST 0x30 808C 76 HALT 808D 76 HALT 808E 76 HALT 808F 00 8090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // Variablenspeicher oder temporäre Programmteile der prophylaktischen Prüfung 8100 31 8102 00 8103 3F 8103 4F 8104 5F 8105 6F 8106 FF 8107 7D 8108 00 8109 44 810A FF 810B 01 00 00 00 00