;******************************************************************
;***                                                            ***
;***  PROF-181x Monitor Version: 1.5                            ***
;***                                                            ***
;***  letzte Aenderung am: 24.08.1985      (c) Joachim Hanst    ***
;***  reverse engineering: 27.10.2014          S. Sader         ***
;******************************************************************
;
;                   TITLE     'PROF-181x MONITOR VERSION 1.5'
;
;
;
;                   MACLIB    Z80
;                   MACLIB    CDEF      ;BENUTZE CDEF.LIB FUER ALLE C-SYSTEM MODULE
;


; Byte References


JA:                   EQU       -1
NEIN:                 EQU       NOT JA

BELL:                 EQU       07H            ; bell
LF:                   EQU       0AH            ; linefeed
FF:                   EQU       0CH            ; formfeed
CR:                   EQU       0DH            ; carriage return
ESC:                  EQU       1BH            ; esc
CNGPRMT:              EQU       '-'            ; AENDERN-PROMPT
EPROM:                EQU       0
MASK_INDEX:           EQU       20H            ; MASKE ZUM FILTERN INDEX-PULSE
MASK_MOT:             EQU       80H            ; MASKE FUER MOTOR EIN/BUSY



                                               ; *********************************
                                               ; *** PARALLEL AUSGABE PORT 74LS259
                                               ; *** -----------------------------

P_TIME_OUT:           EQU       0D8H           ; UHR AUSGABE (74LS259)

PCF_WRITE_CMD:        EQU       0A2H           ; I2C-BEFEHL FUER SCHREIBEN DER REGISTER
PCF_READ_CMD:         EQU       0A3H           ; I2C-BEFEHL FUER LESEN DER REGISTER

P_LS259:              EQU       0D8H           ; 

CONTR:                EQU       0D8h           ; 
STAT:                 EQU       0D9h           ;  

                                               ; MASKEN ZUM SETZEN/RUECKSETZEN
                                               ; DER PINS BEIM LS259
PAD_SET:              EQU       01H            ; BIT SETZEN (MIT OR)
PAD_RESET:            EQU       0FEH           ; BIT ZURÜCKSETZEN (MIT AND)

                                               ; ADRESSEN DER EINZELNEN BITS
                                               ; BEACHTE, DASS IMMER ZWEI BITS
                                               ; GESETZT WERDEN
PAD_DATA:             EQU       00H            ; DATA SETZEN/RUECKSETZEN
PAD_M0:               EQU       02H            ; M0 SETZEN/RUECKSETZEN
PAD_M1:               EQU       04H            ; M1 SETZEN/RUECKSETZEN
PAD_MINI:             EQU       06H            ; MINI SETZEN/RUECKSETZEN
PAD_SEL:              EQU       08H            ; SEL SETZEN/RUECKSETZEN
PAD_SCL:              EQU       0AH            ; SCL SETZEN/RUECKSETZEN
PAD_STB:              EQU       0CH            ; STB SETZEN/RUECKSETZEN
PAD_MM0:              EQU       0EH            ; MM0 SETZEN/RUECKSETZEN


                                               ; *****************************************************************
                                               ; *** FLOPPY-CONTROLER
                                               ; *** ----------------

FDC:                  EQU       0DCH           ; FLOPPY CONTROLER STATUS
FDD:                  EQU       0DDH           ; FLOPPY CONTROLER DATEN
                                               ;
HLO:                  EQU       240            ; HEADLOADTIME   IN MS
SRT:                  EQU       6              ; STEPRATE       IN MS
HUT:                  EQU       240            ; HEADUNLOADTIME IN MS
                                               ;
HLOS:                 EQU       ((HLO)/2)*2    ; DIESE DREI EINTRAEGE
HUTS:                 EQU       (HUT+15)/16    ; NICHT
SRTS:                 EQU       16-SRT         ; VERAENDERN

                                               ; *****************************************************************
                                               ; *** GRIP-PORTS
                                               ; *** ----------

GRIPC:                EQU       0C0H           ; GRAFIK-KARTE
GRIPD:                EQU       0C1H           ;
                                               ;
GRIPIN_MASK:          EQU       80H            ;
GRIPOUT_MASK:         EQU       40H            ;
     


0FFH:     EQU       0FFh      ;  -1
B_40:     EQU       40h       ;  '@'  64
B_04:     EQU       04h       ;  4
B_08:     EQU       08h       ;  8
B_02:     EQU       02h       ;  2
B_06:     EQU       06h       ;  6
B_03:     EQU       03h       ;  3
B_0F:     EQU       0Fh       ;  15
B_2F:     EQU       2Fh       ;  '/'  47
B_0D:     EQU       0DH       ;  13
B_1B:     EQU       1Bh       ;  27
B_0A:     EQU       0AH       ;  10
B_20:     EQU       20h       ;  ' '  32
B_F0:     EQU       0F0h      ;  'p'+128  -16
B_30:     EQU       30h       ;  '0'  48
B_09:     EQU       09h       ;  9
B_01:     EQU       01h       ;  1
B_60:     EQU       60h       ;  '`'  96

B_3F:     EQU       3Fh       ;  '?'  63

B_0E:     EQU       0Eh       ;  14



; Displacement References

SYSTEMPAGE: EQU      0FF00H

; Undefined Label References 
;   (probably from data as program; or, to OUTsiDE program area)



L_103B:               EQU       103Bh     ; Undefined label
L_FD80:               EQU       0FD80h    ; Undefined label
L_FC00:               EQU       0FC00h    ; Undefined label







                      DEFSEGMENT "CSEG",0,01FFFFH,"PMON181ROM"
                      DEFSEGMENT "DSEG",0,0FFFFFH,"PMON181RAM"
 
                      SEGMENT   "CSEG"
                      ORG       EPROM


MONITOR:
;
; SPRUNGVEKTOR FUER MONITOR SERVICE-ROUTINEN
;

                      JP        INIT              ;MONITOR-EINGANG NACH RESET   
CS:                   JP        CONST             ;CONSOLEN STATUS,EIN-UND AUSGABE
CI:                   JP        CONIN             ;GEHEN ERST UEBER SPRUNG IM RAM
CO:                   JP        CONOUT            ;AUF IHRE VERTEILER
                      JP        BOOTERR           ;DRUCKE FEHLERMELDUNG
                      JP        SETCMDT           ;SETZE CMDTAB ENTSPRECHEND TEST
                      JP        RECAL             ;SETZE AUSGEWAEHLETES DRIVE AUF TRACK 0
                      JP        READ              ;LESE DISK
                      JP        WRITE             ;SCHREIBE DISK
                      JP        TEST              ;TESTE DISK-FORMAT
                      JP        MOTO              ;WARTE AUF READY UND GEBE DISK-BEFEHL
                      JP        CMFD              ;SENDE DISK-BEFEHL OHNE READY
                      JP        RESULT            ;ERGEBNISPHASE DES FDC9268
                      JP        SEEK              ;POSITIONIERE AUF SPUR
                      JP        NEXT              ;LESE EIN RESULT-BYTE AUS FDC9268
GRAFIN:               JP        GRAF_IN           ;VIDEO KARTE EINGABE
GRAFOUT:              JP        GRAF_OUT          ;VIDEO KARTE AUSGABE
GRAFIST:              JP        GRAF_IST          ;VIDEO KARTE EIN STATUS
SERNR:                DEFW      9961              ;SERIEN NUMMER
RSTART7:              JP        RST_VERTEILER     ;RST 7 EINSPRUNG (MUSS 38H SEIN)
GRAFOST:              JP        GRAF_OST          ;VIDEO KARTE AUS STATUS
SOFTIN:               JP        SOFT_IN           ;SOFT SCHNITTSTELLE EINGABE
SOFTOUT:              JP        SOFT_OUT          ;SOFT SCHNITTSTELLE AUSGABE
SOFTIST:              JP        SOFT_IST          ;SOFT SCHNITTSTELLE EIN STATUS
SOFTOST:              JP        SOFT_OST          ;SOFT SCHNITTSTELLE AUS STATUS
USER1IN:              JP        USER1_IN          
USER1OUT:             JP        USER1_OUT         
USER1IST:             JP        USER1_IST         
USER1OST:             JP        USER1_OST         
USER2IN:              JP        USER2_IN          
USER2OUT:             JP        USER2_OUT         
USER2IST:             JP        USER2_IST         
USER2OST:             JP        USER2_OST         
USERINIT:             NOP                         ;BENUTZER INITIALISIERUNG
                      NOP
                      RET
VERSIONNR:            DEFB      015H            ;VERSIONS NUMMER
                      JP        RST_VERTEILER
                      JP        DISKERR
                      NOP
                      NOP
                      RET
                      LD        A,0
                      RET
                      JP        SET_PHYS_TIME     ;SETZE ZEIT
                      JP        READ_PHYS_TIME    ;LESE ZEIT
                      JP        MSER1INIT
                      JP        MSER2INIT
                      JP        INIT_FDC
                      JP        LOG_PHYS
                      JP        USER_BYTES_WRITE
                      JP        MAXI_SET
                      JP        MINI_SET
                      JP        SET_PRECOM_1


EPR_BOOT:             DEFW      BCMD_8         ; Hier wird die Bootadresse für EPROM eingetragen
                                               ; als Default steht hier Sprung zur Fehlermeldung
PATCH:                DEFW      0000h
                      DEFW      W_0096
W_0096:               DEFW      06C24h

                                               ;---------------------------EIN-AUSGABEROUTINEN-----



GRAF_IST:
                                               ; TERMINAL EINGABE STATUS
                                               ; AKKU 0 UND Z WENN KEIN ZEICHEN
                                               ; AKKU FF UN NZ WENN ZEICHEN
                      IN        A,(GRIPC)
                      AND       GRIPIN_MASK
                      RET       Z
                      LD        A,0FFH
                      OR        A              ; RESET ZERROFLAG
                      RET

GRAF_OST:
                                               ; TERMINAL AUSGABE STATUS
                      IN        A,(GRIPC)
                      AND       GRIPOUT_MASK
                      RET       Z
                      LD        A,0FFH
                      OR        A
                      RET


GRAF_IN:
                                               ; TERMINAL EINGABE
                      IN        A,(GRIPC)
                      AND       GRIPIN_MASK    ; ZEICHEN DA ?
                      JR        Z,GRAF_IN      ; WARTE AUF ZEICHEN
                      IN        A,(GRIPD)
                      RET


GRAF_OUT:
                                               ; TERMINAL AUSGABE
                      IN        A,(GRIPC)
                      AND       GRIPOUT_MASK
                      JR        Z,GRAF_OUT     ; WARTE BIS BUFFER LEER
                      LD        A,C            ; AUSGABE ZEICHEN NACH A
                      OUT       (GRIPD),A
                      RET


SOFT_IN:
USER1_IN:
USER2_IN:

                      IN0       A,(04H)        ; ASCI Status Register Ch 0
                      AND       80H
                      JR        Z,SOFT_IN
                      IN0       A,(08H)        ; ASCI Receive Data Register Ch 0
                      RET

SOFT_OUT:
USER1_OUT:
USER2_OUT:

                      IN0       A,(04H)        ; ASCI Status Register Ch 0
                      AND       02H
                      JR        Z,SOFT_OUT
                      LD        A,C
                      OUT0      (06H),A        ; ASCI Transmit Data Register Ch 0
                      RET

SOFT_IST:
USER1_IST:
USER2_IST:

                      IN0       A,(04H)        ; ASCI Status Register Ch 0
                      AND       80H
                      RET       Z
                      OR        0FFH
                      RET

SOFT_OST:
USER1_OST:
USER2_OST:

                      IN0       A,(04H)        ; ASCI Status Register Ch 0
                      AND       02H
                      RET       Z
                      OR        0FFH
                      RET


MSER1INIT:            CALL      MSERINIT
                      IN0       A,(02H)        ; ASCI Control Register B Ch 0
                      AND       0D0H
                      OR        C
                      OUT0      (02H),A        ; ASCI Control Register B Ch 0
                      RET


MSER2INIT:            CALL      MSERINIT
                      IN0       A,(03H)        ; ASCI Control Register B Ch 1
                      AND       0D0H
                      OR        C
                      OUT0      (03H),A        ; ASCI Control Register B Ch 1
                      RET


MSERINIT:             AND       0FH
                      LD        L,A            ; GERAET 0 .. 15 ?
                      LD        H,0
                      LD        DE,SER_INIT_TAB
                      ADD       HL,DE
                      LD        A,(HL)         ; INIT-PARAMETER
                      AND       2FH            ; MASKIEREN
                      LD        C,A            ; ZURUECKGEBEN
                      RET

SER_INIT_TAB:         DEFB      000h,000h,000h,000h,000h,000h,000h,000h
                      DEFB      000h,000h,000h,000h,000h,000h,000h,000h

;-----------------------------------------------

SOUT:                                          ; GEBE STRING AUS
                                               ; ANFANG IN HL, ENDE DURCH 24HEX
                      LD        A,(HL)         ; LESE ZEICHEN
                      CP        '$'            ; STRING ENDE
                      RET       Z              ; RETURN WENN
                      LD        C,A            ; IN C FUER AUSGABE
                      CALL      CO             ; GEBE ZEICHEN AUF CONSOLE
                      INC       HL             ; ZEIGER AUF NAECHSTES ZEICHEN
                      JR        SOUT           ; WIEDERHOLE

;-----------------------------------------------

CROUT:                                         ; GEBE NEUE ZEILE AUS
                      PUSH      BC
                      LD        C,0DH          ; CR
                      CALL      CECHO
                      POP       BC
                      RET

;-----------------------------------------------

CECHO:                                         ; ZEICHEN IN C AUSGEBEN
                      PUSH      BC
                      LD        B,C
                      LD        A,1BH          ; ESC?
                      CP        B
                      JR        NZ,ECH05       ; NEIN
                      LD        C,'$'          ; STATTDESSEN "$" AUSGEBEN
ECH05:                CALL      CO
                      LD        A,0DH          ; ENTER?
                      CP        B
                      JR        NZ,ECH10       ; NEIN
                      LD        C,0AH          ; STATTDESSEN LF AUSGEBEN
                      CALL      CO
ECH10:                POP       BC
                      LD        A,C            ; EVTL. ALTERNATIVZEICHEN ZURUECKGEBEN
                      RET

;-----------------------------------------------

GETCH1:                                        ; LESE EIN ZEICHEN VON KONSOLE, UND WANDLE IN GROSSBUCHSTABEN
                      CALL      GETCH
                      CP        'a'
                      RET       C              ; SCHON GROßBUCHSTABE
                      SUB       'a'-'A'        ; IN GROßBUCHSTABEN WANDELN
                      LD        C,A            ; NACH C
                      RET

;-----------------------------------------------

GETCH:
                      CALL      CI
                      AND       7FH            ; SONDERZEICHEN > 127 AUSBLENDEN
                      LD        C,A            ; NACH C
                      RET

;-----------------------------------------------

DEZOUT:                                        ; WANDLE AKKU IN DEZIMALZAHL UND GEBE AUS
                      OR        A              ; AKKU NULL
                      JR        Z,DEZOUT2      ; DANN IST SCHON ALLES OK
                      LD        B,A
                      XOR       A
DEZOUT1:
                      INC       A
                      DAA
                      DJNZ      DEZOUT1
DEZOUT2:
                      CALL      NMOUT
                      RET

;-----------------------------------------------

HLOUT:                                         ; INHALT VON HL (16 BIT) AUSGEBEN
                      LD        A,H
                      CALL      NMOUT
                      LD        A,L

;-----------------------------------------------

NMOUT:                                         ; INHALT VON A (8 BIT) AUSGEBEN
                      PUSH      HL             ; REGISTER RETTEN
                      PUSH      BC
                      PUSH      AF
                      RRCA                     ; OBERE 4 BIT 
                      RRCA
                      RRCA
                      RRCA
                      AND       0FH
                      LD        C,A
                      CALL      PRVAL          ; WANDELN IN ASCII
                      CALL      CECHO          ; AUSGEBEN
                      POP       AF
                      AND       0FH            ; UNTERE 4 BIT
                      LD        C,A
                      CALL      PRVAL          ; WANDELN IN ASCII
                      CALL      CECHO          ; AUSGEBEN
                      POP       BC             ; REGISTER ZURUECK RETTEN
                      POP       HL
                      RET

;-----------------------------------------------

PRVAL:                                         ; WERT IN C ALS ASCII 
                      PUSH      AF             ; WANDELN
                      LD        A,C
                      OR        0F0H
                      DAA
                      ADD       A,0A0H
                      ADC       A,040H
                      LD        C,A            ; IN C ZURUECKGEBEN
                      POP       AF
                      RET

;-----------------------------------------------

PRINT_DRIVE:
                                               ; GIBT DEN LAUFWERK BUCHSTABEN UND EIN BLANK AUF DER
                                               ; KONSOLE AUS
                      LD        A,(UNIT)       ; WELCHES LAUFWERK?
                      CALL      LOG_PHYS
                      ADD       A,'A'          ; WANDLE IN ASCII
                      LD        C,A
                      CALL      CO
                      LD        C,' '
                      CALL      CO
                      RET

;-----------------------------------------------

LOG_PHYS:                                      ; LOGISCHES IN PHYSISCHES LAUFWERK UMRECHNEN
                      AND       03H            ; UNIT MASKIEREN
                      JR        NZ,LOG_PHYS1   ; KEINE AENDERUNG NOTWENDIG 
                      LD        A,(TEMP_LOG_DRIVE)
                      AND       03H
                      RET
LOG_PHYS1:
                      PUSH      BC
                      LD        C,A
                      LD        A,(TEMP_LOG_DRIVE)
                      AND       03H
                      CP        C
                      JR        NZ,LOG_PHYS2
                      LD        C,0            ; KEINE AENDERUNG NOTWENDIG
LOG_PHYS2:
                      LD        A,C            ; GIB KORRIGIERTES LAUFWERK ZURUECK
                      POP       BC
                      RET

;-----------------------------------------------

SETCMDT:
                                               ; NEHME WERTE AUS TEST_TYPE UND TEST_MSEK
                                               ; UND TRAGE SIE IN CMDTAB EIN

                      LD        A,(TEST_MSEK)  ; ANZAHL DER SEKTOREN/SPUR
                      LD        (EOT),A
                      LD        A,(TEST_TYPE)  ; LADE TEST_TYPE
                      LD        C,A            ; UND RETTE IN C
                      AND       40H            ; MASKIERE UND
                      LD        (CMDTAB),A     ; SETZE MFM BIT IN CMDTAB
                      LD        A,C
                      AND       03H            ; SETZE SEKTORGROESSE
                      LD        (SECSZ),A
                      OR        A
                      LD        A,0FFH         ; SETZE DTL AUF 80 BEI 128 BYTES/SEKTOR
                      JR        NZ,CMDS1       ; SONST AUF 0FFH
                      LD        A,80H
CMDS1:                LD        (DTLL),A
                      LD        A,C            ; SETZE GAP-LAENGE IN ABHAENGIGKEIT
                      AND       03H            ; VON DER SEKTORGROESSE
                      LD        C,A
                      LD        B,0
                      LD        HL,GAPTAB
                      ADD       HL,BC
                      LD        A,(HL)
                      LD        (GAPLL),A
                      RET

GAPTAB:                                        ; DIESE TABELLE GIBT DIE GAPLAENGE FUER JEDE
                                               ; SEKTORGROESE AN
                      DEFB      007H           ; GAPLAENGE FUER  128 BYTES/SEKTOR
                      DEFB      00EH           ; GAPLAENGE FUER  256 BYTES/SEKTOR
                      DEFB      01BH           ; GAPLAENGE FUER  512 BYTES/SEKTOR
                      DEFB      035H           ; GAPLAENGE FUER 1024 BYTES/SEKTOR

;-----------------------------------------------

DELAY_HL:             LD        A,L            ; WERT UEBERPRUEFEN
                      OR        H              ; HL=0 ?
                      RET       Z              ; HL=0 -> RÜCKSPRUNG

                      PUSH      HL             ; ZAEHLER RETTEN
                      LD        A,(SPEED)     ; TAKTKENNUNG
                      LD        L,A
                      LD        H,07H
                      MLT       HL             ; 7*EINGANGSWERT
DELAY_HL1:            DEC       HL
                      LD        A,L
                      OR        H              ; HL=0 ?
                      JR        NZ,DELAY_HL1
                      POP       HL             ; ZAEHLER ZURUECK
                      DEC       HL             ; HERUNTERZAEHLEN
                      JR        DELAY_HL       ; WEITER VERZOEGERN 

;-----------------------------------------------

INIT_FDC:             LD        HL,(UNIT)      ; FDC INIT-WERTE SETZEN
                      PUSH      HL
                      LD        A,L
                      AND       03H            ; LAUFWERK MASKIEREN
                      LD        L,A
                      LD        H,0
                      ADD       HL,HL          ; * 2
                      LD        DE,SPECD_WORD
                      ADD       HL,DE          ; LAUFWERKKENNUNG BESTIMMEN
                      LD        A,(HL)
                      INC       HL
                      LD        H,(HL)
                      LD        L,A
                      LD        A,(LAST_FDC_SPEED)
                      OR        A
                      JR        NZ,INIT_FDC_1
                      SRL       H
                      INC       H
                      SCF
                      RR        L
                      RES       3,L
                      LD        A,0
                      ADC       A,L
                      LD        L,A
INIT_FDC_1:           RES       0,H
                      LD        BC,W_0303       ; INITIALISIERUNGSWERTE ZUM CONTROLLER 
                      LD        (UNIT),HL       ; SENDEN
                      CALL      CMFD
                      POP       HL
                      LD        (UNIT),HL
                      RET



INIFDC:
                                               ; SOFT RESET DES FDC9268
                                               ; FALLS KEIN FLOPPY CONTROLLER VORHANDEN IST,
                                               ; WIRD DISKFLG AUF 00H GESETZT, SONST AUF FFH
                                               ; Bit:  7  6  5  4  3  2  1  0
                                               ;       ^  ^  ^  ^  ^  ^  ^  ^
                                               ;       |  |  |  |  |  |  |  |
                                               ;       |  |  |  |  |  |  |  `---- FDD 0 busy
                                               ;       |  |  |  |  |  |  `------- FDD 1 busy
                                               ;       |  |  |  |  |  `---------- FDD 2 busy
                                               ;       |  |  |  |  `------------- FDD 3 busy
                                               ;       |  |  |  `---------------- FDC busy
                                               ;       |  |  `------------------- Execution mode
                                               ;       |  `---------------------- Data input/Output 0 => CPU to FDC / 1 => FDC to CPU
                                               ;       `------------------------- Request for Master => Ready
                                               ;
                      LD        A,0FFH         ; DEFAULT FUER FLOPPY-CONTROLE IST DA
                      LD        (DISKFLG),A
                      LD        HL,0000H       ; SETZE ZAEHLER
INIFDC1:              DEC       H              ; ERNIEDRIGE ZAEHLER
                      IN        A,(FDC)
                      CP        80H            ; REQUEST FOR MASTER
                      RET       Z              ; OK CONTROLLER DA
                      IN        A,(FDD)        ; LESE DATEN
                      LD        A,H            ; IST ZAEHLER NULL
                      OR        L
                      JR        NZ,INIFDC1     ; NEIN, NEUER VERSUCH
                      LD        (DISKFLG),A    ; KEIN FLOPPYCONTROLLER DA, DISKFLG=00H
                      RET




RECAL:                CALL      MOT_ON_TMR      ; SETZE MOTOR_ON PAD
                      CALL      INIT_FDC       ; INITIALISIERUNGSWERTE AN FDC

                      XOR       A              ; AKKU = 0
                      LD        (ALT_TRACK),A  ; VORSICHTSHALBER AUF SPUR 0 SETZEN
                      LD        A,(UNIT)       ; ALTE UNIT RETTEN
                      LD        (ALT_UNIT),A

                      LD        B,4            ; VIER VERSUCHE
RECAL2:               PUSH      BC
                      CALL      RECAL1
                      CALL      SENSD
                      AND       10H            ; TRACK NULL ERREICHT?
                      POP       BC
                      RET       NZ             ; RUECKSPRUNG WENN EREICHT
                      DJNZ      RECAL2
                      RET
RECAL1:
                      LD        BC,0207H       ; 
                      CALL      MOTO
                      JP        SENS



READY_MASK:
                                               ; HOLT AUS READY_BYTE DIE WERTE FUER LW
                                               ; SCHON AUF READY GETESTET UND LW KANN READY LIEFERN
                                               ; ODER NICHT
                      CALL      UNIT_MASK      ; HOLE MASKE FUER EINGELOGGTES LW
                      LD        A,(READY_BYTE) ; UND MASKIERE READY_BYTE
                      AND       B
                      RET



UNIT_MASK:
                                               ; ERZEUGE AUS EINGELOGGTEM LW MASKE FUER OBER UND UNTERE 4 BIT
                      LD        A,(UNIT)
UNIT_MSK_A:
                                               ; UNIT IN A VORGEWAEHLT
                      AND       00000011B      ; MASKIEREN LAUFWERK 0..3
                      INC       A              ; +1 (1..4)
                      LD        B,A            ; SCHLEIFENZAEHLER SETZEN
                      LD        A,88H          ; MASKE ENTSPRECHEND
UNIMASK:              RLCA                     ; BITPOSITION ROTIEREN
                      DJNZ      UNIMASK        ; WIEDERHOLE
                      LD        B,A            ; MASKE NACH B
                      RET



SEEK:                 CALL      MOT_ON_TMR     ; MOTOR ON SIGNAL
                      LD        HL,(UNIT)      ; LADE NEUES LAUFWERK UND NEUER TRACK
                      LD        BC,(ALT_UNIT)  ; LADE ALTES LAUFWERK UND ALTER TRACK
                      LD        A,C            ; VERGLEICHE
                      CP        L
                      JR        Z,SEEK4        
                      CALL      INIT_FDC
                      JR        SEEK6

SEEK4:                LD        A,B
                      CP        H
                      RET       Z              ; RETURN, WENN KEIN SEEK NOTWENDIG

SEEK6:                LD        HL,(UNIT)
                      LD        (ALT_UNIT),HL  ; ALTES:=NEUES
                      XOR       A              ; I/O-PAGE 0
                      IN        A,(STAT)
                      AND       MASK_MOT       ; MOTOR_ON?
                      JR        Z,SEEK7
                      LD        A,(STEP_WAIT)  ; WARTEZEIT
                      OR        A
                      JR        Z,SEEK7
                      PUSH      AF
                      IN        A,(FDC)
                      CALL      MOT_ON_TMR     ; MOTOR ON SIGNAL SETZEN
                      POP       AF
                      LD        L,A
                      LD        H,64H
                      MLT       HL
                      CALL      DELAY_HL

SEEK7:                LD        A,(RWCMD)
                      CP        06H
                      JR        Z,SEEK5
                      LD        A,(TE_TIME)
                      OR        A
                      JR        Z,SEEK5
                      LD        L,A
                      LD        H,0
                      CALL      DELAY_HL

SEEK5:
                      CALL      SEEK3
                      JR        Z,SEEK1
                      LD        A,(TRACK)
                      PUSH      AF
                      ADD       A,A            ; DOUBLE STEP
                      LD        (TRACK),A
SEEK1:
                      LD        BC,030FH       ; SEEK TRACK
                      CALL      MOTO
                      CALL      SEEK3
                      JR        Z,SEEK2
                      POP       AF
                      LD        (TRACK),A      ; NEUEN TRACK SPEICHERN
SEEK2:
                                               ; SEEK FINISHD ?
SENS:                 LD        BC,0108H       ; SENS DRIVE
                      CALL      CMFD
                      CALL      NEXT
                      PUSH      AF             ; SAVE RESULT
                      CP        080H           ; INVALID COMMAND ?
                      CALL      NZ,NEXT        ; NO => NEXT RESULT
                      POP       AF             ; FIRST RESULT
                      AND       020H           ; ISOLIERE BIT 5
                      JP        Z,SENS
                      RET

SEEK3:
                      CALL      UNIT_MASK
                      LD        A,(SEEKNR)
                      AND       B
                      AND       0FH
                      RET

RESULT:                                        ; FETCH RESULT OF READ WRITE OPERATION
                                               ; AND CHECK THEM FOR R/W ERRORS
                                               ; Z+A=00 IF NO ERRORS
                                               ; NZ,A=? IF ERRORS
                      LD        B,006H         ; 7RESULTS
                      CALL      NEXT
                      LD        HL,REST        ; RESULT TABLE
                      LD        (HL),A         ; STORE RESULT
                      AND       0C0H           ; ERROR ?
                      LD        C,A            ; SAVE
RESLOP:               CALL      NEXT
                      INC       HL
                      LD        (HL),A         ; STORE RESULT
                      DJNZ      RESLOP
                      LD        A,C            ; RESTORE RESULT 0
                      OR        A              ; IN AKKU

                      RET


SPEED_CONST:
                                               ; WARTE BIS DREHZAHL KONSTANT, DANN RETURN MIT ZERO-FLAG=0
                                               ; WENN DREHZAHL NICHT KONSTANT WIRD DANN ZERO-FLAG=1

TOLERANZ:             EQU       64             ; TOLERANZ FUER DREHZAHL KONSTANT

                      CALL      MOT_ON_TMR
                      LD        BC,0204H       ; SELEKTIERE LAUFWERK
                      CALL      CMFD
                      LD        DE,0           ; BESETZE VOR
                      LD        B,10           ; ZEHN VERSUCHE
SPEEDC1:              EX        DE,HL          ; ADDIERE ZU DE TOLERANZ
                      LD        DE,TOLERANZ
                      ADD       HL,DE
                      EX        DE,HL
                      CALL      CDRIVE_SPEED   ; MESSE DREHZAHL
                      JR        Z,SPEEDC3      ; ZURUECK WENN LAUFWERK STEHT
                      EX        DE,HL          ; BILDE DIVERENZ ZU VORHER
                      SBC       HL,DE
                      LD        A,H
                      CP        0              ; IM TOLERANZBEREICH?
                      JR        NZ,SPEEDC2     ; SPRUNG WENN NEIN
                      LD        A,L
                      CP        TOLERANZ*2
                      JR        NC,SPEEDC2     ; SPRUNG WENN DREHZAHL NOCH NICHT KONSTANT
                      CALL      CDRIVE_SPEED   ; WARTE NOCH ZWEI UMDREHUNGEN
                      CALL      CDRIVE_SPEED

                      CALL      NEXT           ; DESELEKTIERE LAUFWERK
                      LD        A,0FFH         ; ZURUECK MIT ZERO = 0
                      OR        A
                      RET

