Home > Previous Page >  Disassembly of Jupiter Ace ROM [German text]
Archive Search  

Disassembly of Jupiter Ace ROM [German text]

Click here to go back to the English Version

;****************************************************************
;*  ACE.MAC                                                     *
;*                      ROM DES JUPITER ACE                     *
;*                      ===================                     *
;*                                                              *
;*  23.09.96    BODO WENZEL     DISASSEMBLIERT UND KOMMENTIERT  *
;****************************************************************
;================================================================
;       KONSTANTEN

;ZEICHENCODES
KLT     EQU     001H    ;PFEIL LINKS
LOK     EQU     002H    ;CAPS LOCK
KRT     EQU     003H    ;PFEIL RECHTS
GFX     EQU     004H    ;GRAFIK
CDL     EQU     005H    ;ZEICHEN LOESCHEN
KUP     EQU     007H    ;PFEIL AUF
INV     EQU     008H    ;INVERTIERT
KDN     EQU     009H    ;PFEIL AB
LDL     EQU     00AH    ;ZEILE LOESCHEN
CCR     EQU     00DH    ;ZEILENENDE
PND     EQU     060H    ;PFUND STERLING
CPR     EQU     07FH    ;COPYRIGHT

CINV    EQU     080H    ;INVERTIERUNG
CLAST   EQU     080H    ;LETZTES ZEICHEN EINES STRINGS

IMM     EQU     040H    ;WORT IST "IMMEDIATE"

SAFETY  EQU     12      ;SICHERHEITSABSTAND FUER PARAMETER-STACK

FSIGN   EQU     080H    ;FLOAT-VORZEICHEN
FEOFFS  EQU     040H    ;FLOAT-EXPONENT-OFFSET

;================================================================
;       EIN- UND AUSGABE, NUR A0 AUSDEKODIERT

IO      EQU     0FEH    ;IN LOESCHT TON-FF
                        ;D0..4  TASTATUR-SPALTEN
                        ;       (ZEILEN IN A15..A8)
                        ;D5     CASSETTE (EAR, EINGABE)
                        ;OUT SETZT TON-FF
                        ;D3     CASSETTE (MIC, AUSGABE)

;================================================================
;       BILDSPEICHER (1 KBYTE)
;
;       ZEILEN:  24 + 4/7 +   1  + 4/7          (60/50 HZ)
;       ZEICHEN: 32 +  8  +   4  +  8
;              BILD + VOR + SYNC + NACH

SCREEN          EQU     02400H  ;24 ZEILEN MIT 32 ZEICHEN
SCREND          EQU     SCREEN+24*32

PADMEM          EQU     02701H  ;FREIER ZWISCHENSPEICHER
FPADMEM         EQU     PADMEM AND NOT 00400H   ;OHNE WAIT

SCRMEND         EQU     02800H  ;ENDE

;================================================================
;       ZEICHENSATZ (1 KBYTE)

CHRSET  EQU     02C00H          ;128 ZEICHEN MIT 8 BYTES

;================================================================
;       ARBEITSSPEICHER (AB 1 KBYTE)

MEMBEG          EQU     03C00H  ;ERSTE MOEGLICHE RAM-ADRESSE

FPWS            EQU     03C00H  ;PLATZ FUER FLOAT-RECHNUNGEN

LISTWS          EQU     03C13H
LPICNT          EQU     03C13H  ;LIST/EDIT WORTZAEHLER
LPIBUF          EQU     03C14H  ;LIST/EDIT EINRUECKUNG PUFFER
LPIACT          EQU     03C15H  ;LIST/EDIT EINRUECKUNG AKTUELL
LPLCNT          EQU     03C16H  ;LIST/EDIT ZEILENZAEHLER

RAMTOP          EQU     03C18H  ;ERSTE NICHT-EXISTENTE ADRESSE

HLD             EQU     03C1AH  ;ZEIGER WAEHREND "#"

SCRPOS          EQU     03C1CH  ;AUSGABE-FELD CURSOR
INSCRN          EQU     03C1EH  ;EINGABE-FELD ANFANG
CURSOR          EQU     03C20H  ;EINGABE-FELD CURSOR
ENDBUF          EQU     03C22H  ;EINGABE-FELD ENDE

RAMVAR          EQU     03C24H  ;AB HIER INITIALISIERT -----

LHALF           EQU     03C24H  ;AUSGABE-FELD ENDE

KEYCOD          EQU     03C26H  ;GEDRUECKTE TASTE
KEYCNT          EQU     03C27H  ;ZEITZAEHLER
STATIN          EQU     03C28H  ;0 EINGABE FREIGEGEBEN
                                ;1 CAPS LOCK
                                ;2 GRAFIK
                                ;3 INVERSE
                                ;5 "ENTER" EINGEGEBEN

EXWRCH          EQU     03C29H  ;ALTERNATIVE AUSGABE

FRAMES          EQU     03C2BH  ;ZAEHLT DIE VSYNCS

XCOORD          EQU     03C2FH  ;PLOT-KOORDINATEN
YCOORD          EQU     03C30H  ;

VCURRENT        EQU     03C31H  ;ZEIGER AKTUELLES DICTION.
VCONTEXT        EQU     03C33H  ;ZEIGER DURCHSUCHTES DICT.
VOCLNK          EQU     03C35H  ;ZEIGER AUF LETZTES DICT.
STKBOT          EQU     03C37H  ;ZEIGER AUF FREIEN SPEICHER
DICT            EQU     03C39H  ;ZEIGER IN DICTIONARY
SPARE           EQU     03C3BH  ;ZEIGER AUF WERTESTACK

ERRNO           EQU     03C3DH  ;FEHLERNUMMER

FLAGS           EQU     03C3EH  ;2 COMPILE-MODE
                                ;3 EDIT-BETRIEB
                                ;4 EINGABE UNSICHTBAR
                                ;6 COMPILER ("[","]")

VBASE           EQU     03C3FH  ;ZAHLENSYSTEM

DICT1ST         EQU     03C40H  ;DICTIONARY "FORTH"

;================================================================
;       STRUKTUREN:
;
;       DICTIONARY:
;       DB...   NAME IN ASCII, LETZTES ZEICHEN HAT BIT 7 = 1
;       DW      LINK ZU VORHERIGEM DICTIONARY
;       DW      LETZTE ADRESSE
;       DB      NAMENSLAENGE
;       DW,DW   FORTHWORTE ZUR UMSCHALTUNG
;       DB      IMMER 0
;       DW      ERSTE ADRESSE
;
;       ROM-WORTE:
;       DB...   NAME IN ASCII, LETZTES ZEICHEN HAT BIT 7 = 1
;       DW      LINK ZU VORHERIGEM WORT
;       DB      NAMENSLAENGE
;       DW      ERSTE CODE-ADRESSE
;       ...     WEITERE DATEN
;
;       RAM-WORTE:
;       DB...   NAME IN ASCII, LETZTES ZEICHEN HAT BIT 7 = 1
;       DW      ANZAHL BYTES BIS ZUM ENDE DES WORTES
;       DW      LINK ZU VORHERIGEM WORT
;       DB      NAMENSLAENGE (BIT 6 = "IMMEDIATE")
;       DW      ERSTE CODE-ADRESSE
;       ...     WEITERE DATEN
;
;       FLOATS:
;       3 BYTES MANTISSE BCD
;       1 BYTE  EXPONENT, OFFSET 40H, BIT 7=VORZEICHEN
;
;================================================================
;       FEHLERNUMMERN