SPEEDC2:              DJNZ      SPEEDC1        ; MAXIMAL 10 VERSUCHE
SPEEDC3:              CALL      NEXT           ; DESELEKTIERE LAUFWERK
                      XOR       A              ; SONST ZURUECK MIT ZERO=1
                      RET



CDRIVE_SPEED:
                                               ; MESSE GESCHWINDIGKEIT DES LAUFWERKS
                                               ; WENN SICH DISKETTE NICHT DREHT IST DAS ZERO-FLAG GESETZT
                                               ; SONST ZERO-FLAG=0 UND GESCHWINDIGKEIT IN HL

                      XOR       A              ; I/O-PAGE 0
                      IN        A,(STAT)       ; LESE INDEX-SIGNAL
                      AND       MASK_INDEX     ; UND MASKIERE
                      JR        Z,DSPEED1      ; WENN INDEX DA, ERSTE SCHLEIFE
                                               ; UEBERSPRINGEN

                      LD        HL,0           ; WARTE BIS INDEX KOMMT
DSPEED2:              INC       HL             ; ERHOEHE HL
                      LD        A,H            ; OUT OF TIME?
                      OR        L
                      RET       Z              ; DANN RETURN
                      XOR       A              ; I/O-PAGE 0
                      IN        A,(STAT)       ; LESE INDEX-SIGNAL
                      AND       MASK_INDEX     ; UND MASKIERE
                      JR        NZ,DSPEED2     ; WARTE BIS LOW

DSPEED1:              LD        HL,0           ; WARTE BIS INDEX WEGGEHT
DSPEED3:              INC       HL             ; ERHOEHE HL
                      LD        A,H            ; OUT OF TIME?
                      OR        L
                      RET       Z              ; DANN RETURN
                      XOR       A              ; I/O-PAGE 0
                      IN        A,(STAT)       ; LESE INDEX-SIGNAL
                      AND       MASK_INDEX     ; UND MASKIERE
                      JR        Z,DSPEED3      ; WARTE BIS HIGH

                      LD        HL,0           ; EIGENTLICHER ZAEHLER
DSPEED4:              INC       HL             ; ERHOEHE HL
                      LD        A,H            ; OUT OF TIME?
                      OR        L
                      RET       Z
                      XOR       A              ; I/O-PAGE 0
                      IN        A,(STAT)       ; LESE INDEX UND WARTE
                      AND       MASK_INDEX     ; BIS WIEDER LOW
                      JR        NZ,DSPEED4
                      LD        A,0FFH         ; RESET ZERO-FLAG
                      OR        A

                      RET                      ; ZURUECK MIT DRIVE-SPEED

NOREADY_MOTO:         XOR       A              ; I/O-PAGE 0
                      IN        A,(STAT)       ; LAEUFT MOTOR SCHON ?
                      AND       MASK_MOT
                      JR        Z,NREDY1       ; SPRUNG WENN MOTOR SCHON LAEUFT
NREDY2:               CALL      SPEED_CONST    ; WARTE BIS LW AUF TOUREN
                      JR        NZ,NREDY1      ; SPRUNG WENN DREHZAHL KONSTANT
                      CALL      NRDYERR        ; GEBE ERROR-TEXT AUS
                      JR        NZ,NREDY2      ; WIEDERHOLUNG
                      JP        UMLEIT_GETCM
NREDY1:               JP        MOTO1



MOTO:                                          ; WAITS UNTIL DISK READY AND THEN
                                               ; TRANSMITS COMMAND TO FDC

                      PUSH      BC             ; SAVE COMMAND
                      CALL      READY_MASK     ; LW SCHON GETESTET?
                      AND       0FH            ; STEHT IN DEN UNTEREN 4 BITS
                      JP        NZ,NOREADY_MOTO; WENN NICHT SPRUNG
                                               ; SONST WEITER WIE GEHABT
MOTO2:                LD        HL,SPEED       ; SET TIMER
                      LD        L,(HL)
                      LD        H,06H
                      MLT       HL
                      LD        H,0F0H
                      MLT       HL

MOTO3:                PUSH      HL             ; SAVE TIMER
                      LD        BC,0204H       ; SENSE DRIVE
                      CALL      CMFD
                      CALL      NEXT           ; FETCH RESULT
                      POP       HL             ; GET TIMER VALUE
                      AND       20H            ; DISK READY ?
                      JR        NZ,MOTO1       ; OK, READY
                      DEC       HL             ; TIMER=TIMER-1
                      LD        A,H            ; = ZERO?
                      OR        L
                      JR        NZ,MOTO3       ; NO, TRY AGAIN
                      CALL      NRDYERR        ; DRIVE NOT READY TEXT
                      JR        NZ,MOTO2       ; NO, AGAIN
                      JP        UMLEIT_GETCM   ; ENTWEDER MONITOR ODER WARM-BOOT



NRDYERR:
                                               ; GEBE FEHLERMELDUNG FUER DRIVE NOT READY AUS
                                               ; UND VERGLEICHE EINGEGEBENES ZEICHEN MIT N

                      LD        HL,NREADY1     ; PRINT ERROR TEXT
                      CALL      SOUT
                      CALL      PRINT_DRIVE    ; GEBE LW BUCHSTABE AUS
                      LD        HL,NREADY2     ; GEBE REST TEXT AUS
                      CALL      SOUT
                      CALL      GETCH1         ; AGAIN?
                      LD        C,A            ; ECHO
                      CALL      CECHO
                      CALL      CROUT          ; LINE FEED
                      LD        A,C
                      CP        'N'
                      RET

NREADY1:              DEFM      0DH,0AH,BELL," Drive $"
NREADY2:              DEFM      "not ready, retry (Y/N) ? $"
W_0429:               EQU       $-1

MOTO1:                POP       BC


CMFD:                                          ; TRANSMIT COMMAND TO FDC
                                               ; IN B STEHT ANZAHL DER BYTES
                                               ; IN C STEHT BEFEHL
;                      CALL      PRT_BUF        ; FUER TESTZWECKE
;                      NOP
;                      NOP
;                      NOP
                      LD        HL,CMDTAB
CMFD1:                LD        A,30           ; WAIT FOR MASTER
CMFD2:                DEC       A              ; DELAY
                      JR        NZ,CMFD2
                      IN        A,(FDC)        ; REQUEST FOR MASTER
                      AND       0C0H
                      CP        080H
                      JR        NZ,CMFD1       ; NO => WAIT
                      LD        A,C            ; YES =>
                      OUT       (FDD),A        ; SEND BYTE
                      INC       HL             ; POINT TO NEXT CMD BYTE
                      LD        C,(HL)
                      DJNZ      CMFD1          ; SEND NEXT BYTE
                      RET                      ; ALL BYTES TRANSFERRED

; CMFD_TXT1:            DEFM      0DH,0AH,"Bef-Code: $"
; CMFD_TXT2:            DEFM      " Buffer: $"


NEXT:                                          ; READ NEXT RESULT FROM FDC

                      LD        A,6            ; WAIT FOR MASTER READY
NEXT1:                DEC       A              ; DELAY
                      JR        NZ,NEXT1
                      IN        A,(FDC)        ; REQUEST FOR MASTER
                      AND       0C0H           ; TRANSFER TO MASTER
                      CP        0C0H
                      JP        NZ,NEXT        ; NO =>WAIT
                      IN        A,(FDD)        ; YES => FETCH RESULT
;                      NOP
;                      NOP
;                      NOP
;                      CALL      PRT_RES

                      RET


WRITE:
                      LD        A,05H          ; WRITE COMMANDO
                      LD        HL,TXTWR       ; WRITE ERROR TEXT
                      JP        RWCOM



READ:
                      LD        A,06H          ; READ COMMANDO
                      LD        HL,TXTRD       ; READ ERROR TEXT
                      JP        RWCOM

;-----------------------------------------------

RWCOM:
                                               ; VOR EINTRITT IN DIESE ROUTINE MUESSEN CMDTAB
                                               ; SECTCNT UND DMAADR GESETZT SEIN.
                                               ; IN A MUSS READ ODER WRITE COMMANDO STEHEN,
                                               ; IN HL MUSS DIE ADRESSE DER ERROR MSSG. STEHEN.
                                               ; ES WERDEN DIE ANGEGEBENE ANZAHL SECTCNT
                                               ; VON/NACH DMAADR UEBERTRAGEN.
                                               ; HD BIT WIRD ENTSPRECHEND DEM H BIT GESETZT.
                                               ; DAS IN CMDTAB STEHENDE MFM BIT WIRD UEBERNOMMEN.
                                               ; ES WIRD DIE PRECOMPENSATION ZEIT AUS WRITE_PRECOM
                                               ; UEBERNOMMEN.

                      CALL      MOT_ON_TMR      ; MOTOR ON


                      LD        (RWCMD),A      ; LEGE COMMANDO AB
                      LD        (ERMSG),HL     ; LEGE ADR FUER ERR.TEXT AB
                      LD        A,(SECTCNT)    ; WIEVIELE SECTOREN SOLLEN UEBERTRAGEN WERDEN?
                      OR        A              ;
                      RET       Z              ; RETURN; WENN NULL GEWESEN

                      CALL      SEEK           ; TRACK POSITIONIEREN
                      CALL      SETHEAD        ; KOPF WAEHLEN
                      CALL      SET_PRECOM     ; PRECOMP. WAEHLEN

                      LD        A,(RWRETRY)    ; ANZAHL SCHREIB-/LESEVERSUCHE FESTLEGEN
                      LD        B,A

RWCOM1:               PUSH      BC
                      LD        HL,(DMAADR)    ; DMA SPEICHER ADRESSE SETZEN
                      OUT0      (28H),L        ; DMA Memory Address Register Ch 1L
                      OUT0      (29H),H        ; DMA Memory Address Register Ch 1H
                      LD        A,(DMABANK)
                      OUT0      (2AH),A        ; DMA Memory Address Register Ch 1B

                      LD        A,0DAH         ; DMA-KANAL SETZEN
                      OUT0      (2BH),A        ; DMA I/O Address Register Ch 1L
                      XOR       A
                      OUT0      (2CH),A        ; DMA I/O Address Register Ch 1H

                      LD        A,(SECSZ)      ; BERECHNUNG DES ZU UEBERTRAGENDEN
                      LD        B,A            ; BYTES ANHAND SECTORGRÖßE UND
                      INC       B              ; SECTORANZAHL
                      XOR       A
                      SCF
RWCOM2:               RLA
                      DJNZ      RWCOM2
                      LD        L,A
                      LD        A,(SECTCNT)
                      LD        H,A
                      MLT       HL

                      LD        B,07H          ; ZAEHLER
RWCOM3:               ADD       HL,HL          ; HL=HL*2
                      DJNZ      RWCOM3         ; WEITIER BISD ZAEHLER = 0

                      OUT0      (2EH),L        ; DMA Byte Count Register Ch 1L
                      OUT0      (2FH),H        ; DMA Byte Count Register Ch 1H
                      IN0       A,(32H)        ; DMA/WAIT Control Register
                      AND       0F0H           ; UNTER 4 BIT AUSBLENDEN
                      LD        C,A
                      LD        A,(RWCMD)
                      CP        06H            ; READ?
                      LD        A,0AH          ; 
                      JR        Z,RWCOM4
                      LD        A,08H          ; 
RWCOM4:               OR        C              ; UNTERE 4 BIT SETZEN
                      OUT0      (32H),A        ; DMA/WAIT Control Register

                      LD        A,90H          ; DMA FREIGEBEN
                      OUT0      (30H),A        ; DMA Status Register
                      LD        B,09H          ; 9 BYTES ZU UEBERTRAGEN
                      LD        A,(RWCMD)      ; LADE COMMANDO
                      LD        C,A            ; NACH C
                      LD        A,(CMDTAB)     ; TRAGE MFM-BIT EIN
                      AND       40H            ; ISOLIERE MFM-BIT
                      OR        C              ; COMMAND DAZU
                      LD        C,A            ; ZURUECK INC
                      CALL      MOTO           ; SEND COMMAND TO FDC
                      CALL      RESULT         ; LESE ERGEBNIS VON FDC
                      LD        A,(REST+1)
                      LD        C,A
                      LD        A,(REST+2)
                      OR        C              ; ERGEBNISBITS VERODERN

                      POP       BC
                      JR        Z,RWCOM5       ; VERSUCH OK -> WEITER
                      DJNZ      RWCOM1         ; WIEDERHOLE BIS ANZAHL VERSUCHE ERREICHT

RWCOM5:               OR        A              ; FDC STATUS PRUEFEN
                      PUSH      AF
                      CALL      NZ,DISKERR     ; FEHLERMELDUNG AUSGEBEN
                      POP       AF
                      RET
              


SETHEAD:
                                               ; SETZE HEAD BYTE AUF 00H ODER 01H
                                               ; SETZE HEAD BIT IN UNIT BYTE

                                               ; FOLGENDE KOMBINATIONEN SIND MOEGLICH:
                                               ; X BEDEUTET UNBESTIMMT, - BEDEUTET KEINE AENDERUNG ZU VORHER

                                               ; HEAD VORHER=>     UNIT NACHHER,       HEAD NACHHER
                                               ; XXXXXX00          000000--            00000000
                                               ; XXXXXX01          000001--            00000001
                                               ; XXXXXX10          000001--            00000000
                                               ; XXXXXX11          000000--            00000001

                      LD        A,(HEAD)       ; LADE HEAD BIT
                      LD        C,A            ; RETTE IN C
                      AND       1
                      LD        (HEAD),A
                      LD        A,C
                      RLCA                     ; EIN BIT NACH LINKS
                      LD        C,A
                      RLCA                     ; ZWEI BIT NACH LINKS
                      XOR       C              ; ERZEUGE UNIT BIT
                      AND       04H            ; BLENDE ANDERE BITS AUS
                      LD        C,A            ; SAVE
                      LD        A,(UNIT)       ; LADE DRIVE NR.
                      AND       03H            ; BLENDE OBERE BITS AUS
                      OR        C              ; HEAD DAZU
                      LD        (UNIT),A       ; ZURUECK
                      RET




TEST:
          ;DIESE ROUTINE ERMITTELT DIE DATEN DER PLATTE, DIE SICH IM VON
          ;UNIT SPEZIFIZIERTEN LAUFWERK BEFINDET
          ;GETESTET WIRD DIE SPUR, DIE IN TEST$TRACK STEHT
          ;ALS ERGEBNIS WERDEN TEST$TYPE UND TEST$MSEK GESETZT
          ;KANN DER PLATTEN-TYP NICHT ERMITTELT WERDEN IST DER AKKU AUF FFH
          ;WENN PLATTEN-TYP ERKANNT WURDE IST AKKU=00H
          ;
                          CALL      RECAL                   ; REKALIBRIERE
                      LD        A,(UNIT)          ; SEITE 0 WAEHLEN
                      AND       03H               ; MASKIEREN
                      LD        (UNIT),A
                      LD        A,(TEST_TRACK)    ; POSITIONIERE AUF DIE SPUR
                      LD        (TRACK),A         ; DEREN FORMAT ERKANNT WERDEN SOLL
                      CALL      SEEK

                      LD        A,B_60            ; TESTE OB DD,MINI
                      LD        (TEST_TYPE),A
                      CALL      MINI_SET
                      CALL      READ_ID           ; VERSUCHE ID-FELD ZU LESEN
                      JR        Z,TEST1           ; SPRUNG WENN DD,MINI
      
                      LD        A,B_40            ; TESTE OB DD,MAXI
                      LD        (TEST_TYPE),A
                      CALL      MAXI_SET
                      CALL      READ_ID           ; VERSUCHE ID-FELD ZU LESEN
                      JR        Z,TEST1           ; SPRUNG WENN DD,MAXI

                      LD        A,0               ; TESTE OB SD,MAXI
                      LD        (TEST_TYPE),A
                      CALL      MAXI_SET
                      CALL      READ_ID           ; VERSUCHE ID-FELD ZU LESEN
                      JR        Z,TEST1           ; SPRUNG WENN SD,MAXI

                      LD        A,B_20            ; TESTE OB SD,MINI
                      LD        (TEST_TYPE),A
                      CALL      MINI_SET
                      CALL      READ_ID           ; VERSUCHE ID-FELD ZU LESEN
                      JR        Z,TEST1

TEST2:                LD        A,0FFH            ; BLEIBT NICHTS MEHR UEBRIG
                      RET                         ; RUECKSPRUNG MIT FEHLER

 
TEST1:                                          ; OK, MINI ODER MAXI, FM ODER MFM
                                                            ; ERKANNT
                                                            ; ZAEHLE JETZT DIE ANZAHL DER SEKTOREN
                                                            ; AUF DER SPUR
                      CALL      INIT_FDC          ; LESE ERSTES ID-FELD
                      LD        A,(REST+5)        ; LADE SEKTORNUMMER
                      LD        D,A               ; NACH D UM EINE UMDREHUNG ABZUWARTEN
                      LD        C,A               ; NACH C UM GROESSTEN SEKTOR ZU ERMITTELN
                      LD        E,A
                      LD        B,52              ; MAXIMAL 52 LESEVERSUCHE, DANN FEHLER
TEST3:                PUSH      BC                ; RETTE REGISTER
                      PUSH      DE
                      CALL      READ_ID           ; LESE NAECHSTES ID-FELD
                      POP       DE                ; RESTORE REGISTER
                      POP       BC
                      JR        NZ,TEST2          ; SPRUNG, WENN FEHLER
                      LD        A,(REST+5)        ; LADE SEKTORNUMMER
                      CP        D                 ; EINE UMDREHUNG?
                      JR        Z,TEST4           ; DANN ENDE (MAX-SEKTOR in C)
                      CP        C                 ; NEUE SEKTORNUMMER GROESSER ALS ALLE ANDEREN?
                      JR        C,TEST5           ; SPRUNG WENN NEIN
                      LD        C,A               ; SONST NEUER SEKTOR DER GROESSTE
TEST5:                CP        E
                      JR        NC,TEST9
                      LD        E,A
TEST9:                DJNZ      TEST3             ; LESE NEUEN SEKTOR EIN
                      JR        TEST2             ; WENN ZAEHLER ABLAEUFT, DANN FEHLER

TEST4:                LD        A,C               ; LEGE GROESSTE SEKTORNUMMER AB
                      LD        (TEST_MSEK),A     ;
                      LD        A,E               ; LEGE KLEINSTE SEKTORNUMMER AB
                      LD        (TEST_LSEK),A     ;
                      LD        A,(REST+6)        ; PACKE SEKTORGROESSE ZU TEST_TYPE
                      AND       07H               ;
                      LD        C,A               ;
                      LD        A,(TEST_TYPE)     ;
                      OR        C                 ;
                      LD        C,A               ;
                      LD        A,(REST+4)        ;
                      RLCA                        ;
                      RLCA                        ;
                      RLCA                        ;
                      RLCA                        ;
                      AND       010H              ;
                      OR        C                 ;
                      LD        (TEST_TYPE),A     ;
                      LD        A,(UNIT)          ; SOLL TWO-SIDED-BIT IMMER AUF HIGH SEIN?
                      CPL                         ; (NAEMLICH DANN, WENN ENTSPRECHENDES
                      AND       00000011B         ; BIT IM OBEREN NIPPLE VON SEEKNR AUF HIGH)
                      LD        B,A
                      OR        a
                      LD        A,(SEEKNR)
                      JR        Z,TEST6           ; KEIN SCHIEBEN NOTWENDIG
TEST7:                RLCA
                      DJNZ      TEST7
TEST6:                AND       080H              ; WENN OBERSTES BIT 1, DANN TS-BIT AUCH EINS
                      JR        NZ,TEST8          ; SONST TS-BIT WIE TS-LEITUNG
                      CALL      SENSD             ; LESE TWO-SIDED SIGNAL EIN
                      RLCA                        ; VERSCHIEBE IN ERSTES BIT
                      RLCA
                      RLCA
                      RLCA
                      AND       080H              ; BLENDE REST AUS
TEST8:                LD        C,A               ; PACKE ZU TEST_TYPE
                      LD        A,(TEST_TYPE)     ; 
                      OR        C                 ;
                      LD        (TEST_TYPE),A     ;
                                                            ; OK, ALLES GEPRUEFT
                      LD        A,0               ; FEHLERFREIE RUECKKEHR
                      RET                         ;

READ_ID:
                      ; LESE NAECHSTES ID FELD
                      ; IN TEST_TYPE BIT 6 STEHT OB FM ODER MFM
                      ; KONNTE KEIN ID-FELD GELESEN WERDEN, DANN IST AKKU<>0
                      ; UND ZERO-FLAG NICHT GESETZT
                          ;
                      LD        BC,020AH          ; READ ID KOMMANDO
                      LD        A,(TEST_TYPE)     ; PACKE MFM BIT DAZU
                      AND       040H
                      OR        C
                      LD        C,A
                      CALL      MOTO              ; LESE ID-FELD
                      CALL      RESULT            ; WAR LESEVERSUCH ERFOLGREICH?
                      OR        A
                      RET
;
;
;
MAXI_SET:
                      ; SETZT FLOPPY KONTROLER AUF MAXI-LAUFWERKE

                          PUSH      AF
                      LD        A,PAD_MINI AND PAD_RESET    ; LOESCHE SIGNAL MINI
                      OUT       (P_LS259),A
                      LD        A,(SWITCH_DELAY)            ; UMSCHALTVERZOEGERUNG IN MILLISEKUNDEN
                      OR        A
                      LD        A,0FFH
                      CALL      NZ,M_M_DEL
                      LD        (LAST_FDC_SPEED),A
                      POP       AF
                      RET


MINI_SET:
                          ; SETZE FLOPPY KONTROLLER AUF MINI-LAUFWERKE

                      PUSH      AF
                      LD        A,PAD_MINI OR PAD_SET                 ; SETZE SIGNAL MINI
                      OUT       (P_LS259),A
                      LD        A,(SWITCH_DELAY)            ; UMSCHALTVERZOEGERUNG IN MILLISEKUNDEN
                      OR            A
                      LD        A,0
                      CALL      NZ,M_M_DEL
                      LD        (LAST_FDC_SPEED),A
                      POP       AF
                      RET


M_M_DEL:
                      ; Verzoegerung bei Umschaltung Mini/Maxi-Laufwerken beachten
  
                      PUSH      BC                                    ; Register retten
                      PUSH      DE
                      PUSH      HL
                      PUSH      AF
                      LD        C,A
                      LD        A,(LAST_FDC_SPEED)
                      CP        C
                      JR        Z,M_M_DEL_1
                      LD        A,(SWITCH_DELAY)
                      LD        L,A
                      LD        H,064H
                      MLT       HL
                      CALL      DELAY_HL
M_M_DEL_1:            POP       AF                                    ; Register wieder zurueck
                      POP       HL
                      POP       DE
                      POP       BC
                      RET

SENSD:
                      ; aktuelle Laufwerksignale einlesen

                      LD        BC,0204H
                      CALL      CMFD
                      CALL      NEXT
                      RET

;-----------------------------------------------

SET_PRECOM:           LD        A,(PRECOM_BEGIN) ; TRACK, AB DEM PRECOM NOTWENDIG
                      LD        C,A
                      LD        A,(TRACK)
                      CP        C
                      LD        A,0            ; KEINE PRECOM VORWÄHLEN
                      JR        C,SET_PRECOM_1
                      LD        A,(WRITE_PRECOM) ; P0, P1, P2 AM FDC SETZEN (PRECOM EINGAENGE)
SET_PRECOM_1:         LD        C,A
                      AND       01H
                      OR        PAD_M0         ; M0 (P0) SETZEN/RUECKSETZEN
                      OUT       (P_LS259),A
                      LD        A,C
                      RRCA
                      AND       01H
                      OR        PAD_M1         ; M1 (P1) SETZEN/RUECKSETZEN
                      OUT       (P_LS259),A
                      LD        A,C
                      RRCA
                      RRCA
                      AND       01H
                      OR        PAD_DATA       ; DATA (P2) SETZEN/RUECKSETZEN
                      OUT       (P_LS259),A
                      RET

;-----------------------------------------------

DISKERR:
                                               ; GIBT DISK FEHLERMELDUNG AUS
                                               ; BENUTZT DAZU DIE RESULT TABELLE
                                               ; UND DIE ERMSG EINTRAGUNG

                      LD        A,(DERMSG)     ; SOLL FEHLERMELDUNG
                      INC       A              ; UNTERDRUECKT WERDEN ?
                      RET       Z              ; WENN JA, RUECKSPRUNG
                      LD        HL,(ERMSG)     ; LADE READ BZW WRITE TEXT
                      CALL      SOUT           ; UND GEBE IHN AUS
                      LD        A,(REST)       ; LADE LAUFWERK NUMMER
                      CALL      LOG_PHYS       ; Umwandlung log. in phys. Laufwerk
                      ADD       A,41H          ; WANDLE IN ASCCI
                      LD        C,A            ; GEBE LAUFWERK BUCHSTABE AUS
                      CALL      CECHO

                      LD        HL,TXT1        ; GEBE TRACK AUS
                      CALL      SOUT
                      LD        A,(REST+3)
                      CALL      DEZOUT

                      LD        HL,TXT2        ; GEBE HEAD AUS
                      CALL      SOUT
                      LD        A,(REST+4)
                      ADD       A,30H          ; WANDLE IN ASCII
                      LD        C,A
                      CALL      CECHO

                      LD        HL,TXT3        ; GEBE SECTOR AUS
                      CALL      SOUT
                      LD        A,(REST+5)
                      CALL      DEZOUT

                                               ; GEBE FEHLER IM KLARTEXT AUS

                      LD        DE,ERROR_TABLE
                      LD        A,(REST+1)     ; LESE STATUS1
                      LD        H,A
                      LD        A,(REST+2)     ; LESE STATUS2
                      LD        L,A
ERRLOP:
                      ADD       HL,HL          ; TESTE OB FEHLERBIT GESETZT
                      PUSH      HL
                      LD        A,(DE)
                      LD        L,A
                      INC       DE
                      LD        A,(DE)
                      LD        H,A
                      CALL      C,SOUT         ; WENN JA GEBE TEXT AUS
                      POP       HL
                      INC       DE             ; ZEIGE AUF NAECHSTE MELDUNG
                      LD        A,H            ; KEIN FEHLER MEHR DA?
                      OR        L
                      JR        NZ,ERRLOP

                      CALL      CROUT

                      RET                      ; OK, ENDE


TXT1:                 DEFM      ", track #$"
TXT2:                 DEFM      ", " 
TXT2_1:               DEFM      "head #$"
TXT3:                 DEFM      ", sector #$"



ERROR_TABLE:
                      DEFW      B15MSG         ; FEHLERMELDUNGEN FUER ST1
                      DEFW      NOBMSG
                      DEFW      B13MSG
                      DEFW      B12MSG
                      DEFW      NOBMSG
                      DEFW      B10MSG
                      DEFW      B9MSG
                      DEFW      B8MSG

                      DEFW      NOBMSG         ; FEHLERMELDUNGEN FUER ST2
                      DEFW      B6MSG
                      DEFW      B5MSG
                      DEFW      B4MSG
                      DEFW      NOBMSG
                      DEFW      NOBMSG
                      DEFW      B1MSG
                      DEFW      B0MSG

NOBMSG:               DEFB      24H
B15MSG:               DEFM      10,13,' end of cylinder',24H
B13MSG:               DEFM      10,13,' data error',24H
B12MSG:               DEFM      10,13,' over run',24H
B10MSG:               DEFM      10,13,' no data',24H
B9MSG:                DEFM      10,13,' not writable',24H
B8MSG:                DEFM      10,13,' missing address mark',24H
B6MSG:                DEFM      10,13,' control mark',24H
B5MSG:                DEFM      10,13,' data error in data field',24H
B4MSG:                DEFM      10,13,' wrong cylinder',24H
B1MSG:                DEFM      10,13,' bad cylinder',24H
B0MSG:                DEFM      10,13,' missing address mark in data field',24H

TXTRD:                DEFM      BELL,0DH,0AH,' Read error on $'
TXTWR:                DEFM      BELL,0DH,0AH,' Write error on $'





; FLOPPY-CONTROLLER EINGANG P2 / PCF8583 DATENEINGANG (SDA) SETZEN 

SET_SDA_P2:           LD        A,PAD_DATA OR PAD_SET   
                      OUT       (P_LS259),A
                      RET

; FLOPPY-CONTROLLER EINGANG P2 / PCF8583 DATENEINGANG (SDA) ZURUECKSETZEN

RESET_SDA_P2:         LD        A,PAD_DATA
                      OUT       (P_LS259),A
                      RET

; PCF8583 EINGANG SCL SETZEN / STEIGENDE FLANKE CLOCKEINGANG

SET_SCL:              LD        A,PAD_SCL OR PAD_SET
                      OUT       (P_TIME_OUT),A
                      RET

; PCF8583 EINGANG SCL ZURUECKSETZEN / FALLENDE FLANKE CLOCKEINGANG

RESET_SCL:            LD        A,PAD_SCL
                      OUT       (P_TIME_OUT),A
                      RET

; KLEINE VERZOEGERUNG

DELAY:                LD        A,03H
DELAY1:               DEC       A
                      JP        NZ,DELAY1
                      RET

; LESE EIN BIT VOM PCF8583

PCF_READ:             CALL      SET_SCL       ; CLOCK PCF8583 STEIGENDE FLANKE
                      CALL      DELAY
                      LD        A,1           ; I/O-PAGE 1
                      IN        A,(STAT)      ; LESE SDA-BIT VON PCF8583
                      CPL                     ; INVERTIEREN
                      RLCA                    ; SCHIEBE NACH BIT0
                      CAll      RESET_SCL     ; CLOCK PCF8583 FALLENDE FLANKE
                      RET

; BIT LOGISCH 1 AN PCF8583 AUSGEBEN

PCF_BIT_DATA:         CALL      SET_SDA_P2
                      CALL      DELAY
                      CALL      RESET_SDA_P2

; PCF8583 CLOCKEINGANG FALLENDE FLANKE MIT DELAY

PCF_CLK_1_0:          CALL      DELAY
                      CALL      RESET_SCL
                      RET

; STOP-SIGNAL AN PCF8583 SENDEN

PCF_STOP:             CALL      RESET_SDA_P2     ; STOP TRANSMISSION
                      CALL      DELAY
                      CALL      SET_SDA_P2
                      CALL      DELAY
                      CALL      SET_SCL
                      RET

; 8 DATENBITS AN PCF8583 AUSGEBEN

PCF_WRITE_BYTE:       PUSH      BC
                      LD        C,A              ; ZWISCHENSPEICHERN 
                      LD        B,8H             ; 8 BITS
PCF_WR_1:             LD        A,C              ; BITMUSTER HOLEN
                      RLCA                       ; BIT IN CARRY FLAG
                      CALL      C,SET_SDA_P2     ; 1 SENDEN
                      CALL      NC,RESET_SDA_P2  ; 0 SENDEN
                      CALL      PCF_READ
                      LD        A,C
                      RLA                        ; NAECHSTES BIT VORBEREITEN
                      LD        C,A              ; ZWISCHENSTAND WEGSPEICHERN
                      DEC       B                ; BITZAEHLER
                      JP        NZ,PCF_WR_1      ; NAECHTES BIT AUSGEBEN
                      LD        A,C              ; MUSS JETZT 0 SEIN
                      POP       BC
                      RET


PCF_SET_REGS:         PUSH      AF               ;
                      CALL      PCF_BIT_DATA     ; 
                      LD        A,PCF_WRITE_CMD  ; BEFEHL SCHREIBEN IN PCF_REGISTER 

                      CALL      PCF_WRITE_BYTE   ; Sende BEFEHLSKENNUNG nach PCF
                      CALL      SET_SDA_P2
                      CALL      PCF_READ

                      POP       AF               ; STARTADRESSE PCF-REGISTERSATZ

                      CALL      PCF_WRITE_BYTE   ; Sende REGISTERNUMMER nach PCF
                      CALL      SET_SDA_P2
                      CALL      PCF_READ
                      RET


PCF_READ_REGS:        CALL      PCF_SET_REGS     ; BEFEHL
                      CALL      SET_SCL
                      CALL      PCF_BIT_DATA
                      LD        A,PCF_READ_CMD
                      CALL      PCF_WRITE_BYTE
                      CALL      SET_SDA_P2
                      CALL      PCF_READ
PCF_READ_R2:          LD        A,0FFH
                      CALL      PCF_WRITE_BYTE
                      LD        (HL),A
                      INC       HL
                      DEC       B
                      JP        NZ,PCF_READ_R1
                      CALL      SET_SDA_P2
                      CALL      PCF_READ
                      JP        PCF_READ_END

PCF_READ_R1:          CALL      RESET_SDA_P2
                      CALL      PCF_READ
                      JP        PCF_READ_R2

PCF_READ_END:         CALL      PCF_STOP
                      RET


PCF_SND_CMD:          CALL      PCF_SET_REGS        ; Sende (B) Bytes des Puffer (HL) an PCF8583
PCF_SND_CM1:          LD        A,(HL)
                      CALL      PCF_WRITE_BYTE
                      CALL      SET_SDA_P2
                      CALL      PCF_READ
                      INC       HL
                      DEC       B
                      JP        NZ,PCF_SND_CM1
                      CALL      PCF_STOP
                      RET

; DATUM/UHRZEIT AUS PCF8583 AUSLESEN

READ_PHYS_TIME:

                      PUSH      AF                   ; REGISTER RETTEN
                      PUSH      BC
                      PUSH      DE
                      PUSH      HL

                      LD        A,0
                      LD        B,10H                ; BEFEHLSPUFFERGROESSE 16 BYTE

                      LD        HL,PCF_CMD_BUF
                      CALL      PCF_READ_REGS
                      LD        HL,PCF_CMD_BUF+2     ; ZEIT/DATUM AUS PUFFER UEBERTRAGEN
                      LD        DE,TIME_FIELD
                      LD        BC,0005H
                      LDIR
                      LD        A,(PCF_CMD_BUF+0FH)  ; JAHRESKORREKTUR
                      LD        (TIME_FIELD+6),A
                      LD        A,(PCF_CMD_BUF)
                      AND       02H
                      JP        Z,READ_PHYS_T1
                      LD        A,(TIME_FIELD+6)
                      INC       A
                      DAA
                      LD        (TIME_FIELD+6),A
                      CALL      SET_PHYS_TIME
READ_PHYS_T1:
                      POP       HL
                      POP       DE
                      POP       BC
                      POP       AF
                      RET


SET_PHYS_TIME:

                      PUSH      AF                   ; REGISTER RETTEN
                      PUSH      BC
                      PUSH      DE
                      PUSH      HL
                                                     ; Befehlspuffer vorbereiten
                      LD        HL,PCF_CMD_VORL      ; von hier (Vorlage)
                      LD        DE,PCF_CMD_BUF       ; nach da kopieren
                      LD        BC,000FH             ; 15 Bytes
                      LDIR
                      LD        HL,TIME_FIELD        ; von hier
                      LD        DE,PCF_CMD_BUF+2     ; nach da kopieren
                      LD        BC,0005H             ; 5 Bytes (s,m,h,d,mon)
                      LDIR
                      LD        A,(PCF_CMD_BUF+5)    ; TAG
                      AND       03FH                 ; BIT 6 UND 7 AUSBLENDEN
                      LD        C,A
                      LD        A,(TIME_FIELD+6)     ; JAHR
                      LD        (PCF_CMD_BUF+0FH),A
                      RRCA
                      RRCA
                      LD        B,A
                      RRCA
                      RRCA
                      RRCA
                      AND       80H
                      ADD       A,B
                      AND       0C0H
                      OR        C
                      LD        (PCF_CMD_BUF+5),A
                      LD        A,0                  ; REGISTER-ADRESSE 0 ....
                      LD        B,10H                ; ANZAHL BYTES AN PCF8583
                      LD        HL,PCF_CMD_BUF       ; PUFFERADRESSE
                      CALL      PCF_SND_CMD          ; I2C-TELEGRAMM AN PCF8583 SENDEN

                      POP       HL                   ; REGISTER ZURUECKRETTEN
                      POP       DE
                      POP       BC
                      POP       AF

                      RET

                                                            ; BEFEHLS-PUFFER-VORLAGE
PCF_CMD_VORL:       
                      DEFB      00Ch,000h,000h,000h,000h,000h,000h
PCF_CMD_VORL1:
                      DEFB      090h,03Ah,000h,000h,000h,000h,001h
                      DEFB      001h


USER_BYTES_READ:      LD        A,10H                ; AB REGISTERADRESSE 10H
                      LD        B,18H                ; 18H BYTES LESEN
                      LD        HL,SYSTEMPAGE        ; AB ADRESSE SYSTEMPAGE ABLEGEN
                      CALL      PCF_READ_REGS        ; PCF8583 REGISTER LESEN
                      RET


USER_BYTES_WRITE:     LD        A,10H                ; AB REGISTERADRESSE 10H
                      LD        B,18H                ; 18H BYTES SCHREIBEN
                      LD        HL,SYSTEMPAGE        ; VON ADRESSE SYSTEMPAGE NEHMEN
                      CALL      PCF_SND_CMD          ; PCF8583 REGISTER SCHREIBEN
                      RET


MOT_ON_TMR:           PUSH      AF                   ; REGISTER RETTEN
                      PUSH      BC
                      PUSH      DE
                      PUSH      HL
                                                     ; 10 SEKUNDEN TIMEOUT SETZEN
                      LD        A,07H                ; AB REGISTERADRESSE 07H
                      LD        B,02H                ; 2 BYTES SCHREIBEN
                      LD        HL,PCF_CMD_VORL1     ; VON ADRESSE W_0930 NEHMEN
                      CALL      PCF_SND_CMD          ; PCF8583 REGISTER SCHREIBEN

                                                     ; ENABLE ALARM CONTROL REGISTER
                      LD        A,0                  ; AB REGISTERADRESSE 00H
                      LD        B,01H                ; 1 BYTE SCHREIBEN
                      LD        HL,PCF_CMD_VORL      ; VON ADRESSE W_0929 NEHMEN
                      CALL      PCF_SND_CMD          ; PCF8583 REGISTER SCHREIBEN
                      POP       HL                   ; REGISTER ZURUECKRETTEN
                      POP       DE
                      POP       BC
                      POP       AF
                      RET


;---------------------------------------------

;
;
;
;**************************************************************************
;***                                                                    ***
;***  ES FOLGT NUN DIE ROUTINE ZUM BOOTEN VON DER HARDDISK              ***
;***                                                                    ***
;**************************************************************************
;
;
;
; PORTADRESSEN FUER OMTI-CONTROLLER AUF ECB-BUS (MIT ECPC VON CONITEC)

ODATA:                EQU       0E0H
OSTATUS:              EQU       0E1H
OCONFIG:              EQU       0E2H
OMASK:                EQU       0E3H
ORESET:               EQU       0E1H
OSELECT:              EQU       0E2H

HDADR:                EQU       0FC00H               ; LADEADRESSE FUER BOOTSTRAP-LOADER


HD_CNTRL_TST:         LD        A,0                  ; VORBELEGEN MIT CONTROLLER FEHLT
                      LD        (OMTI_OK),A
                      CALL      OMTI_DA
                      RET       NZ
                      LD        B,0FFH
L_0976:               DJNZ      L_0976               ; VERZOEGERUNGSSCHLEIFE BIS B=0
                      LD        HL,0                 ;

                      OUT      (OSELECT),A
L_097D:               IN       A,(OSTATUS)           ; CONTROLLER-STATUS LESEN
                      AND      3FH                   ; MASKIEREN
                      CP       0DH                   ; 
                      JR       Z,L_098C              ;
                      INC      HL
                      LD       A,H
                      CP       10H                   ; 
                      JR       NZ,L_097D             ;
                      RET


L_098C:               CALL     OMTI_DA
                      RET      NZ
                      LD       A,JA
                      LD       (OMTI_OK),A           ; CONTROLLER VORHANDEN
                      RET


OMTI_DA:              LD       HL,0                  ; OMTI-HD-CONTROLLER
                      OUT      (OSTATUS),A
OMTI_DA1:             IN       A,(OSTATUS)
                      AND      3FH
                      RET      Z
                      INC      HL
                      LD       A,H
                      CP       10H                   ; 10 MAL PRÜFEN
                      JR       NZ,OMTI_DA1
                      OR       A
                      RET


L_09A8:               CALL      SELECT
                      LD        HL,W_09CA
                      CALL      SCMD2
L_09B1:               IN        A,(OSTATUS)
                      AND       B_3F
                      CP        B_0F
                      JR        Z,L_09C6
                      CP        B_09
                      JR        NZ,L_09B1
                      LD        HL,HD_NO_CYL
                      LD        B,B_08
                      LD        C,ODATA
                      OTIR
L_09C6:               CALL      READSTATUS
                      RET


W_09CA:               DEFB      0CH,00,00,00,00,00


                      LD        BC,TXT2_1

                      nop
                      nop
                      LD        BC,0



SELECT:                                        ; SELECT OMTI CONTROLLER
                      OUT       (OSELECT),A
SELECT1:              IN        A,(OSTATUS)    ; WAIT FOR CONTROLLER SELECTED
                      AND       00111111B
                      CP        00001101B      ; WAIT UNTIL COMMANDTRANSFER IS READY
                      JR        NZ,SELECT1
                      RET


L_09E3:               CALL      SELECT
                      LD        HL,W_FEE0

SCMD2:                LD        B,6            ; BYTE COUNTER
                      LD        C,ODATA        ; POINTER TO OMTI DATAPORT
SCMD1:                IN        A,(OSTATUS)    ; READ STATUSBYTE
                      AND       00111111B
                      CP        00001101B      ; READY FOR WRITE COMMAND BYTE ?
                      JR        NZ,SCMD1       ; NO, WAIT UNTIL READY
                      OUTI                     ; WRITE COMMANDBYTE TO OMTI
                      JR        NZ,SCMD1       ; UNTIL ALL DONE
                      RET


READSTATUS:
                                               ; READ STATUSBYTE AND SET ZEROFLAG AND
                                               ; ERRFLAG IF ANY ERROR
                      IN        A,(OSTATUS)    ; READ CONTOLLER STATUSBYTE
                      AND       00111111B
                      CP        00001111B      ; READY FOR STATUS READ ?
                      JR        NZ,READSTATUS  ; NO, WAIT UNTIL READY
                      IN        A,(ODATA)      ; OK, READ STATUSBYTE
                      LD        (W_FEE6),A
                      OR        A              ; AND SET ZEROFLAG
                      RET


L_0A09:               LD        A,(W_FEE4)
                      LD        E,A


READBUFFER:
                                                ; READ OMTI DATABUFFER TO (HL)
                      IN        A,(OSTATUS)     ; WAIT FOR DATA READ TRANSFER
                      AND       00111111B       ;
                      CP        00001111B
                      RET       Z               ; NO TRANSFER IN ERROR CASE
                      CP        00001011B
                      JR        NZ,READBUFFER
                      LD        BC,ODATA        ; CLEAR B AND SET C TO DATAPORT
                      INIR                      ; READ NEXT 256 BYTE
                      INIR
                      DEC       E
                      JR        NZ,READBUFFER
                      RET


L_0A23:               LD        A,(W_FEE4)
                      LD        E,A
L_0A27:               IN        A,(OSTATUS)
                      AND       00111111B
                      CP        00001111B
                      RET       Z
                      CP        00001001B
                      JR        NZ,L_0A27
                      LD        BC,00E0H
                      OTIR
                      OTIR
                      DEC       E
                      JR        NZ,L_0A27
                      RET


L_0A3D:               LD        HL,(HD_TRACK)
                      LD        A,L
                      LD        (W_FEE3),A
                      LD        A,(HD_SECTOR)
                      AND       3FH
                      LD        B,A
                      LD        A,(HD_HEAD)
                      AND       1FH
                      LD        C,A
                      RRC       H
                      RRC       H
                      LD        A,H
                      AND       0C0H
                      OR        B
                      LD        (W_FEE2),A
                      RRC       H
                      LD        A,H
                      AND       80H
                      OR        C
                      LD        (W_FEE1),A
                      RET


L_0A65:               LD        A,0AH
                      LD        (W_FEE0),A
                      JR        L_0A71
L_0A6C:               LD        A,08H
                      LD        (W_FEE0),A
L_0A71:               CALL      L_0A3D
                      LD        A,(SECTCNT)
                      LD        (W_FEE4),A
                      LD        A,(HD_CTRL_BYTE)
                      LD        (W_FEE5),A
                      CALL      L_09E3
                      LD        HL,(DMAADR)
                      LD        A,(W_FEE0)
                      CP        08H
                      PUSH      AF
                      CALL      Z,L_0A09
                      POP       AF
                      CALL      NZ,L_0A23
                      CALL      READSTATUS
                      RET       Z
                      LD        A,(DERMSG)
                      AND       0FFH
                      RET       NZ
L_0A9D:               LD        HL,W_0AA7
                      CALL      SOUT
                      LD        A,0FFH
                      OR        A
                      RET


W_0AA7:               DEFM      0DH,0AH,BELL,' Harddisk error',00DH,00AH,'$'

          
L_0ABC:               CALL      ANZ_TXT_HD        ; Text "Harddisk" ausgeben
                      CALL      WAIT_HD_READY
                      JR        Z,L_0ACD
                      LD        HL,HD_N_READY     ; "not ready" ausgeben
                      CALL      SOUT
                      JP        GETCOM            ; Neue Eingabe
L_0ACD:               LD        HL,0
                      LD        (HD_TRACK),HL
                      LD        (HD_HEAD),HL
                      LD        HL,HDADR
                      LD        (DMAADR),HL
                      LD        A,01H             ; einen Sektor einlesen
                      LD        (SECTCNT),A
                      CALL      L_0A6C
                      JP        NZ,GETCM
                      LD        HL,W_FDF5           ; Text im Bootsektor vorhanden?
                      LD        DE,HD_BOOT_KENN
                      LD        B,0BH             ; 
BOOT_TST:             LD        A,(DE)
                      CP        (HL)
                      JR        NZ,HD_BOOT_ERR    ; Fehlermeldung
                      INC       HL
                      INC       DE
                      DJNZ      BOOT_TST
                      LD        HL,W_FDDB
                      LD        DE,HD_SCTR_TRK
                      LD        BC,001Ah          ; 26 Bytes kopieren
                      LDIR
                      CALL      L_09A8
                      JR        NZ,L_0A9D
                      RET


HD_BOOT_ERR:          LD        HL,TXT_HD_BOOT_ERR
                      CALL      SOUT
                      LD        A,0FFH
                      OR        A
                      RET


TXT_HD_BOOT_ERR:      DEFM      0DH,0AH,BELL,' error, no valid bootsector$'
HD_N_READY:           DEFM      ' => not ready$'
HD_BOOT_KENN:         DEFM      '(c) Conitec'

WAIT_HD_READY:
                                               ; WARTE BIS WINCHESTER READY ODER TIMEOUT
                      CALL      CHECK_HD_READY
                      RET       Z              ; ALLES OK WINCHESTER BEIM ERSTEN MAL READY
                      LD        HL,WHRTXT      ; GEBE WARTEMELDUNG AUS
                      CALL      SP_OUT
                      LD        HL,0FFFFH      ; LADE TIMEOUT ZAEHLER
WHR1:                 PUSH      HL
                      CALL      CHECK_HD_READY
                      POP       HL
                      RET       Z
                      DEC       HL
                      LD        A,H
                      OR        L
                      JR        NZ,WHR1
                      LD        A,0FFH
                      OR        A
                      RET

WHRTXT:               DEFM      01H,'waiting for Harddisk ready $'

CHECK_HD_READY:
                                               ; PRUEFE OB WINCHESTERLAUFWERK READY
                      CALL      SELECT
                      LD        HL,READYCMDFIELD
                      CALL      SCMD2
                      CALL      READSTATUS
                      RET

READYCMDFIELD:
                      DEFB      0,0,0,0,0,0



BOOTERR:
                                               ; GEBE FEHLERMELDUNG BEI BOOT AUS
                                               ; UND GEHE ZUM MONITOR ZURUECK
                      LD        HL,BERMSG
                      CALL      SOUT
                      JP        GETCM

BERMSG:               DEFM      0DH,0AH,BELL,' Can not boot',0DH,0AH,'$'

;-----------------------------------------------

                                               ; ES FOLGEN UNIO TREIBER-ROUTINEN

;UNIOINIT:
                                               ; DIESE ROUTINE WIRD BEI INITIALISIERUNG DES MONITORS
                                               ; AUFGERUFEN.



UNIOINIT:             LD        HL,UATAB       ; LESE UNIO BAUD JUMPER
                      LD        BC,UDTAB       ;
                      LD        E,CONTR        ; PORT 74LS259
                      LD        D,STAT         ; PORT FLAGS
                      CALL      JUMPIN         ; WERTE DER JUMPER ABFRAGEN
                      LD        (BAUD_JUMPERBYTE),A   ; JUMPER1
                      LD        A,D            ; JUMPER2
                      LD        (IO_JUMPERBYTE),A
                      LD        A,(BAUD_JUMPERBYTE)  
                      LD        E,A
                      LD        D,0
                      LD        HL,BDTAB       ; KONVERTIERTABELLE
                      ADD       HL,DE
                      LD        A,(HL)
                      LD        (BAUD_JUMPERBYTE),A   ; BAUDKENNUNG ABSPEICHERN
                      RET

;-----------------------------------------------

JUMPIN:                                        ; DIESES PROGRAMM LIEST DIE BEIDEN
                                               ; JUMPER AUF DER UNIO- BZW PROF-KARTE
                                               ; EIN. FOLGENDE REGISTER MUESSEN BELEGT SEIN
                                               ; E=PORTADRESSE DES 74 LS259
                                               ; D=PORTADRESSE DES EINGANGS PORTS
                                               ; BC=ADRESSE DER DECODER TABELLE
                                               ; HL=ADRESSE DER AUSGANGS BITS
                                               ; AUSGABE
                                               ; AKKU=JUMPER1, D=JUMPER2

                      PUSH      BC             ; RETTE DECODER TABELLE
                      LD        C,E
                      LD        B,3            ; ERSTES BITMUSTER AUSGEBEN
                      OTIR
                      LD        A,C            ; TAUSCHE PORTADRESSE
                      LD        C,D
                      LD        D,A
                      LD        B,0FFH         ; I/O-PAGE (UNGERADE)
                      IN        A,(C)          ; LESE ERSTES BITPAAR EIN (BIT 4/5)
                                               ; JUMPER1-BIT und JUMPER2-BIT
                      RRA                      ; SCHIEBE BITS NACH RECHTS
                      RRA
                      RRA
                      RRA
                      AND       00000011B      ; MASKIERE
                      LD        E,A            ; UND NACH E

                      LD        A,C            ; TAUSCHE PORTADRESSE
                      LD        C,D
                      LD        D,A
                      LD        B,2            ; ZWEITES BITMUSTER AUSGEBEN
                      OTIR
                      LD        A,C            ; TAUSCHE PORTADRESE
                      LD        C,D            ; I/O-ADRESSE (LOW) FUER IN-BEFEHL
                      LD        D,A
                      LD        B,0FFH         ; I/O-PAGE (UNGERADE)
                      IN        A,(C)          ; LESE ZWEITES BITPAAR EIN EIN
                      RRA                      ; EINMAL NACH RECHTS SCHIEBEN
                      RRA
                      AND       00001100B      ; MASKIEREN
                      OR        E              ; UND ZU E PACKEN
                      LD        E,A

                      LD        A,C            ; TAUSCHE PORTADRESSE
                      LD        C,D            ; I/O-ADRESSE (LOW) FUER IN-BEFEHL
                      LD        D,A
                      LD        B,2            ; DRITTES BITMUSTER AUSGEBEN
                      OTIR
                      LD        A,C            ; TAUSCHE PORTADRESSE
                      LD        C,D            ; I/O-ADRESSE (LOW) FUER IN-BEFEHL
                      LD        D,A
                      LD        B,0FFH         ; I/O-PAGE (UNGERADE)
                      IN        A,(C)          ; LESE DRITTES BITPAAR EIN
                      AND       00110000B      ; MASKIEREN UND ZU E PACKEN
                      OR        E
                      LD        B,3            ; TRENNE BEIDE JUMPERFELDER
JUMPI1:               RRA
                      RL        D
                      RRA
                      RL        E
                      DJNZ      JUMPI1
                      POP       HL             ; HOLE DECODER TABELLE
                      PUSH      HL
                      LD        B,0
                      LD        A,D
                      AND       00000111B      ; MASKIEREN
                      LD        C,A
                      ADD       HL,BC
                      LD        D,(HL)
                      POP       HL             ; HOLE DECODER TABELLE
                      LD        A,E
                      AND       00000111B      ; MASKIEREN
                      LD        C,A
                      ADD       HL,BC
                      LD        A,(HL)
                      RET

;--------------------------------------------------------

UDTAB:                DEFB      00,00,00,02,00,03,04,01

UATAB:                                                  ; SEQUENZEN ZUM EINLESEN DER JUMPERSTELLUNG

                      DEFB      PAD_DATA OR PAD_SET     ; DATA SETZEN
                      DEFB      PAD_M0 AND PAD_RESET    ; M0 RUECKSETZEN
                      DEFB      PAD_M1 AND PAD_RESET    ; M1 RUECKSETZEN

                      DEFB      PAD_DATA AND PAD_RESET  ; DATA RUECKSETZEN
                      DEFB      PAD_M0 OR PAD_SET       ; M0 SETZEN

                      DEFB      PAD_M0 AND PAD_RESET    ; M0 RUECKSETZEN
                      DEFB      PAD_M1 OR PAD_SET       ; M1 SETZEN

BDTAB:                                                  ; UMRECHNUNGTABELLE JUMPER IN
                                                        ; BAUDKENNUNG
                      DEFB      0FH                     ; JUMPER OHNE = 0 (19200 BAUD)
                      DEFB      0EH                     ; JUMPER 1-3  = 1 ( 9600 BAUD)
                      DEFB      0AH                     ; JUMPER 2-4  = 2 ( 2400 BAUD)
                      DEFB      08H                     ; JUMPER 3-5  = 3 ( 1200 BAUD)
                      DEFB      06H                     ; JUMPER 4-6  = 4 (  300 BAUD)
                      
;--------------------------------------------------------

SER_INIT:             LD        A,00                      
                      OUT0      (04H),A                 ; ASCII Status Register Ch 0
                      LD        A,(SERBAUD0)
                      RRCA
                      RRCA
                      RRCA
                      LD        B,A
                      RRCA
                      AND       07H
                      OR        60H
                      OUT0      (00H),A                 ; ASCII Control Register A Ch 0
                      LD        A,B
                      AND       10H
                      OUT0      (02H),A                 ; ASCII Control B Ch 0 Register Ch 0
                      LD        A,(SERBAUD0)
                      CALL      MSER1INIT
                      LD        A,(LOG_DRIVE)
                      AND       04H
                      OUT0      (05H),A                 ; ASCII Status Register Ch 1
                      LD        A,(SERBAUD1)
                      RRCA
                      RRCA
                      RRCA
                      LD        B,A
                      RRCA
                      AND       07H
                      LD        C,A
                      LD        A,(LOG_DRIVE)
                      RLCA
                      AND       10H
                      OR        60H
                      OR        C
                      OUT0      (01H),A                 ; ASCII Control Register A Ch 1
                      LD        A,B
                      AND       10H
                      OUT0      (03H),A                 ; ASCII Control Register B Ch 1
                      LD        A,(SERBAUD1)
                      CALL      MSER2INIT

;-----------------------------------------------

; Ansprung über CS
CONST:
                                               ; VERTEILER FUER CONSOLEN STATUS
                                               ; DIE ROUTINEN MUESSEN A=FF UND KEIN ZERO-FLAG SETZEN
                                               ; FALLS EIN ZEICHEN DA IST SONST AKKU= 0 UND ZERO-FLAG

                      LD        A,(IO_JUMPERBYTE); LESE JUMPERBYTE EIN
                      CALL      VERTEILER
                      DEFW      GRAFIST
                      DEFW      SOFTIST
                      DEFW      USER1IST
                      DEFW      USER2IST
                      DEFW      DUMMYIST




; Ansprung über CI
CONIN:
                                               ; VERTEILER FUER CONSOLEN EINGABE
                                               ; DIE ROUTINE MUSSEN AUF EIN ZEICHEN VON DER KONSOLE WARTEN
                                               ; UND DIESES IM AKKU UEBERGEBEN
                                               ; ALLE ANDEREN REGISTER BLEIBEN UNVERAENDERT

                      LD        A,(IO_JUMPERBYTE)
                      CALL      VERTEILER
                      DEFW      GRAFIN
                      DEFW      SOFTIN
                      DEFW      USER1IN
                      DEFW      USER2IN
                      DEFW      DUMMYIN



; Ansprung über CO
CONOUT:
                                               ; VERTEILER FUER CONSOLEN AUSGABE
                                               ; DAS ZEICHEN IN REG C. WIRD VON DEN ROUTINEN AUSGEGEBEN
                                               ; UND IN AKKU KOPIERT, ALLE ANDEREN REGISTER BLEIBEN UNVERAENDERT

                      LD        A,(IO_JUMPERBYTE)
                      CALL      VERTEILER
                      DEFW      GRAFOUT
                      DEFW      SOFTOUT
                      DEFW      USER1OUT
                      DEFW      USER2OUT
                      DEFW      DUMMYOUT



VERTEILER:
                                               ; VERZEIGT AUF EINE DER ADRESSEN DIE DER RETURNADRESSE FOLGEN

                      EX        (SP),HL        ; LEGE RETURNADRESSE IN HL
VERTEILER1:
                      DEC       A              ; WAR AKKU NULL?
                      JP        M,VERTEILER2   ; DANN ZEIGT HL AUF DIE RICHTIGE RETURN ADR.
                      INC       HL             ; ANSONSTEN EINE ADRESSE WEITER
                      INC       HL
                      JR        VERTEILER1
VERTEILER2:
                      LD        A,(HL)         ; LADE ADRESSE DER ROUTINE IN HL
                      INC       HL
                      LD        H,(HL)
                      LD        L,A
                      EX        (SP),HL        ; LADE ALTES HL UND LEGE ADRESSE DER ROUTINE
                                               ; AUF DEN STACK
                      RET                      ; SPRINGE IN DIE RICHTIGE ROUTINE



DUMMYIST:
                      LD        A,0FFH
                      OR        A
                      RET

DUMMYIN:
                      LD        A,'Y'
                      RET

DUMMYOUT:
                      LD        A,C
                      RET




BREAK:
                                               ; PRUEFT OB EIN ZEICHEN EINGELESEN WURDE

                      CALL      CS
                      JP        Z,FRET
                      CALL      CI             ; LESE ZEICHEN
                      AND       7FH
                      CP        1BH            ; GLEICH ESCAPE
                      JP        Z,SRET         ; JA ENDE
BREAK1:               CALL      CS             ; WARTE AUF NEUES ZEICHEN
                      JR        Z,BREAK1
                      CALL      CI             ; LESE NEUES ZEICHEN
                      AND       7FH
                      CP        1BH
                      JP        Z,SRET         ; WAR BREAK
                      JP        FRET           ; WAR ETWAS ANDERES



CNVBN:
                      LD        A,C            ; WANDLUNG  
                      SUB       '0'
                      CP        0AH
                      RET       M
                      SUB       7
                      RET





GETHX:                                          ; HEXZEICHEN LESEN
                      PUSH      HL
                      LD        HL,0
                      LD        E,0             ; KENNUNG KEIN NEUER WERT
GETHX1:
                      CALL      GETCH1          ; LESE ZEICHEN (GROßBUCHSTABEN)
                      LD        C,A
                      CALL      VALDL           ; TRENNZEICHEN ERKANNT?
                      JP        NC,GETHX2       ; NEIN, WEITER
                      CALL      CECHO           ; JA, AUSGEBEN
                      LD        D,C
                      PUSH      HL
                      POP       BC              ; HEX-WERT UEBERGABE IN BC
                      POP       HL
                      LD        A,E
                      OR        A
                      JP        NZ,SRET         ; CARRY GESETZT -> NEUER WERT IN BC
                      JP        Z,FRET          ; CARRY GELOESCHT -> KEINE NEUER WERT