ERRNONE EQU     -1      ;KEIN FEHLER
ERRMEM  EQU     1       ;SPEICHER VOLL
ERRSTK  EQU     2       ;STACK-UNTERLAUF (ZUVIELE DROP'S)
ERRBRK  EQU     3       ;UNTERBRECHUNG DURCH BENUTZER
ERRIMM  EQU     4       ;IMMEDIATE-WORT IM INTERPRETER-MODE
ERRBLK  EQU     5       ;BLOCK-FEHLER (Z. B. "IF" - "ENDIF")
ERRNAME EQU     6       ;NAME ZU LANG BEI "CRHEADER"
ERRPICK EQU     7       ;FALSCHER STACKOFFSET Z. B. BEI "PICK"
ERRFLT  EQU     8       ;FLOAT-UEBERLAUF
ERRAT   EQU     9       ;FEHLER BEI "AT"
ERRREAD EQU     10      ;FEHLER BEI "?READ" ODER "?VERIFY"
ERRDICT EQU     11      ;F. MIT DICT. BEI "REDEFINE" & "FORGET"
ERRMODE EQU     12      ;COMPILE-MODE BEI "LINKHERE"
ERRFIND EQU     13      ;WORT NICHT GEFUNDEN
ERRLIST EQU     14      ;WORT NICHT LISTBAR BEI "LIST"

;================================================================
;       RESET

        ORG     00000H

        DI                      ;KEINE INTERRUPTS

        LD      HL,MEMBEG
        LD      A,0FCH          ;TESTWERT UND ADRESSMASKE
        JR      RMEMLP
;================================================================
;       EIN ZEICHEN AUSGEBEN

        ORG     00008H

RSTEMIT MACRO
        RST     008H
        ENDM

        EXX
        BIT     3,(IX+FLAGS-MEMBEG)
        JP      REMIT
;================================================================
;       EINEN WERT IN DE AUF DEN PARAMETERSTACK SCHIEBEN

        ORG     00010H

RSTPUSH MACRO
        RST     010H
        ENDM

CPUSH:
        LD      HL,(SPARE)
        LD      (HL),E
        INC     HL
        JP      RPUSH
;================================================================
;       EINEN WERT VOM PARAMETERSTACK NACH DE HOLEN

        ORG     00018H

RSTPULL MACRO
        RST     018H
        ENDM

CPULL:
        LD      HL,(SPARE)
        DEC     HL
        LD      D,(HL)
        JP      RPULL
;================================================================
;       EINEN FEHLER MELDEN

        ORG     00020H

RSTERR  MACRO   ERRNUM
        RST     020H
        DB      ERRNUM
        ENDM

        POP     HL
        LD      A,(HL)
        LD      (ERRNO),A       ;FEHLERNUMMER HOLEN
        JP      RABORT
;================================================================
RMEMLP:
        INC     H
        LD      (HL),A
        CP      (HL)
        JR      Z,RMEMLP        ;SPEICHER-ENDE SUCHEN

        AND     H
        LD      H,A             ;NUR VOLLE KBYTE

        LD      (RAMTOP),HL     ;ENDE MERKEN

        LD      SP,HL           ;STACKPOINTER SETZEN

        LD      HL,ROMVAR
        JR      RGOON
;================================================================
;       VSYNC-INTERRUPT

        ORG     00038H

        JP      VSYNC
;================================================================
RGOON:
        LD      DE,RAMVAR
        LD      BC,ROMVEND-ROMVAR
        LDIR                    ;VARIABLEN VORBESETZEN

        LD      IX,MEMBEG
        LD      IY,RSLNEXT      ;ZEIGER SETZEN

        CALL    CCLS
        XOR     A
        LD      (SCREEN+24*32),A        ;BILD-ENDE MARKIEREN
;----------------------------------------------------------------
        LD      HL,CHRSET
RGFXLP:
        LD      A,L
        AND     0BFH            ;4 SAETZE BLOCKGRAFIK
        RRCA
        RRCA                    ;XX0000XX       00
        RRCA                    ;XX0001XX       00
        JR      NC,RGFXM        ;XX0010XX       0F
        RRCA                    ;XX0011XX       00
        RRCA                    ;XX0100XX       F0
RGFXM:                          ;XX0101XX       00
        RRCA                    ;XX0110XX       FF
        LD      B,A             ;XX0111XX       00
        SBC     A,A             ;XX1000XX       00
        RR      B               ;XX1001XX       0F
        LD      B,A             ;XX1010XX       0F
        SBC     A,A             ;XX1011XX       0F
        XOR     B               ;XX1100XX       F0
        AND     0F0H            ;XX1101XX       0F
        XOR     B               ;XX1110XX       FF
        LD      (HL),A          ;XX1111XX       0F
        INC     L
        JR      NZ,RGFXLP       ;NOCH NICHT ALLE GRAFIKZEICHEN ?

        LD      DE,CHRSET+128*8-1
        LD      HL,ROMCHR-1
        LD      BC,8            ;8 ZEILEN
        LDDR                    ;COPYRIGHT-ZEICHEN

        EX      DE,HL
        LD      A,128-020H-1    ;ANZAHL RESTLICHE ZEICHEN
RCHRLP:
        LD      C,7             ;7 ZEILEN
        BIT     5,A
        JR      Z,RCHR7         ;ZEICHEN MIT 7 ZEILEN ?
        LD      (HL),B
        DEC     HL
        DEC     C               ;UNTERE ZEILE HINTERGRUND
RCHR7:
        EX      DE,HL
        LDDR                    ;ZEICHEN KOPIEREN
        EX      DE,HL

        LD      (HL),B
        DEC     HL              ;OBERE ZEILE HINTERGRUND

        DEC     A
        JR      NZ,RCHRLP       ;NOCH NICHT ALLE ZEICHEN ?

        IM      1               ;VSYNC AUF RST 38H
        JR      RQUIT
;================================================================
        DB      'QUI','T' OR CLAST
        DW      0
        DB      4
QUIT:
        DW      $+2

RQUIT:
        LD      SP,(RAMTOP)     ;STACKPOINTER ZURUECKSETZEN

        EI                      ;INTERRUPTS FREIGEBEN

        JP      QUITLOOP        ;AUF GEHT'S
;================================================================
        DB      'ABOR','T' OR CLAST
        DW      QUIT-1
        DB      5
ABORT:
        DW      $+2

RABORT:
        PUSH    IY
        LD      IY,NEXT         ;NORMALE FEHLERPRUEFUNG

        LD      HL,(STKBOT)
        LD      (SPARE),HL      ;DATENSTACK ZURUECKSETZEN

        LD      HL,FLAGS
        LD      A,(HL)
        AND     NOT ((1 SHL 6) OR (1 SHL 3) OR (1 SHL 2))
        BIT     2,(HL)
        LD      (HL),A          ;COMPILER UND EDITOR AUS
        JR      Z,ABGOON        ;KEIN COMPILER-MODE ?

        CALL    NEXT
        DW      DP,AT,GETBYTE
        DB      5
        DW      PLUS,DUP,RESCURR        ;CURRENT ZURUECKSETZEN
        DW      NFA,GETWORD,STKBOT
        DW      EXCLAM                  ;STACK ZURUECKSETZEN
        DW      SEMICODE

ABGOON:
        BIT     7,(IX+ERRNO-MEMBEG)
        JR      NZ,ABORTEND     ;KEIN FEHLER GESPEICHERT ?

        CALL    ROMTXT
        DB      'ERRO','R' OR CLAST

        CALL    NEXT
        DW      GETWORD,ERRNO,CAT,PNT,CR
        DW      SEMICODE        ;FEHLER MELDEN

        LD      (IX+ERRNO-MEMBEG),ERRNONE   ;KEIN FEHLER MEHR

ABORTEND:
        LD      HL,(STKBOT)
        LD      BC,SAFETY
        ADD     HL,BC
        LD      (SPARE),HL
        POP     IY
        JR      RQUIT
;================================================================
ROMVAR:
        DW      SCREEN+23*32                    ;LHALF
        DB      0,0                             ;KEYCOD
        DB      0                               ;STATIN
        DW      0                               ;EXWRCH
        DB      0,0,0,0                         ;FRAMES
        DB      0,0                             ;XCOORD/YCOORD
        DW      FORTH+2+RAMVAR-ROMVAR           ;VCURRENT
        DW      FORTH+2+RAMVAR-ROMVAR           ;VCONTEXT
        DW      FORTH+5+RAMVAR-ROMVAR           ;VOCLNK
        DW      FREEMEM                         ;STKBOT
        DW      FORTH-5+RAMVAR-ROMVAR           ;DICT
        DW      FREEMEM+SAFETY                  ;SPARE
        DB      -1                              ;ERRNO
        DB      0                               ;FLAGS
        DB      10                              ;VBASE

        DB      'FORT','H' OR CLAST             ;DICT1ST
        DW      0000H,1FFFH
        DB      5
FORTH:
        DW      SETCONTEXT
        DW      FORTH-1+RAMVAR-ROMVAR   ;FORTH IST CONTEXT
        DB      0
        DW      0

ROMVEND:
FREEMEM EQU     ROMVEND+RAMVAR-ROMVAR           ;FREIER SPEICHER
;================================================================
VSYNC:
        PUSH    AF
        EX      AF,AF'
        PUSH    AF
        PUSH    BC
        PUSH    DE
        PUSH    HL              ;REGISTER RETTEN

        LD      B,62
VDELAY:
        DJNZ    VDELAY          ;ETWAS WARTEN (WARUM ???)

        LD      HL,FRAMES
VSCNT:
        INC     (HL)
        INC     HL
        JR      Z,VSCNT         ;VSYNC-ZAEHLER ERHOEHEN

        CALL    VKEY            ;TASTE MIT AUTOREPEAT HOLEN

        LD      HL,STATIN
        BIT     0,(HL)
        JR      Z,VSEND         ;EINGABE GESPERRT ?
        AND     A
        JR      Z,VSEND         ;KEINE TASTE ?
        CP      ' '
        JR      C,VSCTRL        ;STEUERZEICHEN ?

        BIT     1,(HL)
        CALL    NZ,TOUPPER      ;"CAPS LOCK" ?
        BIT     2,(HL)
        JR      Z,VSNOGRF
        AND     09FH            ;"GRAPHICS" ?
VSNOGRF:
        BIT     3,(HL)
        JR      Z,VSNOINV
        OR      CINV            ;"INVERSE" ?
VSNOINV:
        CALL    DCDCNORM        ;ANZEIGBARES ZEICHEN

VSCTRL:
        CALL    DOCTRL          ;STEUERZEICHEN

        CALL    DCSETCUR        ;CURSOR SETZEN
VSEND:
        POP     HL
        POP     DE
        POP     BC
        POP     AF
        EX      AF,AF'
        POP     AF              ;REGISTER HOLEN

        EI                      ;INTERRUPTS WIEDER FREIGEBEN
        RET                     ;(WARUM NICHT "RETI" ???)
;================================================================
DCDOCHAR:
        CP      CCR
        JR      NZ,DCDCNORM     ;NICHT "ENTER" ?

        LD      HL,SCREEN+24*32
        LD      (ENDBUF),HL
        LD      (CURSOR),HL     ;EINGABE-ZEIGER ANS BILD-ENDE

        XOR     A
        CALL    DCDCINS         ;NEUES EINGABE-ENDE SETZEN

        LD      HL,SCREEN+23*32
        LD      (INSCRN),HL     ;EINE ZEILE EINGABE
        RET

DCDCNORM:
        AND     A
        RET     Z               ;KEINE TASTE ?

DCDCINS:
        EX      AF,AF'          ;ZEICHEN MERKEN

        LD      HL,(ENDBUF)
        LD      A,(HL)
        AND     A
        JR      Z,DCDCSCROL
        LD      DE,-(SCREEN+24*32)
        ADD     HL,DE
        JR      NC,DCDCEND      ;EINGABE-ENDE VOR BILD-ENDE ?

DCDCSCROL:
        LD      DE,(LHALF)
        LD      HL,-(SCREEN+3*32)
        ADD     HL,DE
        JR      NC,DCDCQUIT     ;AUSG.-ENDE IN ERSTEN 3 ZEILEN ?

        LD      HL,(SCRPOS)
        LD      BC,32
        ADD     HL,BC
        SBC     HL,DE
        PUSH    DE
        CALL    NC,SCROLLUP     ;AUSG.-CURSOR IN LETZTER ZEILE ?

        CALL    DCSTREND
        POP     DE
        CALL    INSLINE         ;EINGABE HOCHSCHIEBEN

        LD      HL,INSCRN
        LD      B,4             ;4-MAL ???
DCDCSLOOP:
        CALL    DECLINE
        DJNZ    DCDCSLOOP       ;EINGABE-ANFANG HOCHSCHIEBEN

DCDCEND:
        CALL    DCGETCIN
        LD      D,H
        LD      E,L
        INC     HL
        LD      (ENDBUF),HL     ;EINGABE-ENDE WEITERSCHIEBEN

        DEC     HL
        DEC     HL
        JR      Z,DCDCSTORE     ;EINGABE-CURSOR AM ENDE ?

        LDDR                    ;RESTLICHE EINGABE WEITERSCHIEBEN

DCDCSTORE:
        EX      AF,AF'
        LD      (DE),A          ;ZEICHEN SPEICHERN
        INC     DE
        LD      (CURSOR),DE     ;NEUE EINGABE-ADRESSE MERKEN
DCDCQUIT:
        XOR     A               ;Z-FLAG SETZEN, KEIN ZEICHEN MEHR
        RET
;================================================================
DOCTRL:
        LD      HL,DCJMPTAB
        LD      D,0
        LD      E,A
        ADD     HL,DE           ;ZEIGER AUF TABELLEN-EINTRAG

        LD      E,(HL)
        ADD     HL,DE
        JP      (HL)            ;ADRESSE ANSPRINGEN
DCJMPTAB:
        DB      DCNOP-$         ;0 (KEINE TASTE)
        DB      DCLEFT-$        ;1 PFEIL LINKS
        DB      DCFLAG-$        ;2 CAPS LOCK
        DB      DCRIGHT-$       ;3 PFEIL RECHTS
        DB      DCFLAG-$        ;4 GRAFIK
        DB      DCCHARDEL-$     ;5 ZEICHEN LOESCHEN
        DB      DCNOP-$         ;6 (UNBENUTZT)
        DB      DCUP-$          ;7 PFEIL AUF
        DB      DCFLAG-$        ;8 INVERTIERT
        DB      DCDOWN-$        ;9 PFEIL AB
        DB      DCLINEDEL-$     ;A ZEILE LOESCHEN
        DB      DCNOP-$         ;B (UNBENUTZT)
        DB      DCNOP-$         ;C (UNBENUTZT)
        DB      DCENTER-$       ;D ZEILENENDE
;----------------------------------------------------------------
DCFLAG:
        LD      HL,STATIN
        XOR     (HL)
        LD      (HL),A          ;FLAG WECHSELN
        RET
;----------------------------------------------------------------
DCLEFT:
        LD      HL,(CURSOR)
        DEC     HL
        LD      A,(HL)
        AND     A
        RET     Z               ;AM EINGABE-ANFANG ?

        LD      (CURSOR),HL     ;NEUE ADRESSE MERKEN

        INC     HL
        LD      (HL),A          ;ZEICHEN UMSPEICHERN
DCNOP:
        RET
;----------------------------------------------------------------
DCRIGHT:
        LD      HL,(CURSOR)
        INC     HL
        LD      DE,(ENDBUF)
        AND     A
        SBC     HL,DE
        RET     Z               ;AM EINGABE-ENDE ?

        ADD     HL,DE
        LD      (CURSOR),HL     ;NEUE ADRESSE MERKEN

        LD      A,(HL)
        DEC     HL
        LD      (HL),A          ;ZEICHEN UMSPEICHERN
        RET
;----------------------------------------------------------------
DCCURDEL:
        LD      HL,(CURSOR)
        INC     HL
        LD      (CURSOR),HL     ;EINGABE-ADRESSE ERHOEHEN

DCCHARDEL:
        CALL    DCGETCIN
        LD      H,D
        LD      L,E
        DEC     DE
        LD      A,(DE)
        AND     A
        RET     Z               ;AM EINGABE-ANFANG ?

        LD      (CURSOR),DE
        LD      A,B
        OR      C
        JR      Z,DCCDGOON      ;AM EINGABE-ENDE ?

        LDIR                    ;ZEICHEN LINKS LOESCHEN
DCCDGOON:
        DEC     HL
        LD      (HL),' '        ;LETZTES ZEICHEN LOESCHEN
        LD      (ENDBUF),HL     ;(UEBERFLUESSIG ???)

        INC     C               ;Z-FLAG LOESCHEN
        RET
;----------------------------------------------------------------
DCUP:
        CALL    DCLEFT
        JR      Z,DCUSCROLL     ;AM EINGABE-ANFANG ?

        LD      B,31
DCUPLOOP:
        CALL    DCLEFT
        DJNZ    DCUPLOOP        ;MAXIMAL EINE ZEILE ZURUECK
        RET

DCUSCROLL:
        LD      HL,(INSCRN)
        LD      DE,(LHALF)
        AND     A
        SBC     HL,DE
        RET     Z               ;EINGABE-ANFANG AM AUSGABE-ENDE ?

        CALL    DCCURDEL

        LD      HL,(INSCRN)
        LD      DE,-32
        XOR     A
DCUSLOOP:
        ADD     HL,DE
        CP      (HL)
        JR      NZ,DCUSLOOP     ;NAECHSTE MARKE SUCHEN

        LD      (INSCRN),HL

        CALL    DCSETEND
        LD      (CURSOR),HL     ;NEUES EINGABE-ENDE SETZEN
;----------------------------------------------------------------
DCOUTCUR:
        LD      A,' ' OR CINV
        CALL    DCDOCHAR        ;CURSOR-ZEICHEN AUSGEBEN

        LD      HL,(CURSOR)
        DEC     HL
        LD      (CURSOR),HL     ;ADRESSE KORRIGIEREN

DCSETCUR:
        LD      HL,(CURSOR)
        LD      A,(STATIN)
        RRA
        LD      (HL),017H OR CINV       ;"NORMAL"
        RRA
        JR      NC,SCNOCAPS
        LD      (HL),'C' OR CINV        ;"CAPS LOCK"
SCNOCAPS:
        RRA
        RET     NC
        LD      (HL),'G' OR CINV        ;"GRAFIK"
        RET
;----------------------------------------------------------------
DCDOWN:
        CALL    DCRIGHT
        JR      Z,DCDSCROLL     ;AM EINGABE-ENDE ?
        LD      B,31
DCDNLOOP:
        CALL    DCRIGHT
        DJNZ    DCDNLOOP        ;MAXIMAL EINE ZEILE VOR
        RET

DCDSCROLL:
        CALL    DCSTREND
        RET     PO              ;ENDE GEFUNDEN ?
        PUSH    HL

        CALL    DCCURDEL

        POP     HL
        CALL    DCSETBEG        ;NEUEN EINGABE-ANFANG SETZEN

        JR      DCOUTCUR
;----------------------------------------------------------------
DCSTREND:
        LD      HL,SCREEN+24*32
        LD      DE,(INSCRN)
        AND     A
        SBC     HL,DE
        LD      B,H
        LD      C,L             ;ANZAHL BERECHNEN

        EX      DE,HL
        INC     HL              ;ZEIGER HINTER ANFANG

        XOR     A
        CPIR                    ;NACH TEXTENDE SUCHEN

        DEC     HL              ;ZEIGER KORRIGIEREN
        RET
;----------------------------------------------------------------
DCLINEDEL:
        LD      HL,(ENDBUF)
        DEC     HL
        LD      (CURSOR),HL     ;ZEIGER AUF EINGABE-ENDE

DCLDLOOP:
        CALL    DCCHARDEL
        JR      NZ,DCLDLOOP     ;BIS ZUM ANFANG LOESCHEN
        RET
;----------------------------------------------------------------
DCENTER:
        LD      HL,STATIN
        SET     5,(HL)          ;"ENTER" EINGEGEBEN
        RES     0,(HL)          ;EINGABE SPERREN
        RET
;----------------------------------------------------------------
DCCLEAR:
        LD      HL,SCREEN+24*32
        LD      DE,(LHALF)
        CALL    BLANKS          ;EINGABE-FELD LOESCHEN

        LD      HL,SCREEN+23*32
        LD      (LHALF),HL
        LD      (HL),0          ;EINGABE-ANFANG MARKIEREN

DCRETYPE:
        LD      HL,(LHALF)

DCSETBEG:
        LD      (INSCRN),HL     ;EINGABE-ANFANG SETZEN
        INC     HL
        LD      (CURSOR),HL     ;DAHINTER AKTUELLE ADRESSE

DCSETEND:
        CALL    DCSTREND
        LD      A,' '
DCSELOOP:
        DEC     HL
        CP      (HL)
        JR      Z,DCSELOOP      ;EINGABE-STRINGENDE SUCHEN

        INC     HL
        LD      (ENDBUF),HL     ;DORT EINGABE-ENDE SETZEN
        RET
;----------------------------------------------------------------
DCGETCIN:
        LD      HL,(ENDBUF)
        LD      DE,(CURSOR)
        AND     A
        SBC     HL,DE
        LD      B,H
        LD      C,L             ;ANZAHL BERECHNEN

        ADD     HL,DE           ;ZEIGER WIEDER HERSTELLEN
        RET
;----------------------------------------------------------------
VKEY:
        CALL    KEYGET
        LD      B,A             ;GEDRUECKTE TASTE HOLEN

        LD      HL,(KEYCOD)
        XOR     L
        JR      Z,VKAGAIN       ;GLEICHE TASTE NOCH GEDRUECKT ?
        XOR     L
        JR      Z,VKNEW         ;KEINE TASTE GEDRUECKT ?
        XOR     A
        CP      L
        RET     NZ              ;VORHER ANDERE TASTE GEDRUECKT ?

VKNEW:
        LD      L,B             ;TASTE MERKEN
        LD      H,32            ;ZEITZAEHLER LADEN
        JR      VKQUIT

VKAGAIN:
        DEC     H               ;ZEITZAEHLER ERNIEDRIGEN

        LD      A,H
        CP      30
        JR      Z,VKPRESS       ;TASTE ENTPRELLT ?

        XOR     A
        CP      H
        JR      NZ,VKQUIT       ;AUTOREPEAT-ZEIT ERREICHT ?

        LD      H,4             ;ZEITZAEHLER ZURUECKSETZEN
VKPRESS:
        LD      A,L             ;TASTE HOLEN
VKQUIT:
        LD      (KEYCOD),HL
        RET
;----------------------------------------------------------------
KEYGET:
        LD      BC,IO OR (0FEH SHL 8)   ;MASKE UND ADRESSE
        IN      D,(C)           ;ZEILE MIT "SHIFT" UND "SYMBOL"
        LD      E,D             ;MERKEN

        SRL     D
        SBC     A,A
        AND     -40             ;WENN KEIN "SHIFT", OFFSET
        SRL     D
        JR      C,KEYGNC        ;KEIN "SYMBOL" ?
        LD      A,40            ;ANZAHL TASTEN
KEYGNC:
        ADD     A,2*40+7        ;NORMAL "SHIFT" "SYMBOL"
        LD      L,A             ;  47      87     127

        LD      A,E
        OR      3               ;ZEILE OHNE "SHIFT" UND "SYMBOL"

        LD      E,0FFH          ;BISHER KEINE TASTE
KEYGLP:
        CPL
        AND     1FH
        LD      D,A             ;TASTEN MASKIEREN
        JR      Z,KEYGNK        ;KEINE TASTE GEDRUECKT ?

        LD      A,L
        INC     E
        JR      NZ,KEYGQU       ;BEREITS TASTE GEDRUECKT ?
KEYGSC:
        SUB     8               ;OFFSET KORRIGIEREN
        SRL     D
        JR      NC,KEYGSC       ;TASTE NOCH NICHT GEFUNDEN ?

        LD      E,A             ;OFFSET MERKEN
        JR      NZ,KEYGQU       ;WEITERE TASTE GEDRUECKT ?
KEYGNK:
        DEC     L               ;OFFSET KORRIGIEREN
        RLC     B
        JR      NC,KEYGQU2      ;TASTATUR FERTIG ?

        IN      A,(C)           ;NAECHSTE ZEILE HOLEN
        JR      KEYGLP

KEYGQU:
        LD      E,-1            ;KEINE TASTE GEDRUECKT
KEYGQU2:
        LD      A,E
        INC     A
        RET     Z               ;KEINE TASTE GEDRUECKT ?

        LD      HL,KEYTBL
        ADD     HL,DE
        LD      A,(HL)          ;TASTENCODE HOLEN
        RET
KEYTBL:
        DB      'v','h','y','6','5','t','g','c' ;NORMAL
        DB      'b','j','u','7','4','r','f','x'
        DB      'n','k','i','8','3','e','d','z'
        DB      'm','l','o','9','2','w','s',0
        DB      ' ',CCR,'p','0','1','q','a',0

        DB      'V','H','Y',KUP,KLT,'T','G','C' ;MIT "SHIFT"
        DB      'B','J','U',KDN,INV,'R','F','X'
        DB      'N','K','I',KRT,'3','E','D','Z'
        DB      'M','L','O',GFX,LOK,'W','S',0
        DB      ' ',CCR,'P',CDL,LDL,'Q','A',0

        DB      '/','^','[','&','%','>','}','?' ;MIT "SYMBOL"
        DB      '*','-',']','''','$','<','{',PND
        DB      ',','+',CPR,'(','#','E','\',':'
        DB      '.','=',';',')','@','W','|',0
        DB      ' ',CCR,'"','_','!','Q','~',0
;================================================================
REMIT:
        JR      Z,RENORM        ;KEIN "EDIT" ?
        CALL    DCDOCHAR
        EXX
        RET

RENORM:
        LD      B,A
        LD      HL,(EXWRCH)
        LD      A,H
        OR      L
        LD      A,B
        JR      Z,EMITSCR
        JP      (HL)            ;AUSGABE-VEKTOR BENUTZEN ?

EMITSCR:
        LD      HL,(SCRPOS)
        LD      DE,(LHALF)
        EX      DE,HL
        SCF
        SBC     HL,DE
        EX      DE,HL
        CALL    C,SCROLLUP      ;BEI BEDARF EINE ZEILE SCROLLEN

        CP      CCR
        JR      Z,ESENTER       ;"ENTER" ?

        LD      (HL),A          ;ZEICHEN SPEICHERN
        INC     HL              ;NAECHSTE ADRESSE
        JR      ESQUIT

ESENTER:
        INC     HL
        LD      A,L
        AND     32-1
        JR      NZ,ESENTER      ;ZEIGER AN NAECHSTEN ZEILENANFANG

ESQUIT:
        LD      (SCRPOS),HL     ;CURSOR-ADRESSE SPEICHERN
        EXX
        RET
;----------------------------------------------------------------
SCROLLUP:
        PUSH    AF
        LD      HL,SCRPOS
        CALL    DECLINE         ;CURSOR-ADRESSE ANPASSEN
        POP     AF

        LD      HL,(LHALF)
        LD      DE,SCREEN+32    ;AUSGABE-FELD HOCHSCHIEBEN

INSLINE:
        AND     A
        SBC     HL,DE
        LD      B,H
        LD      C,L             ;ANZAHL ZEICHEN
        LD      HL,-32
        ADD     HL,DE
        EX      DE,HL
        LDIR                    ;BILDSCHIRM HOCHSCHIEBEN

        LD      B,32
ILLOOP:
        DEC     HL
        LD      (HL),' '
        DJNZ    ILLOOP          ;EINGEFUEGTE ZEILE LOESCHEN
        RET
;----------------------------------------------------------------
DECLINE:
        LD      A,(HL)
        SUB     32
        LD      (HL),A
        INC     HL
        JR      NC,DLEND
        DEC     (HL)
DLEND:
        INC     HL
        RET
;================================================================
GETVAR:
        EX      DE,HL
        LD      E,(HL)
        LD      D,0             ;OFFSET HOLEN

        LD      HL,MEMBEG
        ADD     HL,DE
        EX      DE,HL
        RSTPUSH                 ;ADRESSE AUF STACK
        JP      (IY)
;================================================================
        DB      'HER','E' OR CLAST
        DW      ABORT-1
        DB      4
HERE:
        DW      $+2

        LD      DE,(STKBOT)
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'CONTEX','T' OR CLAST
        DW      HERE-1
        DB      7
CONTEXT:
        DW      GETVAR
        DB      VCONTEXT-MEMBEG
;================================================================
        DB      'CURREN','T' OR CLAST
        DW      CONTEXT-1
        DB      7
CURRENT:
        DW      GETVAR
        DB      VCURRENT-MEMBEG
;================================================================
        DB      'BAS','E' OR CLAST
        DW      CURRENT-1
        DB      4
BASE:
        DW      GETVAR
        DB      VBASE-MEMBEG
;================================================================
GETFLAGS:
        DW      GETVAR
        DB      FLAGS-MEMBEG
;================================================================
DP:
        DW      GETVAR
        DB      DICT-MEMBEG
;================================================================
        DB      'PA','D' OR CLAST
        DW      BASE-1
        DB      3
PAD:
        DW      DOCONSTANT,PADMEM
;================================================================
NSEMICOLON:
        DB      ';' OR CLAST
        DW      PAD-1
        DB      1 OR IMM
SEMICOLON:
        DW      DOCOMPILER,SEMIS
        DW      ASSERT
        DB      10                      ;PRUEFWERT TESTEN
        DW      SEMICODE

        LD      HL,FLAGS
        LD      A,(HL)
        AND     NOT ((1 SHL 6) OR (1 SHL 2))
        LD      (HL),A          ;COMPILER AUSSCHALTEN
        JP      (IY)
;================================================================
        DB      0
        DW      NSEMICOLON-$-1
SEMIS:
        DW      RSEMIS
RSEMIS:
        POP     HL              ;AKTUELLEN ZEIGER WEGWERFEN

NEXT:
        POP     HL              ;ZEIGER HOLEN
NEXTSUB:
        LD      E,(HL)
        INC     HL
        LD      D,(HL)
        INC     HL
        PUSH    HL              ;NAECHSTE FORTH-ADRESSE HOLEN
NEXTDE:
        EX      DE,HL
        LD      E,(HL)
        INC     HL
        LD      D,(HL)
        INC     HL
        EX      DE,HL
        JP      (HL)            ;MASCHINENCODE ANSPRINGEN
;================================================================
SLNEXT:
        DW      RSLNEXT
RSLNEXT:
        LD      BC,11
        LD      DE,(SPARE)
        LD      HL,(STKBOT)
        ADD     HL,BC
        SBC     HL,DE
        JR      C,RSLNGOON      ;NOCH PLATZ ZWISCHEN STACKS ?
ERRORSTK:
        RSTERR  ERRSTK

RSLNGOON:
        LD      BC,0
        CALL    MEMCHECK
        CALL    USERBREAK
        JR      NEXT
;================================================================
USERBREAK:
        LD      A,0FEH
        IN      A,(IO)          ;TASTENZEILE LESEN
        RRA
        RET     C               ;"SHIFT" NICHT GEDRUECKT ?
        LD      A,7FH
        IN      A,(IO)          ;TASTENZEILE LESEN
        RRA
        RET     C               ;"BREAK" NICHT GEDRUECKT ?
BREAK:
        RSTERR  ERRBRK
;================================================================
QUITLOOP:
        CALL    NEXT
QLLOOP:
        DW      QUERY                   ;EINE ZEILE HOLEN
        DW      LINE                    ; UND BEARBEITEN
        DW      OK                      ; UND "OK" SENDEN
        DW      DOREPEAT,QLLOOP-$-1     ; FUER IMMER...
;================================================================
        DB      'LIN','E' OR CLAST
        DW      SEMICOLON-1
        DB      4
LINE:
        DW      DOCOL
LINELOOP:
        DW      SLNEXT                  ;ALLE PRUEFUNGEN
        DW      FIND,QDUP               ;WORT SUCHEN
        DW      DOIF,LINENUM-$-1        ;NICHT GEFUNDEN ?
        DW      CHKIMM                  ;WORT BEARBEITEN
        DW      DOREPEAT,LINELOOP-$-1
LINENUM:
        DW      NUMBER,QDUP             ;ZAHL SUCHEN
        DW      DOIF,LINESTR-$-1        ;NICHT GEFUNDEN ?
        DW      CHKNUMBER               ;ZAHL BEARBEITEN
        DW      DOREPEAT,LINELOOP-$-1
LINESTR:
        DW      CHKSTRING,ZEROEQ        ;TEXT SUCHEN
        DW      DOIF,LINEERR-$-1        ;NICHT GEFUNDEN ?
        DW      SEMIS
LINEERR:
        DW      RETYPE                  ;FEHLER MELDEN
        DW      DOREPEAT,LINELOOP-$-1
;================================================================
OK:
        DW      $+2

        LD      A,(FLAGS)
        BIT     6,A
        JR      NZ,OKQUIT       ;LAEUFT DER COMPILER NOCH ?
        BIT     4,A
        JR      NZ,OKQUIT       ;EINGABE UNSICHTBAR ?

        CALL    ROMTXT
        DB      ' OK',' ' OR CLAST
        LD      A,CCR
        RSTEMIT

OKQUIT:
        JP      (IY)
;================================================================
CHKIMM:
        DW      $+2

        RSTPULL                 ;CODE-FELD-ADRESSE
        DEC     DE
        LD      A,(DE)
        CPL
        AND     (IX+FLAGS-MEMBEG)
        AND     1 SHL 6
        INC     DE
        JR      Z,CHKIQUIT      ;COMPILER AUS ODER IMMEDIATE ?

        RSTPUSH
        LD      DE,KOMMA
CHKIQUIT:
        JP      NEXTDE
;----------------------------------------------------------------
CHKNUMBER:
        DW      $+2

        RSTPULL
        BIT     6,(IX+FLAGS-MEMBEG)
        JR      NZ,CHKIQUIT     ;COMPILER AN ?
        JP      (IY)
;================================================================
        DB      'RETYP','E' OR CLAST
        DW      QUERY-1
        DB      6
RETYPE:
        DW      $+2

        CALL    DCRETYPE
        CALL    DCOUTCUR
        LD      (HL),'?' OR CINV        ;CURSOR AENDERN
        JR      QSTART
;================================================================
        DB      'QUER','Y' OR CLAST
        DW      LINE-1
        DB      5
QUERY:
        DW      $+2

        CALL    DCCLEAR
        CALL    DCOUTCUR

QSTART:
        LD      HL,STATIN
        SET     0,(HL)          ;EINGABE FREIGEBEN
        RES     5,(HL)          ;BISHER KEIN "ENTER"
QLOOP:
        BIT     5,(HL)
        JR      Z,QLOOP         ;AUF "ENTER" WARTEN

        CALL    DCCURDEL
        JP      (IY)
;================================================================
        DB      'WOR','D' OR CLAST
        DW      RETYPE-1
        DB      4
WORD:
        DW      $+2

        RSTPULL                 ;DELIMITER HOLEN

        LD      HL,SCRMEND-2
        LD      B,SCRMEND-SCREND-3
WCLLOOP:
        LD      (HL),' '
        DEC     HL
        DJNZ    WCLLOOP         ;PUFFER LOESCHEN

        PUSH    DE
        EX      DE,HL
        RSTPUSH
        POP     DE
        CALL    CWORD           ;TEXT EINLESEN

        INC     B
        DEC     B
        JR      Z,WGOON1
        LD      BC,255          ;ANZAHL AUF 255 BEGRENZEN
WGOON1:
        LD      HL,PADMEM
        LD      (HL),C          ;ANZAHL SPEICHERN
        INC     HL
        LD      A,252
        CP      C
        JR      NC,WGOON2
        LD      C,A             ;ANZAHL BEGRENZEN
WGOON2:
        INC     C
        PUSH    DE
        PUSH    BC
        EX      DE,HL
        LDIR                    ;EINGABE UMSPEICHERN
        POP     BC
        POP     DE
        DEC     C
        CALL    BLWORD          ;EINGABE LOESCHEN
        JP      (IY)
;================================================================
GETSTRING:
        LD      E,' '           ;LEERZEICHEN ALS BEGRENZER
CWORD:
        LD      HL,(LHALF)
        LD      (INSCRN),HL

        LD      BC,0            ;BISHER KEIN ZEICHEN
CWLOOP1:
        INC     HL
        LD      A,(HL)
        CP      E
        JR      Z,CWLOOP1       ;ANFANG SUCHEN
        AND     A
        JR      Z,CWNFND

        PUSH    HL              ;ANFANG MERKEN
CWLOOP2:
        INC     BC              ;MITZAEHLEN
        INC     HL
        LD      A,(HL)
        AND     A
        JR      Z,CWEND         ;TEXTENDE ?
        CP      E
        JR      NZ,CWLOOP2      ;ENDE SUCHEN
CWEND:
        POP     DE              ;ANFANG HOLEN

        XOR     A
        CP      B
        RET                     ;TEST AUF ANZAHL 256

CWNFND:
        PUSH    DE
        CALL    DCSTREND
        JP      PO,CWERR        ;EINGABE-ENDE GEFUNDEN ?
        LD      DE,(LHALF)
        CALL    BLANKS          ;EINGABE-FELD LOESCHEN
        LD      (LHALF),HL
        POP     DE
        JR      CWORD           ;NAECHSTES WORT

CWERR:
        EX      DE,HL           ;ZEIGER AUF ENDE (???)
        POP     BC
        LD      BC,0
        SCF                     ;MISSERFOLG MELDEN
        RET
;================================================================
CHKSTRING:
        DW      $+2

        CALL    GETSTRING
        LD      D,B
        LD      E,C
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'VLIS','T' OR CLAST
        DW      WORD-1
        DB      5
VLIST:
        DW      $+2

        LD      A,CCR
        RSTEMIT

        LD      C,0             ;ALLE WORTE FINDEN
        JR      RFIND
;================================================================
        DB      'FIN','D' OR CLAST
        DW      VLIST-1
        DB      4
FIND:
        DW      $+2

        CALL    GETSTRING
        JR      C,RZERO         ;KEIN WORT EINGEGEBEN ?

RFIND:
        LD      HL,(VCONTEXT)
        LD      A,(HL)
        INC     HL
        LD      H,(HL)
        LD      L,A             ;ERSTEN ZEIGER HOLEN
FLOOP:
        LD      A,(HL)
        AND     3FH
        JR      Z,FNEXT2        ;KEIN WORT MEHR ?
        XOR     C
        JR      Z,FTEST         ;GLEICHE LAENGE ?
        LD      A,C
        AND     A
        JR      NZ,FNEXT2       ;EINZELNES WORT GESUCHT ?
FTEST:
        PUSH    DE
        PUSH    HL
        CALL    PTR2NAME
        OR      C
        JR      Z,FPRINT        ;WORT SOFORT AUSGEBEN ?

        LD      B,C             ;WORTLAENGE HOLEN
FCOMPARE:
        LD      A,(DE)
        CALL    TOUPPER
        INC     DE
        XOR     (HL)
        AND     NOT CLAST
        INC     HL
        JR      NZ,FNEXT1       ;WORT UNGLEICH ?
        DJNZ    FCOMPARE        ;NOCH NICHT ALLE ZEICHEN ?

        POP     DE
        INC     DE
        RSTPUSH                 ;ZEIGER AUF CODE-FELD
        POP     DE
        CALL    BLWORD          ;EVTL. EINGABE LOESCHEN
        JP      (IY)

FPRINT:
        CALL    OUTTXT
        HALT                    ;VSYNC ABWARTEN
        CALL    USERBREAK
FNEXT1:
        POP     HL
        POP     DE
FNEXT2:
        DEC     HL
        LD      A,(HL)
        DEC     HL
        LD      L,(HL)
        LD      H,A             ;NAECHSTER ZEIGER
        OR      L
        JR      NZ,FLOOP        ;NOCH NICHT ALLE WORTE ?
        DB      0C3H            ;JP RZERO (HRM-HRM !!!)
;================================================================
ZERO:
        DW      $+2

RZERO:
        LD      DE,0
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'EXECUT','E' OR CLAST
        DW      FIND-1
        DB      7
EXECUTE:
        DW      $+2

        RSTPULL
        JP      NEXTDE
;================================================================
        DB      'NUMBE','R' OR CLAST
        DW      EXECUTE-1
        DB      6
NUMBER:
        DW      $+2

        CALL    GETSTRING
        JR      C,RZERO         ;KEIN WORT EINGEGEBEN ?

        PUSH    BC
        PUSH    DE
        CALL    CNVINT
        JR      NZ,NFLOAT       ;KEIN ZWISCHENRAUM ?
        LD      DE,LITERAL
        JR      NUMBERQUIT      ;16-BIT-INTEGER

NFLOAT:
        RSTPULL
        LD      DE,0
        RSTPUSH
        LD      DE,0 OR ((FEOFFS+5) SHL 8)

        POP     BC
        PUSH    BC
        LD      A,(BC)
        CP      '-'
        JR      NZ,NFGOON       ;POSITIVE ZAHL ?
        LD      D,FSIGN OR (FEOFFS+5)
        INC     BC
NFGOON:
        RSTPUSH
        LD      D,B
        LD      E,C

        DEC     HL
        DEC     HL
NFLOOP1:
        CALL    DECGET
        INC     HL
        INC     (HL)
        DEC     HL
        JR      NC,NFLOOP1      ;VORKOMMA-ANTEIL UMWANDELN

        CP      '.'-'0'
        JR      NZ,NUMBERERR    ;NICHT DEZIMALPUNKT ?
NFLOOP2:
        CALL    DECGET
        JR      NC,NFLOOP2      ;NACHKOMMA-ANTEIL UMWANDELN

        ADD     A,'0'
        CALL    CNVEND
        JR      NZ,NFEXP        ;KEIN ZWISCHENRAUM ?
        LD      E,0
        JR      NFEGOON
NFEXP:
        AND     NOT 020H
        CP      'E'
        JR      NZ,NUMBERERR    ;KEIN EXPONENT ?
        PUSH    HL
        CALL    CNVINT
        RSTPULL
        POP     HL
        JR      NZ,NUMBERERR    ;KEIN ZWISCHENRAUM ?
NFEGOON:
        CALL    FZEROEQ
        JR      Z,NFQUIT        ;ZAHL = 0 ?

        INC     HL
        LD      A,(HL)
        AND     7FH
        ADD     A,E
        JP      M,NUMBERERR
        JR      Z,NUMBERERR     ;EXPONENT ZU GROSS ?
        XOR     (HL)
        AND     7FH
        XOR     (HL)            ;VORZEICHEN BEHALTEN
        LD      (HL),A          ;EXPONENT SPEICHERN
NFQUIT:
        LD      DE,LITFLOAT
NUMBERQUIT:
        RSTPUSH
        POP     DE
        POP     BC
        CALL    BLWORD
        JP      (IY)

NUMBERERR:
        POP     HL
        POP     HL
        RSTPULL
        RSTPULL
        JP      RZERO
;----------------------------------------------------------------
DECGET:
        LD      A,(DE)
        INC     DE
        SUB     '0'
        RET     C
        CP      10
        CCF
        RET     C               ;ZEICHEN < '0' ODER > '9' ?

DECSHIN:
        LD      C,A
        LD      A,(HL)
        AND     0F0H
        RET     NZ              ;OBERSTE STELLE <> 0 ?
        LD      A,C
DECSTORE:
        DEC     HL
        DEC     HL
        LD      C,3
DSLOOP:
        RLD
        INC     HL
        DEC     C
        JR      NZ,DSLOOP       ;DIGIT AN UNTERSTER STELLE
        DEC     (HL)
        DEC     HL
        CP      A
        RET                     ;DIGIT EINGESCHOBEN, TEST AUF 0
;----------------------------------------------------------------
FZEROEQ:
        LD      B,6
FZEQLP:
        XOR     A
        CALL    DECSHIN
        RET     NZ              ;STELLE <> 0 GEFUNDEN ?
        DJNZ    FZEQLP          ;MAXIMAL ALLE STELLEN
        INC     HL
        LD      (HL),B          ;EXPONENT LOESCHEN
        RET
;----------------------------------------------------------------
CNVINT:
        RSTPUSH
        CALL    NEXT
        DW      DUP,CAT,GETBYTE
        DB      '-'
        DW      EQ                      ;NEGATIVES VORZEICHEN ?
        DW      DUP,NEGATE,GTR
        DW      PLUS,ONEMINUS           ;ZEIGER ANPASSEN
        DW      ZERO,ZERO,ROT
        DW      CONVERT                 ;ZAHL KONVERTIEREN
        DW      ROT,RGT,IFN0NEG         ;BEI BEDARF NEGIEREN
        DW      ROT,DROP                ;OBERES WORT WEGWERFEN
        DW      SWAP
        DW      SEMICODE
        RSTPULL
        LD      A,(DE)
CNVEND:
        CP      ' '
        RET     Z
        AND     A
        RET                     ;TEST AUF ZWISCHENRAUM
;================================================================
        DB      'CONVER','T' OR CLAST
        DW      NUMBER-1
        DB      7
CONVERT:
        DW      DOCOL
CNVTLOOP:
        DW      ONEPLUS,DUP,GTR         ;ADRESSE MERKEN
        DW      CAT,CNVDIGIT            ;EIN ZEICHEN KONVERTIEREN
        DW      DOIF,CNVTEND-$-1        ;KEINE ZIFFER ?
        DW      SWAP
        DW      BASE,CAT,UMUL
        DW      DROP,ROT
        DW      BASE,CAT,UMUL
        DW      DPLUS                   ;ZIFFER EINSCHIEBEN
        DW      RGT                     ;ADRESSE HOLEN
        DW      DOREPEAT,CNVTLOOP-$-1
CNVTEND:
        DW      RGT                     ;STACK KORRIGIEREN
        DW      SEMIS
;----------------------------------------------------------------
CNVDIGIT:
        DW      $+2
        RSTPULL
        LD      A,E
        CALL    TOUPPER         ;ZEICHEN HOLEN
        ADD     A,-'0'
        JR      NC,CNVDQUIT     ;ZEICHEN < '0' ?
        CP      10
        JR      C,CNVDOK        ;ZEICHEN < '9' ?
        ADD     A,'0'-'A'
        JR      NC,CNVDQUIT     ;ZEICHEN < 'A' ?
        ADD     A,10            ;WERT KORRIGIEREN
CNVDOK:
        CP      (IX+VBASE-MEMBEG)
        JR      NC,CNVDQUIT     ;ZEICHEN ZU GROSS ?
        LD      D,0
        LD      E,A
        RSTPUSH                 ;DIGIT SPEICHERN
        SCF
CNVDQUIT:
        JP      CMPPUSH         ;TEST SPEICHERN
;================================================================
BLWORD:
        LD      H,D
        LD      L,E             ;ZEIGER AUF ANFANG
        INC     BC
        ADD     HL,BC
        PUSH    HL              ;ZEIGER HINTER TRENNZEICHEN

        BIT     4,(IX+FLAGS-MEMBEG)
        CALL    Z,CTYPE         ;EINGABE SICHTBAR ?

        CALL    DCSTREND        ;EINGABE-ENDE SUCHEN

        POP     DE
        AND     A
        SBC     HL,DE
        LD      B,H
        LD      C,L             ;RESTLICHE ZEICHEN BERECHNEN

        LD      HL,(INSCRN)
        INC     HL
        EX      DE,HL
        JR      C,BLANKS2
        JR      Z,BLANKS
        LDIR                    ;EINGABE LOESCHEN
;----------------------------------------------------------------
BLANKS:
        AND     A
BLANKS2:
        SBC     HL,DE
        EX      DE,HL           ;ANZAHL BERECHNEN
BLLOOP:
        LD      A,D
        OR      E
        RET     Z               ;ALLES GELOESCHT ?

        LD      (HL),' '
        INC     HL              ;NAECHSTES ZEICHEN LOESCHEN
        DEC     DE
        JR      BLLOOP
;================================================================
TOUPPER:
        AND     7FH
        CP      'a'
        RET     C
        CP      'z'+1
        RET     NC
        AND     5FH
        RET
;================================================================
        DB      'VI','S' OR CLAST
        DW      CONVERT-1
        DB      3
VIS:
        DW      $+2

        RES     4,(IX+FLAGS-MEMBEG)     ;EINGABE SICHTBAR
        JP      (IY)
;================================================================
        DB      'INVI','S' OR CLAST
        DW      VIS-1
        DB      5
INVIS:
        DW      $+2

        SET     4,(IX+FLAGS-MEMBEG)     ;EINGABE UNSICHTBAR
        JP      (IY)
;================================================================
        DB      'FAS','T' OR CLAST
        DW      INVIS-1
        DB      4
FAST:
        DW      $+2

        LD      IY,NEXT
        JP      (IY)
;================================================================
        DB      'SLO','W' OR CLAST
        DW      FAST-1
        DB      4
SLOW:
        DW      $+2

        LD      IY,RSLNEXT
        JP      (IY)
;================================================================
PULLBC:
        LD      HL,(SPARE)
        DEC     HL
        LD      B,(HL)
        DEC     HL
        LD      C,(HL)
        LD      (SPARE),HL
        RET
;================================================================
RPULL:
        DEC     HL
        LD      E,(HL)
        LD      (SPARE),HL
        RET
;================================================================
RPUSH:
        LD      (HL),D
        INC     HL
        LD      (SPARE),HL
        RET
;================================================================
        DB      'DU','P' OR CLAST
        DW      SLOW-1
        DB      3
DUP:
        DW      $+2

        RSTPULL
        RSTPUSH
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'DRO','P' OR CLAST
        DW      DUP-1
        DB      4
DROP:
        DW      $+2

        RSTPULL
        JP      (IY)
;================================================================
        DB      'SWA','P' OR CLAST
        DW      DROP-1
        DB      4
SWAP:
        DW      $+2

        RSTPULL
        CALL    PULLBC
        RSTPUSH
        LD      D,B
        LD      E,C
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'C','@' OR CLAST
        DW      SWAP-1
        DB      2
CAT:
        DW      $+2

        RSTPULL
        LD      A,(DE)
        LD      E,A
        LD      D,0
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'C','!' OR CLAST
        DW      CAT-1
        DB      2
CEXCLAM:
        DW      $+2

        RSTPULL
        CALL    PULLBC
        LD      A,C
        LD      (DE),A
        JP      (IY)
;================================================================
        DB      '@' OR CLAST
        DW      CEXCLAM-1
        DB      1
AT:
        DW      $+2

        RSTPULL
        EX      DE,HL
        LD      E,(HL)
        INC     HL
        LD      D,(HL)
        RSTPUSH
        JP      (IY)
;================================================================
        DB      '!' OR CLAST
        DW      AT-1
        DB      1
EXCLAM:
        DW      $+2

        RSTPULL
        CALL    PULLBC
        EX      DE,HL
        LD      (HL),C
        INC     HL
        LD      (HL),B
        JP      (IY)
;================================================================
        DB      '>','R' OR CLAST
        DW      EXCLAM-1
        DB      2
GTR:
        DW      $+2

        RSTPULL
        POP     BC
        PUSH    DE
        PUSH    BC
        JP      (IY)
;================================================================
        DB      'R','>' OR CLAST
        DW      GTR-1
        DB      2
RGT:
        DW      $+2

        POP     BC
        POP     DE
        PUSH    BC
        RSTPUSH
        JP      (IY)
;================================================================
        DB      '?DU','P' OR CLAST
        DW      RGT-1
        DB      4
QDUP:
        DW      $+2

        RSTPULL
        RSTPUSH
        LD      A,D
        OR      E
        CALL    NZ,CPUSH
        JP      (IY)
;================================================================
        DB      'RO','T' OR CLAST
        DW      QDUP-1
        DB      3
ROT:
        DW      DOCOL
        DW      GTR,SWAP,RGT,SWAP
        DW      SEMIS
;================================================================
        DB      'OVE','R' OR CLAST
        DW      ROT-1
        DB      4
OVER:
        DW      DOCOL
        DW      GTR,DUP,RGT,SWAP
        DW      SEMIS
;================================================================
        DB      'PIC','K' OR CLAST
        DW      OVER-1
        DB      4
PICK:
        DW      $+2

        CALL    CPICK
        JP      (IY)
;================================================================
        DB      'ROL','L' OR CLAST
        DW      PICK-1
        DB      4
ROLL:
        DW      $+2

        CALL    CPICK

        EX      DE,HL
        LD      HL,(STKBOT)
        SBC     HL,DE
        JP      NC,ERRORSTK     ;STACK NICHT GENUEGEND GROSS ?

        LD      H,D
        LD      L,E
        INC     HL
        INC     HL
        LDIR                    ;STACK VERSCHIEBEN
        LD      (SPARE),DE
        JP      (IY)
;================================================================
CPICK:
        CALL    PULLBC
        DEC     BC
        SLA     C
        RL      B
        INC     BC
        INC     BC
        JR      NC,CPKGOON      ;OFFSET OK ?
        RSTERR  ERRPICK

CPKGOON:
        LD      HL,(SPARE)
        SBC     HL,BC
        PUSH    HL
        LD      E,(HL)
        INC     HL
        LD      D,(HL)
        RSTPUSH                 ;ZAHL AUS PARAMETERSTACK HOLEN
        POP     HL
        RET
;================================================================
        DB      'TYP','E' OR CLAST
        DW      ROLL-1
        DB      4
TYPE:
        DW      $+2

        CALL    PULLBC
        RSTPULL
        CALL    CTYPE
        JP      (IY)
;================================================================
TYPEDE:
        LD      A,(DE)
        LD      C,A
        INC     DE
        LD      A,(DE)
        LD      B,A
        INC     DE
;----------------------------------------------------------------
CTYPE:
        LD      A,B
        OR      C
        RET     Z
        LD      A,(DE)
        INC     DE
        DEC     BC
        RSTEMIT
        JR      CTYPE
;================================================================
        DB      '<','#' OR CLAST
        DW      TYPE-1
        DB      2
LTNUM:
        DW      $+2

        LD      HL,SCRMEND-1
        LD      (HLD),HL        ;ZEIGER VORBEREITEN
        JP      (IY)
;================================================================
        DB      '#','>' OR CLAST
        DW      LTNUM-1
        DB      2
NUMGT:
        DW      $+2

        RSTPULL
        RSTPULL                 ;STACK PUTZEN

        LD      DE,(HLD)
        RSTPUSH                 ;ZEIGER HOLEN

        LD      HL,SCRMEND-1
        AND     A
        SBC     HL,DE
        EX      DE,HL
        RSTPUSH                 ;LAENGE BERECHNEN
        JP      (IY)
;================================================================
        DB      '.' OR CLAST
        DW      SIGN-1
        DB      1
PNT:
        DW      DOCOL
        DW      LTNUM,DUP               ;UMWANDLUNG STARTEN
        DW      ABS,ZERO                ;DOPPELWORT AUFBAUEN
        DW      NUMS                    ;ZAHL ABSOLUT UMWANDELN
        DW      ROT,SIGN                ;VORZEICHEN BEARBEITEN
PNTLEFT:
        DW      NUMGT                   ;BEARBEITUNG BEENDEN
        DW      TYPE,SPACE              ;AUSGEBEN
        DW      SEMIS
;================================================================
        DB      'U','.' OR CLAST
        DW      PNT-1
        DB      2
UPNT:
        DW      DOCOL
        DW      ZERO,LTNUM,NUMS         ;UMWANDLUNG STARTEN
        DW      DOREPEAT,PNTLEFT-$-1
;================================================================
        DB      '#','S' OR CLAST
        DW      UPNT-1
        DB      2
NUMS:
        DW      DOCOL
NUMSLP:
        DW      NUM                     ;EINE STELLE UMWANDELN
        DW      OVER,OVER,LOR,ZEROEQ
        DW      DOUNTIL,NUMSLP-$-1      ;REST <> 0 ?
        DW      SEMIS
;================================================================
        DB      '#' OR CLAST
        DW      NUMS-1
        DB      1
NUM:
        DW      DOCOL
        DW      BASE,CAT,DIV32BY16,ROT  ;MIT "BASE" MODULO
        DW      NIBASC,HOLD             ;ALS ZEICHEN SPEICHERN
        DW      SEMIS
;================================================================
NIBASC:
        DW      $+2

        RSTPULL
        LD      A,E             ;NIBBLE HOLEN
        ADD     A,'0'
        CP      '0'+10
        JR      C,NADEC         ;KORREKTUR FUER 'A'...
        ADD     A,7
NADEC:
        LD      E,A
        RSTPUSH                 ;ASCII SPEICHERN
        JP      (IY)
;================================================================
        DB      'CL','S' OR CLAST
        DW      NUM-1
        DB      3
CLS:
        DW      $+2

        CALL    CCLS
        JP      (IY)

CCLS:
        LD      DE,SCREEN+24*32-1
        LD      HL,(LHALF)
        LD      BC,32
        ADD     HL,BC
        DEC     HL
        LDDR                    ;LETZTE AUSGABEZEILE AN BILD-ENDE

        LD      (XCOORD),BC     ;PLOTKOORDINATEN LOESCHEN

        LD      HL,SCREEN
        LD      (SCRPOS),HL     ;CURSOR HOME

        INC     DE
        EX      DE,HL
        LD      (LHALF),HL      ;AUSGABE-ENDE SETZEN

        JP      BLANKS          ;AUSGABE-FELD LOESCHEN
;================================================================
        DB      'SIG','N' OR CLAST
        DW      NUMGT-1
        DB      4
SIGN:
        DW      $+2

        RSTPULL
        RL      D
        LD      E,'-'
        JR      C,RHOLD         ;BEI BEDARF '-' SPEICHERN
        JP      (IY)
;================================================================
        DB      'HOL','D' OR CLAST
        DW      CLS-1
        DB      4
HOLD:
        DW      $+2

        RSTPULL
RHOLD:
        LD      HL,(HLD)
        DEC     L
        JR      Z,HOLDQUIT      ;PUFFER VOLL ?

        LD      (HLD),HL
        LD      (HL),E          ;ZEICHEN SPEICHERN
HOLDQUIT:
        JP      (IY)
;================================================================
        DB      'SPAC','E' OR CLAST
        DW      HOLD-1
        DB      5
SPACE:
        DW      $+2

        LD      A,' '
        RSTEMIT
SPACEQUIT:
        JP      (IY)
;================================================================
        DB      'SPACE','S' OR CLAST
        DW      SPACE-1
        DB      6
SPACES:
        DW      $+2

        RSTPULL
SPCLOOP:
        DEC     DE
        BIT     7,D
        JR      NZ,SPACEQUIT    ;ALLE AUSGEGEBEN ?
        LD      A,' '
        RSTEMIT
        JR      SPCLOOP
;================================================================
        DB      'C','R' OR CLAST
        DW      SPACES-1
        DB      2
CR:
        DW      $+2

        LD      A,CCR
        RSTEMIT
        JP      (IY)
;================================================================
        DB      'EMI','T' OR CLAST
        DW      CR-1
        DB      4
EMIT:
        DW      $+2

        RSTPULL
        LD      A,E
        RSTEMIT
        JP      (IY)
;================================================================
        DB      'F','.' OR CLAST
        DW      EMIT-1
        DB      2
FPNT:
        DW      $+2

        LD      HL,(SPARE)
        DEC     HL
        BIT     7,(HL)
        RES     7,(HL)
        JR      Z,FPGOON1
        LD      A,'-'
        RSTEMIT                 ;NEGATIVES VORZEICHEN AUSGEBEN
FPGOON1:

        LD      E,0             ;BISHER KEIN EXPONENT
        LD      A,(HL)
        DEC     A
        CP      FEOFFS+9
        JR      NC,FPGOON2
        CP      FEOFFS-4
        JR      NC,FPGOON3      ;KEIN EXPONENT NOTWENDIG ?
FPGOON2:
        LD      (HL),FEOFFS+1
        INC     A
        LD      E,A             ;EXPONENT MERKEN
FPGOON3:

        LD      A,FEOFFS
        SUB     (HL)
        JR      C,FPMLOOP       ;EXPONENT NEGATIV ?
        LD      B,A
        INC     B
        LD      A,'.'
FPH0:
        RSTEMIT
        LD      A,'0'
        DJNZ    FPH0            ;FUEHRENDE NULLEN AUSGEBEN

FPMLOOP:
        LD      A,'@'
        CP      (HL)
        SBC     A,A
        DEC     HL
        OR      (HL)
        DEC     HL
        OR      (HL)
        DEC     HL
        OR      (HL)
        INC     HL
        INC     HL
        JR      Z,FP0           ;ZAHL = 0 ?

        XOR     A
        CALL    DECSTORE
        ADD     A,'0'
        RSTEMIT                 ;NAECHSTE ZIFFER AUSGEBEN
        INC     HL
        LD      A,(HL)
        CP      FEOFFS
        JR      NZ,FPMLOOP      ;ZAHL < 0.1 ODER ZAHL >=1.0 ?
        LD      A,'.'
        RSTEMIT
        JR      FPMLOOP         ;DEZIMALPUNKT AUSGEBEN

FP0:
        LD      A,E
        AND     A
        JR      NZ,FPEXP        ;EXPONENT AUSZUGEBEN ?
        LD      A,' '
        RSTEMIT
        JR      FPQUIT

FPEXP:
        SUB     FEOFFS+1
        LD      L,A
        SBC     A,A
        LD      H,A
        LD      A,'E'
        RSTEMIT
        CALL    PNTHL           ;EXPONENT AUSGEBEN
FPQUIT:
        RSTPULL
        RSTPULL
        JP      (IY)
;================================================================
        DB      'A','T' OR CLAST
        DW      FPNT-1
        DB      2
ATPOS:
        DW      $+2

        RSTPULL                 ;SPALTE
        CALL    PULLBC          ;ZEILE
        LD      A,C
        CALL    CATPOS
        LD      (SCRPOS),HL
        JP      (IY)

CATPOS:
        ADD     A,32
        LD      L,A
        LD      H,1             ;SCREEN / 32
        ADD     HL,HL
        ADD     HL,HL
        ADD     HL,HL
        ADD     HL,HL
        ADD     HL,HL           ;SCREEN + ZEILE
        LD      D,0
        LD      A,E
        AND     1FH
        LD      E,A
        ADD     HL,DE           ;SCREEN + ZEILE + SPALTE

        LD      DE,(LHALF)
        SBC     HL,DE
        ADD     HL,DE
        RET     C               ;NICHT HINTER AUSGABE-FELD ?
        RSTERR  ERRAT
;================================================================
        DB      'PLO','T' OR CLAST
        DW      ATPOS-1
        DB      4
PLOT:
        DW      $+2

        CALL    PULLBC          ;0/1/2/3 = RES/SET/NOP/XOR

        RSTPULL                 ;Y-KOORDINATE
        LD      (IX+YCOORD-MEMBEG),E
        SRL     E
        RL      C               ;LSB-Y HOLEN

        LD      A,22
        SUB     E               ;Y-KOORDINATE ALS ZEILENNUMMER

        RSTPULL                 ;X-KOORDINATE
        LD      (IX+XCOORD-MEMBEG),E
        SRL     E
        RL      C               ;LSB-X HOLEN

        CALL    CATPOS          ;ZEIGER IN BILDSCHIRM

        LD      A,(HL)          ;ALTES ZEICHEN HOLEN
        AND     78H
        CP      10H
        LD      A,(HL)
        JR      Z,PLGOON        ;BEREITS GRAFIK-ZEICHEN ?
        LD      A,10H           ;LEERES GRAFIK-ZEICHEN
PLGOON:
        LD      E,A             ;AUSGANGSCODE MERKEN
        LD      D,87H           ;MASKE SETZEN

        LD      A,C
        AND     3
        LD      B,A
        JR      Z,PLX0Y0        ;X=0 UND Y=0 ?

        CPL
        ADD     A,2
        ADC     A,3
        LD      D,A
        LD      B,E             ;BITMASKEN FUER X<>0 UND Y<>0
PLX0Y0:
        LD      A,C
        RRCA
        RRCA
        RRCA
        SBC     A,A             ;LOESCHEN/SETZEN MASKE
        BIT     3,C
        JR      NZ,PLXOR        ;NOP/XOR ?
        XOR     E
        RLCA
        SBC     A,A
        XOR     B               ;LOESCHEN/SETZEN VORBEREITEN
PLXOR:
        AND     D
        XOR     E
        LD      (HL),A          ;NEUEN CODE SPEICHERN
        JP      (IY)
;================================================================
        DB      'BEE','P' OR CLAST
        DW      PLOT-1
        DB      4
BEEP:
        DW      DOCOL
        DW      OVER,GETBYTE
        DB      125
        DW      SWAP,MULDIV             ;WERT ANPASSEN
        DW      SEMICODE

        RSTPULL
        CALL    PULLBC
        LD      HL,250-1
        ADD     HL,BC
        INC     L               ;(??? RUNDUNG)
        DI
BLOOP:
        LD      A,7FH
        IN      A,(IO)
        RRCA
        JR      NC,BDBREAK      ;UNTERBROCHEN ?
        CALL    BEEPDELAY
        DEC     DE
        LD      A,D
        OUT     (IO),A
        CALL    BEEPDELAY
        OR      E
        JP      NZ,BLOOP        ;ZEIT NOCH NICHT UM ?
        EI
        JP      (IY)

BDBREAK:
        RSTERR  ERRBRK

BEEPDELAY:
        LD      B,L
        LD      C,H
BDLOOP:
        DJNZ    BDLOOP
        DEC     B
        DEC     C
        JP      NZ,BDLOOP       ;ETWAS WARTEN...
        RET
;================================================================
        DB      'INKE','Y' OR CLAST
        DW      BEEP-1
        DB      5
INKEY:
        DW      $+2

        CALL    KEYGET
        LD      E,A
        LD      D,0
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'I','N' OR CLAST
        DW      INKEY-1
        DB      2
IN:
        DW      $+2

        CALL    PULLBC
        LD      D,0
        IN      E,(C)
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'OU','T' OR CLAST
        DW      IN-1
        DB      3
OUT:
        DW      $+2

        CALL    PULLBC
        RSTPULL
        OUT     (C),E
        JP      (IY)
;================================================================
        DB      'AB','S' OR CLAST
        DW      OUT-1
        DB      3
ABS:
        DW      DOCOL
        DW      DUP,IFN0NEG
        DW      SEMIS
;================================================================
        DB      '0','=' OR CLAST
        DW      ABS-1
        DB      2
ZEROEQ:
        DW      $+2

        RSTPULL
        LD      A,D
        OR      E
        CP      1               ;C, WENN A=0
CMPPUSH:
        LD      A,0
        LD      D,A
        RLA
        LD      E,A
        RSTPUSH                 ;WENN C, WERT = 1, SONST 0
        JP      (IY)
;================================================================
        DB      '0','<' OR CLAST
        DW      ZEROEQ-1
        DB      2
ZEROLT:
        DW      $+2

        RSTPULL
        RL      D               ;VORZEICHEN HOLEN
        JR      CMPPUSH
;================================================================
        DB      '0','>' OR CLAST
        DW      ZEROLT-1
        DB      2
ZEROGT:
        DW      $+2

        RSTPULL
        LD      A,D
        OR      E
        JR      Z,CMPPUSH       ;= 0 ?
        RL      D
        CCF
        JR      CMPPUSH         ;INVERTIERTES VORZEICHEN HOLEN
;================================================================
        DB      '=' OR CLAST
        DW      ZEROGT-1
        DB      1
EQ:
        DW      DOCOL
        DW      MINUS,ZEROEQ
        DW      SEMIS
;================================================================
        DB      '>' OR CLAST
        DW      EQ-1
        DB      1
GT:
        DW      $+2

        RSTPULL
        PUSH    DE
        RSTPULL
        POP     HL
        CALL    GREATER
        JR      CMPPUSH
;================================================================
        DB      '<' OR CLAST
        DW      GT-1
        DB      1
LT:
        DW      DOCOL
        DW      SWAP,GT
        DW      SEMIS
;================================================================
        DB      'U','<' OR CLAST
        DW      LT-1
        DB      2
ULT:
        DW      $+2

        CALL    PULLBC
UCMP:
        RSTPULL
        EX      DE,HL
        AND     A
        SBC     HL,BC           ;C = (BC > HL)
        JR      CMPPUSH
;================================================================
        DB      'D','<' OR CLAST
        DW      ULT-1
        DB      2
DLT:
        DW      $+2

        RSTPULL
        PUSH    DE
        CALL    PULLBC
        RSTPULL
        POP     HL
        AND     A
        SBC     HL,DE
        JR      Z,UCMP          ;HOEHERE 16 BIT GLEICH ?

        ADD     HL,DE
        EX      DE,HL
        CALL    GREATER         ;NUR HOEHERE 16 BIT VERGLEICHEN
        RSTPULL
        JR      CMPPUSH
;================================================================
GREATER:
        LD      A,H
        XOR     D
        JP      M,GRTRQUIT      ;VORZEICHEN UNGLEICH ?

        SBC     HL,DE
GRTRQUIT:
        RL      H               ;VORZEICHEN IN C
        RET
;================================================================
        DB      'U','*' OR CLAST
        DW      DLT-1
        DB      2
UMUL:
        DW      $+2

        RSTPULL
        CALL    PULLBC
        LD      HL,0
        LD      A,16            ;BITZAEHLER SETZEN
UMULLOOP:
        ADD     HL,HL
        EX      DE,HL
        ADC     HL,HL
        EX      DE,HL
        JR      NC,UMULNEXT     ;MULTIPLIKATOR-BIT = 0 ?
        ADD     HL,BC
        JR      NC,UMULNEXT     ;KEIN UEBERTRAG ?
        INC     DE
UMULNEXT:
        DEC     A
        JR      NZ,UMULLOOP     ;NOCH NICHT ALLE BITS ?
        EX      DE,HL
        JR      PUSHDEHL
;================================================================
DIV32BY16:
        DW      $+2

        RSTPULL                 ;DIVISOR
        EXX
        RSTPULL                 ;DIVIDEND H
        PUSH    DE
        RSTPULL                 ;DIVIDEND L
        POP     HL

        LD      A,H
        OR      L
        LD      A,33            ;NORMALER BITZAEHLER
        JR      NZ,D32GOON      ;DIVIDEND > 65535 ?
        EX      DE,HL
        LD      A,17            ;BERECHNUNG ABKUERZEN
D32GOON:
        EXX
        LD      B,A
        XOR     A
        LD      H,A
        LD      L,A
        LD      C,A             ;BERECHNUNG VORBEREITEN
D32LOOP:
        ADC     HL,HL
        SBC     A,A
        AND     A
        SBC     HL,DE           ;TESTWEISE SUBTRAHIEREN
        SBC     A,C
        JR      NC,D32NEXT
        ADD     HL,DE           ;SUBTRAKTION ZURUECKNEHMEN
D32NEXT:
        CCF
        EXX
        EX      DE,HL
        ADC     HL,HL
        EX      DE,HL
        ADC     HL,HL
        EXX
        DJNZ    D32LOOP         ;NOCH NICHT ALLE BITS ?
        EX      DE,HL
        RSTPUSH                 ;REST SPEICHERN
        EXX                     ;QUOTIENT HOLEN

PUSHDEHL:
        PUSH    HL
        RSTPUSH
        POP     DE
        RSTPUSH
        JP      (IY)
;================================================================
        DB      '/MO','D' OR CLAST
        DW      UMUL-1
        DB      4
DIVMOD:
        DW      DOCOL
        DW      SWAP,GTR,I,ABS          ;DIVIDEND VORBEREITEN
        DW      GETBYTE
        DB      0
DIVMOD2:
        DW      ROT,DUP,I
        DW      LXOR                    ;VORZEICHEN BERECHNEN
        DW      GTR,ABS                 ;DIVISOR VORBEREITEN
        DW      UDIVMOD
        DW      RGT,IFN0NEG,SWAP        ;VORZEICHEN QUOTIENT
        DW      RGT,IFN0NEG,SWAP        ;VORZEICHEN REST
        DW      SEMIS
;================================================================
        DB      '*/MO','D' OR CLAST
        DW      DIVMOD-1
        DB      5
MULDIVMOD:
        DW      DOCOL
        DW      ROT,GTR,I,ABS           ;FAKTOR 1 VORBEREITEN
        DW      ROT,DUP,RGT,LXOR        ;VORZEICHEN BERECHNEN
        DW      GTR,ABS                 ;FAKTOR 2 VORBEREITEN
        DW      UMUL
        DW      DOREPEAT,DIVMOD2-$-1
;================================================================
        DB      '/' OR CLAST
        DW      MULDIVMOD-1
        DB      1
DIV:
        DW      DOCOL
        DW      DIVMOD
        DW      SWAP,DROP               ;REST LOESCHEN
        DW      SEMIS
;================================================================
        DB      'MO','D' OR CLAST
        DW      DIV-1
        DB      3
MOD:
        DW      DOCOL
        DW      DIVMOD
        DW      DROP                    ;QUOTIENT LOESCHEN
        DW      SEMIS
;================================================================
        DB      '*' OR CLAST
        DW      MOD-1
        DB      1
MUL:
        DW      DOCOL
        DW      UMUL,DROP               ;OBERE 16-BIT LOESCHEN
        DW      SEMIS
;================================================================
        DB      '*','/' OR CLAST
        DW      MUL-1
        DB      2
MULDIV:
        DW      DOCOL
        DW      MULDIVMOD               ;*/MOD
        DW      SWAP,DROP               ;REST LOESCHEN
        DW      SEMIS
;================================================================
        DB      'U/MO','D' OR CLAST
        DW      MULDIV-1
        DB      5
UDIVMOD:
        DW      DOCOL
        DW      DIV32BY16,DROP
        DW      SEMIS
;================================================================
IFN0NEG:
        DW      DOCOL
        DW      ZEROLT,DOIF,I0NEND-$-1
        DW      NEGATE                  ;VORZEICHEN WIE TOS
I0NEND:
        DW      SEMIS
;================================================================
        DB      'NEGAT','E' OR CLAST
        DW      UDIVMOD-1
        DB      6
NEGATE:
        DW      $+2

        LD      BC,2            ;2 BYTES
        JR      DONEGATE
;================================================================
        DB      'DNEGAT','E' OR CLAST
        DW      NEGATE-1
        DB      7
DNEGATE:
        DW      $+2

        LD      BC,4            ;4 BYTES
DONEGATE:
        LD      HL,(SPARE)
        AND     A
        SBC     HL,BC           ;ZEIGER AUF ZAHL IM WERTESTACK
DNLOOP:
        LD      A,B             ;0 LADEN, OHNE C ZU LOESCHEN
        SBC     A,(HL)
        LD      (HL),A          ;BYTE NEGIEREN
        INC     HL
        DEC     C
        JR      NZ,DNLOOP       ;NOCH NICHT ALLE BYTES ?
        JP      (IY)
;================================================================
        DB      '+' OR CLAST
        DW      DNEGATE-1
        DB      1
PLUS:
        DW      $+2

        RSTPULL
        PUSH    DE
        RSTPULL
        POP     HL
        ADD     HL,DE
        EX      DE,HL
        RSTPUSH
        JP      (IY)
;================================================================
        DB      '-' OR CLAST
        DW      PLUS-1
        DB      1
MINUS:
        DW      DOCOL
        DW      NEGATE,PLUS
        DW      SEMIS
;================================================================
        DB      'D','+' OR CLAST
        DW      MINUS-1
        DB      2
DPLUS:
        DW      $+2

        RSTPULL
        PUSH    DE
        CALL    PULLBC
        RSTPULL
        PUSH    DE
        RSTPULL
        EX      DE,HL
        ADD     HL,BC
        EX      DE,HL
        RSTPUSH
        POP     BC
        POP     HL
        ADC     HL,BC
        EX      DE,HL
        RSTPUSH
        JP      (IY)
;================================================================
        DB      '1','+' OR CLAST
        DW      DPLUS-1
        DB      2
ONEPLUS:
        DW      $+2

        RSTPULL
        JR      XPLUS
;================================================================
        DB      '2','+' OR CLAST
        DW      ONEPLUS-1
        DB      2
TWOPLUS:
        DW      $+2

        RSTPULL
        INC     DE
XPLUS:
        INC     DE
        JR      XPLUSMINUS
;================================================================
        DB      '1','-' OR CLAST
        DW      TWOPLUS-1
        DB      2
ONEMINUS:
        DW      $+2

        RSTPULL
        JR      XMINUS
;================================================================
        DB      '2','-' OR CLAST
        DW      ONEMINUS-1
        DB      2
TWOMINUS:
        DW      $+2

        RSTPULL
        DEC     DE
XMINUS:
        DEC     DE
XPLUSMINUS:
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'O','R' OR CLAST
        DW      TWOMINUS-1
        DB      2
LOR:
        DW      $+2

        RSTPULL
        CALL    PULLBC
        LD      A,E
        OR      C
        LD      E,A
        LD      A,D
        OR      B
        LD      D,A
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'AN','D' OR CLAST
        DW      LOR-1
        DB      3
LAND:
        DW      $+2

        RSTPULL
        CALL    PULLBC
        LD      A,E
        AND     C
        LD      E,A
        LD      A,D
        AND     B
        LD      D,A
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'XO','R' OR CLAST
        DW      LAND-1
        DB      3
LXOR:
        DW      $+2

        RSTPULL
        CALL    PULLBC
        LD      A,E
        XOR     C
        LD      E,A
        LD      A,D
        XOR     B
        LD      D,A
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'MA','X' OR CLAST
        DW      LXOR-1
        DB      3
MAX:
        DW      DOCOL
        DW      OVER,OVER,LT            ;ZAHLEN VERGLEICHEN
        DW      DOELSE,MINMAX-$-1
;================================================================
        DB      'MI','N' OR CLAST
        DW      MAX-1
        DB      3
MIN:
        DW      DOCOL
        DW      OVER,OVER,GT            ;ZAHLEN VERGLEICHEN
MINMAX:
        DW      DOIF,MINMAXEND-$-1
        DW      SWAP                    ;BEI BEDARF TAUSCHEN
MINMAXEND:
        DW      DROP                    ;FALSCHE ZAHL LOESCHEN
        DW      SEMIS
;================================================================
        DB      'DECIMA','L' OR CLAST
        DW      MIN-1
        DB      7
DECIMAL:
        DW      $+2

        LD      (IX+VBASE-MEMBEG),10
        JP      (IY)
;================================================================
NCOLON:
        DB      ':' OR CLAST
        DW      DECIMAL-1
        DB      1
COLON:
        DW      DODEFINER,DOCOL
        DW      GETBYTE
        DB      10                      ;PRUEFWERT SETZEN
        DW      SEMICODE

        LD      HL,FLAGS
        LD      A,(HL)
        OR      (1 SHL 6) OR (1 SHL 2)
        LD      (HL),A          ;COMPILER EINSCHALTEN
        JP      (IY)
;================================================================
        DW      NCOLON-$-1
DOCOL:
        EX      DE,HL           ;AKTUELLEN ZEIGER FUER STACK
        JP      NEXTSUB
;================================================================
NCREATE:
        DB      'CREAT','E' OR CLAST
        DW      COLON-1
        DB      6
CREATE:
        DW      DOCOL
        DW      GETBYTE
        DB      ' '
        DW      WORD,CRHEADER           ;HEADER VORBEREITEN
        DW      ZERO,KOMMA
        DW      CURRENT,AT
        DW      DUP,AT,KOMMA            ;VERKETTUNG BILDEN
        DW      HERE,SWAP,EXCLAM        ;ADRESSE MERKEN
        DW      PAD,CAT,CKOMMA
        DW      GETWORD,DOCREATE,KOMMA  ;ERSTES WORT SPEICHERN
        DW      SEMIS
;================================================================
CRHEADER:
        DW      $+2

        CALL    LINKHERE

        RSTPULL
        LD      A,(DE)          ;NAMENSLAENGE HOLEN
        DEC     A
        CP      03FH
        JR      C,CHGOON        ;NAME NICHT ZU LANG ?
        RSTERR  ERRNAME

CHGOON:
        ADD     A,8             ;LINKS, LAENGENBYTE UND 1. WORT
        LD      C,A
        LD      B,0
        CALL    MEMCHECK

        LD      A,(DE)
        LD      C,A
        LD      HL,(STKBOT)
        PUSH    DE
        CALL    ALLOC           ;SPEICHER RESERVIEREN
        POP     DE

        LD      A,(DE)
        LD      B,A             ;ANZAHL ZEICHEN
CHLOOP:
        INC     DE
        LD      A,(DE)
        CALL    TOUPPER
        LD      (HL),A
        INC     HL
        DJNZ    CHLOOP          ;NAMEN SPEICHERN

        LD      (DICT),HL
        DEC     HL
        SET     7,(HL)          ;NAMENSENDE KENNZEICHNEN
        JP      (IY)
;================================================================
LINKHERE:
        BIT     2,(IX+FLAGS-MEMBEG)
        JR      Z,LHGOON        ;KEIN COMPILE-MODE ?
        RSTERR  ERRMODE

LHGOON:
        LD      HL,(STKBOT)
        LD      DE,(DICT)
        XOR     A
        SBC     HL,DE
        EX      DE,HL
        LD      (HL),E
        INC     HL
        LD      (HL),D          ;LINK AUFBAUEN

        LD      H,A
        LD      L,A
        LD      (DICT),HL
        RET
;================================================================
        DB      ',' OR CLAST
        DW      CREATE-1
        DB      1
KOMMA:
        DW      DOCOL
        DW      ALLOT2,HERE,TWOMINUS,EXCLAM
        DW      SEMIS
;================================================================
        DB      'C',',' OR CLAST
        DW      KOMMA-1
        DB      2
CKOMMA:
        DW      DOCOL
        DW      GETBYTE
        DB      1
        DW      ALLOT,HERE,ONEMINUS,CEXCLAM
        DW      SEMIS
;================================================================
        DB      'ALLO','T' OR CLAST
        DW      CKOMMA-1
        DB      5
ALLOT:
        DW      $+2

        CALL    PULLBC
        LD      HL,(STKBOT)
        CALL    ALLOC
        JP      (IY)
;================================================================
ALLOT2:
        DW      DOCOL
        DW      GETBYTE
        DB      2
        DW      ALLOT
        DW      SEMIS
;================================================================
MEMCHECK:
        LD      HL,30
MEMCHECK2:
        PUSH    BC
        ADD     HL,BC
        LD      BC,(SPARE)
        ADD     HL,BC           ;NEUE ENDADRESSE
        POP     BC
        JR      C,MCERROR       ;SPEICHER-UEBERLAUF ?
        SBC     HL,SP
        RET     C               ;KEINE KOLLISION MIT STACK ?
MCERROR:
        RSTERR  ERRMEM
;================================================================
ALLOC:
        EX      DE,HL
        LD      HL,40
        CALL    MEMCHECK2       ;ETWAS WEITER PRUEFEN

        LD      HL,(STKBOT)
        ADD     HL,BC
        LD      (STKBOT),HL
        LD      HL,(SPARE)
        PUSH    HL
        ADD     HL,BC
        LD      (SPARE),HL      ;ZEIGER WEITERSCHIEBEN

        EX      (SP),HL
        PUSH    HL
        AND     A
        SBC     HL,DE
        LD      B,H
        LD      C,L             ;ABSTAND = ALTER SPARE - DE
        POP     HL
        POP     DE
        RET     Z               ;NICHTS ZU VERSCHIEBEN ?

        DEC     HL
        DEC     DE
        LDDR
        INC     HL              ;PARAMETERSTACK VERSCHIEBEN
        RET
;================================================================
NVARIABLE:
        DB      'VARIABL','E' OR CLAST
        DW      ALLOT-1
        DB      8
VARIABLE:
        DW      DODEFINER,DOVARIABLE
        DW      KOMMA
        DW      SEMIS
;================================================================
NCONSTANT:
        DB      'CONSTAN','T' OR CLAST
        DW      VARIABLE-1
        DB      8
CONSTANT:
        DW      DODEFINER,DOCONSTANT
        DW      KOMMA
        DW      SEMIS
;================================================================
        DW      NCREATE-$-1
DOCREATE:
        JR      DOVARIABLE
;================================================================
        DW      NVARIABLE-$-1
DOVARIABLE:
        RSTPUSH
        JP      (IY)
;================================================================
        DW      NCONSTANT-$-1
DOCONSTANT:
        EX      DE,HL
        LD      E,(HL)
        INC     HL
        LD      D,(HL)
        RSTPUSH                 ;WERT AUF STACK
        JP      (IY)
;================================================================
        DB      'LITERA','L' OR CLAST
        DW      CONSTANT-1
        DB      7 OR IMM
LITERAL:
        DW      DOCOMPILER,GETWORD
        DW      KOMMA
        DW      SEMIS
;================================================================
        DB      2
        DW      -1
GETWORD:
        DW      $+2

        LD      B,1             ;NUR EIN WORT
GWLOOP:
        POP     HL
        LD      E,(HL)
        INC     HL
        LD      D,(HL)          ;WORT HOLEN
GWGOON:
        INC     HL
        PUSH    HL
        RSTPUSH                 ;WORT AUF STACK
        DJNZ    GWLOOP
GWQUIT:
        JP      (IY)
;================================================================
NASCII:
        DB      'ASCI','I' OR CLAST
        DW      LITERAL-1
        DB      5 OR IMM
ASCII:
        DW      DOCOL
        DW      GETBYTE
        DB      ' '
        DW      WORD,ONEPLUS,CAT
        DW      SEMICODE

        BIT     6,(IX+FLAGS-MEMBEG)
        JR      Z,GWQUIT        ;COMPILER AUS ?

        CALL    NEXT
        DW      GETWORD,GETBYTE,KOMMA
        DW      CKOMMA
        DW      SEMIS
;================================================================
        DB      1
        DW      NASCII-$-1
GETBYTE:
        DW      $+2

        POP     HL
        LD      E,(HL)
        LD      D,0
        LD      B,1
        JR      GWGOON
;================================================================
LITFLOAT:
        DW      DOCOMPILER,GETFLOAT
        DW      SWAP,KOMMA,KOMMA
        DW      SEMIS
;================================================================
        DB      4
        DW      -1
GETFLOAT:
        DW      $+2

        LD      B,2
        JR      GWLOOP
;================================================================
NDEFINER:
        DB      'DEFINE','R' OR CLAST
        DW      ASCII-1
        DB      7
DEFINER:
        DW      DODEFINER,DODEFINER
        DW      HERE,GETBYTE
        DB      12
        DW      ALLOT2
        DW      DOREPEAT,0EB6H-$-1
;================================================================
        DW      NDEFINER-$-1
DODEFINER:
        CALL    DOVARIABLE
        DW      CREATE                  ;HEADER ERZEUGEN
        DW      DUP,AT
        DW      HERE,TWOMINUS,EXCLAM    ;VERKETTUNG BILDEN
        DW      TWOPLUS,DROPGOON
        DW      SEMIS
;----------------------------------------------------------------
DROPGOON:
        DW      $+2

        RSTPULL
        JP      DOCOL
;================================================================
        DB      'CAL','L' OR CLAST
        DW      DEFINER-1
        DB      4
CALL:
        DW      $+2

        RSTPULL                 ;ZIELADRESSE HOLEN
        EX      DE,HL
        JP      (HL)
;================================================================
NDOESGT:
        DB      'DOES','>' OR CLAST
        DW      COMPILER-1
        DB      5 OR IMM
DOESGT:
        DW      DOCOMPILER,DODOESGT
        DW      ASSERT
        DB      12                      ;PRUEFWERT TESTEN
        DW      DOESPATCH
        DW      GETBYTE
        DB      0CDH
        DW      CKOMMA
        DW      GETWORD,DOVARIABLE,KOMMA;"CALL DOVARIABLE"
        DW      GETBYTE
        DB      10                      ;PRUEFWERT SETZEN
        DW      SEMIS
;================================================================
DOESPATCH:
        DW      DOCOL
        DW      DUP,TWOMINUS,NFA
        DW      HERE,MINUS,ONEMINUS,KOMMA
        DW      HERE,SWAP,EXCLAM        ;VERKETTUNG KORRIGIEREN
        DW      SEMIS
;================================================================
        DB      5
        DW      NDOESGT-$-1
DODOESGT:
        DW      RSEMIS
;================================================================
NCOMPILER:
        DB      'COMPILE','R' OR CLAST
        DW      CALL-1
        DB      8
COMPILER:
        DW      DODEFINER,DOCOMPILER
        DW      IMMEDIATE
        DW      HERE
        DW      GETBYTE
        DB      11
        DW      ALLOT2
        DW      DOREPEAT,0EB6H-$-1
;================================================================
        DW      NCOMPILER-$-1
DOCOMPILER:
        BIT     6,(IX+FLAGS-MEMBEG)
        JR      NZ,DOCOMGOON    ;COMPILER EINGESCHALTET ?

        RSTERR  ERRIMM

DOCOMGOON:
        CALL    DOVARIABLE
        DW      DUP,AT,KOMMA
        DW      DOREPEAT,1094H-$-1
;================================================================
NRUNSGT:
        DB      'RUNS','>' OR CLAST
        DW      DOESGT-1
        DB      5 OR IMM
RUNSGT:
        DW      DOCOMPILER,DORUNSGT
        DW      ASSERT
        DB      11                      ;PRUEFWERT TESTEN
        DW      SWAP,CKOMMA
        DW      DOESPATCH
        DW      GETWORD,RUNSCORR,KOMMA
        DW      GETBYTE
        DB      10                      ;PRUEFWERT SETZEN
        DW      SEMIS
;----------------------------------------------------------------
        DB      5
        DW      NRUNSGT-$-1
DORUNSGT:
        DW      RSEMIS
;----------------------------------------------------------------
RUNSCORR:
        POP     HL
        PUSH    DE
        EX      DE,HL
        RSTPUSH
        LD      B,D
        LD      C,E
        POP     DE
        PUSH    DE
        DEC     DE
        DEC     DE
        CALL    SKIPOFFS        ;NAECHSTE FORTH-ADRESSE
        POP     DE
        PUSH    BC
        JP      DOCOL
;================================================================
        DB      'IMMEDIAT','E' OR CLAST
        DW      RUNSGT-1
        DB      9
IMMEDIATE:
        DW      DOCOL
        DW      CURRENT,AT,AT
        DW      SEMICODE
        RSTPULL
        EX      DE,HL
        SET     6,(HL)          ;IMMEDIATE-BIT SETZEN
        JP      (IY)
;================================================================
        DB      'VOCABULAR','Y' OR CLAST
        DW      IMMEDIATE-1
        DB      10
VOCABULARY:
        DW      DODEFINER,SETCONTEXT
        DW      CURRENT,AT
        DW      TWOPLUS,KOMMA
        DW      ZERO,CKOMMA             ;VERKETTUNG VORBEREITEN
        DW      HERE,GETWORD,VOCLNK
        DW      DUP,AT,KOMMA,EXCLAM     ;UMSCHALTUNG COMPILIEREN
        DW      SEMIS
;================================================================
        DB      'DEFINITION','S' OR CLAST
        DW      VOCABULARY-1
        DB      11
DEFINITIONS:
        DW      $+2

        LD      HL,(VCONTEXT)
        LD      (VCURRENT),HL
        JP      (IY)
;----------------------------------------------------------------
SETCONTEXT:
        LD      (VCONTEXT),DE
        JP      (IY)
;================================================================
NIF:
        DB      'I','F' OR CLAST
        DW      RSQRBR-1
        DB      2 OR IMM
IF:
        DW      DOCOMPILER,DOIF
        DW      HERE,GETBYTE
        DB      2
        DW      ALLOT2
        DW      SEMIS
;================================================================
NWHILE:
        DB      'WHIL','E' OR CLAST
        DW      IF-1
        DB      5 OR IMM
WHILE:
        DW      DOCOMPILER,DOWHILE
        DW      ASSERT
        DB      1                       ;PRUEFWERT TESTEN
        DW      HERE,GETBYTE
        DB      4
        DW      ALLOT2
        DW      SEMIS
;================================================================
NELSE:
        DB      'ELS','E' OR CLAST
        DW      WHILE-1
        DB      4 OR IMM
ELSE:
        DW      DOCOMPILER,DOELSE
        DW      ASSERT
        DB      2                       ;PRUEFWERT TESTEN
        DW      ALLOT2
        DW      DOFPATCH
        DW      HERE,TWOMINUS
        DW      GETBYTE
        DB      2                       ;PRUEFWERT SETZEN
        DW      SEMIS
;================================================================
NTHEN:
        DB      'THE','N' OR CLAST
        DW      ELSE-1
        DB      4 OR IMM
THEN:
        DW      DOCOMPILER,DOTHEN
        DW      ASSERT
        DB      2                       ;PRUEFWERT TESTEN
        DW      DOFPATCH
        DW      SEMIS
;================================================================
NBEGIN:
        DB      'BEGI','N' OR CLAST
        DW      THEN-1
        DB      5 OR IMM
BEGIN:
        DW      DOCOMPILER,DOBEGIN
        DW      HERE
        DW      GETBYTE
        DB      1                       ;PRUEFWERT SETZEN
        DW      SEMIS
;================================================================
DOFPATCH:
        DW      DOCOL
        DW      DUP,HERE,SWAP,MINUS
        DW      ONEMINUS,SWAP,EXCLAM    ;SPRUNGADRESSE PATCHEN
        DW      SEMIS
;================================================================
DORPATCH:
        DW      DOCOL
        DW      HERE,MINUS,ONEMINUS
        DW      KOMMA                   ;SPRUNGADRESSE PATCHEN
        DW      SEMIS
;================================================================
NREPEAT:
        DB      'REPEA','T' OR CLAST
        DW      BEGIN-1
        DB      6 OR IMM
REPEAT:
        DW      DOCOMPILER,DOREPEAT
        DW      ASSERT
        DB      4                       ;PRUEFWERT TESTEN
        DW      SWAP
        DW      DORPATCH
        DW      DOFPATCH
        DW      SEMIS
;================================================================
NUNTIL:
        DB      'UNTI','L' OR CLAST
        DW      REPEAT-1
        DB      5 OR IMM
UNTIL:
        DW      DOCOMPILER,DOUNTIL
        DW      ASSERT
        DB      1                       ;PRUEFWERT TESTEN
        DW      DORPATCH
        DW      SEMIS
;================================================================
        DB      2
        DW      NELSE-$-1
DOELSE:
        DW      FJUMP
;================================================================
        DB      2
        DW      NREPEAT-$-1
DOREPEAT:
        DW      FJUMP
;================================================================
FJUMP:
        POP     HL
        LD      E,(HL)
        INC     HL
        LD      D,(HL)          ;OFFSET HOLEN
OFFSJUMP:
        ADD     HL,DE
        JP      NEXTSUB         ;NEUEN FORTH-ZEIGER SETZEN
;================================================================
        DB      2
        DW      NIF-$-1
DOIF:
        DW      IF0JUMP
;================================================================
        DB      2
        DW      NWHILE-$-1
DOWHILE:
        DW      IF0JUMP
;================================================================
        DB      2
        DW      NUNTIL-$-1
DOUNTIL:
        DW      IF0JUMP
;----------------------------------------------------------------
IF0JUMP:
        CALL    PULLBC
        LD      A,B
        OR      C               ;TEST AUF 0
EQUJUMP:
        JR      Z,FJUMP         ;BEGINGUNG ERFUELLT ?
        POP     HL
        INC     HL
        INC     HL
        JP      NEXTSUB         ;OFFSET UEBERSPRINGEN
;================================================================
        DB      0
        DW      NBEGIN-$-1
DOBEGIN:
        DW      NEXT
;================================================================
        DB      0
        DW      NTHEN-$-1
DOTHEN:
        DW      NEXT
;================================================================
NDO:
        DB      'D','O' OR CLAST
        DW      UNTIL-1
        DB      2 OR IMM
DO:
        DW      DOCOMPILER,DODO
        DW      HERE
        DW      GETBYTE
        DB      3                       ;PRUEFWERT SETZEN
        DW      SEMIS
;================================================================
NLOOP:
        DB      'LOO','P' OR CLAST
        DW      DO-1
        DB      4 OR IMM
LOOP:
        DW      DOCOMPILER,DOLOOP
LOOPGOON:
        DW      ASSERT
        DB      3                       ;PRUEFWERT TESTEN
        DW      DORPATCH
        DW      SEMIS
;================================================================
NPLUSLOOP:
        DB      '+LOO','P' OR CLAST
        DW      LOOP-1
        DB      5 OR IMM
PLUSLOOP:
        DW      DOCOMPILER,DOPLUSLOOP
        DW      DOREPEAT,LOOPGOON-$-1
;================================================================
ASSERT:
        DW      $+2

        RSTPULL
        POP     HL
        LD      A,(HL)
        INC     HL
        PUSH    HL              ;PRUEFWERT
        SUB     E
        OR      D
        JR      Z,JNEXT4        ;GLEICH MIT WERT AUF STACK ?
        RSTERR  ERRBLK
;================================================================
        DB      'I' OR CLAST
        DW      DEFINITIONS-1
        DB      1
I:
        DW      $+2

        POP     BC
        POP     DE              ;SCHLEIFENZAEHLER BZW. "R"
        PUSH    DE
        PUSH    BC
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'I','''' OR CLAST
        DW      I-1
        DB      2
ITICK:
        DW      $+2

        LD      HL,4            ;"R2" (SIEHE "I")
        JR      RGET
;================================================================
        DB      'J' OR CLAST
        DW      ITICK-1
        DB      1
J:
        DW      $+2

        LD      HL,6            ;"R3" (SIEHE "I")
RGET:
        ADD     HL,SP
        LD      E,(HL)
        INC     HL
        LD      D,(HL)          ;ZAHL VOM RETURNSTACK HOLEN
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'LEAV','E' OR CLAST
        DW      J-1
        DB      5
LEAVE:
        DW      $+2

        POP     BC
        POP     HL
        POP     HL
        PUSH    HL
        PUSH    HL              ;ZAEHLER GLEICH ENDWERT MACHEN
        PUSH    BC
        JP      (IY)
;================================================================
        DB      0
        DW      NDO-$-1
DODO:
        DW      $+2

        CALL    PULLBC
        RSTPULL
        POP     HL
        PUSH    DE
        PUSH    BC              ;ZAEHLER UND ENDWERT MERKEN
        PUSH    HL
JNEXT4:
        JP      (IY)
;================================================================
        DB      2
        DW      NLOOP-$-1
DOLOOP:
        DW      $+2

        LD      DE,1
        JR      LOOPADD
;================================================================
        DB      2
        DW      NPLUSLOOP-$-1
DOPLUSLOOP:
        DW      $+2

        RSTPULL
LOOPADD:
        POP     BC
        POP     HL              ;ZAEHLER HOLEN
        AND     A
        ADC     HL,DE           ;ERHOEHEN (??? UMSTAENDLICH)
        LD      A,D
        POP     DE              ;ENDWERT HOLEN
        SCF
        JP      PE,LOOPEND      ;UEBERLAUF (= ENDE) ?

        PUSH    DE
        PUSH    HL              ;WERTE WIEDER SPEICHERN

        RLCA
        JR      NC,LOOPCMP
        EX      DE,HL
LOOPCMP:
        CALL    GREATER
        CCF
        JR      NC,LOOPEND      ;NOCH NICHT ENDE ?

        POP     HL
        POP     HL              ;SCHLEIFENWERTE LOESCHEN

LOOPEND:
        PUSH    BC
        SBC     A,A
        JP      EQUJUMP
;================================================================
NLBRACKET:
        DB      '(' OR CLAST
        DW      LSQRBR-1
        DB      1 OR IMM
LBRACKET:
        DW      DOCOMPILER,DOLBRACKET
        DW      GETBYTE
        DB      ')'
LBREND:
        DW      HERE,SWAP,ALLOT2,SAVETEXT
        DW      SWAP,EXCLAM             ;TEXT SPEICHERN
        DW      SEMIS
;================================================================
        DB      -1
        DW      NLBRACKET-$-1
DOLBRACKET:
        DW      $+2

        POP     HL
        LD      E,(HL)
        INC     HL
        LD      D,(HL)          ;OFFSET HOLEN
        INC     DE
        JP      OFFSJUMP
;================================================================
NPTSTR:
        DB      '.','"' OR CLAST
        DW      LBRACKET-1
        DB      2 OR IMM
PTSTR:
        DW      DOCOMPILER,DOPTSTR
        DW      GETBYTE
        DB      '"'
        DW      DOREPEAT,LBREND-$-1
;================================================================
        DB      -1
        DW      NPTSTR-$-1
DOPTSTR:
        DW      $+2

        POP     DE
        CALL    TYPEDE          ;STRING AUSGEBEN
        PUSH    DE
        JP      (IY)
;================================================================
SAVETEXT:
        DW      $+2

STLOOP:
        RSTPULL
        PUSH    DE
        CALL    CWORD           ;ENDE SUCHEN
        LD      H,D
        LD      L,E
        ADD     HL,BC
        LD      A,(HL)
        POP     HL
        CP      L
        JR      Z,STFND         ;ENDE GEFUNDEN ?

        EX      DE,HL
        RSTPUSH
        LD      DE,RETYPE
        CALL    EXECDE
        JR      STLOOP          ;NOCHMAL PROBIEREN

STFND:
        PUSH    DE
        PUSH    BC
        LD      HL,(STKBOT)     ;GRENZE GEGEN SPARE
        CALL    ALLOC           ;SPEICHER HOLEN
        POP     BC
        POP     DE
        PUSH    DE
        PUSH    BC
        EX      DE,HL
        LDIR                    ;TEXT UMSPEICHERN
        POP     BC
        LD      D,B
        LD      E,C
        RSTPUSH
        POP     DE
        CALL    BLWORD          ;EINGABE LOESCHEN
        JP      (IY)
;================================================================
        DB      '[' OR CLAST
        DW      PLUSLOOP-1
        DB      1 OR IMM
LSQRBR:
        DW      $+2

        RES     6,(IX+FLAGS-MEMBEG)     ;COMPILER AUSSCHALTEN
        JP      (IY)
;================================================================
        DB      ']' OR CLAST
        DW      LEAVE-1
        DB      1
RSQRBR:
        DW      $+2

        SET     6,(IX+FLAGS-MEMBEG)     ;COMPILER EINSCHALTEN
        JP      (IY)
;================================================================
        DB      'EXI','T' OR CLAST
        DW      PTSTR-1
        DB      4
EXIT:
        DW      RSEMIS
;================================================================
RDONAME EQU     0       ;ZEIGER AUF NAME ALTES WORT
RDOCODE EQU     2       ;ZEIGER AUF CODEFELD ALTES WORTES
RDNCODE EQU     4       ;ZEIGER AUF CODEFELD NEUES WORT
RDDNAME EQU     4       ;NAMENSLAENGENDIFFERENZ
RDNRUN  EQU     6       ;0 / RUN-ADRESSE NEUES WORT
RDOEND  EQU     8       ;ZEIGER HINTER ALTES WORT
RDNEND  EQU     10      ;ZEIGER HINTER NEUES WORT
RDDLEN  EQU     10      ;LAENGENDIFFERENZ
RDNNAME EQU     12      ;ZEIGER AUF NAME NEUES WORT
;================================================================
        DB      'REDEFIN','E' OR CLAST
        DW      EXIT-1
        DB      8
REDEFINE:
        DW      $+2

        CALL    LINKHERE
        LD      HL,(VCURRENT)
        LD      E,(HL)
        INC     HL
        LD      D,(HL)
        EX      DE,HL
        INC     HL
        LD      (PADMEM+RDNCODE),HL     ;CODEFELD NEUES WORT

        PUSH    HL
        CALL    PTR2ADDR
        LD      (PADMEM+RDNNAME),HL
        LD      (PADMEM+RDNRUN),BC
        LD      (PADMEM+RDNEND),DE      ;ADRESSEN HOLEN

        LD      HL,(STKBOT)
        SBC     HL,DE
        JP      NZ,DICTERR      ;NICHT NEUESTES WORT ?

        POP     DE
        RSTPUSH                 ;UMZUDEFINIERENDES WORT
        CALL    NEXT
        DW      RESCURR,FIND,SEMICODE
        RSTPULL                 ;CODEFELD-ADR. DES ALTEN WORTES
        LD      HL,-FREEMEM
        ADD     HL,DE
        JP      NC,REDEFABORT   ;WORT NICHT IM RAM ?

        EX      DE,HL
        LD      (PADMEM+RDOCODE),HL
        CALL    PTR2ADDR        ;ADRESSEN HOLEN
        LD      (PADMEM+RDONAME),HL
        PUSH    HL              ;(SIEHE UNTEN !!!)
        LD      (PADMEM+RDOEND),DE
        LD      A,B
        OR      C
        LD      DE,(PADMEM+RDNRUN)
        JR      Z,RDGOON1       ;ALT OHNE SPEZIELLEN RUN-TEIL ?
        LD      A,D
        OR      E
        JR      Z,REDEFABORT    ;NEU OHNE SPEZIELLEN RUN-TEIL ?

RDGOON1:
        POP     HL
        LD      BC,(PADMEM+RDNNAME)
        SBC     HL,BC
        EX      DE,HL
        ADD     HL,DE
        LD      (PADMEM+RDNRUN),HL      ;RUN-ADRESSE KORRIGIEREN

        LD      HL,(PADMEM+RDNEND)
        ADD     HL,DE
        LD      BC,(PADMEM+RDOEND)
        AND     A
        SBC     HL,BC
        LD      (PADMEM+RDDLEN),HL      ;LAENGENDIFF. BERECHNEN

        LD      BC,46
        ADD     HL,BC
        BIT     7,H
        JR      NZ,RDGOON2      ;UM MINDESTENS 47 BYTE KLEINER ?

        LD      BC,(SPARE)
        ADD     HL,BC
        JR      C,REDEFABORT
        SBC     HL,SP
        JR      NC,REDEFABORT   ;ZUWENIG SPEICHER ?

RDGOON2:
        LD      HL,(PADMEM+RDOCODE)
        PUSH    HL
        DEC     HL
        DEC     HL
        LD      B,(HL)
        DEC     HL
        LD      C,(HL)
        LD      HL,(PADMEM+RDNCODE)
        PUSH    HL
        DEC     HL
        DEC     HL
        LD      (HL),B
        DEC     HL
        LD      (HL),C          ;WORT-VERKETTUNG HERSTELLEN
        POP     HL
        ADD     HL,DE
        POP     BC
        AND     A
        SBC     HL,BC
        LD      (PADMEM+RDDNAME),HL     ;NAMENSLAENGENDIFF. BER.

        LD      DE,(PADMEM+RDONAME)
        LD      HL,(PADMEM+RDOEND)
        AND     A
        SBC     HL,DE
        LD      B,H
        LD      C,L
        PUSH    DE
        PUSH    BC
        CALL    DELWORD         ;ALTES WORT LOESCHEN

        LD      HL,(PADMEM+RDDLEN)
        POP     BC
        ADD     HL,BC
        LD      B,H
        LD      C,L
        POP     HL
        PUSH    BC
        CALL    ALLOC           ;SPEICHER FUER NEUES WORT HOLEN
        EX      DE,HL
        LD      HL,(PADMEM+RDNNAME)
        LD      BC,(PADMEM+RDDLEN)
        ADD     HL,BC           ;STARTADRESSE KORRIGIEREN
        POP     BC
        PUSH    BC
        PUSH    HL
        LDIR                    ;NEUES WORT KOPIEREN
        POP     DE
        POP     BC
        CALL    DELWORD         ;ORIGINAL LOESCHEN

        CALL    CORRCURR        ;ZEIGER KORRIGIEREN
        JP      (IY)

REDEFABORT:
        LD      HL,(VCURRENT)
        LD      DE,(PADMEM+RDNCODE)
        DEC     DE
        LD      (HL),E
        INC     HL
        LD      (HL),D          ;CURRENT DICTIONARY SETZEN
DICTERR:
        RSTERR  ERRDICT
;================================================================
DELWORD:
        LD      HL,(STKBOT)
        AND     A
        SBC     HL,BC
        LD      (STKBOT),HL     ;HERE ERNIEDRIGEN

        LD      HL,(SPARE)
        SBC     HL,BC
        LD      (SPARE),HL      ;SPARE ERNIEDRIGEN

        SBC     HL,DE
        RET     Z               ;WAR SCHON LETZTES WORT ?

        PUSH    BC
        LD      B,H
        LD      C,L
        POP     HL
        ADD     HL,DE
        LDIR                    ;REST VERSCHIEBEN
        RET
;----------------------------------------------------------------
CORRCURR:
        LD      BC,VCURRENT
        CALL    CORRPTR
        CALL    CORRPTR         ;ZEIGER FUER CURRENT KORRIGIEREN

        LD      BC,DICT1ST
CORRDICT:
        LD      HL,(STKBOT)
        SCF
        SBC     HL,BC
        RET     C               ;AM ENDE ANGEKOMMEN ?

CDLOOP:
        LD      A,(BC)
        RLA
        INC     BC
        JR      NC,CDLOOP       ;NAMEN UEBERSPRINGEN

        INC     BC
        INC     BC
        CALL    CORRPTR         ;END-ADRESSE KORRIGIEREN
        INC     BC
        CALL    CORRPTR         ;ERSTES WORT DES DICT.
        CALL    JUMPDE
        DW      DOCOL
        DB      CDCOLON-$
        DW      DODEFINER
        DB      CDDEFCOM-$
        DW      DOCOMPILER
        DB      CDDEFCOM-$
        DW      SETCONTEXT
        DB      CDSETCTXT-$
        DW      0

        LD      HL,-7
        ADD     HL,BC
        LD      C,(HL)
        INC     HL
        LD      B,(HL)
        DEC     HL
        ADD     HL,BC           ;LINK AUF VORHERIGES DICT.
        LD      B,H
        LD      C,L
        JR      CORRDICT

CDDEFCOM:
        CALL    CORRPTR
CDCOLON:
        CALL    CORRWORD
        JR      CORRDICT

CDSETCTXT:
        CALL    CORRPTR
        INC     BC
        CALL    CORRPTR
        JR      CORRDICT
;----------------------------------------------------------------
CORRWORD:
        CALL    CORRPTR
        LD      HL,SEMIS
        AND     A
        SBC     HL,DE
        RET     Z               ;FORTH-WORTENDE GEFUNDEN ?

        CALL    SKIPOFFS
        JR      CORRWORD
;----------------------------------------------------------------
CORRPTR:
        LD      A,(BC)
        LD      E,A
        INC     BC
        LD      A,(BC)
        LD      D,A
        DEC     BC              ;ADRESSE HOLEN

        CALL    CORRADDR

        EX      DE,HL
        LD      A,E
        LD      (BC),A
        INC     BC
        LD      A,D
        LD      (BC),A          ;KORRIGIERT SPEICHERN
        INC     BC
        RET
;----------------------------------------------------------------
CORRADDR:
        LD      HL,(PADMEM+RDONAME)
        AND     A
        SBC     HL,DE
        LD      H,D
        LD      L,E
        RET     NC              ;AELTERES WORT => KEINE ANPASSUNG

        LD      HL,(PADMEM+RDOEND)
        SBC     HL,DE
        JR      NC,CAWORD       ;UMDEFINIERTES WORT ?

        LD      HL,(PADMEM+RDNNAME)
        SBC     HL,DE
        JR      C,CADICT        ;ANDERES DICTIONARY ?

        LD      HL,(PADMEM+RDDLEN)
        ADD     HL,DE
        RET                     ;NEUER => UM DIFFERENZ ANPASSEN

CAWORD:
        LD      HL,(PADMEM+RDOCODE)
        SBC     HL,DE
        LD      HL,(PADMEM+RDNRUN)
        RET     C               ;MIT RUN-TEIL => NEUE ADRESSE

        LD      HL,(PADMEM+RDDNAME)
        ADD     HL,DE
        RET                     ;UM NAMENSDIFFERENZ ANPASSEN

CADICT:
        LD      HL,(PADMEM+RDONAME)
        ADD     HL,DE
        LD      DE,(PADMEM+RDNNAME)
        AND     A
        SBC     HL,DE
        RET                     ;UM LAENGENDIFFERENZ ANPASSEN
;----------------------------------------------------------------
SKIPOFFS:
        DEC     DE
        LD      A,(DE)
        RLA
        RET     NC              ;NORMALES FORTH-WORT ?

SKOFFS2:
        DEC     DE
        DEC     DE
        LD      A,(DE)          ;OFFSET HOLEN
        LD      L,A
        LD      H,0
        INC     A
        JR      NZ,SKOGOON      ;OFFSET-BYTE GUELTIG ?
        LD      A,(BC)
        LD      L,A
        INC     BC
        LD      A,(BC)
        LD      H,A
        INC     BC              ;OFFSET IM CODE HOLEN

SKOGOON:
        ADD     HL,BC
        LD      B,H
        LD      C,L             ;NEUE ADRESSE MERKEN
        RET
;----------------------------------------------------------------
NFA:
        DW      $+2
        RSTPULL
        EX      DE,HL
        CALL    FPTR2NAME
        EX      DE,HL
        RSTPUSH
        JP      (IY)
;----------------------------------------------------------------
PTR2ADDR:
        PUSH    HL
        LD      E,(HL)
        INC     HL
        LD      D,(HL)          ;ERSTE WORTADRESSE HOLEN
        CALL    JUMPDE
        DW      DOCOMPILER
        DB      P2ARUN-$
        DW      DODEFINER
        DB      P2ARUN-$
        DW      0

        LD      BC,0            ;KEIN SPEZIELLER RUN-TEIL
        JR      P2AGOON

P2ARUN:
        POP     HL
        PUSH    HL
        INC     HL
        INC     HL
        LD      C,(HL)
        INC     HL
        LD      B,(HL)          ;RUNTIME-ADRESSE HOLEN

P2AGOON:
        POP     HL
        PUSH    HL
        DEC     HL
        DEC     HL
        DEC     HL
        DEC     HL
        LD      D,(HL)
        DEC     HL
        LD      E,(HL)
        ADD     HL,DE
        EX      DE,HL           ;ZEIGER HINTER WORT BERECHNEN
        POP     HL
;----------------------------------------------------------------
FPTR2NAME:
        DEC     HL
PTR2NAME:
        LD      A,H
        CP      MEMBEG SHR 8
        LD      A,(HL)
        RES     6,A             ;IMMEDIATE-BIT LOESCHEN
        JR      C,P2NGOON
        ADD     A,2             ;BEI WORTEN IM RAM MEHR
P2NGOON:
        DEC     HL
        DEC     HL              ;VERKETTUNGSZEIGER UEBERSPRINGEN
P2NLOOP:
        DEC     HL
        DEC     A
        JR      NZ,P2NLOOP      ;AUF NAMENSANFANG ZEIGEN
        RET
;===============================================================
JDELOOP:
        INC     HL              ;OFFSET UEBERSPRINGEN
        PUSH    HL
JUMPDE:
        POP     HL
        LD      A,(HL)
        INC     HL
        PUSH    HL
        LD      H,(HL)
        LD      L,A             ;NAECHSTEN ZEIGER HOLEN

        OR      H
        RET     Z               ;0 ? (HRM-HRM, AUF "NOP" !!!)

        SBC     HL,DE
        POP     HL
        INC     HL
        JR      NZ,JDELOOP      ;ZEIGER NICHT ERREICHT ?

        PUSH    DE
        LD      D,0
        LD      E,(HL)          ;OFFSET HOLEN
        ADD     HL,DE
        POP     DE
        JP      (HL)            ;CODE ANSPRINGEN
;================================================================
RESCURR:
        DW      DOCOL
        DW      ONEMINUS,TWOMINUS,AT
        DW      CURRENT,AT,EXCLAM       ;CURRENT ZURUECKSETZEN
        DW      SEMIS
;================================================================
FINDWORD:
        CALL    NEXT
        DW      FIND
        DW      SEMICODE
        RSTPULL                 ;ADRESSE DES CODE-FELDS
        LD      HL,-FREEMEM
        ADD     HL,DE
        RET     C               ;WORT GEFUNDEN ?
        RSTERR  ERRFIND
;================================================================
        DB      'FORGE','T' OR CLAST
        DW      REDEFINE-1
        DB      6
FORGET:
        DW      $+2

        LD      HL,(VCURRENT)
        LD      DE,(VCONTEXT)
        AND     A
        SBC     HL,DE
        JP      NZ,DICTERR      ;VERSCHIEDENE DICTIONARIES ?

        CALL    FINDWORD
        LD      HL,-5
        ADD     HL,DE
        LD      (DICT),HL
        SET     2,(IX+FLAGS-MEMBEG)     ;COMPILE-MODE EINSCHALTEN
        RSTERR  ERRNONE
;================================================================
        DB      'EDI','T' OR CLAST
        DW      FORGET-1
        DB      4
EDIT:
        DW      $+2

        CALL    FINDWORD
        SET     3,(IX+FLAGS-MEMBEG)     ;"EDIT" MERKEN
        JR      EDITLIST
;================================================================
        DB      'LIS','T' OR CLAST
        DW      EDIT-1
        DB      4
LIST:
        DW      $+2

        CALL    FINDWORD
;----------------------------------------------------------------
EDITLIST:
        LD      A,CCR
        RSTEMIT

        BIT     3,(IX+FLAGS-MEMBEG)
        PUSH    DE
        CALL    NZ,DCCLEAR      ;"EDIT" ?
        POP     BC

        LD      A,(BC)
        LD      E,A
        INC     BC
        LD      A,(BC)
        LD      D,A
        DEC     BC
        CALL    JUMPDE
        DW      DOCOL
        DB      ELCOLON-$
        DW      DOCOMPILER
        DB      ELCOMPILER-$
        DW      DODEFINER
        DB      ELDEFINER-$
        DW      0
        RSTERR  ERRLIST
;----------------------------------------------------------------
ELCOLON:
        LD      HL,2
        JR      ELOUT
;----------------------------------------------------------------
ELCOMPILER:
        PUSH    DE

        LD      HL,2
        ADD     HL,BC
        LD      A,(HL)
        INC     HL
        LD      H,(HL)
        LD      L,A             ;ADRESSE HINTER "DOCOMPILER"

        DEC     HL
        DEC     HL
        DEC     HL
        LD      L,(HL)
        LD      A,L
        RLCA
        SBC     A,A
        LD      H,A             ;CODEBYTE (???) AUF 16 BIT
        CALL    PNTHL

        POP     DE
;----------------------------------------------------------------
ELDEFINER:
        LD      HL,4
;----------------------------------------------------------------
ELOUT:
        ADD     HL,BC
        PUSH    HL
        PUSH    BC
        CALL    OUTWORD         ;":" ETC. AUSGEBEN
        POP     DE
        POP     BC
        CALL    OUTWORD         ;NAMEN AUSGEBEN

        LD      (IX+LPIBUF-MEMBEG),1    ;1 ZEICHEN EINRUECKEN
ELMLOOP:
        LD      (IX+LPLCNT-MEMBEG),16   ;16 ZEILEN
ELLLOOP:
        CALL    LISTPGM
        JR      C,ELREADY       ;WORT FERTIG GELISTET ?
        DEC     (IX+LPLCNT-MEMBEG)
        JP      P,ELLLOOP       ;NOCH NICHT ALLE ZEILEN BENUTZT ?

ELREADY:
        BIT     3,(IX+FLAGS-MEMBEG)
        JR      NZ,ELEDIT       ;"EDIT" ?

        JR      C,ELQUIT        ;WORT FERTIG GELISTET ?

        LD      HL,KEYCOD
        LD      (HL),0
ELACK:
        LD      A,(HL)
        AND     A
        JR      Z,ELACK         ;AUF BESTAETIGUNG WARTEN

        CALL    USERBREAK
        JR      ELMLOOP         ;WEITERMACHEN

ELEDIT:
        PUSH    AF
        RES     3,(IX+FLAGS-MEMBEG)     ;KURZ KEIN "EDIT"
        PUSH    BC

        CALL    NEXT
        DW      RETYPE,LINE
        DW      SEMICODE        ;EDITIEREN

        SET     3,(IX+FLAGS-MEMBEG)     ;WIEDER "EDIT"
        CALL    DCCLEAR
        POP     BC
        POP     AF
        JR      NC,ELMLOOP      ;WORT NICHT FERTIG GELISTET ?
ELQUIT:
        RES     3,(IX+FLAGS-MEMBEG)     ;KEIN "EDIT" MEHR
        JP      (IY)
;----------------------------------------------------------------
LISTPGM:
        LD      A,(LPIBUF)
        LD      (LPIACT),A      ;EINRUECKUNG HOLEN

        LD      (IX+LPICNT-MEMBEG),5    ;ERSTMAL 5 WORTE
LPLOOP:
        LD      A,(BC)
        LD      E,A
        INC     BC
        LD      A,(BC)
        LD      D,A
        INC     BC
        CALL    JUMPDE          ;NAECHSTES WORT HOLEN
        DW      DOIF
        DB      LPIINC-$
        DW      DOELSE
        DB      LPILEFT-$
        DW      DOTHEN
        DB      LPIDEC-$
        DW      DOBEGIN
        DB      LPIINC-$
        DW      DOUNTIL
        DB      LPIDEC-$
        DW      DOWHILE
        DB      LPILEFT-$
        DW      DOREPEAT
        DB      LPIDEC-$
        DW      DODO
        DB      LPIINC-$
        DW      DOLOOP
        DB      LPIDEC-$
        DW      DOPLUSLOOP
        DB      LPIDEC-$
        DW      DODOESGT
        DB      LPILEFT-$
        DW      DORUNSGT
        DB      LPILEFT-$
        DW      GETWORD
        DB      LPWORD-$
        DW      GETFLOAT
        DB      LPFLOAT-$
        DW      GETBYTE
        DB      LPBYTE-$
        DW      DOLBRACKET
        DB      LPLBRACKET-$
        DW      DOPTSTR
        DB      LPPTSTR-$
        DW      SEMIS
        DB      LPSEMIS-$
        DW      0

LPOUT:
        CALL    OUTWORDI
LPNEXT:
        DEC     (IX+LPICNT-MEMBEG)
        JR      NZ,LPLOOP       ;WORTZAHL BEGRENZEN

        AND     A               ;WORT NOCH NICHT FERTIG GELISTET
        RET

LPIINC:
        LD      HL,(LPIBUF)
        LD      H,L
        INC     L               ;DEMNAECHST MEHR EINRUECKEN
        JR      LPINDENT

LPILEFT:
        LD      HL,(LPIBUF)
        LD      H,L
        DEC     H               ;EINMAL WENIGER EINRUECKEN
        JR      LPINDENT

LPIDEC:
        LD      HL,(LPIBUF)
        DEC     L
        LD      H,L             ;JETZT WENIGER EINRUECKEN
LPINDENT:
        LD      (LPIBUF),HL

        LD      (IX+LPICNT-MEMBEG),1    ;NUR NOCH DIESES WORT

        DEC     (IX+LPLCNT-MEMBEG)      ;ZEILE FERTIG
        JR      LPOUT

LPWORD:
        CALL    LPNXTWRD
        RSTPUSH
        LD      DE,PNT
LPNUMBER:
        CALL    OUTINDENT
        CALL    EXECDE          ;ZAHL AUSGEBEN
        JR      LPNEXT

LPFLOAT:
        CALL    LPNXTWRD
        RSTPUSH
        CALL    LPNXTWRD
        RSTPUSH
        LD      DE,FPNT
        JR      LPNUMBER

LPBYTE:
        LD      A,(BC)
        PUSH    AF
        CALL    OUTWORDI
        POP     AF
        RSTEMIT
        LD      A,' '
        RSTEMIT
        JR      LPNEXT

LPSEMIS:
        CALL    ROMTXT
        DB      CCR,';',CCR OR CLAST

        SCF                     ;WORT FERTIG GELISTET
        RET

LPLBRACKET:
        LD      A,')'
        JR      LPSTRING

LPPTSTR:
        LD      A,'"'
LPSTRING:
        PUSH    AF
        PUSH    BC
        CALL    OUTWORDI
        POP     DE
        CALL    TYPEDE          ;ZEICHENKETTE AUSGEBEN
        LD      B,D
        LD      C,E
        POP     AF
        RSTEMIT                 ;GRENZZEICHEN AUSGEBEN

        AND     A               ;WORT NOCH NICHT FERTIG GELISTET
        RET
;----------------------------------------------------------------
OUTINDENT:
        LD      A,(LPIACT)
        AND     A
        RET     M               ;KEINE NEUE ZEILE & EINRUECKUNG ?

        PUSH    BC
        LD      B,A
        LD      A,CCR
        RSTEMIT
        INC     B
        DEC     B
        JR      Z,OIQUIT        ;EINRUECKUNG = 0 ?
OILOOP:
        LD      A,' '
        RSTEMIT
        DJNZ    OILOOP          ;EINRUECKUNG AUSGEBEN

OIQUIT:
        LD      (IX+LPIACT-MEMBEG),-1    ;KEINE EINRUECKUNG MEHR
        POP     BC
        RET
;----------------------------------------------------------------
LPNXTWRD:
        LD      A,(BC)
        LD      E,A
        INC     BC
        LD      A,(BC)
        LD      D,A
        INC     BC              ;NAECHSTES WORT HOLEN
        RET
;----------------------------------------------------------------
OUTWORDI:
        CALL    OUTINDENT

OUTWORD:
        EX      DE,HL
        DEC     HL
        LD      A,(HL)
        BIT     7,A
        JR      NZ,OWDOXX       ;KEIN NORMALES FORTH-WORT ?
        CALL    PTR2NAME
        JR      OUTTXT

OWDOXX:
        EX      DE,HL
        CALL    SKOFFS2
        INC     DE
        LD      A,(DE)
        LD      L,A
        INC     DE
        LD      A,(DE)
        LD      H,A
        ADD     HL,DE           ;ZEIGER AUF NAMEN

OUTTXT:
        LD      A,(HL)
        AND     7FH             ;ZEICHEN HOLEN
        RSTEMIT
        BIT     7,(HL)
        INC     HL
        JR      Z,OUTTXT        ;NOCH NICHT ENDE ?
        LD      A,' '
        RSTEMIT
        RET
;----------------------------------------------------------------
ROMTXT:
        EX      (SP),HL         ;ZEIGER HOLEN
        CALL    OUTTXT
        EX      (SP),HL         ;RUECKSPRUNG SETZEN
        RET
;================================================================
PNTHL:
        LD      DE,PNT
        PUSH    DE
        EX      DE,HL
        RSTPUSH
        POP     DE
;----------------------------------------------------------------
EXECDE:
        PUSH    BC
        CALL    NEXTDE
        DW      $+2
        DW      $+2
        POP     BC
        POP     BC
        RET
;================================================================
TXALL:
        PUSH    IY

        PUSH    HL
        POP     IY              ;ADRESSE HOLEN

        LD      HL,TXRXQUIT
        PUSH    HL              ;RUECKSPRUNG SETZEN

        LD      HL,-2000H
        BIT     7,C
        JR      Z,TAGOON1       ;LANGER VORSPANN ?
        LD      H,-0400H SHR 8
TAGOON1:

        INC     DE
        DEC     IY              ;ZEIGER UND ANZAHL KORRIGIEREN
        DI
        XOR     A               ;VORBEREITEN
TALOOP1:
        LD      B,151
TADEL1:
        DJNZ    TADEL1          ;LANGE WARTEN

        OUT     (IO),A          ;PEGEL WECHSELN
        XOR     8

        INC     L
        JR      NZ,TAGOON2
        INC     H
TAGOON2:
        JR      NZ,TALOOP1      ;VORSPANN SENDEN

        LD      B,43
TADEL2:
        DJNZ    TADEL2          ;KURZ WARTEN

        OUT     (IO),A          ;PEGEL = 0

        LD      L,C             ;STARTBYTE HOLEN

        LD      BC,8 + (59 SHL 8)
TADEL3:
        DJNZ    TADEL3          ;KURZ WARTEN

        LD      A,C
        OUT     (IO),A          ;PEGEL = 1

        LD      B,56
        JP      TASTART
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TALOOP2:
        LD      A,C             ;PEGEL 1 HOLEN
        BIT     7,B             ;Z SETZEN
TADEL4:
        DJNZ    TADEL4          ;KURZ WARTEN

        JR      NC,TABIT0       ;BIT = 0 ?

        LD      B,61
TADEL5:
        DJNZ    TADEL5          ;KURZ WARTEN

TABIT0:
        OUT     (IO),A          ;PEGEL SETZEN
        LD      B,58
        JP      NZ,TALOOP2      ;ERSTE BITHAELFTE GESENDET ?

        DEC     B               ;ZYKLEN-KORREKTUR
        XOR     A               ;PEGEL 0 HOLEN
TANEXT:
        RL      L
        JP      NZ,TADEL4       ;NOCH NICHT 8 BITS GESENDET ?

        DEC     DE              ;ANZAHL ERNIEDRIGEN
        INC     IY              ;ZEIGER ERHOEHEN

        LD      B,46

        LD      A,7FH
        IN      A,(IO)
        RRA
        RET     NC              ;BENUTZER-ABBRUCH ?

        LD      A,D
        CP      0FFH
        RET     NC              ;PRUEFZAHL GESENDET ?

        OR      E
        JR      Z,TAEND         ;ALLE BYTES GESENDET ?

        LD      L,(IY+0)        ;NAECHSTES BYTE HOLEN
TACHECK:
        LD      A,H
        XOR     L
        LD      H,A             ;PRUEFSUMME BILDEN

TASTART:
        XOR     A
        SCF                     ;FUER DIE BIT-ANZAHL
        JP      TANEXT

TAEND:
        LD      L,H             ;PRUEFSUMME SENDEN
        JR      TACHECK
;----------------------------------------------------------------
TXRXQUIT:
        POP     IY
        EX      AF,AF'

        LD      B,59
TRQDEL6:
        DJNZ    TRQDEL6         ;KURZ WARTEN

        XOR     A
        OUT     (IO),A          ;PEGEL = 0

        LD      A,7FH
        IN      A,(IO)
        RRA
        EI
        JP      NC,BREAK        ;BENUTZER-ABBRUCH ?

        EX      AF,AF'
        RET
;----------------------------------------------------------------
RXALL:
        DI
        PUSH    IY

        PUSH    HL
        POP     IY              ;ZEIGER HOLEN

        LD      HL,TXRXQUIT
        PUSH    HL              ;RUECKSPRUNG SETZEN

        LD      H,C             ;STARTBYTE MERKEN
        EX      AF,AF'          ;READ/VERIFY-FLAG MERKEN

        XOR     A
        LD      C,A             ;BISHER 0-PEGEL

RASYNC:
        RET     NZ              ;BENUTZER-ABBRUCH ?
RALOOP1:
        LD      L,0
RALOOP2:
        LD      B,-72
        CALL    RXBIT
        JR      NC,RASYNC       ;ABBRUCH ?
        LD      A,-33
        CP      B
        JR      NC,RALOOP1      ;KEIN SYNC-ZEICHEN ?
        INC     L
        JR      NZ,RALOOP2      ;NOCH KEINE 256 SYNC-ZEICHEN ?

RALOOP3:
        LD      B,-49
        CALL    RXLEVEL
        JR      NC,RASYNC       ;ABBRUCH ?

        LD      A,B
        CP      -40
        JR      NC,RALOOP3      ;NOCH SYNC-ZEICHEN ?

        CALL    RXLEVEL
        RET     NC              ;ABBRUCH ?

        CALL    RXBYTE
        RET     NC              ;ABBRUCH ?

        CCF
        RET     NZ              ;ERSTES BYTE FALSCH ?
        JR      RASTART
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RALOOP:
        EX      AF,AF'
        JR      NC,RAVERIFY     ;NUR VERGLEICHEN ?

        LD      (IY+0),L        ;BYTE SPEICHERN
        JR      RAGOON
RAVERIFY:
        LD      A,(IY+0)
        XOR     L
        RET     NZ              ;BYTE UNGLEICH ?

RAGOON:
        INC     IY              ;ZEIGER ERHOEHEN
        DEC     DE              ;ANZAHL ERNIEDRIGEN
        EX      AF,AF'

RASTART:
        CALL    RXBYTE
        RET     NC              ;ABBRUCH ?

        LD      A,D
        OR      E
        JR      NZ,RALOOP       ;ANZAHL NOCH NICHT EMPFANGEN ?

        LD      A,H
        CP      1               ;C SETZEN, WENN PRUEFSUMME OK
RETURN:
        RET
;----------------------------------------------------------------
RXBYTE:
        LD      L,1             ;FUER DIE BIT-ANZAHL

RB8LOOP:
        LD      B,-57
        CALL    RXBIT
        RET     NC              ;ABBRUCH ?
        LD      A,-30
        CP      B               ;LANGE ZEIT = 1-BIT
        RL      L
        JP      NC,RB8LOOP      ;NOCH NICHT 8 BITS ?

        LD      A,H
        XOR     L
        LD      H,A             ;PRUEFSUMME BILDEN

        SCF                     ;BYTE EMPFANGEN
        RET
;----------------------------------------------------------------
RXBIT:
        CALL    RXLEVEL
        RET     NC              ;ABBRUCH ?

RXLEVEL:
        LD      A,20
RBDELAY:
        DEC     A
        JR      NZ,RBDELAY      ;KURZ WARTEN

        AND     A               ;C LOESCHEN
RBLOOP:
        INC     B
        RET     Z               ;TIMEOUT ?

        LD      A,7FH
        IN      A,(IO)
        RRA
        RET     NC              ;BENUTZER-ABBRUCH ?

        XOR     C
        AND     020H SHR 1
        JR      Z,RBLOOP        ;PEGEL GLEICH ?

        LD      A,C
        CPL
        LD      C,A             ;PEGEL MERKEN

        SCF                     ;ALLES OK
        RET
;================================================================
FFLAG   EQU     0       ;00/FF = WOERTERBUCH / BINAERDATEI
FNLEN   EQU     1       ;NAMENSLAENGE
;               2       ;DATEINAME
FLEN    EQU     11      ;ANZAHL BYTES
FSTART  EQU     13      ;STARTADRESSE
FDICT   EQU     15      ;DICTIONARY
FCURR   EQU     17      ;VCURRENT
;               19      ;VCONTEXT
;               21      ;VOCLNK
;               23      ;STKBOT

FSIZE   EQU     25      ;GROESSE DIESES BLOCKS
;================================================================
        DB      'SAV','E' OR CLAST
        DW      LIST-1
        DB      4
SAVE:
        DW      DOCOL
        DW      FILEFHEAD,DOSAVE
        DW      SEMIS
;================================================================
        DB      'BSAV','E' OR CLAST
        DW      SAVE-1
        DB      5
BSAVE:
        DW      DOCOL
        DW      FILEBHEAD,DOSAVE
        DW      SEMIS
;================================================================
        DB      'BLOA','D' OR CLAST
        DW      BSAVE-1
        DB      5
BLOAD:
        DW      DOCOL
        DW      FILEBHEAD,READHEADER,DOBLOAD
        DW      SEMIS
;================================================================
        DB      'VERIF','Y' OR CLAST
        DW      BLOAD-1
        DB      6
VERIFY:
        DW      DOCOL
        DW      FILEFHEAD
        DW      DOELSE,DOVERIFY-$-1
;================================================================
        DB      'BVERIF','Y' OR CLAST
        DW      VERIFY-1
        DB      7
BVERIFY:
        DW      DOCOL
        DW      FILEBHEAD
DOVERIFY:
        DW      READHEADER,DOBVERIFY
        DW      SEMIS
;================================================================
        DB      'LOA','D' OR CLAST
        DW      BVERIFY-1
        DB      4
LOAD:
        DW      DOCOL
        DW      FILEFHEAD
        DW      SEMICODE

        LD      HL,(STKBOT)
        LD      (FPADMEM+FSTART),HL     ;START

        EX      DE,HL
        LD      HL,-52
        ADD     HL,SP
        AND     A
        SBC     HL,DE
        LD      (FPADMEM+FLEN),HL       ;GROESSE FREIER SPEICHER

        CALL    NEXT
        DW      READHEADER,DOBLOAD
        DW      SEMICODE

        LD      BC,(STKBOT)

        LD      HL,FREEMEM-1
        LD      (PADMEM+RDONAME),HL
        INC     HL
        LD      (PADMEM+RDOEND),HL      ;KORREKTUR VORBEREITEN

        LD      HL,(FPADMEM+FSIZE+FLEN)
        ADD     HL,BC
        LD      (STKBOT),HL     ;SPEICHER BELEGEN

        LD      HL,-FREEMEM
        ADD     HL,BC
        LD      (PADMEM+RDDLEN),HL
        LD      DE,(FPADMEM+FSIZE+FDICT)
        ADD     HL,DE
        LD      DE,(FORTH+2+RAMVAR-ROMVAR)
        LD      (FORTH+2+RAMVAR-ROMVAR),HL      ;NEUES ENDE

        PUSH    BC
        PUSH    DE
        LD      (PADMEM+RDNNAME),SP
        CALL    CORRDICT        ;GELADENES DICT. EINBINDEN
        POP     BC
        POP     HL
LDNLOOP:
        BIT     7,(HL)
        INC     HL
        JR      Z,LDNLOOP       ;NAMEN UEBERSPRINGEN
        INC     HL
        INC     HL
        LD      (HL),C
        INC     HL
        LD      (HL),B          ;LAENGE DES DICT.S SPEICHERN

        LD      HL,(STKBOT)
        LD      BC,SAFETY
        ADD     HL,BC
        LD      (SPARE),HL      ;PARAMETER-STACK SETZEN
        JP      (IY)
;================================================================
FILENAME:
        DW      DOCOL
        DW      GETBYTE
        DB      ' '
        DW      WORD
        DW      SEMICODE        ;NAMEN HOLEN
        CALL    LINKHERE
        RSTPULL
        LD      A,' '
        LD      (DE),A          ;NAMENSLAENGE DURCH ' ' ERSETZEN

        LD      DE,PADMEM+FLEN
        LD      HL,SCRMEND-1
        CALL    BLANKS          ;PUFFER LOESCHEN
        JP      (IY)
;================================================================
SEMICODE:
        DW      RETURN
;================================================================
FILEFHEAD:
        DW      DOCOL
        DW      FILENAME
        DW      SEMICODE
        XOR     A
        LD      (FPADMEM+FFLAG),A
        LD      HL,FREEMEM
        LD      (FPADMEM+FSTART),HL
        EX      DE,HL
        LD      HL,(STKBOT)
        AND     A
        SBC     HL,DE
        LD      (FPADMEM+FLEN),HL
        LD      HL,(FORTH+2+RAMVAR-ROMVAR)
        LD      (FPADMEM+FDICT),HL
        LD      HL,VCURRENT
        LD      DE,FPADMEM+FCURR
        LD      BC,8
        LDIR                    ;HEADER VORBEREITEN
        JP      (IY)
;================================================================
FILEBHEAD:
        DW      DOCOL
        DW      FILENAME
        DW      GETWORD,FPADMEM+FLEN,EXCLAM
        DW      GETWORD,FPADMEM+FSTART,EXCLAM
        DW      SEMIS
;================================================================
DOSAVE:
        DW      $+2

        LD      A,(FPADMEM+FNLEN)
        AND     A
        JR      Z,RXERROR       ;KEIN NAME ?
        LD      HL,(FPADMEM+FLEN)
        LD      A,H
        OR      L
        JR      Z,RXERROR       ;LAENGE = 0 ?
        PUSH    HL

        LD      DE,25
        LD      HL,FPADMEM+FFLAG
        LD      C,D
        CALL    TXALL           ;HEADER SENDEN

        POP     DE
        LD      HL,(FPADMEM+FSTART)
        LD      C,-1
        CALL    TXALL           ;DATEN SENDEN
        JP      (IY)
;----------------------------------------------------------------
READHEADER:
        DW      $+2

RHLOOP:
        LD      DE,25
        LD      HL,FPADMEM+FSIZE+FFLAG
        LD      C,D
        SCF
        CALL    RXALL           ;HEADER LESEN
        JR      NC,RHLOOP       ;NOCH NICHT OK ?

        LD      DE,FPADMEM+FSIZE+FFLAG
        LD      A,(DE)
        AND     A
        JR      NZ,RHBINARY     ;BINAER-DATEI ?

        CALL    ROMTXT
        DB      CCR,'Dict',':' OR CLAST
        JR      RHCHECK

RHBINARY:
        CALL    ROMTXT
        DB      CCR,'Bytes',':' OR CLAST

RHCHECK:
        LD      HL,FPADMEM+FFLAG
        LD      BC,11 + (11 SHL 8)
        JR      RHCSTART

RHCLOOP:
        LD      A,(DE)
        RSTEMIT                 ;NAMEN AUSGEBEN
RHCSTART:
        LD      A,(DE)
        CP      (HL)
        JR      NZ,RHCNEXT      ;ZEICHEN UNGLEICH ?
        DEC     C
RHCNEXT:
        INC     HL
        INC     DE
        DJNZ    RHCLOOP         ;NOCH NICHT ALLE ZEICHEN ?

        JR      NZ,RHLOOP       ;NAME UNGLEICH ?
        JP      (IY)
;----------------------------------------------------------------
RXERROR:
        RSTERR  ERRREAD
;----------------------------------------------------------------
DOBLOAD:
        DW      $+2

        LD      B,-1            ;LESEN
        JR      DOBREAD
;----------------------------------------------------------------
DOBVERIFY:
        DW      $+2

        LD      HL,FPADMEM+FCURR
        LD      DE,FPADMEM+FSIZE+FCURR
        LD      B,8
DBVLOOP:
        LD      A,(DE)
        INC     DE
        CP      (HL)
        INC     HL
        JR      NZ,RXERROR
        DJNZ    DBVLOOP         ;VARIABLEN VERGLEICHEN

DOBREAD:
        LD      HL,(FPADMEM+FLEN)
        LD      DE,(FPADMEM+FSIZE+FLEN)
        LD      A,H
        OR      L
        JR      Z,DBRGOON1      ;LAENGE NICHT TESTEN ?
        SBC     HL,DE
        JR      C,RXERROR

DBRGOON1:
        LD      HL,(FPADMEM+FSTART)
        LD      A,H
        OR      L
        JR      NZ,DBRGOON2     ;STARTADRESSE UEBERNEHMEN ?
        LD      HL,(FPADMEM+FSIZE+FSTART)

DBRGOON2:
        LD      C,-1
        RR      B               ;READ/VERIFY-FLAG HOLEN
        CALL    RXALL           ;DATEN LESEN
        JR      NC,RXERROR      ;ABBRUCH ?
        JP      (IY)
;================================================================
FEXP1   EQU     0       ;EXPONENT OBERE ZAHL / ERGEBNIS
FEXP2   EQU     1       ;EXPONENT UNTERE ZAHL
FSGN    EQU     2       ;VORZEICHEN 7=UNTEN 6=OBEN
FACCU   EQU     3       ;AKKUMULATOR
FQUO    EQU     7       ;QUOTIENT
FDIVOR  EQU     16      ;DIVISOR
;================================================================
FINIT:
        LD      BC,FPWS+FDIVOR-1
        XOR     A
FICLEAR:
        LD      (BC),A
        DEC     C               ;(ETWAS UNSAUBER!!!)
        JR      NZ,FICLEAR      ;PUFFER LOESCHEN

        LD      HL,(SPARE)
        LD      DE,-4
        DEC     HL
        LD      C,(HL)          ;EXPONENT OBERE ZAHL MERKEN
        LD      (HL),A          ; UND LOESCHEN
        ADD     HL,DE
        INC     HL
        LD      (SPARE),HL      ;"TOS" LOESCHEN
        DEC     HL
        LD      B,(HL)          ;EXPONENT UNTERE ZAHL MERKEN
        LD      (HL),A          ; UND LOESCHEN
        LD      A,C
        RRCA
        XOR     B
        AND     NOT FSIGN
        XOR     B
        LD      (FPWS+FSGN),A   ;VORZEICHEN MERKEN
        RES     7,B
        RES     7,C
        LD      (FPWS+FEXP1),BC ;EXPONENTEN SPEICHERN
        INC     HL
        EX      DE,HL           ;ZEIGER AUF OBERE ZAHL
        ADD     HL,DE           ;ZEIGER AUF UNTERE ZAHL
        RET
;----------------------------------------------------------------
FADJUST:
        LD      A,9
        CP      B
        JR      NC,FADJLP1      ;EXPONENTENDIFFERENZ BEGRENZEN
        LD      B,A

FADJLP1:
        LD      C,4
        INC     HL
        INC     HL
        INC     HL
        XOR     A
FADJLP2:
        RRD
        DEC     HL
        DEC     C
        JR      NZ,FADJLP2      ;KLEINERE ZAHL DIVIDIEREN
        INC     HL
        DJNZ    FADJLP1         ;BIS DIFFERENZ ERREICHT

        ADD     A,-5            ;WAR LETZTE STELLE >= 5 ?
        PUSH    HL
FADJLP3:
        LD      A,(HL)
        ADC     A,B
        DAA
        LD      (HL),A
        INC     HL
        JR      C,FADJLP3       ;RUNDEN
        POP     HL
        RET
;----------------------------------------------------------------
FNEG:
        PUSH    BC
        PUSH    HL
        LD      B,4
        AND     A
FNLOOP:
        LD      A,0
        SBC     A,(HL)
        DAA
        LD      (HL),A
        INC     HL
        DJNZ    FNLOOP          ;ALLE STELLEN NEGIEREN
        POP     HL
        POP     BC
        RET
;----------------------------------------------------------------
FADDITION:
        LD      C,1             ;MULTIPLIKATOR 1

FMULADD:
        PUSH    HL
        PUSH    DE
        PUSH    BC
        LD      A,C
        AND     0FH
        LD      B,A
        XOR     C
        LD      C,A
        RRCA
        RRCA
        ADD     A,C
        RRCA
        ADD     A,B
        LD      C,A             ;BCD ZU BINAER WANDELN

        LD      B,4
        XOR     A
FMLOOP1:
        PUSH    BC
        PUSH    DE
        PUSH    HL
        ADD     A,(HL)
        DAA
        LD      L,A
        LD      A,(DE)
        LD      H,0
        LD      D,H
        RL      H               ;UEBERTRAG AUS ADDITION
        AND     A
        JR      Z,FMNEXT        ;STELLE = 0 ?
        LD      E,A
FMLOOP2:
        SRL     C
        JR      NC,FMNOADD      ;MULTIPLIKATOR-BIT = 0 ?
        LD      A,L
        ADD     A,E
        DAA
        LD      L,A
        LD      A,H
        ADC     A,D
        DAA
        LD      H,A             ;ADDITION
FMNOADD:
        INC     C
        DEC     C
        JR      Z,FMNEXT        ;MULTIPLIKATOR = 0 ?
        LD      A,E
        ADD     A,A
        DAA
        LD      E,A
        LD      A,D
        ADC     A,A
        DAA
        LD      D,A             ;ERGEBNIS SCHIEBEN
        JR      FMLOOP2         ;NOCHMAL

FMNEXT:
        EX      DE,HL
        POP     HL
        LD      (HL),E
        LD      A,D
        POP     DE
        POP     BC
        INC     DE
        INC     HL
        DJNZ    FMLOOP1         ;NOCH NICHT ALLE BYTES ?

        POP     BC
        POP     DE
        POP     HL
        RET
;================================================================
        DB      'F','-' OR CLAST
        DW      LOAD-1
        DB      2
FMINUS:
        DW      DOCOL
        DW      FNEGATE
        DW      SEMICODE
        JR      FADDSUB
;================================================================
        DB      'F','+' OR CLAST
        DW      FMINUS-1
        DB      2
FPLUS:
        DW      FADDSUB

FADDSUB:
        CALL    FINIT           ;BEARBEITUNG VORBEREITEN

        LD      A,C
        SUB     B
        PUSH    AF
        JR      NC,FASGOON1     ;EXPONENT UNTEN<=OBEN ?
        EX      DE,HL
        NEG
        LD      (IX+FPWS+FEXP1-MEMBEG),B        ;ZAHLEN TAUSCHEN
FASGOON1:
        LD      B,A
        CALL    NZ,FADJUST      ;BEI BEDARF ANDERE ZAHL ANPASSEN
        POP     AF
        JR      NC,FASGOON2     ;EXPONENT UNTEN<=OBEN ?
        EX      DE,HL
FASGOON2:

        LD      B,2
        LD      C,(IX+FPWS+FSGN-MEMBEG)
FASLP1:
        RL      C
        CALL    C,FNEG
        EX      DE,HL
        DJNZ    FASLP1          ;BEI BEDARF ZAHLEN NEGIEREN

        CALL    FADDITION
        DEC     DE
        LD      A,(DE)
        ADD     A,-98H
        RR      B
        LD      (IX+FPWS+FSGN-MEMBEG),B ;NEUES VORZEICHEN MERKEN
        CALL    NZ,FNEG         ;BEI BEDARF NEGIEREN

FASLP2:
        LD      A,(DE)
        AND     A
        JR      NZ,FASGOON3     ;OBERSTE STELLEN <> 0 ?
        DEC     (IX+FPWS+FEXP1-MEMBEG)
        DEC     (IX+FPWS+FEXP1-MEMBEG)  ;EXPONENT KORRIGIEREN
        PUSH    DE
        LD      H,D
        LD      L,E
        DEC     HL
        LD      BC,255+(3 SHL 8)        ;C LADEN WEGEN "LDD"
FASLP3:
        OR      (HL)
        LDD
        DJNZ    FASLP3          ;STELLEN SCHIEBEN
        EX      DE,HL
        LD      (HL),B
        POP     DE
        JR      NZ,FASLP2       ;ZAHL <> 0 ?
        JP      (IY)

FASGOON3:
        LD      D,H
        LD      E,L             ;ZAHL NOCH NICHT SCHIEBEN
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FCORR:
        PUSH    DE
        LD      BC,4
        LDIR                    ;ZAHL SCHIEBEN
        POP     HL
        DEC     DE
FCLP:
        LD      A,(DE)
        AND     A
        JR      Z,FCQUIT        ;STELLEN = 0 ?

        CP      10H
        SBC     A,A
        INC     A
        INC     A
        LD      B,A
        ADD     A,(IX+FPWS+FEXP1-MEMBEG)
        LD      (FPWS+FEXP1),A  ;EXPONENT KORRIGIEREN

        CALL    FADJUST
        JR      FCLP

FCQUIT:
        LD      A,(FPWS+FEXP1)
        DEC     A
        CP      -FEOFFS-1
        INC     A
        JR      NC,FLT0         ;ZAHL ZU KLEIN ?
        CP      +FEOFFS+64
        JR      NC,FLTERR       ;ZAHL ZU GROSS ?
        LD      B,A
        LD      A,(FPWS+FSGN)
        LD      C,A
        RLA
        XOR     C
        AND     FSIGN
        XOR     B
        LD      (DE),A          ;VORZEICHEN UND EXPONENT
        JP      (IY)

FLTERR:
        RSTERR  ERRFLT

FLT0:
        LD      BC,0+(4 SHL 8)
FLT0LP:
        LD      (HL),C
        INC     HL
        DJNZ    FLT0LP          ;ZAHL AUF 0 SETZEN
        JP      (IY)
;================================================================
        DB      'F','*' OR CLAST
        DW      FPLUS-1
        DB      2
FMUL:
        DW      $+2

        CALL    FINIT           ;BEARBEITUNG VORBEREITEN

        XOR     A
        CP      B
        SBC     A,A
        AND     C
        JR      Z,FLT0          ;EINE DER BEIDEN ZAHLEN = 0 ?

        PUSH    HL
        LD      BC,FPWS+FACCU-1
        PUSH    BC
        LD      B,3
FMLOOP:
        LD      C,(HL)
        INC     HL
        EX      (SP),HL
        INC     HL
        CALL    FMULADD
        EX      (SP),HL
        DJNZ    FMLOOP          ;ALLE DOPPELSTELLEN MULTIPL.

        LD      BC,(FPWS+FEXP1)
        LD      A,B
        ADD     A,C
        SUB     FEOFFS+2
        LD      (FPWS+FEXP1),A  ;EXPONENTEN BERECHNEN
        POP     HL
        POP     DE
        JR      FCORR
;================================================================
        DB      'F','/' OR CLAST
        DW      FMUL-1
        DB      2
FDIV:
        DW      $+2

        CALL    FINIT           ;BEARBEITUNG VORBEREITEN

        XOR     A
        CP      B
        JR      Z,FLT0          ;DIVIDEND = 0 ?

        CP      C
        JR      Z,FLTERR        ;DIVISOR = 0 ?

        INC     DE
        INC     DE
        LD      A,(DE)
        DEC     DE
        DEC     DE
        ADD     A,1
        DAA
        EX      AF,AF'          ;TEST AUF 0.99????E??

        EX      DE,HL
        CALL    FNEG            ;OBERE ZAHL FUER SUBTR. NEGIEREN
        EX      DE,HL

        PUSH    HL
        LD      DE,FPWS+FDIVOR
        LD      BC,4
        LDIR                    ;UNTERE ZAHL ZWISCHENSPEICHERN
        EX      DE,HL
        DEC     HL
        LD      B,5             ;ANZAHL DIVISOR-STELLEN
FDLOOP1:
        PUSH    DE
        LD      A,(HL)
        DEC     HL
        LD      E,(HL)
        EX      AF,AF'
        LD      C,A
        EX      AF,AF'
        INC     C
        DEC     C
        JR      NZ,FDGOON1      ;WAR ZAHL < 0.990000EXX ?
        LD      E,A
        JR      FDGOON2

FDGOON1:
        PUSH    BC
        LD      B,2             ;2 DIGIT PRO BYTE
FDLOOP2:
        LD      D,10H
FDLOOP3:
        SLA     E
        RLA
        RL      D
        JR      NC,FDLOOP3      ;D-A-E UM EIN DIGIT SCHIEBEN
        INC     D
FDLOOP4:
        SUB     C
        DAA
        INC     E
        JR      NC,FDLOOP4
        DEC     D
        JR      NZ,FDLOOP4      ;TEILDIVISION DURCH SUBTRAKTION
        ADD     A,C
        DAA
        DEC     E
        DJNZ    FDLOOP2         ;EINZELQUOTIENTEN BERECHNEN

        POP     BC
FDGOON2:
        LD      C,E
        POP     DE
        INC     C
        DEC     C
        JR      Z,FDNEXT        ;EINZELQUOTIENT = 0 ?

        PUSH    HL
        DEC     HL
        DEC     HL
        CALL    FMULADD         ;SUBTRAKTION DURCHFUEHREN
        PUSH    DE
        LD      DE,FQUO-FDIVOR+4
        ADD     HL,DE           ;ZEIGER AUSRICHTEN
        LD      DE,FPWS+FACCU
        LD      A,C
        LD      (DE),A
        CALL    FADDITION       ;QUOTIENT AKKUMULIEREN
        POP     DE
        POP     HL
        INC     HL
        INC     B
FDNEXT:
        DJNZ    FDLOOP1         ;UND NOCH EINE RUNDE...

        LD      HL,(FPWS+FEXP1)
        LD      A,H
        SUB     L
        ADD     A,FEOFFS
        LD      HL,FPWS+FQUO+1
        LD      B,A
        LD      A,(FPWS+FQUO+4)
        AND     A
        JR      NZ,FDGOON3
        DEC     B
        DEC     B
        DEC     HL              ;EXPONENTEN-KORREKTUR
FDGOON3:

        LD      (IX+FPWS+FEXP1-MEMBEG),B        ;NEUER EXPONENT
        POP     DE
        JP      FCORR           ;ERGEBNIS KORRIGIEREN
;================================================================
        DB      'FNEGAT','E' OR CLAST
        DW      FDIV-1
        DB      7
FNEGATE:
        DW      $+2

        RSTPULL
        LD      A,D
        AND     A
        JR      Z,FNQUIT
        XOR     80H             ;ZAHLEN <> 0 NEGIEREN
FNQUIT:
        LD      D,A
        RSTPUSH
        JP      (IY)
;================================================================
        DB      'IN','T' OR CLAST
        DW      FNEGATE-1
        DB      3
INT:
        DW      $+2

        LD      HL,(SPARE)
        DEC     HL
        LD      DE,0            ;WERT LOESCHEN
INTLOOP:
        LD      A,(HL)          ;EXPONENT HOLEN
        RLCA
        CP      0+(FEOFFS+1) SHL 1
        JR      C,INTQUIT       ;ABS(ZAHL) < 1.0 ?

        XOR     A
        DEC     HL
        CALL    DECSTORE        ;UM EIN DIGIT LINKS SCHIEBEN
        INC     HL
        EX      DE,HL
        LD      B,H
        LD      C,L
        ADD     HL,HL
        ADD     HL,HL
        ADD     HL,BC
        ADD     HL,HL           ;WERT * 10
        LD      C,A
        LD      B,0
        ADD     HL,BC           ;HERAUSGESCHOBENES DIGIT ADDIEREN
        EX      DE,HL
        JR      INTLOOP

INTQUIT:
        DEC     HL
        DEC     HL
        LD      (HL),D
        DEC     HL
        LD      (HL),E
        LD      DE,IFN0NEG
        JP      NEXTDE          ;VORZEICHEN ANPASSEN
;================================================================
        DB      'UFLOA','T' OR CLAST
        DW      INT-1
        DB      6
UFLOAT:
        DW      $+2

        RSTPULL
        EX      DE,HL
        LD      BC,0 OR (16 SHL 8)
        LD      D,C
        LD      E,C
UFLOOP:
        ADD     HL,HL
        LD      A,E
        ADC     A,A
        DAA
        LD      E,A
        LD      A,D
        ADC     A,A
        DAA
        LD      D,A
        RL      C
        DJNZ    UFLOOP          ;IN BCD-ZAHL WANDELN

        RSTPUSH
        LD      D,FEOFFS+6
        LD      E,C
        RSTPUSH                 ;ZAHL SPEICHERN
        DEC     HL
        DEC     HL
        CALL    FZEROEQ         ;EXPONENT BEI 0 ANPASSEN
        JP      (IY)
;================================================================
;       ZEICHENSATZ
        DB      000H,000H,000H,000H
        DB      000H,000H,000H          ;........
                                        ;........
                                        ;........
                                        ;........
                                        ;........
                                        ;........
                                        ;........
        DB      010H,010H,010H,010H
        DB      000H,010H,000H          ;...*....
                                        ;...*....
                                        ;...*....
                                        ;...*....
                                        ;........
                                        ;...*....
                                        ;........
        DB      024H,024H,000H,000H
        DB      000H,000H,000H          ;..*..*..
                                        ;..*..*..
                                        ;........
                                        ;........
                                        ;........
                                        ;........
                                        ;........
        DB      024H,07EH,024H,024H
        DB      07EH,024H,000H          ;..*..*..
                                        ;.******.
                                        ;..*..*..
                                        ;..*..*..
                                        ;.******.
                                        ;..*..*..
                                        ;........
        DB      008H,03EH,028H,03EH
        DB      00AH,03EH,008H          ;....*...
                                        ;..*****.
                                        ;..*.*...
                                        ;..*****.
                                        ;....*.*.
                                        ;..*****.
                                        ;....*...
        DB      062H,064H,008H,010H
        DB      026H,046H,000H          ;.**...*.
                                        ;.**..*..
                                        ;....*...
                                        ;...*....
                                        ;..*..**.
                                        ;.*...**.
                                        ;........
        DB      010H,028H,010H,02AH
        DB      044H,03AH,000H          ;...*....
                                        ;..*.*...
                                        ;...*....
                                        ;..*.*.*.
                                        ;.*...*..
                                        ;..***.*.
                                        ;........
        DB      008H,010H,000H,000H
        DB      000H,000H,000H          ;....*...
                                        ;...*....
                                        ;........
                                        ;........
                                        ;........
                                        ;........
                                        ;........
        DB      004H,008H,008H,008H
        DB      008H,004H,000H          ;.....*..
                                        ;....*...
                                        ;....*...
                                        ;....*...
                                        ;....*...
                                        ;.....*..
                                        ;........
        DB      020H,010H,010H,010H
        DB      010H,020H,000H          ;..*.....
                                        ;...*....
                                        ;...*....
                                        ;...*....
                                        ;...*....
                                        ;..*.....
                                        ;........
        DB      000H,014H,008H,03EH
        DB      008H,014H,000H          ;........
                                        ;...*.*..
                                        ;....*...
                                        ;..*****.
                                        ;....*...
                                        ;...*.*..
                                        ;........
        DB      000H,008H,008H,03EH
        DB      008H,008H,000H          ;........
                                        ;....*...
                                        ;....*...
                                        ;..*****.
                                        ;....*...
                                        ;....*...
                                        ;........
        DB      000H,000H,000H,000H
        DB      008H,008H,010H          ;........
                                        ;........
                                        ;........
                                        ;........
                                        ;....*...
                                        ;....*...
                                        ;...*....
        DB      000H,000H,000H,03EH
        DB      000H,000H,000H          ;........
                                        ;........
                                        ;........
                                        ;..*****.
                                        ;........
                                        ;........
                                        ;........
        DB      000H,000H,000H,000H
        DB      018H,018H,000H          ;........
                                        ;........
                                        ;........
                                        ;........
                                        ;...**...
                                        ;...**...
                                        ;........
        DB      000H,002H,004H,008H
        DB      010H,020H,000H          ;........
                                        ;......*.
                                        ;.....*..
                                        ;....*...
                                        ;...*....
                                        ;..*.....
                                        ;........
        DB      03CH,046H,04AH,052H
        DB      062H,03CH,000H          ;..****..
                                        ;.*...**.
                                        ;.*..*.*.
                                        ;.*.*..*.
                                        ;.**...*.
                                        ;..****..
                                        ;........
        DB      018H,028H,008H,008H
        DB      008H,03EH,000H          ;...**...
                                        ;..*.*...
                                        ;....*...
                                        ;....*...
                                        ;....*...
                                        ;..*****.
                                        ;........
        DB      03CH,042H,002H,03CH
        DB      040H,07EH,000H          ;..****..
                                        ;.*....*.
                                        ;......*.
                                        ;..****..
                                        ;.*......
                                        ;.******.
                                        ;........
        DB      03CH,042H,00CH,002H
        DB      042H,03CH,000H          ;..****..
                                        ;.*....*.
                                        ;....**..
                                        ;......*.
                                        ;.*....*.
                                        ;..****..
                                        ;........
        DB      008H,018H,028H,048H
        DB      07EH,008H,000H          ;....*...
                                        ;...**...
                                        ;..*.*...
                                        ;.*..*...
                                        ;.******.
                                        ;....*...
                                        ;........
        DB      07EH,040H,07CH,002H
        DB      042H,03CH,000H          ;.******.
                                        ;.*......
                                        ;.*****..
                                        ;......*.
                                        ;.*....*.
                                        ;..****..
                                        ;........
        DB      03CH,040H,07CH,042H
        DB      042H,03CH,000H          ;..****..
                                        ;.*......
                                        ;.*****..
                                        ;.*....*.
                                        ;.*....*.
                                        ;..****..
                                        ;........
        DB      07EH,002H,004H,008H
        DB      010H,010H,000H          ;.******.
                                        ;......*.
                                        ;.....*..
                                        ;....*...
                                        ;...*....
                                        ;...*....
                                        ;........
        DB      03CH,042H,03CH,042H
        DB      042H,03CH,000H          ;..****..
                                        ;.*....*.
                                        ;..****..
                                        ;.*....*.
                                        ;.*....*.
                                        ;..****..
                                        ;........
        DB      03CH,042H,042H,03EH
        DB      002H,03CH,000H          ;..****..
                                        ;.*....*.
                                        ;.*....*.
                                        ;..*****.
                                        ;......*.
                                        ;..****..
                                        ;........
        DB      000H,000H,010H,000H
        DB      000H,010H,000H          ;........
                                        ;........
                                        ;...*....
                                        ;........
                                        ;........
                                        ;...*....
                                        ;........
        DB      000H,010H,000H,000H
        DB      010H,010H,020H          ;........
                                        ;...*....
                                        ;........
                                        ;........
                                        ;...*....
                                        ;...*....
                                        ;..*.....
        DB      000H,004H,008H,010H
        DB      008H,004H,000H          ;........
                                        ;.....*..
                                        ;....*...
                                        ;...*....
                                        ;....*...
                                        ;.....*..
                                        ;........
        DB      000H,000H,03EH,000H
        DB      03EH,000H,000H          ;........
                                        ;........
                                        ;..*****.
                                        ;........
                                        ;..*****.
                                        ;........
                                        ;........
        DB      000H,010H,008H,004H
        DB      008H,010H,000H          ;........
                                        ;...*....
                                        ;....*...
                                        ;.....*..
                                        ;....*...
                                        ;...*....
                                        ;........
        DB      03CH,042H,004H,008H
        DB      000H,008H               ;..****..
                                        ;.*....*.
                                        ;.....*..
                                        ;....*...
                                        ;........
                                        ;....*...
        DB      03CH,04AH,056H,05EH
        DB      040H,03CH               ;..****..
                                        ;.*..*.*.
                                        ;.*.*.**.
                                        ;.*.****.
                                        ;.*......
                                        ;..****..
        DB      03CH,042H,042H,07EH
        DB      042H,042H               ;..****..
                                        ;.*....*.
                                        ;.*....*.
                                        ;.******.
                                        ;.*....*.
                                        ;.*....*.
        DB      07CH,042H,07CH,042H
        DB      042H,07CH               ;.*****..
                                        ;.*....*.
                                        ;.*****..
                                        ;.*....*.
                                        ;.*....*.
                                        ;.*****..
        DB      03CH,042H,040H,040H
        DB      042H,03CH               ;..****..
                                        ;.*....*.
                                        ;.*......
                                        ;.*......
                                        ;.*....*.
                                        ;..****..
        DB      078H,044H,042H,042H
        DB      044H,078H               ;.****...
                                        ;.*...*..
                                        ;.*....*.
                                        ;.*....*.
                                        ;.*...*..
                                        ;.****...
        DB      07EH,040H,07CH,040H
        DB      040H,07EH               ;.******.
                                        ;.*......
                                        ;.*****..
                                        ;.*......
                                        ;.*......
                                        ;.******.
        DB      07EH,040H,07CH,040H
        DB      040H,040H               ;.******.
                                        ;.*......
                                        ;.*****..
                                        ;.*......
                                        ;.*......
                                        ;.*......
        DB      03CH,042H,040H,04EH
        DB      042H,03CH               ;..****..
                                        ;.*....*.
                                        ;.*......
                                        ;.*..***.
                                        ;.*....*.
                                        ;..****..
        DB      042H,042H,07EH,042H
        DB      042H,042H               ;.*....*.
                                        ;.*....*.
                                        ;.******.
                                        ;.*....*.
                                        ;.*....*.
                                        ;.*....*.
        DB      03EH,008H,008H,008H
        DB      008H,03EH               ;..*****.
                                        ;....*...
                                        ;....*...
                                        ;....*...
                                        ;....*...
                                        ;..*****.
        DB      002H,002H,002H,042H
        DB      042H,03CH               ;......*.
                                        ;......*.
                                        ;......*.
                                        ;.*....*.
                                        ;.*....*.
                                        ;..****..
        DB      044H,048H,070H,048H
        DB      044H,042H               ;.*...*..
                                        ;.*..*...
                                        ;.***....
                                        ;.*..*...
                                        ;.*...*..
                                        ;.*....*.
        DB      040H,040H,040H,040H
        DB      040H,07EH               ;.*......
                                        ;.*......
                                        ;.*......
                                        ;.*......
                                        ;.*......
                                        ;.******.
        DB      042H,066H,05AH,042H
        DB      042H,042H               ;.*....*.
                                        ;.**..**.
                                        ;.*.**.*.
                                        ;.*....*.
                                        ;.*....*.
                                        ;.*....*.
        DB      042H,062H,052H,04AH
        DB      046H,042H               ;.*....*.
                                        ;.**...*.
                                        ;.*.*..*.
                                        ;.*..*.*.
                                        ;.*...**.
                                        ;.*....*.
        DB      03CH,042H,042H,042H
        DB      042H,03CH               ;..****..
                                        ;.*....*.
                                        ;.*....*.
                                        ;.*....*.
                                        ;.*....*.
                                        ;..****..
        DB      07CH,042H,042H,07CH
        DB      040H,040H               ;.*****..
                                        ;.*....*.
                                        ;.*....*.
                                        ;.*****..
                                        ;.*......
                                        ;.*......
        DB      03CH,042H,042H,052H
        DB      04AH,03CH               ;..****..
                                        ;.*....*.
                                        ;.*....*.
                                        ;.*.*..*.
                                        ;.*..*.*.
                                        ;..****..
        DB      07CH,042H,042H,07CH
        DB      044H,042H               ;.*****..
                                        ;.*....*.
                                        ;.*....*.
                                        ;.*****..
                                        ;.*...*..
                                        ;.*....*.
        DB      03CH,040H,03CH,002H
        DB      042H,03CH               ;..****..
                                        ;.*......
                                        ;..****..
                                        ;......*.
                                        ;.*....*.
                                        ;..****..
        DB      0FEH,010H,010H,010H
        DB      010H,010H               ;*******.
                                        ;...*....
                                        ;...*....
                                        ;...*....
                                        ;...*....
                                        ;...*....
        DB      042H,042H,042H,042H
        DB      042H,03EH               ;.*....*.
                                        ;.*....*.
                                        ;.*....*.
                                        ;.*....*.
                                        ;.*....*.
                                        ;..*****.
        DB      042H,042H,042H,042H
        DB      024H,018H               ;.*....*.
                                        ;.*....*.
                                        ;.*....*.
                                        ;.*....*.
                                        ;..*..*..
                                        ;...**...
        DB      042H,042H,042H,042H
        DB      05AH,024H               ;.*....*.
                                        ;.*....*.
                                        ;.*....*.
                                        ;.*....*.
                                        ;.*.**.*.
                                        ;..*..*..
        DB      042H,024H,018H,018H
        DB      024H,042H               ;.*....*.
                                        ;..*..*..
                                        ;...**...
                                        ;...**...
                                        ;..*..*..
                                        ;.*....*.
        DB      082H,044H,028H,010H
        DB      010H,010H               ;*.....*.
                                        ;.*...*..
                                        ;..*.*...
                                        ;...*....
                                        ;...*....
                                        ;...*....
        DB      07EH,004H,008H,010H
        DB      020H,07EH               ;.******.
                                        ;.....*..
                                        ;....*...
                                        ;...*....
                                        ;..*.....
                                        ;.******.
        DB      00EH,008H,008H,008H
        DB      008H,00EH               ;....***.
                                        ;....*...
                                        ;....*...
                                        ;....*...
                                        ;....*...
                                        ;....***.
        DB      000H,040H,020H,010H
        DB      008H,004H               ;........
                                        ;.*......
                                        ;..*.....
                                        ;...*....
                                        ;....*...
                                        ;.....*..
        DB      070H,010H,010H,010H
        DB      010H,070H               ;.***....
                                        ;...*....
                                        ;...*....
                                        ;...*....
                                        ;...*....
                                        ;.***....
        DB      010H,038H,054H,010H
        DB      010H,010H               ;...*....
                                        ;..***...
                                        ;.*.*.*..
                                        ;...*....
                                        ;...*....
                                        ;...*....
        DB      000H,000H,000H,000H
        DB      000H,000H,0FFH          ;........
                                        ;........
                                        ;........
                                        ;........
                                        ;........
                                        ;........
                                        ;********
        DB      01CH,022H,078H,020H
        DB      020H,07EH,000H          ;...***..
                                        ;..*...*.
                                        ;.****...
                                        ;..*.....
                                        ;..*.....
                                        ;.******.
                                        ;........
        DB      000H,038H,004H,03CH
        DB      044H,03EH,000H          ;........
                                        ;..***...
                                        ;.....*..
                                        ;..****..
                                        ;.*...*..
                                        ;..*****.
                                        ;........
        DB      020H,020H,03CH,022H
        DB      022H,03CH,000H          ;..*.....
                                        ;..*.....
                                        ;..****..
                                        ;..*...*.
                                        ;..*...*.
                                        ;..****..
                                        ;........
        DB      000H,01CH,020H,020H
        DB      020H,01CH,000H          ;........
                                        ;...***..
                                        ;..*.....
                                        ;..*.....
                                        ;..*.....
                                        ;...***..
                                        ;........
        DB      004H,004H,03CH,044H
        DB      044H,03EH,000H          ;.....*..
                                        ;.....*..
                                        ;..****..
                                        ;.*...*..
                                        ;.*...*..
                                        ;..*****.
                                        ;........
        DB      000H,038H,044H,078H
        DB      040H,03CH,000H          ;........
                                        ;..***...
                                        ;.*...*..
                                        ;.****...
                                        ;.*......
                                        ;..****..
                                        ;........
        DB      00CH,010H,018H,010H
        DB      010H,010H,000H          ;....**..
                                        ;...*....
                                        ;...**...
                                        ;...*....
                                        ;...*....
                                        ;...*....
                                        ;........
        DB      000H,03CH,044H,044H
        DB      03CH,004H,038H          ;........
                                        ;..****..
                                        ;.*...*..
                                        ;.*...*..
                                        ;..****..
                                        ;.....*..
                                        ;..***...
        DB      040H,040H,078H,044H
        DB      044H,044H,000H          ;.*......
                                        ;.*......
                                        ;.****...
                                        ;.*...*..
                                        ;.*...*..
                                        ;.*...*..
                                        ;........
        DB      010H,000H,030H,010H
        DB      010H,038H,000H          ;...*....
                                        ;........
                                        ;..**....
                                        ;...*....
                                        ;...*....
                                        ;..***...
                                        ;........
        DB      004H,000H,004H,004H
        DB      004H,024H,018H          ;.....*..
                                        ;........
                                        ;.....*..
                                        ;.....*..
                                        ;.....*..
                                        ;..*..*..
                                        ;...**...
        DB      020H,028H,030H,030H
        DB      028H,024H,000H          ;..*.....
                                        ;..*.*...
                                        ;..**....
                                        ;..**....
                                        ;..*.*...
                                        ;..*..*..
                                        ;........
        DB      010H,010H,010H,010H
        DB      010H,00CH,000H          ;...*....
                                        ;...*....
                                        ;...*....
                                        ;...*....
                                        ;...*....
                                        ;....**..
                                        ;........
        DB      000H,068H,054H,054H
        DB      054H,054H,000H          ;........
                                        ;.**.*...
                                        ;.*.*.*..
                                        ;.*.*.*..
                                        ;.*.*.*..
                                        ;.*.*.*..
                                        ;........
        DB      000H,078H,044H,044H
        DB      044H,044H,000H          ;........
                                        ;.****...
                                        ;.*...*..
                                        ;.*...*..
                                        ;.*...*..
                                        ;.*...*..
                                        ;........
        DB      000H,038H,044H,044H
        DB      044H,038H,000H          ;........
                                        ;..***...
                                        ;.*...*..
                                        ;.*...*..
                                        ;.*...*..
                                        ;..***...
                                        ;........
        DB      000H,078H,044H,044H
        DB      078H,040H,040H          ;........
                                        ;.****...
                                        ;.*...*..
                                        ;.*...*..
                                        ;.****...
                                        ;.*......
                                        ;.*......
        DB      000H,03CH,044H,044H
        DB      03CH,004H,006H          ;........
                                        ;..****..
                                        ;.*...*..
                                        ;.*...*..
                                        ;..****..
                                        ;.....*..
                                        ;.....**.
        DB      000H,01CH,020H,020H
        DB      020H,020H,000H          ;........
                                        ;...***..
                                        ;..*.....
                                        ;..*.....
                                        ;..*.....
                                        ;..*.....
                                        ;........
        DB      000H,038H,040H,038H
        DB      004H,078H,000H          ;........
                                        ;..***...
                                        ;.*......
                                        ;..***...
                                        ;.....*..
                                        ;.****...
                                        ;........
        DB      010H,038H,010H,010H
        DB      010H,00CH,000H          ;...*....
                                        ;..***...
                                        ;...*....
                                        ;...*....
                                        ;...*....
                                        ;....**..
                                        ;........
        DB      000H,044H,044H,044H
        DB      044H,03CH,000H          ;........
                                        ;.*...*..
                                        ;.*...*..
                                        ;.*...*..
                                        ;.*...*..
                                        ;..****..
                                        ;........
        DB      000H,044H,044H,028H
        DB      028H,010H,000H          ;........
                                        ;.*...*..
                                        ;.*...*..
                                        ;..*.*...
                                        ;..*.*...
                                        ;...*....
                                        ;........
        DB      000H,044H,054H,054H
        DB      054H,028H,000H          ;........
                                        ;.*...*..
                                        ;.*.*.*..
                                        ;.*.*.*..
                                        ;.*.*.*..
                                        ;..*.*...
                                        ;........
        DB      000H,044H,028H,010H
        DB      028H,044H,000H          ;........
                                        ;.*...*..
                                        ;..*.*...
                                        ;...*....
                                        ;..*.*...
                                        ;.*...*..
                                        ;........
        DB      000H,044H,044H,044H
        DB      03CH,004H,038H          ;........
                                        ;.*...*..
                                        ;.*...*..
                                        ;.*...*..
                                        ;..****..
                                        ;.....*..
                                        ;..***...
        DB      000H,07CH,008H,010H
        DB      020H,07CH,000H          ;........
                                        ;.*****..
                                        ;....*...
                                        ;...*....
                                        ;..*.....
                                        ;.*****..
                                        ;........
        DB      00EH,008H,030H,030H
        DB      008H,00EH,000H          ;....***.
                                        ;....*...
                                        ;..**....
                                        ;..**....
                                        ;....*...
                                        ;....***.
                                        ;........
        DB      008H,008H,008H,008H
        DB      008H,008H,000H          ;....*...
                                        ;....*...
                                        ;....*...
                                        ;....*...
                                        ;....*...
                                        ;....*...
                                        ;........
        DB      070H,010H,00CH,00CH
        DB      010H,070H,000H          ;.***....
                                        ;...*....
                                        ;....**..
                                        ;....**..
                                        ;...*....
                                        ;.***....
                                        ;........
        DB      032H,04CH,000H,000H
        DB      000H,000H,000H          ;..**..*.
                                        ;.*..**..
                                        ;........
                                        ;........
                                        ;........
                                        ;........
                                        ;........
        DB      03CH,042H,099H,0A1H
        DB      0A1H,099H,042H,03CH     ;..****..
                                        ;.*....*.
                                        ;*..**..*
                                        ;*.*....*
                                        ;*.*....*
                                        ;*..**..*
                                        ;.*....*.
                                        ;..****..
ROMCHR:
;================================================================
        DB      0FFH
        DW      UFLOAT-1
        DB      000H
;================================================================
        END