GETHX2:
                      CALL      VALDG           ; GÜLTIGE HEXZIFFER?
                      JP        NC,GETHX1       ; NAECHSTES ZEICHEN LESEN
                      CALL      CECHO           ; AUSGEBEN
                      CALL      CNVBN           ; BINAER WANDELN
                      LD        E,0FFH          ; KENNUNG NEUER WERT IST DA
                      ADD       HL,HL
                      ADD       HL,HL
                      ADD       HL,HL
                      ADD       HL,HL           ; * 16 (LEFT SHIFT 4 BIT)
                      LD        B,0
                      LD        C,A             ;
                      ADD       HL,BC           ; IN UNTERE 4 BIT EINSCHIEBEN
                      JP        GETHX1          ; NAECHSTES ZEICHEN LESEN

GETDEZ:
                                               ; LESE DEZIMALZAHLEN NACH HL
                                               ; ALS TRENNZEICHEN WERDEN '/',':' UND <CR> ERKANNT
                                               ; TRENNZEICHEN WIRD IN AKKU UEBERGEBEN

                      LD        B,0
                      LD        HL,0           ; LOESCHE AKKU
GETDEZ1:              CALL      GETCH1         ; LESE ZEICHEN
                      CP        '/'
                      JR        Z,GETDEZ2
                      CP        ':'
                      JR        Z,GETDEZ2
                      CP        0DH
                      JR        Z,GETDEZ2
                      SUB       '0'            ; ZAHL ?
                      JR        C,GETDEZ1
                      CP        0AH
                      JR        NC,GETDEZ1
                      LD        C,A
                      ADD       HL,HL
                      ADD       HL,HL
                      ADD       HL,HL
                      ADD       HL,HL
                      ADD       HL,BC
                      LD        A,'0'          ; GEBE ZAHL AUS
                      ADD       A,C
                      LD        C,A
                      CALL      CECHO
                      JR        GETDEZ1
GETDEZ2:              LD        C,A
                      CALL      CECHO
                      LD        A,C
                      RET



; INHALT VON HL ALS HEXWERT AUSGEBEN UND NEUER WERT (ADRESSE)

HL_NEU_WRT:           PUSH      HL
                      CALL      HLOUT          
                      LD        C,'-'
                      CALL      CECHO
                      CALL      GETHX
                      JR        NC,HL_NEU_WR1
                      POP       AF
                      PUSH      BC             ; NEUER WERT VON BC
HL_NEU_WR1:           POP       HL             ; NACH HL
                      LD        A,D
                      CP        0DH            ; PRUEFE AUF CR
                      RET


; INHALT VON A ALS HEXWERT ausgeben und neuen Hex-Wert einlesen (BYTE)

NEU_WRT:              PUSH      AF
                      CALL      NMOUT          ;Hexziffernausgabe
                      LD        C,'-'          ;
                      CALL      CECHO          ;Minus-Zeichen ausgeben
                      CALL      GETHX          ;NEUER WERT
                      JR        NC,NEU_WR1     ;
                      POP       AF
                      LD        A,C
                      PUSH      AF
NEU_WR1:              POP       BC
                      LD        A,D
                      CP        0DH            ; PRUEFE AUF CR
                      LD        A,B
                      RET


; EINGABE VON JA(Y) ODER NEIN(N) ABFRAGEN

JA_NEIN:              OR        A               ; ALTER WERT NEIN?
                      JR        Z,JA_NEIN_1
                      LD        A,JA            ; VORBELEGUNG MIT JA
JA_NEIN_1:            PUSH      AF
                      LD        HL,Y_TXT        ; TEXT Y VORBELEGEN
                      JR        NZ,JA_NEIN_2
                      LD        HL,N_TXT        ; TEXT N VORBELEGEN
JA_NEIN_2:            CALL      SOUT            ; TEXT AUSGEBEN

JA_NEIN_3:            CALL      GETCH1          ; NEUEN WERT EINLESEN
                      CP        'Y'             ; EINGABE 'Y'?
                      LD        C,JA
                      JR        Z,JA_NEIN_4
                      CP        'N'             ; EINGABE 'N'?
                      LD        C,NEIN
                      JR        Z,JA_NEIN_4
                      LD        C,A
                      CALL      VALDL           ; GÜLTIGES ENDEZEICHEN?
                      JR        NC,JA_NEIN_3    ; KEIN GÜLTIGES ZEICHEN -> NEUE EINGABE
                      CALL      CECHO           ; ZEICHEN SPIEGELN
                      POP       AF
                      LD        B,A             ; ZEICHEN RETTEN
                      LD        A,0DH           ; 'CR' EINGEGEBEN?
                      CP        C
                      LD        A,B             ; ZEICHEN ZURUECKRETTEN
                      RET

JA_NEIN_4:            PUSH      BC
                      LD        C,A
                      CALL      CECHO
                      POP       BC
                      POP       AF
                      LD        A,C
                      PUSH      AF
                      JR        JA_NEIN_3


; NEGIERTE EINGABE JA/NEIN

NEG_JA_NEIN:          OR        A
                      JR        Z,NEG_JN_1
                      LD        A,JA
NEG_JN_1:             CPL
                      CALL      JA_NEIN
                      CPL
                      RET


Y_TXT:                DEFM      ' Y-$'
N_TXT:                DEFM      ' N-$'




ANZ_TXT_HD:           LD        A,(OMTI_OK)
                      LD        HL,TX_HD        ; TEXT "HARDDISK" VORBEREITEN
                      JR        DISKDA_1


DISKDA:
                                                ; GIBT MELDUNG AUS, WENN DISKZUGRIFF OHNE KONTROLLER VERSUCHT WIRD
                                                ; UND KEHRT AUF DIE EINGABEEBENE ZURUECK
                      LD        A,(DISKFLG)     ; LADE FLAG
                      LD        HL,TX_FLOPPY    ; TEXT 'FLOPPY' VORBEREITEN
DISKDA_1:             OR        A               ; =NULL?
                      RET       NZ              ; ZURUECK ZUM RUFENDEN PROGRAMM -> CONTROLLER DA
                      CALL      SP_OUT
                      LD        HL,NODISK       ; GEBE MELDUNG AUS
                      CALL      SOUT
                      JP        GETCOM          ; AUF KOMMANDOEBENE ZURUECK

TX_FLOPPY:            DEFM      01H,'Floppy$'
NODISK:               DEFM      ' access not possible',BELL,'$'
TX_HD:                DEFM      01H,'Harddisk$'




TST_UNIT:             LD        A,(HD_DISKFLG)  ; LAUFWERK EINGELOGGT?
                      AND       06H
                      JR        NZ,TST_UNIT1    ; OK
                      LD        HL,NO_DRIVE_TXT ; FEHLERMELDUNG
                      CALL      SOUT
                      JP        GETCOM
TST_UNIT1:            CP        04H
                      RET

NO_DRIVE_TXT:         DEFM      0DH,0AH,07h,' no drive specified$'



REGDS:                
;                     CALL      CROUT           ; NEUE ZEILE
                      LD        HL,RTAB
REGDS3:
                      LD        C,(HL)
                      LD        A,C
                      OR        A
                      JP        NZ,REGDS0
                      CALL      CROUT
                      RET
REGDS0:
                      CP        'a'             ; SOLL NEUE ZEILE ANFANGEN?
                      JR        NZ,REGDS1       ; SPRUNG WENN NEIN
                      PUSH      AF
                      PUSH      BC
                      CALL      CROUT
                      POP       BC
                      POP       AF
REGDS1:
                      CALL      CECHO
                      LD        C,'='
                      CALL      CECHO
                      INC       HL
                      LD        E,(HL)
                      LD        D,(REGS AND 0FF00H) SHR 8
                      INC       HL
                      LD        A,(DE)
                      CALL      NMOUT
                      LD        A,(HL)
                      OR        A
                      JP        Z,REGDS2
                      DEC       DE
                      LD        A,(DE)
                      CALL      NMOUT
REGDS2:
                      LD        C,' '
                      CALL      CECHO
                      INC       HL
                      JP        REGDS3



RGADR:
                      LD        HL,RTAB
                      LD        DE,3           ; LAENGE DER TABELLEN EINTRAEGE
RGADR1:
                      LD        A,(HL)
                      OR        A
                      JP        Z,CERROR
                      CP        C
                      JP        Z,RGADR2
                      ADD       HL,DE
                      JP        RGADR1
RGADR2:
                      INC       HL
                      LD        B,H
                      LD        C,L
                      RET



                                               ;--------------------REGISTER ZURUECKLADEN------

RSTTF:
                      DI                       ; INTERRUPTS SPERREN
                      LD        SP,MSTAK       
                      POP       BC             ; LADE I UND R REGISTER
                      LD        A,C
                      LD        R,A
                      LD        A,B
                      LD        I,A
                      EXX
                      EX        AF,AF'         ; ERST ZWEITREGISTERSATZ LADEN
                      POP       HL
                      POP       DE
                      POP       BC
                      POP       AF
                      EX        AF,AF'
                      EXX                      ; JETZT NORMALER REGISTERSATZ
                      POP       IY
                      POP       IX
                      POP       DE
                      POP       BC
                      POP       AF
                      LD        SP,(SSAVE)     ; STACKPOINTER RESTAURIEREN
                      LD        HL,(PSAVE)     ; HL RESTAURIEREN
                      PUSH      HL
                      LD        HL,(LSAVE)
                      EI                       ; INTERRUPTS WIEDER FREIGEBEN
                                               ;------------------ENDE REGISTER ZURUECKLADEN--------
                      RET


CERROR:
                      LD        HL,SYNERRTXT
                      CALL      SOUT
                      JP        GETCM

SYNERRTXT:
                      DEFM      " What?",BELL,0DH,0AH,'$'


FRET:
                      SCF                       ; RETURN MIT CARRY
                      CCF                       ; GELOESCHT
                      RET

SRET:
                      SCF                       ; RETURN MIT CARRY GESETZT
                      RET


VALDG:                                          ;GUELTIGE EINGABEN PRUEFEN '0...9','A...F'
                      LD        A,C
                      CP        '0'
                      JP        M,FRET
                      CP        '9'
                      JP        M,SRET
                      JP        Z,SRET
                      CP        'A'
                      JP        M,FRET
                      CP        'G'
                      JP        P,FRET
                      JP        SRET



VALDL:                                          ;GUELTIGE EINGABEN PRUEFEN ',' ODER 'CR' ODER ' '
                      LD        A,C
                      CP        ','
                      JP        Z,SRET
                      CP        0DH
                      JP        Z,SRET
                      CP        ' '
                      JP        Z,SRET
                      JP        FRET

DISP_TIME:
                                               ; GEBE UHRZEIT UND DATUM AUF DEN BILDSCHIRM
                      CALL      READ_PHYS_TIME ; LESE ZEIT AUS UHR
                      LD        HL,TIMTXT1     ; DATUM TEXT AUS
                      CALL      SP_OUT
                      LD        A,(TIME_FIELD+4); MONAT
                      CALL      NMOUT
                      LD        C,'/'
                      CALL      CECHO
                      LD        A,(TIME_FIELD+3)
                      CALL      NMOUT
                      LD        C,'/'
                      CALL      CECHO
                      LD        A,(TIME_FIELD+6)
                      CALL      NMOUT
                      LD        HL,TIMTXT2        ; GEBE TIME AUS
                      CALL      SP_OUT
                      LD        A,(TIME_FIELD+2); STUNDE
                      CALL      NMOUT
                      LD        C,':'
                      CALL      CECHO
                      LD        A,(TIME_FIELD+1); MINUTE
                      CALL      NMOUT
                      LD        C,':'
                      CALL      CECHO
                      LD        A,(TIME_FIELD)  ; SEKUNDE
                      CALL      NMOUT
                      CALL      CROUT
                      LD        A,(IO_JUMPERBYTE); IST GRIP ALS KONSOLE DEFINIERT?
                      OR        A
                      RET       NZ              ; RETURN WENN NICHT
                      LD        HL,SETTT          ; SONST, SETZE GRIP-UHR
                      CALL      SOUT
                      LD        A,(TIME_FIELD+2)
                      ADD       A,20H
                      LD        C,A
                      CALL      CECHO
                      LD        A,(TIME_FIELD+1)
                      ADD       A,20H
                      LD        C,A
                      CALL      CECHO
                      LD        A,(TIME_FIELD)
                      ADD       A,20H
                      LD        C,A
                      CALL      CECHO
                      RET

SETTT:                DEFM      27,27,'U$'
TIMTXT1:              DEFM      16H,'PCF8583 Date : $'
TIMTXT2:              DEFM      1EH,'Time : $'


; ------------ Ich weiß nicht, was das soll -------------
          PUSH      BC
          CP        0
          JR        Z,L_0FAA
          LD        B,0
L_0FA3:   INC       B
          DEC       A
          DAA
          JP        NZ,L_0FA3
          LD        A,B
L_0FAA:   POP       BC
          RET
; ------------ Ich weiß nicht, was das soll -------------



; LESE HEX-ADRESSEN EIN

GETNM:                LD        L,3               ; MAXIMAL 3 ADRESSEN EINLESEN
                      LD        A,C               ; GEWUENSCHTE ANZAHL IN C-REG
                      AND       03H               ; 0..3
                      RET       Z                 ; 0=KEINE EINGABE ERFORDERLICH

                      LD        H,A               ; SCHLEIFE FÜR ANZAHL ADRESSEN
GETNM1:
                      CALL      GETHX
                      JP        NC,CERROR         ; FEHLERHAFTE EINGABE?
                      PUSH      BC                ; WERT AUF DEM STACK ABLEGEN
                      DEC       L
                      DEC       H                 ; EIN WERT WENIGER EINZUGEBEN
                      JP        Z,GETNM3          ; ALLE ADRESSEN SIND EINGELESEN
                      LD        A,D               ; LETZTES EINGEGEBENES ZEICHEN
GETNM2:
                      CP        0DH               ; 'CR' ?
                      JP        Z,CERROR
                      JP        GETNM1            ; NAECHSTEN WERT EINLESEN

GETNM3:               LD        A,D
                      CP        0DH               ; LETZTES ZEICHEN 'CR'?
GETNM4:               JP        NZ,CERROR
                      LD        BC,0FFFFH
                      LD        A,L
                      OR        A
                      JP        Z,GETNM6

GETNM5:               PUSH      BC
                      DEC       L
                      JP        NZ,GETNM5
GETNM6:               POP       BC
                      POP       DE
                      POP       HL
                      CALL      HILO               ; RANGECHECK
                      JP        NC,GETNM7
                      LD        D,H
                      LD        E,L
GETNM7:               EX        (SP),HL
                      PUSH      DE
                      PUSH      BC
                      PUSH      HL
GETNM8:               DEC       A
                      RET       M
                      POP       HL
                      EX        (SP),HL
                      JP        GETNM8


HILO:                 PUSH      BC                 ; BC RETTEN
                      LD        B,A
                      PUSH      HL                 ; HL RETTEN
                      LD        A,D
                      OR        E
                      JP        Z,HILO_1           ; DE=0?
                      INC       HL
                      LD        A,H
                      OR        L                  ; 
                      JP        Z,HILO_1           ; HL=FFFFH?
                      POP       HL                 ; HL ZURUECK
                      PUSH      DE                 ; DE RETTEN
                      LD        A,0FFH
                      XOR       D
                      LD        D,A
                      LD        A,0FFH
                      XOR       E
                      LD        E,A
                      INC       DE
                      LD        A,L
                      ADD       A,E
                      LD        A,H
                      ADC       A,D
                      POP       DE                 ; DE ZURUECK
                      LD        A,B
                      POP       BC                 ; BC ZURUECK
                      RET


HILO_1:               POP       HL                 ; HL ZURUECK
                      LD        A,B
                      POP       BC                 ; BC ZURUECK
                      JP        SRET               ; MIT FEHLER ZURUECK


; ------------ Ich weiß nicht, was das soll -------------

          LD        BC,W_103D
          LD        DE,W_D8F0
L_101E:   LD        A,B_2F
L_1020:   PUSH      HL
          INC       A
          ADD       HL,DE
          JR        NC,L_1029
          INC       SP
          INC       SP
          JR        L_1020
L_1029:   PUSH      DE
          PUSH      BC
          LD        C,A
          CALL      CECHO
          POP       BC
          POP       DE
          POP       HL
          LD        A,(BC)
          LD        E,A
          INC       BC
          LD        A,(BC)
          LD        d,A
          INC       BC
          LD        A,E
          OR        d
          JR        NZ,L_101E
          RET


W_103D:   JR        L_103B     ; TABELLE ??
          sBC       A,H
          rst       38h
          OR        0FFH
          rst       38h
          rst       38h
          nop
          nop

; ------------ Ich weiß nicht, was das soll Ende -------------


RWINP:
                                               ; LIEST DMA ADRESSE UND ANZAHL DER SEKTOREN EIN
                      CALL      GETHX          ; LESE DMA ADRESSE
                      JP        NC,CERROR
                      LD        A,D            ; KEIN CR
                      CP        0DH
                      JP        Z,CERROR       ; SPRUNG WENN DOCH
                      LD        (DMAADR),BC    ; ABSPEICHERN
                      CALL      GETHX          ; LESE ANZAHL DER SEKTOREN
                      JP        NC,CERROR
                      LD        A,D
                      CP        0DH            ; MUSS CR SEIN
                      JP        NZ,CERROR
                      LD        A,C
                      LD        (SECTCNT),A    ; ABSPEICHERN
                      RET


RST_VERTEILER:      

                                               ;---------------------------ANFANG REGISTER RETTEN-----
                      LD        (LSAVE),HL
                      POP       HL
                      LD        (PSAVE),HL
                      LD        (SSAVE),SP     ; RETTE STACKPOINTER
                      LD        SP,LSAVE       ; JETZT RETTEN DURCH PUSHBEFEHLE MOEGLICH
                      PUSH      AF
                      PUSH      BC
                      PUSH      DE
                      PUSH      IX             ; ZUSAETZLICH Z80 REGISTER
                      PUSH      IY
                      EX        AF,AF'
                      EXX                      ; SCHALTE REGISTER  UM
                      PUSH      AF
                      PUSH      BC
                      PUSH      DE
                      PUSH      HL
                      EXX                      ; REGISTER ZURUECK SCHALTEN
                      EX        AF,AF'
                      LD        A,I            ; SAVE I UND R REGISTER
                      LD        B,A
                      LD        A,R
                      LD        C,A
                      PUSH      BC
;                      PUSH      IX
;                      LD        IX,(PSAVE)     ; BREAKPOINT GESETZT?
;                      DEC       IX             ; IP -1
;                      LD        A,(IX)
;                      CP        0FFH           ; RST 38H?
;                      JR        NZ,RST_V1
;                      LD        (PSAVE),IX     ; ALTEN OPCODE WIEDERHERSTELLEN
;                      PUSH      HL
;                      PUSH      IX
;                      POP       HL             ; IP UMSPEICHERN
;                      PUSH      AF
;                      PUSH      BC             ; UND BREAKPOINT LOESCHEN
;                      PUSH      IY
;                      LD        B,5            ; 5 BREAKPOINT MÖGLICH
;                      LD        IY,BRTAB
;RST_V0:               LD        A,(IY)
;                      CP        L
;                      JR        NZ,RST_V01     ; KEINE UEBEREINSTIMMUNG
;                      LD        A,(IY+1)
;                      CP        H
;                      JR        NZ,RST_V01     ; KEINE UEBEREINSTIMMUNG

;                      LD        A,(IY+2)       ; ALTEN OPCODE
;                      LD        (HL),A         ; WIEDER HERSTELLEN
;                      XOR       A              ; BREAKPOINT IN TABELLE LOESCHEN
;                      LD        (IY),A
;                      LD        (IY+1),A
;                      LD        (IY+2),A
;                      JR        RST_V02        ; GEFUNDEN -> FERTIG

;RST_V01:              INC       IY             ; NAECHSTEN BREAKPOINT PRUEFEN
;                      INC       IY
;                      INC       IY
;                      DJNZ      RST_V0         ; BIS ALLE GEPRUEFT

;RST_V02:              POP       IY
;                      POP       BC
;                      POP       IX
;                      POP       AF
;                      POP       HL
;                      CALL      REGDS          ; REGISTERSATZ ANZEIGEN
                                               ;---------------------------ENDE REGISTER RETTEN----

RST_V1:

                      LD        HL,SGNON       ; GEBE MONITOR-MELDUNG AUS
                      CALL      SOUT



GETCOM:               CALL      CROUT

GETCM:
                      LD        HL,MSTAK
                      LD        SP,HL
                      LD        C,':'
                      CALL      CECHO
                      CALL      GETCH1
                      CALL      CECHO
                      LD        D,C            ; SAVE COMMAND
                      LD        HL,CMDMSG      ; ZEIGE AUF TEXT
GTC01:                LD        A,D
                      CP        (HL)           ; GLEICH
                      JR        Z,GTC04
GTC02:                INC       HL
                      LD        A,(HL)         ; GLEICH 00H
                      CP        0
                      JP        Z,CERROR       ; DANN FEHLER
                      CP        '$'
                      JR        NZ,GTC02       ; SUCHE
                      INC       HL             ; VERGLEICHE NAECHSTES KOMMANDO
                      JR        GTC01
GTC04:                INC       HL             ; GEFUNDEN GEBE AUS
                      CALL      SOUT
                      LD        A,D
                      LD        C,D
                      LD        BC,NCMDS       ; C ENTHAELT SCHL.U.INDEXZAEHLER
                      LD        HL,CTAB
GTC05:
                      CP        (HL)
                      JP        Z,GTC10
                      INC       HL
                      DEC       C
                      JP        NZ,GTC05
                      JP        CERROR
GTC10:
                      LD        HL,CADR
                      ADD       HL,BC
                      ADD       HL,BC
                      LD        A,(HL)
                      INC       HL
                      LD        H,(HL)
                      LD        L,A
                      JP        (HL)

;-----------------------------------------------
;(D)ump

DCMD:
                      CALL      GETHX          ; LESE STARTADRESSE
                      LD        H,B
                      LD        L,C
                      LD        A,D
                      JR        C,DCM30
                      CP        CR             ; carriage return?
                      LD        HL,(DISPADR)
                      JR        NZ,DCM33       ; SPRUNG WENN NOCH ENDADRESSE KOMMT
DCM31:                LD        DE,00FFH       ; KEINE ENDADRESSE, 100H WEITER
                      PUSH      HL             ; SAVE ANFAANG
                      ADD       HL,DE
                      EX        DE,HL
                      POP       HL
                      JR        DCM05          ; AUSGABE KANN BEGINNEN
DCM30:                CP        0DH
                      JR        Z,DCM31        ; KEINE ENDADRESSE
DCM33:                CALL      GETHX          ; LESE ZWEITE ADRESSE
                      LD        A,D
                      CP        0DH
                      JP        NZ,CERROR
                      LD        D,B
                      LD        E,C
                      CALL      HILO
                      JR        NC,DCM05       ; HL>DE
                      LD        D,H
                      LD        E,L
DCM05:
                      CALL      CROUT
                      CALL      HLOUT
                      LD        B,000H         ; ZAEHLER FUER ASCII AUSGABE
DCM10:
                      INC       B              ; EIN ZEICHEN WEITER
                      LD        C,' '
                      CALL      CECHO
                      LD        A,(HL)
                      CALL      NMOUT
                      CALL      BREAK
                      JP        C,DCM12
                      CALL      HILO
                      JP        NC,DCM15
DCM12:
                      INC       HL
                      CALL      DCM20
                      CALL      CROUT
                      LD        (DISPADR),HL
                      JP        GETCM
DCM15:
                      INC       HL
                      LD        A,L
                      AND       0FH
                      JP        NZ,DCM10
                      CALL      DCM20
                      JR        DCM05

DCM20:                PUSH      DE             ; SAVE D
                      PUSH      HL             ; SAVE H
                      LD        C,' '
                      CALL      CO
                      LD        C,'>'
                      CALL      CO
                      LD        C,B
DCM23:                DEC       HL
                      DJNZ      DCM23
                      LD        B,C
DCM21:                LD        A,(HL)
                      CP        20H
                      JR        C,DCM22
                      CP        07FH
                      JR        NC,DCM22
                      JR        DCM24
DCM22:                LD        A,'.'          ; DEFAULT FOR NON ASCII
DCM24:                LD        C,A
                      CALL      CO
                      INC       HL
                      DJNZ      DCM21
                      POP       HL
                      POP       DE
                      RET

;----------------------------------------------

GCMD:                                         ; PROGRAMMCOUNTER NEU LADEN UND ABLEGEN
                      CALL      GETHX         ; STARTADRESSE EINLESEN
                      JP        NC,GCM05      ; KEIN NEUER WERT
                      LD        A,D           ; LETZTES ZEICHEN
                      CP        0DH           ; CR?
                      JP        NZ,CERROR     ; FEHLER
                      LD        HL,PSAVE      ; STARTADRESSE LADEN
                      LD        (HL),C        ; NEUE STARTADRESSE SPEICHERN
                      INC       HL
                      LD        (HL),B
                      JP        GCM10         ; WEITER
GCM05:                                        
                      LD        A,D           ; LETZTES ZEICHEN
                      CP        0DH           ; CR?
                      JP        NZ,CERROR     ; FEHLER
GCM10:
                      JP        RSTTF         ; REGISTER ZURUECKLADEN UND LOS

;----------------------------------------------
;(M)ove

MCMD:
                      LD        C,3           ; 3 HEX-ADRESSEN EINLESEN
                      CALL      GETNM
                      POP       BC            ; 1. ADRESSE
                      POP       HL            ; 2. ADRESSE
                      POP       DE            ; 3. ADRESSE
MCM05:
                      PUSH      HL
                      LD        H,D
                      LD        L,E
                      LD        A,(HL)
                      LD        H,B
                      LD        L,C
                      LD        (HL),A
                      INC       BC
                      LD        A,B
                      OR        C
                      JP        Z,GETCM
                      INC       DE
                      POP       HL
                      CALL      HILO
                      JP        NC,GETCM
                      JP        MCM05

;---------------------------------------------------
; (S)ubstitute memory

SCMD:
                      CALL      GETHX             ; Adresse lesen
                      PUSH      BC                ; nach HL kopieren
                      POP       HL
SCM05:
                      LD        A,D               ; bei Leerzeichen oder Komma weiter
                      CP        ' '
                      JP        Z,SCM10
                      CP        ','
                      JP        NZ,GETCM        ; Ende der Eingabe
SCM10:
                      LD        A,(HL)          ; alten Wert
                      CALL      NMOUT             ; anzeigen
                      LD        C,CNGPRMT         ; neuen Wert
                      CALL      CECHO             ; anfordern
                      CALL      GETHX             ; neuen Wert einlesen
                      JP        NC,SCM15
                      LD        (HL),C
SCM15:
                      INC       HL
                      JP        SCM05

;---------------------------------------------------

XCMD:
                      CALL      GETCH
                      LD        C,A
                      CALL      CECHO
                      LD        A,C
                      CP        0DH            ; REGISTERSATZ KOMPLETT AUSGEBEN?
                      JP        NZ,XCM05
                      CALL      REGDS
                      JP        GETCM
XCM05:
                      LD        C,A
                      CALL      RGADR
                      PUSH      BC
                      POP       HL
                      LD        C,' '
                      CALL      CECHO
                      LD        A,C
                      LD        (TEMP),A
XCM10:
                      LD        A,(TEMP)
                      CP        ' '
                      JP        Z,XCM15
                      CP        ','
                      JP        NZ,GETCM
XCM15:
                      LD        A,(HL)
                      OR        A
                      JP        NZ,XCM18
                      JP        GETCOM
XCM18:
                      PUSH      HL
                      LD        E,(HL)
                      LD        D,(REGS AND 0FF00H) SHR 8; SAVE ADRESSE
                      INC       HL
                      LD        B,(HL)
                      PUSH      DE
                      PUSH      DE
                      POP       HL
                      PUSH      BC
                      LD        A,(HL)
                      CALL      NMOUT
                      POP       AF
                      PUSH      AF
                      OR        A
                      JP        Z,XCM20
                      DEC       HL
                      LD        A,(HL)
                      CALL      NMOUT
XCM20:
                      LD        C,CNGPRMT
                      CALL      CECHO
                      CALL      GETHX
                      JP        NC,XCM30
                      LD        A,D
                      LD        (TEMP),A
                      POP       AF
                      POP       HL
                      OR        A
                      JP        Z,XCM25
                      LD        (HL),B
                      DEC       HL
XCM25:
                      LD        (HL),C
XCM27:
                      LD        DE,3
                      POP       HL
                      ADD       HL,DE
                      JP        XCM10
XCM30:
                      LD        A,D
                      LD        (TEMP),A
                      POP       DE
                      POP       DE
                      JP        XCM27

;-----------------------------------------------

CCMD:
                                               ; TESTET PLATTE IM ANGEGEBENEN LAUFWERK
                                               ; UND GIBT ERGEBNISSE AUF DEM BILDSCHIRM AUS

                      CALL      GETCH          ; WELCHES LAUFWERK?
                      CALL      CECHO          ; GEBE ZEICHEN AUF CONSOLE
                      LD        A,C            ; ZEICHEN IN AKKU
                      CP        'H'          
                      JP        Z,CCMD_HD       ; -> HARDDISK
                      CP        'h'
                      JP        Z,CCMD_HD       ; -> HARDDISK
                      PUSH      AF
                      CALL      DISKDA         ; BEFEHL ERLAUBT?
                      POP       AF
                      SUB       'A'            ; WANDLE LW. CHR. IN NUMMER
                      JP        C,CERROR       ; WENN KLEINER, FEHLER
                      LD        B,0
                      CP        4              ; GROESSER 'D'
                      JR        C,CCMD0
                      sub       B_20
                      JP        C,CERROR
                      LD        B,B_04
                      CP        B_04
                      JP        NC,CERROR      ; SPRUNG WENN JA

CCMD0:                LD        C,A            ; RETTE ALTE UNIT
                      LD        A,(UNIT)
                      PUSH      AF
                      LD        A,C
                      CALL      LOG_PHYS
                      OR        B
                      LD        (UNIT),A       ; ZU TESTENDES LAUFWERK
                      LD        B,5            ; ANZAHL DER VERSUCHE


CCMD1:                PUSH      BC
                      LD        HL,(UNIT)      ; RETTE UNIT UND TRACK
                      PUSH      HL
                      CALL      TEST
                      POP       HL
                      LD        (UNIT),HL
                      POP       BC             ; GET ZAEHLER
                      OR        A              ; FEHLER AUFGETRETEN?
                      JR        Z,CCMD2        ; SPRUNG, WENN OK
                      DJNZ      CCMD1          ; NOCH EIN VERSUCH?

                      POP       AF             ; HOLE ALTE UNIT
                      LD        (UNIT),A
CCMD5:                                         ; HIER AUCH EINSPRUNG FUER BOOT ERROR
                      LD        HL,CHKERR      ; DRUCKE FEHLERMELDUNG
                      CALL      SOUT
                      JP        GETCM          ; NEUE EINGABE

CHKERR:               DEFB      0DH,0AH,BELL
                      DEFM      " Disk not correct"
                      DEFB      0DH,0AH,24H



CCMD2:                POP       AF
                      LD        HL,CTXT1       ; DISK FORMAT AUSGEBEN
                      CALL      SP_OUT
                      LD        A,(TEST_TYPE)
                      AND       20H
                      LD        HL,CTXT11      ; MAXI VORBELEGEN
                      JR        Z,CCMD3
                      LD        HL,CTXT12      ; DOCH MINI

CCMD3:                CALL      SOUT
                      LD        HL,CTXT2       ; TWO SIDED BIT AUSGEBEN
                      CALL      SP_OUT
                      LD        A,(TEST_TYPE)
                      RLCA
                      AND       01H
                      LD        HL,CTXT32      ; DOUBLE VORBELEGEN (=1)
                      JR        Z,CCMD4        ; =0?
                      LD        HL,CTXT31      ; DOCH SINGLE

CCMD4:                CALL      SOUT
                      LD        HL,CTXT3       ; DENSITY AUSGEBEN
                      CALL      SP_OUT
                      LD        A,(TEST_TYPE)
                      LD        HL,CTXT22      ; HIGH VORBELEGEN (=1)
                      AND       40H
                      JR        Z,CCMD6        ; =0?
                      LD        HL,CTXT21      ; DOCH LOW

CCMD6:                CALL      SOUT
                      LD        HL,CTXT4       ; SECTOR SIZE AUSGEBEN
                      CALL      SP_OUT
                      LD        A,(TEST_TYPE)  
                      AND       03H            ; BIT 0 UND 1 AUSWERTEN
                      LD        H,0
                      LD        L,A            ; 0 - 3
                      ADD       HL,HL          ; * 2
                      ADD       HL,HL          ; * 4
                      ADD       HL,HL          ; * 8 (8 CHAR./EINTRAG)
                      LD        DE,SEKTXT      ; TEXTTABELLE
                      ADD       HL,DE          ; + OFFSET
                      CALL      SOUT

                      LD        HL,CTXT7       ; FIRST SECTOR AUSGEBEN
                      CALL      SP_OUT
                      LD        A,(TEST_LSEK)
                      CALL      DEZOUT
                      LD        HL,CTXT8       ; LAST SECTOR AUSGEBEN
                      CALL      SP_OUT
                      LD        A,(TEST_MSEK)
                      CALL      DEZOUT
                      LD        HL,CTXT9       ; HEAD BYTE ID AUSGEBEN
                      CALL      SP_OUT
                      LD        A,(REST+4)     ; AUS ERGEBNIS NEHMEN
                      CALL      NMOUT
                      LD        HL,CTXT6       ; READY SIGNAL AUSGEBEN
                      CALL      SP_OUT
                      CALL      READY_MASK
                      AND       0FH            ; 
                      LD        HL,CTXT62      ; SIMULATED VORBELEGEN
                      JR        NZ,CCMD7
                      LD        HL,CTXT61      ; DOCH YES

CCMD7:                CALL      SOUT
                      LD        A,(HD_DISKFLG) 
                      AND       0F9H
                      OR        02H
                      LD        (HD_DISKFLG),A
                      CALL      SETCMDT        ; CMD TABELLE VORBEREITEN
                      JP        GETCOM


; HARDDISK AUSGEWAEHLT

CCMD_HD:              CALL      L_0ABC
                      JR        NZ,CCMD_HD1
                      LD        HL,CTXT40      ; NO OF CYLINDERS
                      CALL      SP_OUT
                      LD        HL,(HD_NO_CYL)
                      CALL      CCMD_HD2       ; BYTE SWAP HL UND AUSGEBEN
                      LD        HL,CTXT41      ; NO OF HEADS
                      CALL      SP_OUT
                      LD        A,(HD_NO_HEADS)
                      CALL      NMOUT
                      LD        HL,CTXT42      ; START RWC CYLINDER
                      CALL      SP_OUT
                      LD        HL,(HD_RWC_CYL)
                      CALL      CCMD_HD2       ; BYTE SWAP HL UND AUSGEBEN
                      LD        HL,CTXT43      ; START PRECOM CYLINDER
                      CALL      SP_OUT
                      LD        HL,(HD_PRE_CYL)
                      CALL      CCMD_HD2       ; BYTE SWAP HL UND AUSGEBEN
                      LD        HL,CTXT44      ; ECC BYTE
                      CALL      SP_OUT
                      LD        A,(HD_ECC_BYTE)
                      CALL      NMOUT
                      LD        HL,CTXT45      ; CONTROL BYTE
                      CALL      SP_OUT
                      LD        A,(HD_CTRL_BYTE)
                      CALL      NMOUT
                      LD        HL,CTXT46      ; SECTROS PER TRACK
                      CALL      SP_OUT
                      LD        HL,(HD_SCTR_TRK)
                      SRL       H              ; DIVIDIERE DURCH 4
                      RR        L              
                      SRL       H
                      RR        L              
                      CALL      HLOUT

CCMD_HD1:             LD        A,(HD_DISKFLG)
                      AND       0F9H
                      OR        04H
                      LD        (HD_DISKFLG),A
                      JP        GETCOM

CCMD_HD2:             LD        A,L            ; BYTE SWAP HL
                      LD        L,H
                      LD        H,A
                      JP        HLOUT          ; AUSGEBEN UND ZURÜCK

CTXT40:               DEFM      01H,'no. of cylinders......: $'
CTXT41:               DEFM      01H,'no. of heads..........:   $'
CTXT42:               DEFM      01H,'start RWC cylinder....: $'
CTXT43:               DEFM      01H,'start precom. cylinder: $'
CTXT44:               DEFM      01H,'ECC byte .............:   $'
CTXT45:               DEFM      01H,'control byte .........:   $'
CTXT46:               DEFM      01H,'sectors per track ....: $'

CTXT1:                DEFM      01H,'disk format...: $'
CTXT2:                DEFM      01H,'two sided bit.: $'
CTXT3:                DEFM      01H,'density.......: $'
CTXT4:                DEFM      01H,'sector size...: #$'
CTXT7:                DEFM      01H,'first sector..: #$'
CTXT8:                DEFM      01H,'last sector...: #$'
CTXT9:                DEFM      01H,'head byte ID..: $'
CTXT6:                DEFM      01H,'ready signal..: $'
CTXT21:               DEFM      'low$'
CTXT22:               DEFM      'high$'
CTXT31:               DEFM      'single$'
CTXT32:               DEFM      'double$'
SEKTXT:               DEFM      '128    $'
                      DEFM      '256    $'
                      DEFM      '512    $'
                      DEFM      '1024   $'
CTXT11:               DEFM      'maxi$'
CTXT12:               DEFM      'mini$'
CTXT61:               DEFM      'yes$'
CTXT62:               DEFM      'simulated by index$'


;-----------------------------------------------

OCMD:
                      CALL      GETHX          ; LESE PORTADRESSE
                      LD        A,D            ; WAR TRENNZEICHEN CR?
                      CP        0DH
                      JP        Z,CERROR       ; FEHLER WENN JA
                      PUSH      BC             ; SAVE INTEGER
                      CALL      GETHX          ; LESE DATA BYTE
                      LD        A,D            ; WAR TRENNZEICHEN CR?
                      CP        0DH
                      JP        NZ,CERROR      ; FEHLER WENN NEIN
                      LD        L,C
                      POP       BC             ; RESTORE PORTADR.
                      OUT       (C),L          ; GEBE AUS
                      JP        GETCM

;-----------------------------------------------

H_BLANK:              LD        C,'H'          ; Gibt 'H' und Leerzeichen aus
                      CALL      CO
                      LD        C,' '
                      CALL      CO
                      RET

;-----------------------------------------------
                                                
RCMD:                                          ; LESE SEKTOR IN SPEICHERBEREICH
                      CALL      TST_UNIT       ; LAUFWERK VORGEWAEHLT?
                      JR        Z,RCMD1
                      CALL      PRINT_DRIVE    ; LAUFWERKNUMMER AUSGEBEN
                      CALL      RWINP          ; SPEICHERADRESSE UND SEKTORNUMMER EINLESEN
                      CALL      READ           ; SEKTOR EINLESEN
                      JP        GETCM

RCMD1:                CALL      H_BLANK        ; GIB 'H ' AUS
                      CALL      RWINP          ; SPEICHERADRESSE UND SEKTORNUMMER EINLESEN
                      CALL      L_0A6C
                      JP        GETCM

;-----------------------------------------------

WCMD:                                          ; SCHREIBE SPEICHERINHALT AUF SEKTOR
                      CALL      TST_UNIT       ; LAUFWERK VORGEWAEHLT?
                      JR        Z,WCMD1
                      CALL      PRINT_DRIVE    ; LAUFWERKSNUMMER AUSGEBEN
                      CALL      RWINP          ; SPEICHERADRESSE UND SEKTORNUMMER EINLESEN
                      CALL      WRITE
                      JP        GETCM

WCMD1:                CALL      H_BLANK        ; GIB 'H ' AUS
                      CALL      RWINP          ; SPEICHERADRESSE UND SEKTORNUMMER EINLESEN
                      CALL      L_0A65
                      JP        GETCM

;-----------------------------------------------

ICMD:
                      LD        C,1            ; 1 HEX-ADRESSE EINLESEN
                      CALL      GETNM
                      POP       BC             ; IN C STEHT PORT
                      IN        A,(C)          ; LESE NACH A
                      LD        C,' '          ; GEBE BLANK AUS
                      PUSH      AF
                      CALL      CO
                      POP       AF
                      PUSH      AF
                      CALL      NMOUT          ; GEBE HEX AUS
                      LD        C,' '          ; GEBE BLANK AUS
                      CALL      CO
                      POP       AF
                      LD        D,A            ; IN D FUER BITOUT
                      CALL      BITOUT
                      JP        GETCOM

;-----------------------------------------------

ACMD:                                          ; SETZEN VON UNIT, TRACK, SIDE UND SECTOR

                      CALL      TST_UNIT       ; DISKETTE EINGELOGGT?
                      JR        Z,ACMD_1       ; HD
                      CALL      PRINT_DRIVE    ; LAUFWERKNAME AUSGEBEN
                      LD        HL,ATXT1       ; DISPLAY TRACK
                      CALL      SP_OUT
                      LD        A,(TRACK)      ; AKTUELLER TRACK
                      CALL      NEU_WRT        ; NEUEN WERT EINLESEN
                      LD        (TRACK),A      ; WERT SPEICEHRN
                      JP        Z,GETCM        ; ENDE DER EINGABEN
                      LD        HL,ATXT2       ; DISPLAY HEAD
                      CALL      SP_OUT
                      LD        A,(HEAD)       ; AKTUELLER HEAD
                      CALL      NEU_WRT        ; NEUEN WERT EINLESEN
                      LD        (HEAD),A       ; WERT SPEICHERN
                      JP        Z,GETCM        ; ENDE DER EINGABEN
                      LD        HL,ATXT3       ; DISPLAY SECTOR
                      CALL      SP_OUT
                      LD        A,(SECTOR)     ; AKTUELLER SECTOR
                      CALL      NEU_WRT        ; NEUEN WERT EINLESEN
                      LD        (SECTOR),A     ; WERT SPEICHERN
                      JP        Z,GETCM        ; ENDE DER EINGABEN
                      JP        GETCOM         ; NEUER BEFEHL

ACMD_1:               LD        C,'H'          ; LAUFWERKNAME 'H'
                      CALL      CO
                      LD        HL,ATXT1       ; DISPLAY TRACK
                      CALL      SP_OUT
                      LD        HL,(HD_TRACK)  ; AKTUELLER TRACK HD
                      CALL      HL_NEU_WRT     ; NEUEN WERT EINLESEN
                      LD        (HD_TRACK),HL  ; WERT SPEICHERN
                      JP        Z,GETCM        ; ENDE DER EINGABE
                      LD        HL,ATXT2       ; DISPLAY HEAD
                      CALL      SP_OUT
                      LD        HL,ATXT4       ; LEERZEICHEN
                      CALL      SOUT
                      LD        A,(HD_HEAD)    ; AKTUELLER HEAD HD
                      CALL      NEU_WRT        ; NEUEN WERT EINLESEN
                      LD        (HD_HEAD),A    ; WERT SPEICHERN
                      JP        Z,GETCM        ; ENDE DER EINGABE
                      LD        HL,ATXT3       ; DISPLAY SECTOR
                      CALL      SP_OUT
                      LD        HL,ATXT4       ; LEERZEICHEN
                      CALL      SOUT
                      LD        A,(HD_SECTOR)  ; AKTUELLER SECTOR HD
                      CALL      NEU_WRT        ; NEUEN WERT EINLESEN
                      LD        (HD_SECTOR),A  ; WERT SPEICHERN
                      JP        Z,GETCM        ; ENDE DER EINGABE
                      JP        GETCOM         ; NEUER BEFEHL

ATXT1:                DEFM      01H,'Track..: $'
ATXT2:                DEFM      01H,'Head...: $'
ATXT3:                DEFM      01H,'Sector.: $'
ATXT4:                DEFM      '  $'

;-----------------------------------------------

BCMD:
                      CALL      GETCH1         ; LAUFWERKNUMMER EINLESEN                                 
                      CALL      CECHO
                      CP        0DH            ; CR?
                      JR        Z,BCMD_2       ; JA, DEFAULT
                      LD        C,10H          ; KENNUNG EPROM
                      CP        'E'            ; EPROM-BOOT?
                      JR        Z,BCMD_1       ; JA
                      LD        C,20H          ; KENNUNG HD
                      CP        'H'            ; HD-BOOT?
                      JR        Z,BCMD_1
                      CP        '0'            ; KENNUNG '0'
                      JP        C,CERROR
                      CP        '4'            ; KENNUNG '4'
                      JP        NC,CERROR
                      AND       03H            ; MASKIERE FLOPPY NR
                      LD        (TEMP_LOG_DRIVE),A  ; FLOPPYLAUFWERK SPEICHERN
                      JR        BCMD_2

BCMD_1:               LD        A,(TEMP_LOG_DRIVE)  ; 
                      AND       03H            ; MASKIEREN
                      OR        C              ; KENNUNG EINSPEICHERN
                      LD        (TEMP_LOG_DRIVE),A  ; ABSPEICHERN

BCMD_2:               LD        A,(TEMP_LOG_DRIVE)
                      LD        C,A
                      AND       10H
                      JP        NZ,BCMD_7      ; EPROM-BOOT
                      LD        A,C
                      AND       20H   
                      JP        NZ,BCMD_9      ; HD-BOOT

; ----------------- FLOPPY-BOOT -----------------------------------

                      CALL      DISKDA         ; FDC DA?
                      XOR       A
                      LD        (TEST_TRACK),A ; ERSTE TESTSPUR IST 0
                      CALL      LOG_PHYS       ; UMRECHNUNG LOG -> PHYS LAUFWERK
                      LD        (UNIT),A
                      LD        B,02           ; 2 MAL VERSUCHEN
BCMD_3:               PUSH      BC
                      CALL      TEST           ; SETZE CONTROLLER AUF MINI ODER MAXI
                      POP       BC
                      OR        A              ; FEHLER AUFGETRETEN?
                      JR        Z,BCMD_4       ; SPRUNG, WENN NEIN
                      DJNZ      BCMD_3         ; NOCH EIN VERSUCH?
                      JP        CCMD5          ; GEBE FEHLERMELDUNG AUS

BCMD_4:               CALL      SETCMDT        ; SETZE CMDTABELLE
                      XOR       A              ; SETZE SPUR NULL
                      LD        (TRACK),A      
                      LD        (HEAD),A       ; HEAD NULL
                      LD        A,(TEST_LSEK)
                      LD        (SECTOR),A     ; NIEDRIGSTE SEKTORNUMMER IN SEKTOR
                      LD        HL,BOOTADR
                      LD        (DMAADR),HL
                      LD        A,01H          ; UEBERTRAGE EINEN SEKTOR
                      LD        (SECTCNT),A
                                               ; OK, ALLE WERTE SIND GESETZT
                      CALL      READ           ; LESE
                      OR        A              ; FEHLER AUFGETRETEN?
                      JP        NZ,BOOTERR
                      LD        HL,BOOTADR     ; KOPIERE DIE ERSTEN 128 BYTE
                      LD        DE,BOOTADR+380H ; NACH HINTEN
                      LD        BC,128
                      LDIR
                      LD        HL,BOOTADR+6   ; PRUEFE, OB "PROF-180X" BOOTDISK IM LAUFWERK
                      LD        DE,PROF_STRING
                      LD        B,09H          ; 9 ZEICHEN PRUEFEN
BCMD_5:               LD        A,(DE)
                      CP        (HL)
                      JR        NZ,BCMD_6      ; Bei Fehler Meldung ausgeben
                      INC       HL
                      INC       DE
                      DJNZ      BCMD_5
                      LD        HL,0
                      LD        (BOOT_NAME),HL
                      JP        BOOTADR+380H   ; OK Sprung in Bootcode
BCMD_6:               LD        HL,FD_BOOT_ERR
                      CALL      SOUT
                      JP        GETCOM

FD_BOOT_ERR:          DEFM      0DH,0AH,07H,' No '
PROF_STRING:          DEFM      'PROF-180X boot disk',0DH,0AH,'$'


; ------------------------------------------------------------------------------------

BCMD_7:                                        ; EPROM-BOOT
                      LD        HL,(PATCH)     ; KENNUNG EPROM-BOOT 
                      LD        A,H
                      OR        L
                      JR        Z,BCMD_8       ; FEHLER
                      LD        A,(RAMCHIPS)   ; GENUEGEND RAM FUER RAM-DISK?
                      OR        A
                      JR        Z,BCMD_8       ; NEIN -> FEHLER
                      LD        (BOOT_NAME),HL
                      LD        A,0F0H         ; WAIT-STATES MEMORY FUER EPROM SETZEN
                      OUT0      (32H),A        ; DMA/WAIT Control Register
                      LD        A,B_0E
                      OUT       (P_LS259),A
                      LD        HL,DISKPAGE-1
                      LD        DE,DISKPAGE-1
                      LD        BC,53645
                      LDIR
                      LD        A,0FH
                      OUT       (P_LS259),A
                      LD        A,(READY_BYTE)
                      AND       0F0H           ; WAIT-STATES MEMORY MASKIEREN
                      OUT0      (32H),A        ; DMA/WAIT Control Register

                      LD        HL,(EPR_BOOT)  ; Lade EPROM-Boot Adresse
                      JP        (HL)           ; Sprung zur Bootroutine

BCMD_8:               LD        HL,EP_BOOT_ERR_TXT
                      CALL      SOUT
                      JP        GETCOM

EP_BOOT_ERR_TXT:      DEFM      0DH,0AH,07H,'EPROM boot failure',0DH,0AH,'$'

; --------------------------------------------------------------------------------------

BCMD_9:                                       ; HD-BOOT
                      CALL      L_0ABC
                      JP        NZ,GETCOM
                      LD        HL,0FFFFh
                      LD        (BOOT_NAME),HL
                      LD        HL,0180H
                      LD        (DISPADR),HL
                      JP        L_FC00



;---------------------------------------------------------------------------------------

LCMD:
                                               ; ZEIGE DATUM UND ZEIT AN
                      CALL      DISP_TIME
                      JP        GETCM



NCMD:
                                               ; SETZE UHRZEIT UND DATUM
                      LD        HL,CITXT1      ; LESE DATUM EIN
                      CALL      SOUT
                      CALL      GETDEZ         ; MONAT
                      CP        '/'
                      JP        NZ,CERROR      ; FALSCHES TRENNZEICHEN

                      LD        A,L
                      CP        0              ; MONAT ZWISCHEN 1 UND 12
                      JP        Z,CERROR
                      CP        13H
                      JP        NC,CERROR
                      LD        (TIME_FIELD+4),A; MONAT WEG

                      CALL      GETDEZ         ; TAG
                      CP        '/'
                      JP        NZ,CERROR
                      LD        A,L
                      CP        0              ; TAG ZWISCHEN 1 UND 31
                      JP        Z,CERROR
                      CP        32H
                      JP        NC,CERROR
                      LD        (TIME_FIELD+3),A; TAG WEG

                      CALL      GETDEZ         ; JAHR
                      CP        0DH
                      JP        NZ,CERROR
                      LD        A,L
                      LD        (TIME_FIELD+6),A; JAHR WEG

                                               ; UHRZEIT EINLESEN
                      LD        HL,CITXT2
                      CALL      SOUT
                      CALL      GETDEZ         ; STUNDE
                      CP        ':'
                      JP        NZ,CERROR
                      LD        A,L
                      CP        24H            ; STUNDE MAX. 24
                      JP        NC,CERROR
                      LD        (TIME_FIELD+2),A ; STUNDE WEG

                      CALL      GETDEZ         ; MINUTE
                      CP        ':'
                      JP        NZ,CERROR
                      LD        A,L
                      CP        60H            ; MINUTE MAX. 60
                      JP        NC,CERROR
                      LD        (TIME_FIELD+1),A ; MINUTE WEG

                      CALL      GETDEZ         ; SEKUNDE
                      CP        0DH
                      JP        NZ,CERROR
                      LD        A,L
                      CP        60H            ; SEKUNDE MAX: 60
                      JP        NC,CERROR
                      LD        (TIME_FIELD),A  ; SEKUNDE WEG

                                               ; SETZE DIE ZEIT
                      LD        HL,CITXT3
                      CALL      SOUT
                      CALL      GETCH          ; WARTE AUF IRGEND EIN ZEICHEN
                      CALL      SET_PHYS_TIME  ; DATUM/UHRZEIT AN PCF8583 SENDEN
                      CALL      CROUT
                      CALL      DISP_TIME
                      JP        GETCOM


CITXT1:               DEFM      0DH,0AH,0AH," Enter today's date (MM/DD/YY): $"
CITXT2:               DEFM      " Enter the time (HH:MM:SS):     $"
CITXT3:               DEFM      " Press any key to set time$"

;---------------------------------------------------------------------------------------

FCMD:
                      LD        C,3            ; HOLE 3 WERTE VON DER CONSOLE
                      CALL      GETNM
                      POP       BC             ; FUELL BYTE
                      POP       DE             ; END WERT
                      POP       HL             ; ANFANGSWERT
FCMD1:                LD        (HL),C         ; FUELLE BYTE
                      CALL      HILO           ; ENDE ERREICHT?
                      JP        C,GETCM
                      INC       HL
                      JP        FCMD1

;---------------------------------------------------------------------------------------

VCMD:
                                               ; VERGLEICHT ZWEI SPEICHERBEREICHE MITEINANDER
                      LD        C,3            ; LESE DREI ADRESSEN EIN
                      CALL      GETNM
                      POP       BC             ; ZWEITER BLOCKANFANG
                      POP       DE             ; ERSTES BLOCKENDE
                      POP       HL             ; ERSTER BLOCKANFANG
VCMD1:                LD        A,(BC)         ; LESE BYTE AUS BLOCK 2
                      CP        (HL)           ; VERGLEICHE MIT ERSTEM BLOCK
                      CALL      NZ,VCMD2       ; GEBE UNGLEICHE ADDRESSEN AUS
                      CALL      HILO           ; ENDE ERREICHT ?
                      JP        C,GETCM        ; OK, ENDE
                      INC       HL
                      INC       BC
                      JP        VCMD1          ; VERGL. NAECHSTES BYTE

;---------------------------------------------------------------------------------------


TCMD:                 LD        C,2            ; LESE ANFANG UND ENDADDRESSE
                      CALL      GETNM
                      POP       DE
                      POP       HL
TCMD1:                LD        C,(HL)
                      LD        A,C            ; LESE SPEICHERSTELLE
                      CPL                      ; NEGIERE
                      LD        (HL),A         ; SCHREIBE IN ZELLE
                      LD        B,15           ; WARTE ETWAS
TCMD2:                DJNZ      TCMD2
                      LD        A,(HL)         ; LESE WIEDER
                      LD        (HL),C         ; ORGINAL BYTE ZURUECK
                      CPL                      ; A SOLL GLEICH C SEIN
                      XOR       C              ; SETZE ALL UNGLEICHEN BITS
                      CALL      NZ,FBYTOUT     ; GEBE FEHLERHAFTES BYTE AUS
                      CALL      HILO           ; ENDE?
                      JP        C,GETCM        ; SPRUNG WENN JA
                      INC       HL             ; TESTE NAECHSTES BYTE
                      JR        TCMD1          ; LOOP

;---------------------------------------------------------------------------------------

VCMD2:                PUSH      HL
                      PUSH      DE
                      PUSH      BC             ; RETTE ALLE ADRESSEN
                      CALL      DISPMEM
                      LD        C,' '
                      CALL      CECHO
                      POP       HL
                      PUSH      HL
                      CALL      DISPMEM
                      CALL      CROUT
                      CALL      BREAK
                      JP        C,GETCM
                      POP       BC
                      POP       DE
                      POP       HL
                      RET


DISPMEM:
                                               ; INPUT: HL
                                               ; ZEIGT HL UND (HL) AUF DEM BILDSCHIRM AN
                                               ; ZERSROERT A,B,C,FF'S
                      CALL      HLOUT
                      LD        C,'='
                      CALL      CECHO
                      LD        A,(HL)
                      CALL      NMOUT
                      RET


FBYTOUT:              PUSH      HL
                      PUSH      DE
                      LD        D,A            ; RETTE AKKU
                      CALL      HLOUT
                      LD        C,' '          ; GEBE NACH ADRRESE TRENNZEICHEN AUS
                      CALL      CO
                      CALL      BITOUT         ; GEBE BITFOLGE AUS
                      CALL      CROUT
                      CALL      BREAK          ; ABBRUCH
                      JP        C,GETCM        ; SPRUNG ZUM MONITOR WENN JA
                      POP       DE
                      POP       HL
                      RET


BITOUT:
                                               ; GIBT 8 BIT IN REG.D AUS
                                               ; ZERSTOERT A,B,C,D,E
                      LD        B,8            ; GEBE 8 BIT AUS
BITOUT1:              RLC       D              ; SCHIEBE IN CARRY
                      LD        A,'0'          ; ASCII 0
                      LD        E,0
                      ADC       A,E            ; CARRY ALS ASCII AUSGEBEN
                      LD        C,A
                      CALL      CO
                      DJNZ      BITOUT1
                      RET
;---------------------------------------------------------------------------------------

HCMD:
                      LD        HL,HCMTXT      ; VORHANDENE BEFEHLE ANZEIGEN
                      CALL      SOUT
                      LD        HL,CMDMSG-1    ; BEFEHLSBESCHREIBUNGSTEXTE

HCMD1:                INC       HL
                      CALL      CROUT
                      LD        A,(HL)
                      OR        A              ; ENDE ERREICHT?
                      JP        Z,GETCM

                      LD        B,5
                      LD        C,' '
HCMD2:                CALL      CECHO
                      DJNZ      HCMD2
                      CALL      SOUT
                      JR        Z,HCMD1                      

HCMTXT:               DEFM      00DH,00AH,00AH,"following commands are available:",00h,0AH,"$"

;---------------------------------------------------------------------------------------

ECMD:
                      LD        HL,ETXT1       ; EPROM TEST DATEN AUSGEBEN
                      CALL      SP_OUT
                      LD        A,2DH          ; FESTE WERTE AUSGEBEN
                      CALL      NMOUT
                      LD        A,73H
                      CALL      NMOUT
                      LD        HL,ETXT3
                      CALL      SP_OUT
                      LD        A,0AH
                      CALL      NMOUT
                      XOR       A
                      CALL      NMOUT
                      LD        HL,ETXT2
                      CALL      SP_OUT
                      LD        HL,(TYPELIST)
                      CALL      HLOUT
                      JP        GETCOM


ETXT1:                DEFM      08H,"end location..........: $"
ETXT2:                DEFM      08H,"checksum..............: $"
ETXT3:                DEFM      08H,"first bank 0 location.: $"

;---------------------------------------------------------------------------------------

KCMD:
                                               ; GIBT ALLE KONSOLENEINGABEN UNVERAENDERT AUS
                                               ; ESCAPE MIT CONTROL-C
                      LD        HL,KCMDTXT
                      CALL      SOUT
KCMD1:                CALL      CI             ; LESE ZEICHEN
                      CP        3              ; CONTROL-C?
                      JR        Z,KCMD2        ; DANN ENDE
                      LD        C,A
                      CALL      CO             ; SONST GEBE ZEICHEN AUS
                      JR        KCMD1
KCMD2:                JP        GETCOM



KCMDTXT:              DEFM      " (escape with ",5EH,43H,")",0DH,0AH,0DH,0AH,'$'
                                               ; ASiDE uebersetzt ^C !!!

;---------------------------------------------------------------------------------------

UCMD:

; Auswahlmöglichkeiten zeigen

                      LD        HL,UCMTX1
                      CALL      SOUT
                      CALL      GETCH1            ; BEFEHL EINLESEN
                      CALL      UCMD90            ; ZEICHEN SPIEGELN

; Befehl auswerten

                      CP        '0'
                      JP        C,GETCOM          ; ungültige Eingabe
                      CP        '4'
                      JP        C,UCM_0_3         ; Unterbefehl 0-3
                      CP        'A'
                      JP        C,GETCOM          ; ungültige Eingabe
                      CP        'C'
                      JP        C,UCM_B           ; Unterbefehl B
                      CP        'C'
                      JP        Z,UCM_C           ; Unterbefehl C
                      CP        'M'
                      JP        Z,UCM_M           ; Unterbefehl M
                      CP        'W'
                      JP        Z,UCM_W           ; Unterbefehl W
                      CP        'U'
                      JP        Z,UCM_U           ; Unterbefehl U
                      CP        'I'
                      JP        Z,UCM_I           ; Unterbefehl I
                      JP        GETCOM


UCM_0_3:
                      PUSH      AF
                      LD        HL,UCMTX2         ; Data for Drive?
                      CALL      SOUT
                      POP       AF
                      CALL      UCMD90            ; Zeichen Spiegeln
                      SUB       '0'               ; Umrechnung Laufwerksnummer
                      LD        (TEMP),A          ; Rette Laufwerksnummer
                      LD        L,A
                      LD        H,0
                      ADD       HL,HL             ; 2 BYTE JE LAUFWERK
                      LD        DE,SPECD_WORD     ; ANFANG TABELLE 4 LAUFWERKE
                      ADD       HL,DE             ; + 0FF00H
                      LD        (ERMSG),HL        ; LAUFWERKSZEIGER SPEICHERN

                      LD        HL,UCMTX3         ; STEPRATE?
                      CALL      SP_OUT
                      LD        HL,(ERMSG)        ; LAUFWERKSZEIGER WIEDER LADEN
                      LD        A,(HL)            ; 
                      RLCA                        ; OBERE 4 BIT IN UNTERE 4 BIT VERSCHIEBEN
                      RLCA
                      RLCA
                      RLCA
                      CPL                         ; BILDE COMPLEMENT
                      AND       0FH               ; MASKIEREN
                      INC       A
                      CALL      NEU_WRT           ; NEUER WERT
                      PUSH      AF
                      DEC       A
                      CPL                         ; BILDE WIEDER COMPLEMENT
                      RRCA                        ; SCHIEBE UNTERE 4 BIT WIEDER IN OBERE 4 BIT
                      RRCA
                      RRCA
                      RRCA
                      AND       0F0H              ; MASKIERE
                      LD        B,A               ; RETTEN
                      LD        HL,(ERMSG)        ; LAUFWERKSZEIGER WIEDER LADEN
                      LD        A,(HL)            ; LAUFWERKSKENNUNG LADEN
                      AND       0FH               ; MASKIERE HEADUNLOADTIME
                      OR        B                 ; MIT STEPRATE VERODERN
                      LD        (HL),A            ; LAUFWERKSKENNUNG SPEICHERN
                      POP       AF
                      JP        Z,UCM_END          ; ???????

                      LD        HL,UCMTX4         ; HEADUNLOADTIME
                      CALL      SP_OUT
                      LD        HL,(ERMSG)        ; LAUFWERKSZEIGER WIEDER LADEN
                      LD        A,(HL)            ; LAUFWERKSKENNUNG LADEN
                      RRCA                        ; SCHIEBE UNTERE 4 BIT IN OBERE 4 BIT
                      RRCA
                      RRCA
                      RRCA
                      AND       0F0H              ; MASKIEREN HEADUNLOADTIME
                      CALL      NEU_WRT           ; NEUER WERT
                      PUSH      AF
                      RLCA                        ; SCHIEBE OBERE 4 BIT WIEDER IN UNTERE 4 BIT
                      RLCA
                      RLCA
                      RLCA
                      AND       0FH               ; MASKIERE HEADUNLOADTIME
                      LD        B,A               ; RETTEN
                      LD        HL,(ERMSG)        ; LAUFWERKSZEIGER WIEDER LADEN
                      LD        A,(HL)            ; LAUFWERKSKENNUNG LADEN
                      AND       0F0H              ; MASKIERE STEPRATE
                      OR        B                 ; MIT HEADUNLOADTIME VERODERN
                      LD        (HL),A            ; LAUFWERKSKENNUNG SPEICHERN
                      POP       AF
                      JP        Z,UCM_END         ; ???????

                      INC       HL                ; LAUFWERKSZEIGER AUF NAECHSTES BYTE SETZEN
                      LD        (ERMSG),HL        ; ZEIGER RETTEN

                      LD        HL,UCMTX5         ; HEADLOADTIME
                      CALL      SP_OUT
                      LD        HL,(ERMSG)        ; LAUFWERKSZEIGER LADEN
                      LD        A,(HL)            ; LAUFWERKSKENNUNG LADEN
                      AND       0FEH              ; HEADLOADTIME MASKIEREN
                      CALL      NEU_WRT           ; NEUER WERT
                      PUSH      AF
                      AND       0FEH              ; WIEDER MASKIEREN
                      LD        HL,(ERMSG)        ; LAUFWERKSZEIGER WIEDER LADEN
                      LD        (HL),A            ; LAUFWERKSKENNUNG LADEN
                      POP       AF
                      JP        Z,UCM_END         ; ???????

                      LD        HL,UCMTX6         ; READY SIGNAL
                      CALL      SP_OUT
                      LD        A,(TEMP)          ; LAUFWERKSUMMER
                      CALL      UNIT_MSK_A        ; MASKE FÜR LAUFWERK 1..4 BESTIMMEN
                      AND       0FH               ; KANN LAUFWERK READY SIGNAL LIEFERN?
                      LD        E,A
                      LD        D,0FFH
                      LD        HL,READY_BYTE     ; 
                      CALL      UCM_I_3           ; ???????
                      JP        Z,UCM_END         ; ???????

                      LD        HL,UCMTX7         ; 80 TRACK
                      CALL      SP_OUT
                      LD        A,(TEMP)          ; LAUFWERKSNUMMER WIEDER HERSTELLEN
                      CALL      UNIT_MSK_A        ; LAUFWERKSMASKE ERZEUGEN
                      AND       B_F0
                      LD        E,A
                      LD        D,0
                      LD        HL,SEEKNR
                      CALL      UCM_I_3
                      JP        Z,UCM_END
                      LD        HL,UCMTX8         ; DOUBLE STEP
                      CALL      SP_OUT
                      LD        A,(TEMP)
                      CALL      UNIT_MSK_A        ; LAUFWERKSMASKE ERZEUGEN
                      AND       B_0F
                      LD        E,A
                      LD        D,0
                      LD        HL,SEEKNR
                      CALL      UCM_I_3
                      JP        UCM_END

UCM_B:    
                      LD        HL,SIO_A_PAR      ; VORBELGEN SCHNITTSTELLE A
                      CP        'A'               ; SCHNITTSTELLE A?
                      JR        Z,UCM_B_1         ; JA
                      LD        HL,SIO_B_PAR      ; SCHNITTSTELLE IST B

;      Schnittstellenkonfiguration (Befehl A oder B)

UCM_B_1:              LD        (ERMSG),HL        ; ZEIGER ZWISCHENSPEICHERN
                      PUSH      AF                ; SCHNITTSTELLE RETTEN
                      LD        HL,UCMT10         ; GEWAEHLTE SCHNITTSTELLE ANZEIGEN
                      CALL      SOUT
                      POP       AF                ; WIEDERHERSTELLEN
                      CALL      UCMD90            ; ZEICHEN SPIEGELN
                      LD        HL,UCMT11         ; BAUDRATE
                      CALL      SP_OUT
                      LD        HL,(ERMSG)        ; ZEIGER LADEN
                      LD        A,(HL)            ; ALTEN WERT LADEN
                      AND       0FH               ; BAURATE MASKIEREN
                      CALL      NEU_WRT           ; NEUEN WERT EINLESEN
                      PUSH      AF                ; SCHNITTSTELLE RETTEN
                      LD        HL,(ERMSG)        ; ZEIGER LADEN
                      AND       0FH               ; BAUDRATE MASKIEREN
                      LD        C,A               ; 
                      LD        A,(HL)            ; ALTEN WEERT LADEN
                      AND       0F0H              ; ALTE BAUDRATE AUSBLENDEN
                      OR        C                 ; NEUE BAUDRATE EINBLENDEN
                      LD        (HL),A            ; WERT ABLEGEN
                      POP       AF                ; WIEDER HERSTELLEN
                      JP        Z,UCM_END         ; 0 => KEINE WEITERE EINGABEN, DA JUMPER
                                                  ; VORRANG HABEN
                      LD        HL,UCMT12         ; 8 DATENBITS?
                      CALL      SP_OUT
                      LD        HL,(ERMSG)        ; ZEIGER LADEN
                      LD        E,40H
                      LD        D,0
                      CALL      UCM_I_3
                      JP        Z,UCM_END
                      LD        HL,UCMT13         ; 2 STOPBITS?
                      CALL      SP_OUT
                      LD        HL,(ERMSG)        ; ZEIGER LADEN
                      LD        E,10H
                      LD        D,0
                      CALL      UCM_I_3
                      JP        Z,UCM_END
                      LD        HL,UCMT14         ; PARITY ENABLE?
                      CALL      SP_OUT
                      LD        HL,(ERMSG)        ; ZEIGER LADEN
                      LD        E,20H
                      LD        D,0
                      CALL      UCM_I_3
                      JP        Z,UCM_END
                      LD        HL,(ERMSG)        ; ZEIGER LADEN
                      LD        A,(HL)
                      AND       20H
                      JP        Z,UCM_END
                      LD        HL,UCMT15         ; PAITY EVEN?
                      CALL      SP_OUT
                      LD        HL,(ERMSG)        ; ZEIGER LADEN
                      LD        E,80H
                      LD        D,0FFH
                      CALL      UCM_I_3
                      JP        UCM_END

UCM_C:    
                      LD        HL,UCMT20           ; ALLGEMEINE DISK-EINSTELLUNGEN
                      CALL      SOUT
                      LD        HL,UCMT21           ; DRIVE A
                      CALL      SP_OUT
                      LD        A,(LOG_DRIVE)
                      AND       03H                 ; LAUFWERK MASKIEREN
                      CALL      NEU_WRT             ; NEUER WERT
                      PUSH      AF                  ; SICHERN
                      AND       03H
                      LD        C,A
                      LD        A,(LOG_DRIVE)       ; ALTER WERTE
                      AND       0FCH                ; MASKIEREN
                      OR        C                   ; KENNUNG EINBLENDEN
                      LD        (LOG_DRIVE),A       ; WERT UEBERSCHREIBEN
                      LD        (TEMP_LOG_DRIVE),A       ; WERT ABSPEICHERN
                      POP       AF                  ; WIEDERHERSTELLEN
                      JP        Z,UCM_END
                      LD        HL,UCMT22           ; TUNNEL EREASE
                      CALL      SP_OUT
                      LD        A,(TE_TIME)
                      CALL      NEU_WRT             ; NEUER WERT
                      LD        (TE_TIME),A
                      JP        Z,UCM_END
                      LD        HL,UCMT23           ; MOTOR DELAY
                      CALL      SP_OUT
                      LD        A,(STEP_WAIT)
                      CALL      NEU_WRT
                      LD        (STEP_WAIT),A
                      JP        Z,UCM_END
                      LD        HL,UCMT24           ; SWITCH DELAY
                      CALL      SP_OUT
                      LD        A,(SWITCH_DELAY)
                      CALL      NEU_WRT             ; NEUER WERT
                      LD        (SWITCH_DELAY),A
                      JP        Z,UCM_END
                      LD        HL,UCMT25           ; START DELAY
                      CALL      SP_OUT
                      LD        A,(START_DELAY)
                      CALL      NEU_WRT             ; NEUER WERT
                      LD        (START_DELAY),A
                      JP        Z,UCM_END
                      LD        HL,UCMT26           ; EPROM BOOT
                      CALL      SP_OUT
                      LD        HL,LOG_DRIVE
                      LD        E,10H
                      LD        D,0
                      CALL      UCM_I_3
                      LD        A,(LOG_DRIVE)
                      LD        (TEMP_LOG_DRIVE),A
                      JP        Z,UCM_END
                      LD        A,(LOG_DRIVE)
                      LD        C,A
                      AND       10H
                      JR        Z,UCM_C_1
                      LD        A,C
                      AND       0DFH
                      LD        (LOG_DRIVE),A
                      LD        (TEMP_LOG_DRIVE),A
                      CALL      CROUT
                      JP        UCM_END

UCM_C_1:              LD        HL,UCMT27          ; HARDDISK BOOT
                      CALL      SP_OUT
                      LD        HL,LOG_DRIVE
                      LD        E,' '
                      LD        D,0
                      CALL      UCM_I_3
                      LD        A,(LOG_DRIVE)
                      LD        (TEMP_LOG_DRIVE),A
                      JP        UCM_END

UCM_M:
                      LD        HL,UCMT30           ; MULTIPLEX PINS     
                      CALL      SOUT
                      LD        HL,UCMT31
                      CALL      SP_OUT
                      LD        HL,LOG_DRIVE
                      LD        E,B_04
                      LD        D,0
                      CALL      UCM_I_3
                      JP        Z,UCM_END
                      LD        HL,UCMT32
                      CALL      SP_OUT
                      LD        HL,LOG_DRIVE
                      LD        E,08H
                      LD        D,0
                      CALL      UCM_I_3
                      JP        UCM_END

UCM_W:    
                      LD        HL,UCMT40
                      CALL      SOUT
                      LD        HL,UCMT41
                      CALL      SP_OUT
                      LD        A,(READY_BYTE)
                      RRCA
                      RRCA
                      RRCA
                      RRCA
                      AND       03H
                      CALL      NEU_WRT             ; NEUER WERT
                      PUSH      AF
                      RLCA
                      RLCA
                      RLCA
                      RLCA
                      AND       ' '
                      LD        C,A
                      LD        A,(READY_BYTE)
                      AND       0CFH
                      OR        C
                      LD        (READY_BYTE),A
                      POP       AF
                      JP        Z,UCM_END
                      LD        HL,UCMT42
                      CALL      SP_OUT
                      LD        A,(READY_BYTE)
                      RLCA
                      RLCA
                      AND       03H
                      CALL      NEU_WRT             ; NEUER WERT
                      PUSH      AF
                      RRCA
                      RRCA
                      AND       0C0H
                      LD        C,A
                      LD        A,(READY_BYTE)
                      AND       03FH
                      OR        C
                      LD        (READY_BYTE),A
                      POP       AF
                      JP        UCM_END

UCM_U:    
                      LD        HL,UCMT50         ; USER BYTES         
                      CALL      SOUT
                      LD        HL,UCMT51         ; USER BYTE 1
                      CALL      SP_OUT
                      LD        A,(U_BYTE_1)      ; ALTER WERT
                      CALL      NEU_WRT           ; NEUER WERT
                      LD        (U_BYTE_1),A      ; NEUER WERT
                      JP        Z,UCM_END
                      LD        HL,UCMT52         ; USER BYTE 2
                      CALL      SP_OUT
                      LD        A,(U_BYTE_2)      ; ALTER WERT
                      CALL      NEU_WRT           ; NEUER WERT
                      LD        (U_BYTE_2),A      ; NEUER WERT
                      JP        Z,UCM_END
                      LD        HL,UCMT53         ; USER BYTE 3
                      CALL      SP_OUT
                      LD        A,(U_BYTE_3)      ; ALTER WERT
                      CALL      NEU_WRT
                      LD        (U_BYTE_3),A      ; NEUER WERT
                      JP        Z,UCM_END
                      LD        HL,UCMT54         ; USER BYTE 4
                      CALL      SP_OUT
                      LD        A,(U_BYTE_4)      ; ALTER WERT
                      CALL      NEU_WRT
                      LD        (U_BYTE_4),A      ; NEUER WERT
                      JP        UCM_END

; INITIALISATION STRINGS AUSGEBEN

UCM_I:    
                      LD        HL,UCMT60         ; KOPFZEILE               
                      CALL      SOUT
                      LD        A,(IO_JUMPERBYTE)
                      AND       03H
                      LD        L,A               ; SCHNITTSTELLE
                      LD        H,10H             ; 10 BYTE JE SCHNITTSTELLE
                      MLT       HL                ;
                      LD        DE,GRIP_ST_TXT    ;
                      ADD       HL,DE             ; ZEIGER AUF TEXT
                      LD        B,08H
                      LD        C,80H

UCM_I_1:              LD        E,(HL)
                      INC       HL
                      LD        D,(HL)
                      INC       HL
                      INC       DE
                      LD        A,D
                      OR        E
                      JR        Z,UCM_I_2
                      PUSH      HL
                      PUSH      BC
                      EX        DE,HL
                      DEC       HL
                      CALL      SP_OUT
                      LD        HL,S_INIT_BYTE
                      POP       DE
                      PUSH      DE
                      LD        D,0
                      CALL      UCM_I_3
                      POP       BC
                      POP       HL
                      JR        NZ,UCM_I_2
                      LD        B,01H
UCM_I_2:              RRC       C
                      DJNZ      UCM_I_1
                      JP        UCM_END

UCM_END:              CALL      CALC_CHECKSUM  ; PRUEFSUMME BERECHNEN UND ALLES SICHERN
                      JP        UCMD           ; NEUES UNTERKOMMANDO

UCM_I_3:              LD        A,D            ; LOGIK POSITIV/NEGATIV
                      OR        A              ; TESTEN
                      PUSH      AF             ; RETTEN
                      LD        A,E            ; BITMASKE
                      AND       (HL)           ; AKTUELLE BITSTELLUNG EINBLENDEN
                      LD        C,A            ; NACH C VERSCHIEBEN
                      POP       AF             ; RETTEN
                      LD        A,C            ; WIEDER NACH A
                      PUSH      HL             ; ZEIGER RETTEN
                      PUSH      DE             ; LOGIK UND MASKE RETTEN
                      JR        Z,UCM_I_4      ; WENN BIT=0 
                      CALL      NEG_JA_NEIN
                      JR        UCM_I_5
UCM_I_4:              CALL      JA_NEIN
UCM_I_5:              POP       DE
                      POP       HL
                      PUSH      AF
                      AND       E
                      LD        B,A
                      LD        C,(HL)
                      LD        A,E
                      CPL
                      AND       C
                      OR        B
                      LD        (HL),A
                      POP       AF
                      RET

; Zeichen Spiegeln

UCMD90:               PUSH      AF
                      LD        C,A
                      CALL      CECHO
                      POP       AF
                      RET


UCMTX1:               DEFM      0DH,0AH,0DH,0AH," 0,1,2,3,A,B,C,I,M,U,W select => $"

UCMTX2:               DEFM      0DH,0AH,0DH,0AH," data for drive $"       ; SUB-BEFEHLE 0,1,2,3
UCMTX3:               DEFM      01H,"step rate ........: $"
UCMTX4:               DEFM      01H,"head unload time .: $"
UCMTX5:               DEFM      01H,"head load time ...: $"
UCMTX6:               DEFM      01H,"ready signal......: $"
UCMTX7:               DEFM      01H,"80 track..........: $"
UCMTX8:               DEFM      01H,"double step.......: $"

UCMT10:               DEFM      0DH,0AH,0DH,0AH," data for V-24-$"        ; SUB-BEFEHLE A,B
UCMT11:               DEFM      01H,"baudrate......: $"
UCMT12:               DEFM      01H,"8 data bits...: $"
UCMT13:               DEFM      01H,"2 stop bits...: $"
UCMT14:               DEFM      01H,"parity enable.: $"
UCMT15:               DEFM      01H,"parity even...: $"

UCMT20:               DEFM      0DH,0AH,0DH,0AH," common data$"           ; SUB-BEFEHL C
UCMT21:               DEFM      01H,"drive A......: $"
UCMT22:               DEFM      01H,"tunnel erase.: $"
UCMT23:               DEFM      01H,"motor delay..: $"
UCMT24:               DEFM      01H,"switch delay.: $"
UCMT25:               DEFM      01H,"start delay..: $"
UCMT26:               DEFM      01H,"EPROM boot...: $"
UCMT27:               DEFM      01H,"Harddisk boot: $"

UCMT30:               DEFM      0DH,0AH,0DH,0AH," multiplexed pins$"      ; SUB-BEFEHL M
UCMT31:               DEFM      01H,"CTS1...: $"
UCMT32:               DEFM      01H,"TDEND0.: $"

UCMT40:               DEFM      0DH,0AH,0DH,0AH," wait insertions$"       ; SUB_BEFEHL W
UCMT41:               DEFM      01H,"I/O....: $"
UCMT42:               DEFM      01H,"memory.: $"

UCMT50:               DEFM      0DH,0AH,0DH,0AH," user bytes$"            ; SUB-BEFEHL U
UCMT51:               DEFM      01H,"byte 1 : $"
UCMT52:               DEFM      01H,"byte 2 : $"
UCMT53:               DEFM      01H,"byte 3 : $"
UCMT54:               DEFM      01H,"byte 4 : $"

UCMT60:               DEFM      0DH,0AH,0DH,0AH," initialisation string(s)$"      ; SUB-BEFEHL I


CALC_CHECKSUM:        XOR       A                    ; BEGINNE MIT A=0
                      LD        HL,SYSTEMPAGE        ; ZEIGER AUF SYSTEMPAGE
                      LD        B,17H                ; 23 BYTES PRUEFSUMME BERECHNEN
CALC_CHKS_1:          ADD       A,(HL)               ; LADE NAECHSTES BYTE
                      INC       HL                   ; ZEIGER AUF NAECHSTES BYTE
                      DJNZ      CALC_CHKS_1          ; ALLE BYTES BEARBEITEN
                      CPL                            ; COMPLEMENT BILDEN
                      INC       A                    ; UM 1 ERHOEHEN
                      LD        (HL),A               ; SICHERN FUER VERGLEICH
                      CALL      USER_BYTES_WRITE     ; IM GEPUFFERTEN RAM DER UHR SPEICHERN
                      RET

;---------------------------------------------------------------------------------------

YCMD:                                                ; LAUFWERK FORMATIEREN
                      LD        HL,YCM_TXT_DRV       ; LAUFWERKNUMMER?
                      CALL      SP_OUT
                      LD        A,(FMT_VAL)          ; VORBELEGUNG AUSGEBEN
                      CALL      NEU_WRT              ; NEUEN WERT EINLESEN
                      LD        (FMT_VAL),A          ; ABSPEICHERN
                      JP        Z,GETCOM             ; BEI EINGABEENDE FERTIG

                      LD        HL,YCM_TXT_MAXI      ; MAXI DISK?
                      CALL      SP_OUT
                      LD        A,(FMT_VAL+1)        ; VORBELEGUNG AUSGEBEN
                      CALL      JA_NEIN              ; NEUEN WERT EINLESEN
                      LD        (FMT_VAL+1),A        ; ABSPEICHERN
                      JP        Z,GETCOM             ; BEI EINGABEENDE FERTIG

                      LD        HL,YCM_TXT_SD        ; SINGLE DENSITY?
                      CALL      SP_OUT
                      LD        A,(FMT_VAL+2)        ; VORBELEGUNG AUSGEBEN
                      CALL      JA_NEIN              ; NEUEN WERT EINLESEN
                      LD        (FMT_VAL+2),A        ; ABSPEICHERN
                      JP        Z,GETCOM             ; BEI EINGABEENDE FERTIG

                      LD        HL,YCM_TXT_SS        ; SINDLE SIDED?
                      CALL      SP_OUT
                      LD        A,(FMT_VAL+3)        ; VORBELEGUNG AUSGEBEN
                      CALL      JA_NEIN              ; NEUEN WERT EINLESEN
                      LD        (FMT_VAL+3),A        ; ABSPEICHERN
                      JP        Z,GETCOM             ; BEI EINGABEENDE FERTIG

                      LD        HL,YCM_TXT_SECSZ     ; SEKTORGROESSE?
                      CALL      SP_OUT
                      LD        A,(FMT_VAL+4)        ; VORBELEGUNG AUSGEBEN
                      AND       03H                  ; MASKIEREN (0...3) ZULAESSIG
                      CALL      NEU_WRT              ; NEUEN WERT EINLESEN
                      PUSH      AF
                      AND       03H
                      LD        (FMT_VAL+4),A        ; ABSPEICHERN
                      POP       AF
                      JP        Z,GETCOM             ; BEI EINGABEENDE FERTIG

                      LD        HL,YCM_TXT_FSEC      ; FIRST SECTOR?
                      CALL      SP_OUT
                      LD        A,(FMT_VAL+5)        ; VORBELEGUNG AUSGEBEN
                      CALL      NEU_WRT              ; NEUEN WERT EINLESEN
                      LD        (FMT_VAL+5),A        ; ABSPEICHERN
                      JP        Z,GETCOM             ; BEI EINGABEENDE FERTIG

                      LD        HL,YCM_TXT_LSEC      ; LAST SECTOR?
                      CALL      SP_OUT
                      LD        A,(FMT_VAL+6)        ; VORBELEGUNG AUSGEBEN
                      CALL      NEU_WRT              ; NEUEN WERT EINLESEN
                      LD        (FMT_VAL+6),A        ; ABSPEICHERN
                      JP        Z,GETCOM             ; BEI EINGABEENDE FERTIG

                      LD        HL,YCM_TXT_TRK       ; ANZAHL TRACKS?
                      CALL      SP_OUT
                      LD        A,(FMT_VAL+7)        ; VORBELEGUNG AUSGEBEN
                      CALL      NEU_WRT              ; NEUEN WERT EINLESEN
                      LD        (FMT_VAL+7),A        ; ABSPEICHERN
                      JP        Z,GETCOM             ; BEI EINGABEENDE FERTIG

                      LD        HL,YCM_TXT_FGAP      ; ANZAHL GAP-BYTES?
                      CALL      SP_OUT
                      LD        A,(FMT_VAL+8)        ; VORBELEGUNG AUSGEBEN
                      CALL      NEU_WRT              ; NEUEN WERT EINLESEN
                      LD        (FMT_VAL+8),A        ; ABSPEICHERN
                      JP        Z,GETCOM             ; BEI EINGABEENDE FERTIG

                      LD        HL,YCM_TXT_START
                      CALL      SP_OUT
                      XOR       A
                      CALL      JA_NEIN              ; NEUEN WERT EINLESEN
                      OR        A
                      JP        Z,GETCOM             ; BEI EINGABEENDE FERTIG
                      LD        A,(FMT_VAL+7)
                      OR        A
                      JP        Z,GETCOM             ; BEI EINGABEENDE FERTIG

                      LD        HL,CMDTAB            ; BEFEHLSPUFFER VORBEREITEN
                      LD        DE,W_FEF7
                      LD        BC,09H               ; 9 BYTES KOPIEREN
                      LDIR                           ; UMKOPIEREN
                      CALL      MOT_ON_TMR           ; MOTOR EINSCHALTEN
                      CALL      CROUT
                      CALL      CROUT
                      LD        A,(FMT_VAL)
                      AND       03H
                      LD        (UNIT),A
                      LD        BC,0204H
                      CALL      MOTO
                      CALL      NEXT
                      BIT       6,A                 ; DISK WRITE PROTECT?
                      JR        Z,L_214C
                      LD        HL,YCM_TXT_WP       ; WRITE PROTECT !
                      CALL      SOUT                ; FEHLERMELDUNG AUSGEBEN
                      JP        L_21BD

L_214C:               LD        A,(FMT_VAL+1)       ; MAXI/MINI EINSTELLEN
                      OR        A
                      JR        Z,L_2157
                      CALL      MAXI_SET
                      JR        L_215A
L_2157:               CALL      MINI_SET

L_215A:               XOR       A                   ; TRACK 0 EINSTELLEN
                      LD        (W_FEF3),A
                      LD        (TRACK),A
                      CALL      RECAL
                      LD        HL,YCM_TXT_SFMT     ; STARTMELDUNG AUSGEBEN
                      CALL      SP_OUT

L_216A:   LD        HL,(UNIT)
          PUSH      HL
          LD        HL,0100H
          LD        BC,W_0303
          LD        (UNIT),HL
          CALL      CMFD
          POP       HL
          LD        (UNIT),HL
          LD        A,(UNIT)
          AND       B_03
          LD        (UNIT),A
          XOR       A
          LD        (W_FEF4),A
          CALL      L_21CB
          LD        A,(FMT_VAL+3)
          OR        A
          JR        NZ,L_21A3
          LD        A,(UNIT)
          OR        B_04
          LD        (UNIT),A
          LD        A,B_01
          LD        (W_FEF4),A
          CALL      L_21CB
L_21A3:   LD        A,(FMT_VAL+7)
          DEC       A
          LD        C,A
          LD        A,(W_FEF3)
          CP        c
          JR        Z,L_21BA
          INC       a
          LD        (W_FEF3),A
          LD        (TRACK),A
          CALL      SEEK
          JR        L_216A
L_21BA:   CALL      RECAL
L_21BD:   LD        HL,W_FEF7
          LD        DE,CMDTAB
          LD        BC,0009h          ; 9 Bytes kopieren
          LDIR
          JP        GETCOM
L_21CB:   CALL      L_2242
          LD        HL,YCM_TXT_FTRK
          CALL      SOUT
          LD        A,(W_FEF3)
          CALL      DEZOUT
          LD        HL,YCM_TXT_FHEAD
          CALL      SOUT
          LD        A,(UNIT)
          RRCA
          RRCA
          AND       B_01
          ADD       A,B_30
          LD        C,A
          CALL      CECHO
          LD        A,(FMT_VAL+5)
          LD        (W_FEF5),A
          LD        C,A
          LD        A,(FMT_VAL+6)
          SUB       c
          INC       A
          LD        (HEAD),A
          LD        A,(W_FEF0)
          LD        (SECSZ),A
          LD        A,(FMT_VAL+4)
          LD        (TRACK),A
          LD        (W_FEF6),A
          LD        A,(FMT_VAL+8)
          LD        (SECTOR),A
          LD        A,(FMT_VAL+2)
          CPL
          AND       B_40
          OR        B_0D
          LD        C,A
          LD        B,B_06
          CALL      MOTO
          LD        A,(HEAD)
          LD        D,A
          LD        HL,W_FEF3
L_2226:   PUSH      HL
          LD        B,B_04
L_2229:   IN        A,(FDC)
          RLCA
          JR        NC,L_2229
          LD        A,(HL)
          OUT       (FDD),A
          INC       HL
          DJNZ      L_2229
          DEC       D
          JR        Z,L_223D
          DEC       HL
          DEC       HL
          INC       (HL)
          POP       HL
          JR        L_2226
L_223D:   POP       HL
          CALL      RESULT
          RET


L_2242:   LD        A,(W_FEF2)
          LD        C,A
          LD        A,(W_FEF3)
          CP        C
          LD        A,0
          JR        C,L_2251
          LD        A,(W_FEF1)
L_2251:   CALL      SET_PRECOM_1
          RET


YCM_TXT_DRV:          DEFM      01H,"drive..........: $"
YCM_TXT_MAXI:         DEFM      01H,"maxi disk......: $"
YCM_TXT_SD:           DEFM      01H,"single density.: $"
YCM_TXT_SS:           DEFM      01H,"single side....: $"
YCM_TXT_SECSZ:        DEFM      01H,"sector size....: $"
YCM_TXT_FSEC:         DEFM      01H,"first sector...: $"
YCM_TXT_LSEC:         DEFM      01H,"last sector....: $"
YCM_TXT_TRK:          DEFM      01H,"track number...: $"
YCM_TXT_FGAP:         DEFM      01H,"format gap.....: $"
YCM_TXT_START:        DEFM      01H,"start format...: $"
YCM_TXT_FTRK:         DEFM      0DH," track #$"
YCM_TXT_FHEAD:        DEFM      " head #$"
YCM_TXT_WP:           DEFM      " Write protect",BELL,"$"
YCM_TXT_SFMT:         DEFM      01H,"start formatting:",0AH,"$"


                                                ;--------------------------------INITIALISIERUNG------

INIT:
                                                ; ***
                      LD        HL,07D0H        ; VERZOEGERUNG ZUM WARM WERDEN
INIT1:                DEC       HL
                      LD        A,H
                      OR        L
                      JR        NZ,INIT1        ; BIS HL=0

                      LD        A,0F0H          ; DMA REQUEST FLANKENGETRIGGERT
                      OUT0      (32H),A         ; DMA/WAIT Control Register
                                                 
                      LD        A,0F0H          ; COMMON-AREA 1 F000H-FFFFh / BANK-AREA 0000H-EFFFH
                      OUT0      (3AH),A         ; MMU Common/Bank Area Register

                      LD        A,040H          ; OFFSET FUER ZUGRIFF AUF COMMON AREA
                      OUT0      (38H),A         ; MMU Common Base Register

                      LD        HL,0F000H       ; RAM-TEST COMMON-AREA 1
                      LD        BC,01000H
                      LD        E,53H           ; PRUEFBYTE Startwert
INIT2:                LD        (HL),E
                      INC       E               ; PRUEFBYTE+1
                      INC       HL              ; ZEIGER+1
                      DEC       BC              ; ZAEHLER-1
                      LD        A,B             ; ENDE ERREICHT?
                      OR        C
                      JR        NZ,INIT2        ; NEIN

                      LD        HL,07D0H        ; VERZOEGERUNG BIS ZUM START SPEICHER PRUEFEN
INIT3:                DEC       HL
                      LD        A,H
                      OR        L
                      JR        NZ,INIT3        ; BIS HL=0

                      LD        HL,0F000H       ; JETZT DAS GANZE PRUEFEN
                      LD        BC,01000H
                      LD        E,53H           ; AUSGANGSPRUEFBYTE Startwert WIE OBEN
INIT4:                LD        A,(HL)
                      CP        E
                      JP        NZ,BLINK_LOOP   ; RAM_FEHLER !!!
                      INC       E
                      INC       HL
                      DEC       BC
                      LD        A,B
                      OR        C
                      JR        NZ,INIT4        ; TEST OK?
                                                
                      LD        HL,0            ; EPROM INS RAM KOPIEREN VON
                      LD        DE,0            ; NACH
                      LD        BC,4000H        ; 16384 BYTES
                      LDIR

                      LD        A,PAD_MM0 OR PAD_SET   ; SETZE MM0 LEITUNG
                      OUT       (P_LS259),A            ; -> EPROM ABSCHALTEN

                      LD        A,83H           ; REFRESH FUER DYN. RAM einschalten (80H)
                                                ; REFRESH ALLE 80 TAKTZYKLEN (03H)
                      OUT0      (36H),A         ; Refresh Control Register

                      LD        HL,0            ; PRÜFSUMME RAM AB ADRESSE 0
                      LD        DE,0            ; BERECHNEN DURCH
                      LD        BC,0
INIT5:                LD        A,(BC)
                      LD        E,A
                      ADD       HL,DE           ; WORD-ADDITION
                      INC       BC              ; NAECHSTES BYTE ADRESSIEREN
                      CP        40H             ; SCHLEIFE, BIS IM SPEICHER 40H GEFUNDEN WIRD
                      JR        NZ,INIT5

                      LD        (PR_SUM),HL     ; PRÜFSUMME ABLEGEN


                      XOR       A
                      OUT0      (38H),A         ; MMU Common Base Register
                      OUT0      (3AH),A         ; MMU Common/Bank Area Register
                      LD        SP,MSTAK        ; SETZE STACKPOINTER
                      CALL      SET_SCL
                      CALL      USER_BYTES_READ ; USER BYTES AUS PCF8583 AUSLESEN UND UNTER SYSTEMPAGE ABLEGEN
                      LD        HL,SYSTEMPAGE
                      LD        B,18H           ; 18H BYTES
                      XOR       A
INIT6:                ADD       A,(HL)          ; 
                      INC       HL
                      DJNZ      INIT6           ; ALLE USERBYTES ADDIEREN 

                      LD        HL,DISKPAGE     ; DATEN VON DISKPAGE NACH
                      LD        DE,SYSTEMPAGE   ; SYSTEMPAGE KOPIEREN
                      LD        BC,0100H        ; 100H BYTES (INCL. USERBYTES)
                      OR        A
                      PUSH      AF
                      JR        NZ,INIT7        ; SIND USERBYTES GESETZT?
                      LD        HL,DISKPAGE+18H   ; DATEN VON DISKPAGE+18H NACH
                      LD        DE,SYSTEMPAGE+18H ; SYSTEMPAGE+18H KOPIEREN
                      LD        BC,00E8H        ; E8H BYTES (OHNE USERBYTES)
INIT7:                LDIR

; BERECHNEN DER TAKTFREQUENZ
; --------------------------

                      CALL      READ_PHYS_TIME  ; PCF-UHRZEIT LESEN
                      LD        HL,0FA0H
                      LD        A,(TIME_FIELD)  ; SEKUNDE
                      LD        C,A             ; NACH C SPEICHERN
INIT8:                DEC       HL
                      LD        A,H
                      OR        L               ; HL=0 ?
                      JR        Z,INIT11        ; TIMEOUT -> FEHLER
                      CALL      READ_PHYS_TIME
                      LD        A,(TIME_FIELD)  ; SEKUNDE
                      CP        C
                      JR        Z,INIT8         ; NOCH KEINE AENDERUNG
                      LD        HL,0008H
                      LD        C,A             ; NACH C SPEICHERN
INIT9:                CALL      READ_PHYS_TIME
                      LD        DE,00C0H
INIT10:               DEC       DE
                      LD        A,D
                      OR        E               ; DE=0 ?
                      JR        NZ,INIT10
                      LD        A,(TIME_FIELD)  ; SEKUNDE
                      INC       HL
                      CP        C
                      JR        Z,INIT9
                      ADD       HL,HL           ; *  2
                      ADD       HL,HL           ; *  4
                      ADD       HL,HL           ; *  8
                      ADD       HL,HL           ; * 16
INIT11:               LD        A,H
                      LD        (SPEED),A       ; TAKTFREQUENZKENNUNG

                      LD        A,(READY_BYTE)
                      AND       0F0H

                      OUT0      (32H),A         ; DMA/WAIT Control Register

                      LD        A,(START_DELAY)
                      LD        L,A
                      LD        H,64H
                      MLT       HL
                      LD        B,0AH
INIT12:               PUSH      BC
                      PUSH      HL
                      CALL      DELAY_HL
                      POP       HL
                      POP       BC
                      DJNZ      INIT12

                      LD        A,(VERSIONNR)   ; SETZE MONITOR VERSIONSNUMMER
                      LD        (MON_VERS),A    ; IM RAM
   
                      CALL      UNIOINIT        ; INITILISIERE UNIO

                      LD        A,(LOG_DRIVE)   ; BOOT DEVICE FESTLEGEN
                      LD        (TEMP_LOG_DRIVE),A

                      LD        A,(BAUD_JUMPERBYTE)   ; 
                      LD        C,A
                      LD        A,(SIO_A_PAR)
                      LD        B,A
                      AND       0FH
                      JR        NZ,INIT21       ; BAUDRATE NICHT UEBER JUMPER
                      LD        A,C

INIT21:               LD        C,A
                      LD        A,B
                      AND       0F0H
                      OR        C
                      LD        (SERBAUD0),A
                      LD        A,(BAUD_JUMPERBYTE)
                      LD        C,A
                      LD        A,(SIO_B_PAR)
                      LD        B,A
                      AND       0FH
                      JR        NZ,INIT22
                      LD        A,C

INIT22:               LD        C,A
                      LD        A,B
                      AND       0F0H
                      OR        C
                      LD        (SERBAUD1),A
                      LD        A,(SPEED)
                      CALL      CHK_TAKT
                      LD        C,A
                      AND       0F0H
                      JR        Z,INIT23
                      LD        C,0

INIT23:               LD        L,C
                      LD        H,0
                      ADD       HL,HL          ; * 2
                      ADD       HL,HL          ; * 4
                      ADD       HL,HL          ; * 8
                      ADD       HL,HL          ; * 16
                      LD        DE,W_28B1      ; TABELLENANFANG ????
                      ADD       HL,DE
                      LD        DE,SER_INIT_TAB      ; ZIELTABELLE ????
                      LD        BC,10H         ; 16 Bytes (10H)
                      LDIR

                      CALL       SER_INIT      ; SERIELLE SCHNITTSTELLEN CPU INITIALISIEREN
                      CALL       USERINIT      ; GGF. USER-SCHNITTSTELLEN INITIALISIEREN

                      LD         HL,FMT_TAB    ; VORBELEGEN DER WERTE FUER FORMATIEREN
                      LD         DE,FMT_VAL    ; ZIELPRUFFER
                      LD         BC,000CH      ; ANZAHL BYTES (12)
                      LDIR                     ; KOPIEREN

;-------------------- hier bin ich

                  LD         A,(IO_JUMPERBYTE)
                  AND        03H
                  LD         L,A
                  LD         H,10H
                  MLT        HL
                  LD         DE,GRIP_ST_TXT
                  ADD        HL,DE
                  LD         A,(S_INIT_BYTE)
INIT24:           OR         A
                  JR         Z,INIT28
                  ADD        A,A
                  PUSH       AF
                  PUSH       HL
                  CALL       C,INIT25
                  POP        HL
                  INC        HL
                  INC        HL
                  POP        AF
                  JR         INIT24

INIT25:           LD         E,(HL)
                  INC        HL
                  LD         D,(HL)
                  INC        DE
                  LD         A,E
                  OR         D
                  RET        Z
                  DEC        DE
                  EX         DE,HL
                  DEC        HL
INIT26:           INC        HL
                  LD         A,(HL)
                  CP         '$'
                  JR         NZ,INIT26
                  INC        HL
                  LD         B,(HL)
INIT27:           INC        HL
                  LD         C,(HL)
                  CALL       CO
                  DJNZ       INIT27
                  RET


INIT28:           LD         C,FF                ; FF (NEUE SEITE) AUSGEBEN
                  CALL       CECHO

                  CALL       PRINT_LINE          ; '======......======' AUSGEBEN
                  CALL       LINE_ON             ;
                  LD         HL,INITXT1          ; PROF-181X (GROSSTEXT) AUSGEBEN
                  CALL       SOUT
                  CALL       LINE_OFF            ;

                  LD         HL,INITXT2
                  CALL       SP_OT1
                  LD         A,(VERSIONNR)
                  RLCA
                  RLCA
                  RLCA
                  RLCA
                  AND        0FH                 ; MAJOR-VERSION
                  ADD        A,'0'
                  LD         C,A
                  CALL       CECHO
                  LD         C,'.'
                  CALL       CECHO
                  LD         A,(VERSIONNR)
                  AND        0FH                 ; MINOR-VERSION
                  ADD        A,'0'
                  LD         C,A
                  CALL       CECHO

                  CALL       PRINT_LINE          ; '======......======' AUSGEBEN
                  CALL       CROUT               ; NEUE ZEILE
                  CALL       CHK_TAKT

                  LD         HL,INITXT3          ; DATUM/UHRZEIT ANZEIGEN
                  CP         JA                  ; PCF OK?
                  PUSH       AF
                  CALL       Z,SP_OUT
                  POP        AF
                  JR         Z,INIT29            ; KEINE UHR DA
                  CALL       DISP_TIME


INIT29:           LD         HL,TXT_SYS_SPEED    ; TAKTFREQUENZ BESTIMMEN
                  CALL       SP_OUT
                  CALL       CHK_TAKT
                  LD         HL,TXT_FAILED       ; SCHON MAL VORBELEGEN
                  AND        0F0H
                  JR         NZ,INIT30           ; FEHLER BEI TAKTFREQUENZ
                  CALL       CHK_TAKT
                  LD         L,A                 ; TAKT-INDEX
                  LD         H,0
                  LD         DE,TXT_SPEED        ; TABELLENANFANG
                  ADD        HL,HL               ; * 2
                  ADD        HL,HL               ; * 4
                  ADD        HL,HL               ; * 8 (JE EINTRAG 8 ZEICHEN)
                  ADD        HL,DE               ; 
                  CALL       SOUT                ; TAKTFREQUENZ AUSGEBEN
                  LD         HL,TXT_MHZ
INIT30:           CALL       SOUT

                  LD         HL,INITXT4          ; SYSTEM DATA BACKUP
                  CALL       SP_OUT
                  POP        AF
                  LD         HL,TXT_OK           ; OK
                  JR         Z,INIT31
                  LD         HL,TXT_FAILED       ; FEHLER
INIT31:           CALL       SOUT


                  LD         HL,INITXT9          ; MEMORY ON BOARD
                  CALL       SP_OUT


                  CALL       INIFDC              ; FLOPPY CONTROLLER OK?
                  CALL       HD_CNTRL_TST        ; HD CONTROLLER OK?
                  LD         HL,INITXT6          ; FLOPPY CONTROLLER
                  CALL       SP_OUT
                  LD         A,(DISKFLG)
                  OR         A
                  LD         HL,TXT_FAILED       ; VORBELGEN MIT FEHLERTEXT
                  JR         Z,INIT32
                  LD         HL,TXT_OK           ; OK
INIT32:           CALL       SOUT
                  LD         HL,INITXT7          ; HD CONTROLLER
                  CALL       SP_OUT
                  LD         A,(OMTI_OK)
                  OR         A
                  LD         HL,TXT_FAILED       ; VORBELGEN MIT FEHLERTEXT
                  JR         Z,INIT33            ; FEHLER
                  LD         HL,TXT_OK           ; OK
INIT33:           CALL       SOUT

                  LD         HL,INITXT8          ; EPROM boot
                  CALL       SP_OUT
                  LD         HL,(PATCH)
                  LD         A,H          
                  OR         L                   ; HL=0 ?
                  LD         HL,TXT_NOT          ; VORBELEGEN MIT 'not patched'
                  CALL       Z,SOUT
                  LD         HL,TXT_PATCHED
                  CALL       SOUT


                  LD         HL,INITXT5          ; default boot device
                  CALL       SP_OUT
                  LD         A,(LOG_DRIVE)
                  AND        30H                 ; MASKIEREN
                  LD         HL,TXT_FLOPPY
                  JR         Z,INIT34            ; FLOPPY BOOT
                  LD         HL,TXT_HD
                  CP         20H
                  JR         Z,INIT34            ; HD BOOT
                  LD         HL,TXT_EPROM
                  CP         10H
                  JR         NZ,INIT35
INIT34:           CALL       SOUT                ; BOOT DEVICE AUSGEBEN
                  LD         A,(LOG_DRIVE)
                  LD         C,A
                  AND        30H                 ; MASKIEREN
                  JR         NZ,INIT35           ; KEIN FLOPPY LAUFWERK
                  LD         A,C
                  AND        03H                 ; FLOPPY MASKIEREN
                  ADD        A,'0'
                  LD         C,A                 ; LAUFWERKSNUMMER
                  CALL       CECHO
INIT35:           CALL       CROUT

                  CALL       PRINT_LINE
                  LD         A,(LOG_DRIVE)
                  AND        30H                 ; MASKIEREN
                  JR         Z,INIT36            ; FLOPPY BOOT
                  CP         10H
                  JR         Z,INIT37            ; EPROM BOOT
                  CP         20H
                  JR         Z,INIT38            ; HD BOOT
                  JP         RST_VERTEILER

INIT36:           LD         A,(DISKFLG)         ; FDC ERKANNT?
                  OR         A
                  JP         Z,RST_VERTEILER     ; NEIN NEUE EINGABE
                  JR         INIT39
INIT37:           LD         HL,(PATCH)
                  LD         A,H
                  OR         L
                  JP         Z,RST_VERTEILER
                  JR         INIT39
INIT38:           LD         A,(OMTI_OK)
                  OR         A
                  JP         Z,RST_VERTEILER
INIT39:           LD         HL,TXT_MONITOR      ; STARTMELDUNG AUSGEBEN
                  CALL       SP_OUT
                  CALL       GETCH1              ; BEFEHL EINLESEN
                  PUSH       AF
                  CALL       CROUT
                  POP        AF
                  CP         CR                  ; ENTER?
                  JP         NZ,BCMD_2           ; JA --> BOOT
                  JP         RST_VERTEILER       ; NEIN --> BEFEHL BEARBEITEN

;-------------------------------------------------

SP_OUT:           CALL       CROUT               ; Ausgabe String mit führenden Leerzeichen
SP_OT1:           LD         A,(HL)              ; STRING BEGINNT MIT ANZAHL LEERZEICHEN
                  INC        HL
                  OR         A
                  JP         Z,SOUT
                  LD         B,A
SP_OT2:           LD         C,' '
                  CALL       CECHO
                  DJNZ       SP_OT2
                  JP         SOUT                ; JETZT DEN EIGENTLICHEN TEXT AUSGEBEN

;-------------------------------------------------

PRINT_LINE:       CALL       CROUT               ; NEUE ZEILE
                  LD         B,71                ; 71 * '='
                  CALL       LINE_ON             ; 
                  LD         A,(IO_JUMPERBYTE)
                  OR         A
                  LD         C,'K'
                  JR         Z,PRINT_LINE_1
                  LD         C,'=' 

PRINT_LINE_1:     CALL       CECHO               ; SOLANGE AUSGEBEN, BIS B=0
                  DJNZ       PRINT_LINE_1
                  CALL       LINE_OFF
                  RET

;-------------------------------------------------

LINE_ON:          LD         A,(IO_JUMPERBYTE)   ; WENN GRIP DA
                  OR         A
                  RET        NZ
                  LD         C,1BH
                  CALL       CO
                  LD         C,'$'               ; STRICHGRAFIK EIN
                  JP         CO

;-------------------------------------------------

LINE_OFF:         LD         A,(IO_JUMPERBYTE)   ; WENN GRIP DA
                  OR         A
                  RET        NZ
                  LD         C,1BH
                  CALL       CO
                  LD         C,'%'               ; STRICHGRAFIK AUS
                  JP         CO

;-------------------------------------------------

BLINK_LOOP:       LD         A,(0F000h)          ; RAM DEFEKT, LED BLINKEN LASSEN, 
                  LD         (0F000h),A          ; SPEICHER LESEN / SCHREIBEN COMMON 1
                  LD         (04000h),A          ; SPEICHER SCHREIBEN BANK AREA
                  LD         A,H
                  RLCA
                  AND        01H
                  OR         PAD_SCL
                  OUT        (P_LS259),A         ; LED SETZEN / RUECKSETZEN
                  INC        HL
                  JR         BLINK_LOOP

;-------------------------------------------------

; ANHAND DER GESCHWINDIGKEIT IN SPEED (TAKT/1536MHz) KENNUNG AUS SPD_TAB ERMITTELN

CHK_TAKT:         PUSH       HL                  ; REGISTER RETTEN
                  PUSH       DE
                  LD         A,(SPEED)           ; TAKT-KENNUNG
                  LD         DE,SPD_TAB          ; TABELLENANFANG
                  LD         H,0                 ; OFFSET-
                  LD         L,A                 ; BERECHNUNG
                  ADD        HL,DE               ; IN TABELLE
                  LD         A,(HL)              ; KENNUNG ZURÜCKGEBEN
                  POP        DE                  ; REGISTER ZURUECKRETTEN
                  POP        HL
                  RET

; TABELLE ZUR BESTIMMUNG EINES TEXT_INDEX IN TXT_SPEED

SPD_TAB:          DEFB       0FFh                ;  0.000 MHz -> ungültig
                  DEFB       0FEh                ;  1.536 MHz -> ungültig
                  DEFB       0FEh                ;  3.072 MHz -> ungültig
                  DEFB       000h                ;  4.608 MHz -> Index 0
                  DEFB       001h                ;  6.144 MHz -> Index 1
                  DEFB       0FEh                ;  7.680 MHz -> ungültig
                  DEFB       002h                ;  9.216 MHz -> Index 2
                  DEFB       0FEh                ; 10.752 MHz -> ungültig
                  DEFB       003h                ; 12.288 MHz -> Index 3
                  DEFB       0FEh                ; 13.824 Mhz -> ungültig
                  DEFB       0FEh                ; 15.360 MHz -> ungültig
                  DEFB       0FEh                ; 16.896 MHz -> ungültig
                  DEFB       004h                ; 18.432 MHz -> Index 4
                  DEFB       0FEh                ; 19.968 MHz -> ungültig
                  DEFB       0FEh                ; 21.504 MHz -> ungültig
                  DEFB       0FEh                ; 23.040 MHz -> ungültig
                  DEFB       005h                ; 24.576 MHz -> Index 5

;-------------------------------------------------

FMT_TAB:          DEFB       000H                ; VORBELEGUNG FUER
                  DEFB       000H                ; FORMAT BEFEHL
                  DEFB       000H                ;
                  DEFB       000H                ;
                  DEFB       002H                ; SEKTROR GROESSE (02) 512 BYTE
                  DEFB       001H                ; STARTSEKTOR     (01)
                  DEFB       00AH                ; ENDSEKTOR       (10)
                  DEFB       050H                ; ANZAHL TRACKS   (80)
                  DEFB       01BH                ; GAP LAENGE      (27)
                  DEFB       0E5H                ; FUELLBYTE
                  DEFB       000H                ;
                  DEFB       0FFH                ;

;-------------------------------------------------

; VORDEFINIERTE TAKTFREQUENZEN

TXT_SPEED:        DEFM       '4.608 $$'          ; 03H
                  DEFM       '6.144 $$'          ; 04H
                  DEFM       '9.216 $$'          ; 06H
                  DEFM       '12.288 $'          ; 08H
                  DEFM       '18.432 $'          ; 0CH
                  DEFM       '24.576 $'          ; 10H

DISKPAGE:

;                 18H USERBYTES
                  DEFB       0D0H,002H,0D0H,002H,0D0H,002H,0D0H
                  DEFB       002H,030H,000H
                  DEFB       000H,0F0H,040H,04EH,00CH,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
;                 E8H RESTBYTES
                  DEFB       000H,000H,001H,000H,001H,000H,01AH
                  DEFB       007H,080H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,0C3H,095H,010H
                  DEFB       000H,00AH,000H,0FFH,0FFH,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       001H,000H,000H,000H,000H,0FFH,000H
                  DEFB       000H,000H,000H,000H
PR_SUM:           DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,0FFH,0FFH,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H,000H,000H,000H
                  DEFB       000H,000H,000H,000H


GRIP_ST_TXT:      DEFW       TXT_SPL_ON
                  DEFW       TXT_STL_OFF
                  DEFW       TXT_SCRN_8_8
                  DEFW       TXT_SCRN_8_10
                  DEFW       TXT_NO_ASCII

          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h
          rst       38h

; GRIP-STEUERTEXTE

TXT_SPL_ON:       DEFM    01H,"spooler on.......: $"
                  DEFB    04                           ; ANZAHL BYTES
                  DEFM    01BH,01BH,'5','0'

TXT_STL_OFF:      DEFM    01H,"status line off..: $"
                  DEFB    04                           ; ANZAHL BYTES
                  DEFM    01BH,01BH,'S','0'

TXT_SCRN_8_8:     DEFM    01H,"max. screen 8*8..: $"
                  DEFB    05                           ; ANZAHL BYTES
                  DEFM    01BH,01BH,'8','@',7FH

TXT_SCRN_8_10:    DEFM    01H,"max. screen 8*10.: $"
                  DEFB    09                           ; ANZAHL BYTES
                  DEFM    01BH,01BH,'6',':',01BH,01BH,'8','9',7FH

TXT_NO_ASCII:     DEFM    01H,"non ASCII........: $"
                  DEFB    04                           ; ANZAHL BYTES
                  DEFM    01BH,01BH,37H,32H

;---------------------------------------------------------------------
;
; ?????????????????????????

W_28B1:   
                  DEFB    000h,02Eh,02Dh,00Eh,00Eh,02Ch,02Bh,02Ah
                  DEFB    029h,004h,028h,003h,021h,002h,020h,020h

                  DEFB    000h,02Eh,000h,02Dh,00Eh,00Eh,00Dh,00Ch
                  DEFB    00Bh,029h,00Ah,028h,009h,021h,008h,001h

                  DEFB    000h,02Eh,02Eh,02Dh,02Dh,02Dh,02Ch,02Bh
                  DEFB    02Ah,00Bh,029h,00Ah,028h,009h,021h,020h

                  DEFB    000h,001h,02Eh,02Eh,02Eh,02Eh,00Eh,00Dh
                  DEFB    00Ch,024h,00Bh,023h,00Ah,022h,009h,008h

                  DEFB    000h,020h,02Eh,02Eh,02Eh,02Eh,02Dh,02Ch
                  DEFB    02Bh,00Ch,02Ah,00Bh,029h,00Ah,028h,021h

                  DEFB    000h,002h,02Eh,02Eh,02Eh,02Eh,02Dh,00Eh
                  DEFB    00Dh,025h,00Ch,024h,00Bh,023h,00Ah,009h

;---------------------------------------------------------------------

INITXT1:              DEFM      0DH,0AH
                      DEFM      ' TTTT  TTTT   TTT  TTTT     TT  TTT   TT T   T',0DH,0AH
                      DEFM      ' T   T T   T T   T T       TTT T   T TTT T   T',0DH,0AH
                      DEFM      ' T   T T   T T   T T         T T   T   T  T T',0DH,0AH
                      DEFM      ' TTTT  TTTT  T   T TTT  TTT  T  TTT    T   T',0DH,0AH
                      DEFM      ' T     T T   T   T T         T T   T   T  T T',0DH,0AH
                      DEFM      ' T     T  T  T   T T         T T   T   T T   T',0DH,0AH
                      DEFM      ' T     T   T  TTT  T         T  TTT    T T   T$'

INITXT2:              DEFB      04H
                      DEFM      'Monitor Version $'
INITXT3:              DEFB      013H
                      DEFM      'real time clock : failed$'
INITXT4:              DEFB      010H
                      DEFM      'system data backup : $'
TXT_MONITOR:          DEFB      06H
                      DEFM      'press the <RETURN> key for Monitor or any other key for boot => $'
INITXT5:              DEFB      0FH
                      DEFM      'default boot device : $'
INITXT6:              DEFB      011H
                      DEFM      'floppy controller : $'
INITXT7:              DEFB      00FH
                      DEFM      'harddisk controller : $'
INITXT8:              DEFB      018H
                      DEFM      'EPROM boot : $'
TXT_OK:               DEFM      'ok$'
TXT_FAILED:           DEFM      'failed$'
TXT_PATCHED:          DEFM      'patched$'
TXT_NOT:              DEFM      'not $'
TXT_SYS_SPEED:        DEFB      016H
                      DEFM      'system speed : $'
TXT_MHZ:              DEFM      'MHz$'
INITXT9:              DEFB      013H
                      DEFM      'memory on board : 1024K byte',0DH,0AH,'$'
TXT_FLOPPY:           DEFM      'floppy drive $'
TXT_HD:               DEFM      'harddisk$'
TXT_EPROM:            DEFM      'EPROM$'
SGNON:                DEFM      0DH,0AH,'Monitor$'


CMDMSG:                                        ; NACH EINGABE EINES ZEICHENS WIRD TEXT AUSGEGEBEN

                      DEFM      'Address for read (write) from (to) drive $'
                      DEFM      'Boot CP/M $'
                      DEFM      'Check drive $'
                      DEFM      'Display memory $'
                      DEFM      'EPROM test$'
                      DEFM      'Fill memory $'
                      DEFM      'Go to $'
                      DEFM      'Help$'
                      DEFM      'Keyboard mode$'
                      DEFM      'In port $'
;                      DEFM      'J:list breakpoints $'
                      DEFM      'List time$'
                      DEFM      'Move memory $'
                      DEFM      'New date and time set$'
                      DEFM      'Out port $'
;                      DEFM      'P:single step $'
;                      DEFM      'Q:set breakpoints $'
                      DEFM      'Read from drive $'
                      DEFM      'Substitute memory $'
                      DEFM      'Test memory $'
                      DEFM      'User set up$'
                      DEFM      'Verify memory $'
                      DEFM      'Write to drive $'
                      DEFM      'X Register $'
                      DEFM      'Y format disk$'
;                      DEFM      'Z:clear breakpoints $'
                      DEFB      0              ; ENDEKENNUNG DER BEFEHLSBESCHREIBUNGSLISTE


CADR:                 DEFW      0       ;
;                      DEFW      JCMD    ;J-Befehl
;                      DEFW      ZCMD    ;Z-Befehl
;                      DEFW      QCMD    ;Q-Befehl
;                      DEFW      PCMD    ;P-Befehl
                      DEFW      YCMD    ;Y-BefeHL
                      DEFW      UCMD    ;U-BefeHL
                      DEFW      KCMD    ;K-BefeHL
                      DEFW      LCMD    ;L-BefeHL
                      DEFW      HCMD    ;H-BefeHL
                      DEFW      GCMD    ;G-BefeHL
                      DEFW      WCMD    ;W-BefeHL
                      DEFW      ACMD    ;A-BefeHL
                      DEFW      RCMD    ;R-BefeHL
                      DEFW      OCMD    ;O-BefeHL
                      DEFW      CCMD    ;C-BefeHL
                      DEFW      TCMD    ;T-BefeHL
                      DEFW      VCMD    ;V-BefeHL
                      DEFW      FCMD    ;F-BefeHL
                      DEFW      BCMD    ;B-BefeHL
                      DEFW      XCMD    ;X-BefeHL
                      DEFW      SCMD    ;S-BefeHL
                      DEFW      MCMD    ;M-BefeHL
                      DEFW      ICMD    ;I-BefeHL
                      DEFW      ECMD    ;E-BefeHL
                      DEFW      DCMD    ;D-BefeHL
                      DEFW      NCMD    ;N-BefeHL




CTAB:
                      DEFB      'N'
                      DEFB      'D'
                      DEFB      'E'
                      DEFB      'I'
                      DEFB      'M'
                      DEFB      'S'
                      DEFB      'X'
                      DEFB      'B'
                      DEFB      'F'
                      DEFB      'V'
                      DEFB      'T'
                      DEFB      'C'
                      DEFB      'O'
                      DEFB      'R'
                      DEFB      'A'
                      DEFB      'W'
                      DEFB      'G'
                      DEFB      'H'
                      DEFB      'L'
                      DEFB      'K'
                      DEFB      'U'
                      DEFB      'Y'
;                      DEFB      'P'
;                      DEFB      'Q'
;                      DEFB      'Z'
;                      DEFB      'J'
NCMDS:                EQU       $-CTAB


RTAB:

                      DEFB      'A'
                      DEFB      ASAVE AND 0FFH
                      DEFB      0
                      DEFB      'B'
                      DEFB      BSAVE AND 0FFH
                      DEFB      0
                      DEFB      'C'
                      DEFB      CSAVE AND 0FFH
                      DEFB      0
                      DEFB      'D'
                      DEFB      DSAVE AND 0FFH
                      DEFB      0
                      DEFB      'E'
                      DEFB      ESAVE AND 0FFH
                      DEFB      0
                      DEFB      'F'
                      DEFB      FSAVE AND 0FFH
                      DEFB      0
                      DEFB      'H'
                      DEFB      HSAVE AND 0FFH
                      DEFB      0
                      DEFB      'L'
                      DEFB      LSAVE AND 0FFH
                      DEFB      0
                      DEFB      'M'
                      DEFB      HSAVE AND 0FFH
                      DEFB      1
                      DEFB      'P'
                      DEFB      PSAVE+1 AND 0FFH
                      DEFB      1
                      DEFB      'S'
                      DEFB      SSAVE+1 AND 0FFH
                      DEFB      1
                      DEFB      'a'
                      DEFB      AASAVE AND 0FFH
                      DEFB      0
                      DEFB      'b'
                      DEFB      BBSAVE AND 0FFH
                      DEFB      0
                      DEFB      'c'
                      DEFB      CCSAVE AND 0FFH
                      DEFB      0
                      DEFB      'd'
                      DEFB      DDSAVE AND 0FFH
                      DEFB      0
                      DEFB      'e'
                      DEFB      EESAVE AND 0FFH
                      DEFB      0
                      DEFB      'f'
                      DEFB      FFSAVE AND 0FFH
                      DEFB      0
                      DEFB      'h'
                      DEFB      HHSAVE AND 0FFH
                      DEFB      0
                      DEFB      'l'
                      DEFB      LLSAVE AND 0FFH
                      DEFB      0
                      DEFB      'm'
                      DEFB      HHSAVE AND 0FFH
                      DEFB      1
                      DEFB      'X'
                      DEFB      XSAVE+1 AND 0FFH
                      DEFB      1
                      DEFB      'Y'
                      DEFB      YSAVE+1 AND 0FFH
                      DEFB      1
                      DEFB      'I'
                      DEFB      ISAVE AND 0FFH
                      DEFB      0
                      DEFB      'R'
                      DEFB      RSAVE AND 0FFH
                      DEFB      0
                      DEFB      0,0     ;ENDE KENNUNG DER TABELLE


;
; ERWEITERUNGEN ZUR ARBEIT MIT BREAKPOINTS
;
;
;
;PCMD:                                          ; SINGLE STEP INSTRUCTION
;
;                      JP        GETCOM         ; NICHT REALISIERT;
;
;
;QCMD:                                          ; SET BREAKPOINTS
;                                               ; ALTE BP'S KOENNEN ERHALTEN BLEIBEN
;                                               ; ACHTUNG FEHLER, WENN MEHRMALS GLEICHER BP
;                                               ; GESETZT WIRD
;
;                      LD        B,5            ; MAX. FÜNF BP'S
;                      LD        IX,BRTAB       ; TABELLENANFANG
;
;QCMD1:                PUSH      BC             ; ZAEHLER
;                      LD        L,(IX)         ; BP NACH HL LADEN
;                      LD        H,(IX+1)
;                      CALL      HL_NEU_WRT     ; ALTEN BP DURCH NEUEN ERSETZEN?
;                                               ; NEUER BP IN HL
;                      LD        A,L
;                      OR        H              ; ADRESSE 0? --> BP LOESCHEN
;                      JR        Z,QCMD_L
;                      LD        A,(IX)         ; ADRESSE GLEICH?
;                      CP        L
;                      JR        NZ,QCMD_N      ; UNGLEICH --> NEUER BP
;                      LD        A,(IX+1)
;                      CP        H
;                      JR        NZ,QCMD_N      ; UNGLEICH --> NEUER BP
;
;                      JR        QCMD2          ; BP BLEIBT GESETZT
;
;QCMD_L:               LD        A,(IX)         ; BP LOESCHEN
;                      LD        B,(IX+1) 
;                      OR        B              ; WAR BP VORHANDEN?
;                      JR        Z,QCMD2        ; NEIN, NICHTS ZU TUN
;                      LD        E,(IX)         ; ALTE ADRESSE
;                      LD        D,(IX+1)       ; LADEN
;                      LD        A,(IX+2)       ; ALTER OPCODE
;                      LD        (DE),A         ; RESTAURIEREN
;                      XOR       A
;                      LD        (IX),A         ; LOESCHE BP UND OPCODE  
;                      LD        (IX+1),A       ; IN TABELLE
;                      LD        (IX+2),A
;
;                      JR        QCMD2          ; UND WEITER
;
;QCMD_N:               LD        A,(IX+2)       ; BP LOESCHEN
;                      LD        E,(IX)
;                      LD        D,(IX+1)
;                      LD        (DE),A         ; ALTEN OPCODE RESTAURIEREN
;                      LD        A,(BC)         ; NEUEN BP SETZEN
;                      LD        (IX+2),A
;                      LD        (IX),L
;                      LD        (IX+1),H
;                      LD        A,0FFH         ; RST 7
;                      LD        (BC),A         ; BP AKTIVIEREN
;
;                      
;QCMD2:                INC       IX             ; NAECHSTEN BREAKPOINT VORBEREITEN
;                      INC       IX
;                      INC       IX
;                      POP       BC
;                      DJNZ      QCMD1
;
;                      JP        GETCOM
;
;
;JCMD:                                          ; GIB DIE GESETZTEN BREAKPOINTS AUS
;                      LD        HL,JTXT
;                      CALL      SOUT
;                      LD        DE,BRTAB       ; STARTADRESSE TABELLE
;                      LD        B,5            ; MAX. FÜNF BREAQKPOINTS
;
;JCMD1:                PUSH      DE
;                      LD        A,(DE)
;                      LD        L,A
;                      INC       DE
;                      LD        A,(DE)
;                      LD        H,A
;                      CALL      HLOUT          
;                      LD        C,'H'
;                      CALL      CECHO
;                      LD        C,' '
;                      CALL      CECHO
;                      POP       DE
;                      INC       DE             ; 2 BYTE ADRESSE
;                      INC       DE
;                      INC       DE             ; 1 BYTE OPCODE
;                      DJNZ      JCMD1
;
;                      JP        GETCOM
;
;
;JTXT:                 DEFM      '(0000H for none)=> $'
;
;
;
;
;ZCMD:                                          ; LÖSCHE ALLE BREAKPOINTS
;
;                      LD        B,5            ; MAX. FÜNF BREAKPOINTS RESTAURIEREN
;                      LD        HL,BRTAB
;
;ZCMD1:                LD        A,(HL)         ; BREAKPOINT ADRESSE LESEN
;                      LD        E,A
;                      XOR       A
;                      LD        (HL),A         ; 0 SETZEN
;                      INC       HL             ; OPCODE
;                      LD        A,(HL)
;                      LD        D,A
;                      XOR       A
;                      LD        (HL),A         ; 0 SETZEN
;                      INC       HL
;                      LD        A,D
;                      OR        E              ; BREAKPOINT VORHANDEN GEWESEN?
;                      JR        Z,ZCMD3        ; NÄCHSTEN BREAKPOINT BEARBEITEN
;
;ZCMD2:                
;                      LD        A,(HL)         ; ALTEN OPCODE LESEN UND
;                      LD        (DE),A         ; WIEDERHERSTELLEN
;
;ZCMD3:                INC       HL             ; NAECHSTER BREAKPOINT
;                      DJNZ      ZCMD1
;
;                      JP        GETCOM
;
;
;
;BRTAB:                DEFW      0                 ; 1. Breakpointadresse
;                      DEFB      0                 ; Befehlscode Breakpoint 1
;                      DEFW      0                 ; 2. Breakpointadresse
;                      DEFB      0                 ; Befehlscode Breakpoint 2
;                      DEFW      0                 ; 3. Breakpointadresse
;                      DEFB      0                 ; Befehlscode Breakpoint 3
;                      DEFW      0                 ; 4. Breakpointadresse
;                      DEFB      0                 ; Befehlscode Breakpoint 4
;                      DEFW      0                 ; 5. Breakpointadresse
;                      DEFB      0                 ; Befehlscode Breakpoint 5


;PRT_BUF:              PUSH      BC                                        
;                      LD        HL,CMFD_TXT1      ; BUFFER FLOPPY CMD ZEIGEN
;                      CALL      SOUT
;                      pop       bc
;                      LD        A,C
;                      CALL      NMOUT
;                      PUSH      BC
;                      LD        C,' '
;                      CALL      CECHO
;                      LD        C,'>'
;                      CALL      CECHO
;                      pop       bc
;                      LD        HL,CMDTAB
;                      push      bc
;CMFD0:                LD        A,(HL)
;                      CALL      NMOUT
;                      LD        C,' '
;                      CALL      CECHO
;                      INC       HL
;                      DJNZ      CMFD0
;
;                      LD        HL,CMFD_TXT2
;                      CALL      SOUT
;                      POP       BC
;                      RET
;
;CMFD_TXT1:            DEFM      0DH,0AH,"Bef-Code: $"
;CMFD_TXT2:            DEFM      0DH,0AH,"Antwort : $"

;PRT_RES:
;                      PUSH      BC                 ; WERT AUS NEXT ROUTINE AUSGEBEN
;                      PUSH      AF
;                      CALL      NMOUT
;                      LD        C,' '
;                      CALL      CECHO
;                      POP       AF
;                      POP       BC
;                      RET
;

; DIE DISKPAGE WIRD DER SYSTEMPAGE UEBERLAGERT

LASTADD:              EQU       $-1       ;LETZTE BENUTZTE ADRESSE IM EPROM
;
;
;
;************************************* BEGINN DES RAM-BEREICHES ******
;
;
;
                      SEGMENT   "DSEG"
                      ORG       SYSTEMPAGE-1024-256
                                        ;
BOOTADR:              EQU       $       ;HIERHER WIRD ERSTER SEKTOR GELADEN
                                        ;
                      DEFS      1024    ;PLATZ FUER ERSTEN SEKTOR
                                        ;
                      DEFS      256-74  ;PLATZ FUER STACK
                                        ;
REGS:                 EQU       $
MSTAK:                EQU       $
                                        ;
                                        ; REGISTER INHALTE
                                        ;
RSAVE:                DEFS      1
ISAVE:                DEFS      1
LLSAVE:               DEFS      1
HHSAVE:               DEFS      1
EESAVE:               DEFS      1
DDSAVE:               DEFS      1
CCSAVE:               DEFS      1
BBSAVE:               DEFS      1
FFSAVE:               DEFS      1
AASAVE:               DEFS      1
YSAVE:                DEFS      2
XSAVE:                DEFS      2
ESAVE:                DEFS      1
DSAVE:                DEFS      1
CSAVE:                DEFS      1
BSAVE:                DEFS      1
FSAVE:                DEFS      1
ASAVE:                DEFS      1
LSAVE:                DEFS      1
HSAVE:                DEFS      1
PSAVE:                DEFS      2
SSAVE:                DEFS      2

PCF_CMD_BUF:          DEFS      16        ; (0FED0h)
W_FEE0:                   EQU       0FEE0h    ;
W_FEE1:               EQU       0FEE1h    ;
W_FEE2:               EQU       0FEE2h    ;
W_FEE3:               EQU       0FEE3h    ;
W_FEE4:               EQU       0FEE4h    ;
W_FEE5:               EQU       0FEE5h    ;
W_FEE6:               EQU       0FEE6h    ;
FMT_VAL:              EQU       0FEE7h    ;


W_FEF0:   EQU       0FEF0h    ;  -272
W_FEF1:   EQU       0FEF1h    ;  -271
W_FEF2:   EQU       0FEF2h    ;  -270
W_FEF3:   EQU       0FEF3h    ;  -269
W_FEF4:   EQU       0FEF4h    ;  -268
W_FEF5:   EQU       0FEF5h    ;  -267
W_FEF6:   EQU       0FEF6h    ;  -266
W_FEF7:   EQU       0FEF7h    ;  -265


                                               ;
                                               ; DIE NACHFOLGENDEN SPEICHERZELLEN MUESSEN
                                               ; MIT DER DISKPAGE GEMISCHT WERDEN KOENNEN
                                               ;
; SYSTEMPAGE:                                  ;
   
                      ORG       0FF00H

SPECD_WORD:           DEFS      8              ; DER INHALT DIESER VIER MAL ZWEI BYTE BESTIMMT DIE
                                               ; STEP-RATE, DIE HEAD-LOAD-TIME UND DIE HEAD-
                                               ; UNLOAD-TIME. SPECD_WORD WIRD NACH EINEM RESET
                                               ; VOREINGESTELLT. NACH JEDEM CHECK DRIVE WERDEN
                                               ; DIE DRIVE-ZEITEN NEU GESETZT.
                                               ; DIE 16 BIT VON SPECD_WORD SIND FOLGENDERMASSEN
                                               ; AUFGEBAUT:
                                               ;          SSSSUUUU LLLLLLLX

                                               ; SSSS:    STEPRATE 0000=16MS
                                               ;                   0001=15MS
                                               ;                   .........
                                               ;                   1111=01MS

                                               ; UUUU:    HEADUNLOADTIME IN 16 MS SCHRITTEN
                                               ;          0000=0MS, 0001=16MS, .. ,1111=240MS

                                               ; LLLLLLL: HEADLOADTIME IN 2 MS SCHRITTEN

                                               ; X: IMMER 1

                                               ; DEFAULTMAESSIG WIRD SPECD_WORD MIT
                                               ; XSPECD_WORD INITIALISIERT, ES KANN ABER
                                               ; AUCH MIT DEM U-BEFEHL GESETZT WERDEN.


READY_BYTE:           DEFS      1              ; DIE UNTEREN 4 BITS GEBEN AN, OB EIN LW
                                               ; EIN READY SIGNAL LIEFERN KANN ('0') ODER OB
                                               ; ES KEIN READY LIEFERT ('1').
                                               ; DIE OBEREN 4 BITS GEBEN DIE WAITZYKLEN
                                               ; FUER DEN HD64180 AN. DIE BIT BEDEUTUNG IST
                                               ; DEM DCNTL-PORT IDENTISCH
                                               ; BIT 7-6 = ANZAHL WAIT-ZYKLEN MEMORY
                                               ; BIT 5-4 = ANZAHL WAIT-ZYKLEN I/O

TE_TIME:              DEFS      1              ; WARTEZEIT VOR SEEK NACH DISK-WRITE IN 100µs
                         
STEP_WAIT:            DEFS      1              ; WARTEZEIT VOR SEEK WENN MOTOR VORHER AUS WAR
                                               ; IST BEI EPSON 3,5 ZOLL LAUFWERKEN NOTWENDIG.
                                               ; ZEIT: MAL 10 MS (BEI 6 MHZ)

SEEKNR:               DEFS      1              ; EINIGE LAUFWERKE BENOETIGEN ZWEI STEPIMPULSE
                                               ; DIE UNTEREN 4 BIT GEBEN FUER JEDES LW
                                               ; AN, OB ES EIN ('0') ODER ZWEI ('1') IMPULSE
                                               ; PRO SPURWECHSEL BRAUCHT, LAUFWERK 0 IST LSB.
                                               ; DIE OBEREN 4 BIT DIESES BYTES GEBEN AN, OB
                                               ; TEST DAS TWO-SIDED-BIT IMMER AUF 1 ODER
                                               ; ENTSPRECHEND DER TWO-SIDED-LEITUNG SETZTEN
                                               ; SOLL. DURCH DIESE ERWEITERUNG SPART MAN SICH
                                               ; DEN HARDWARE-ZUSATZ (SIEHE CP/M ANPASSUNS-
                                               ; BESCHREIBUNG) FUER GEMISCHTEN BETRIEB MIT
                                               ; 80 TRACK LAUFWERKEN.
                                               ; DEFAULTMAESSIG WIRD SEEKNR MIT XSEEKNR
                                               ; INITIALISIERT. SEEKNR KANN ABER AUCH MIT DEM
                                               ; U-BEFEHL GESETZT WERDEN.

SIO_A_PAR:            DEFS      1              ; DIESE BEIDEN BYTES SIND GLEICH AUFGEBAUT
SIO_B_PAR:            DEFS      1              ; SIE GELTEN FUER DIE BEIDEN SERIELLEN
                                               ; SCHNITTSTELLEN
                                               ; DIE UNTEREN VIER BITS GEBEN DIE BAUDRATE
                                               ; AN. SIND SIE 0000, WIRD DIE BAUDRATE
                                               ; ENTSPRECHEND J10 GESETZT
                                               ; SONST  1 =     50   BAUD
                                               ;        2 =     75   BAUD
                                               ;        3 =    110   BAUD
                                               ;        4 =    134.5 BAUD
                                               ;        5 =    150   BAUD
                                               ;        6 =    300   BAUD
                                               ;        7 =    600   BAUD
                                               ;        8 =  1.200   BAUD
                                               ;        9 =  1.800   BAUD
                                               ;        A =  2.400   BAUD
                                               ;        B =  3.600   BAUD
                                               ;        C =  4.800   BAUD
                                               ;        D =  7.200   BAUD
                                               ;        E =  9.600   BAUD
                                               ;        F = 19.200   BAUD
                                               ; BIT 4=0 => 1 STOP BIT, BIT 4=1 => 2 STOP BIT
                                               ; BIT 5=0 => NO PARITY,  BIT 5=1 => PARITY
                                               ; BIT 6=0 => 7 BIT DATA, BIT 6=1 => 8 BIT DATA
                                               ; BIT 7=0 => EVEN PARITY,BIT 7=1 => ODD PARITY

LOG_DRIVE:            DEFS      1              ; BIT 1, BIT 2: DIESE BEIDEN BITS GEBEN AN
                                               ; WELCHES PHYSIKALISCHE LAUFWERK, DAS LOGISCHE
                                               ; LAUFWERK A IST. Achtung, TEMP_LOG_DRIVE IST
                                               ; EINE KOPIE VON LOG_DRIVE. DIE AKTUELLE
                                               ; UMRECHNUNG FINDET IMMER MIT TEMP_LOG_DRIVE
                                               ; STATT.
                                               ; BIT 2=1 WAEHLT CTS AN CPU PIN 52
                                               ; BIT 3=1 WAEHLT TDEND0 AN CPU PIN 50
                                               ; BIT 4=1 STATT VON FLOPPY, EPROM-BOOT
                                               ; BIT 5 IST RESERVIERT

SWITCH_DELAY:         DEFS      1              ; VERZOEGERUNGSZEIT FUER MINI/MAXI UMSCHALTUNG
                                               ; IN 10 MS. IST BEI LAUFWERKEN MIT AUTOMATISCHER
                                               ; UMSCHALTUNG ZWISCHEN MINI-BETRIEB und MAXI-
                                               ; KOMPATIBLEN BETRIEB NOTWENDIG.

S_INIT_BYTE:          DEFS      1              ; VEKTOR FUER ZU SENDENDE INITIALISIERUNGSSTRINGS

START_DELAY:          DEFS      1              ; STARTVERZÖGERUNG LAUFWERK (FF11)

W_FF12:               DEFS      1              ; FREI
U_BYTE_1:             DEFS      1              ; USER BYTE 1 (FF13)
U_BYTE_2:             DEFS      1              ; USER BYTE 2 (FF14)
U_BYTE_3:             DEFS      1              ; USER BYTE 3 (FF15)
U_BYTE_4:             DEFS      1              ; USER BYTE 4 (FF16)

DATA_CHECK:           DEFS      1              ; IN DIESEM BYTE STEHT DIE PRUEFSUMME DER
                                               ; UNTEREN 23 BYTE. DIE PRUEFSUMME WIRD VOM
                                               ; U-BEFEHL ERRECHNET

CMDTAB:               DEFS      1       
UNIT:                 DEFS      1              ; WIRD VON C-BEFEHL GESETZT
TRACK:                DEFS      1              ; WIRD VON A-BEFEHL GESETZT
HEAD:                 DEFS      1              ; WIRD VON A-BEFEHL GESETZT
SECTOR:               DEFS      1              ; WIRD VON A-BEFEHL GESETZT
SECSZ:                DEFS      1              ; WIRD VON C-BEFEHL GESETZT
EOT:                  DEFS      1              ; WIRD VON C-BEFEHL GESETZT
GAPLL:                DEFS      1              ; WIRD VON C-BEFEHL GESETZT
DTLL:                 DEFS      1              ; WIRD VON C-BEFEHL GESETZT

REST:                 DEFS      7              ; ERGEBNISTABELLE DES FLOPPY-CONTROLLERS

DISPADR:              DEFS      2              ; LETZTER STAND DES D-BEFEHLS.
                                               ; UNTER CP/M STEHT HIER KENNUNG FUER PROF-181X.

UMLEIT_GETCM:         DEFS      3              ; ROUTINEN, DIE VON CP/M BENUTZT WERDEN, MUESSEN
                                               ; UEBER DIESEN SPRUNG AUF BEFEHLS-EINGABE-EBENE
                                               ; ZURUECKKEHREN. CP/M BIOS SETZT DIESEN SPRUNG
                                               ; DANN AUF WBOOT

DERMSG:               DEFS      1              ; "0"  :AUSGABE VON FLOPPY-FEHLER
                                               ; "FF" :AUSGABE VON FLOPPY-FEHLER UNTERDRUECKEN

RWRETRY:              DEFS      1              ; ANZAHL DER LESE/SCHREIBVERSUCHE MIT FLOPPY

WRITE_PRECOM:         DEFS      1              ; WRITE PRECOMPENSATION FUER RWCOM ROUTINE
                                               ; ACHTUNG, DIE ANGEGEBENE WRITEPRECOMPENSATIONS
                                               ; ZEIT WIRD NUR DANN GESETZT, WENN DIE
                                               ; ANGEWAEHLTE SPUR GROESSER GLEICH DER SPUNNR.
                                               ; IN PRECOM_BEGIN IST.

ALT_UNIT:             DEFS      1              ; LAUFWERK UND TRACK BEI LETZTEM
ALT_TRACK:            DEFS      1              ; SEEK AUFRUF

IO_JUMPERBYTE:        DEFS      1              ; STELLUNG DES JUMPERS  J9: 0=KEIN JUMPER
                                               ; 1=>1-3,2=>2-4,3=>3-5,4=>4-6. DIRIGIERT KONSOLE

BAUD_JUMPERBYTE:      DEFS      1              ; STELLUNG DES JUMPERS J10: 0=KEIN JUMPER
                                               ; 1=>1-3,2=>2-4,3=>3-5,4=>4-6. BAUDRATE WAEHLEN

RWCMD:                DEFS      1              ; COMMANDO FUER RWCOM
ERMSG:                DEFS      2              ; MESSAGE FUER RWCOM
DISKFLG:              DEFS      1              ; "0": FDC9268 NICHT OK, "FF": FDC9268 OK
TIME_FIELD:           DEFS      7              ; ZWISCHENSPEICHER FUER PFC8583
TEST_TYPE:            DEFS      1              ; WIRD BEI TEST GESETZT (FORMATERKENNUNG FLOPPY)
                                               ; BIT 7:   0=SS,    1=DS 
                                               ; BIT 6:   0=SD,    1=DD
                                               ; BIT 5:   0=MAXI,  1=MINI
                                               ; BIT 4:   IMMER 0
                                               ; BIT 3:   IMMER 0
                                               ; BIT 2:   IMMER 0
                                               ; BIT 0-1: SEKTROGROESSE
                                               ;
TEST_MSEK:            DEFS      1              ; GROESSTER SEKTOR DER SPUR, DEN TEST ERMITTELTE
                                               ;
TEST_LSEK:            DEFS      1              ; KLEINSTER SEKTOR DER SPUR, DEN TEST ERMITTELTE
                                               ;
TEST_TRACK:           DEFS      1              ; AUF DIESER SPUR WIRD DAS FLOPPY-
                                               ; FORMAT GETESTET (DEFAULT=1)

DMABANK:              DEFS      1              ; DMA-BANK FUER FLOPPY READ UND WRITE
DMAADR:               DEFS      2              ; DMA-ADRESSE FUER FLOPPY READ UND WRITE
SECTCNT:              DEFS      1              ; ANZAHL DER SEKTOREN FUER FLOPPY READ UND WRITE

LAST_FDC_SPEED:       DEFS      1              ; ZEIGT AN, OB FDC AUF MAXI (FF) ODER MINI (00)

MON_VERS:             DEFS      1              ; MONITOR VERSIONSNUMMER
TEMP:                 DEFS      1              ; ALLGEMEINER MONITOR ZWISCHENSPEICHER
                                               ; UNTER CP/M STEHT HIER BIOSVERSION
COMMON_PAGE:          DEFS      1              ; PAGEGRENZE FUER COMMON BEREICH (SETZT BIOS)
CURRENT_BANK:         DEFS      1              ; GEWAEHLTE BANK UNTER COMMON (SETZT BIOS)
EPROMZ:               DEFS      1              ; WIEVIEL MAL WURDE EPROM EINGESCHALTET?
                                               ; (WIRD VOM BIOS GESETZT)

TYPELIST:             DEFS      2              ; ZEIGER AUF DISK_TYPE_LIST (WIRD VOM BIOS
                                               ; GESETZT). IM MONITORBETRIEB STEHT HIER DIE
                                               ; PRUEFSUMME DES EPROMS.

SPEED:                DEFS      1              ; SYSTEMTAKT IN VIELFACHEN VON 1,536 MHZ

TEMP_LOG_DRIVE:       DEFS      1              ; KOPIE VON LOG_DRIVE FUER TEMPORAERE LW
                                               ; UMDEFINITION. B-BEFEHL

SERBAUD0:             DEFS      1              ; IN DIESEN BEIDEN BYTES STEHEN DIE WIRKLICH
SERBAUD1:             DEFS      1              ; EINGESTELLTEN BAUDRATEN. ENTWEDER DIE VON J10
                                               ; ODER DIE VON FORMAT_SER0 / FORMAT_SER1

LDTL:                 DEFS      2              ; IN DIESEM WORD STEHT DIE LAENGE DER
                                               ; DISK_TYPE_LIST PATCH-AREA, WIRD VON CP/M PLUS
                                               ; GESETZT

PRECOM_BEGIN:         DEFS      1              ; AB  DIESEM TRACK PRECOM NOTWENDIG

RAMCHIPS:             DEFS      1              ; WENN 00H, DANN  64KBIT CHIPS BESTUECKT
                                               ; WENN FFH, DANN 256KBIT CHIPS BESTUECKT

BOOT_NAME:            DEFS      2              ; DIESES WORT IST NUR UNTER GUELTIG, WENN CP/M VOM EPROM
                                               ; GEBOOTET WURDE (AB MONITOR VERSION 1.3).
                                               ; BOOT_NAME ZEIGT AUF DEN ERSTEN DATEIEINTRAG
                                               ; IM BOOTFAEHIGEN 27512 EPROM. WIRD VOM MONITOR
                                               ; BEI EPROM-BOOT GESETZT, SONST 0000H
                                               ; 
HD_DISKFLG:           DEFS      1              ;
HD_TRACK:             DEFS      2              ; HD TRACK NO
HD_HEAD:              DEFS      1              ; HD HEAD NO
HD_SECTOR:            DEFS      1              ; HD SECTOR NO
HD_SCTR_TRK:          DEFS      1              ; HD SECTOR / TRACK

                      ORG       0FF6FH
HD_NO_CYL:            DEFS      2              ; HD NO OF CYLINDERS
HD_NO_HEADS:          DEFS      1              ; HD NO OF HEADS
HD_RWC_CYL:           DEFS      2              ; HD START RWC CYLINDER
HD_PRE_CYL:           DEFS      2              ; HD START PRECOM CYLINDER
HD_ECC_BYTE:          DEFS      1              ; HD ECC BYTE
HD_CTRL_BYTE:         DEFS      1              ; HD CONTROL BYTE
OMTI_OK:              DEFS      1              ; HD CONTROLLER FLAG
 






; Word References





W_0303:   EQU       0303h     ;  771


W_0FA0:   EQU       0FA0h     ;  4000


W_D8F0:   EQU       0D8F0h


W_FDDB:   EQU       0FDDBh    ;  -549
W_FDF5:   EQU       0FDF5h    ;  -523



                      END


