;******************************************************************
;***                                                            ***
;***  PROF-181x Monitor Version: 1.5                            ***
;***                                                            ***
;***  letzte AenDErung am: 24.08.1985      (c) Joachim Hanst    ***
;***  reverse engeneerINg: 19.07.2013          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
LF:                   EQU       0AH
CR:                   EQU       0DH
ESC:                  EQU       1BH
CNGPRMT:              EQU       '-'
EPROM:                EQU       0
MASK_INDEX:           EQU       20h            ; Maske zum Filtern Index-Pulse



                                               ; *****************************************************************
                                               ; *** 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           ; 

                                               ; 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            ; HEDLOADTIME 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            ;
     
MASK_MOT:             EQU       80H            ; MASKE FUER MOTOR EIN/BUSY


B_C3:     equ       0C3h      ;  'C'+128  -61
B_C0:     equ       0C0h      ;  '@'+128  -64
B_80:     equ       80h       ;  -128
0FFH:     equ       0FFh      ;  -1
B_40:     equ       40h       ;  '@'  64
B_C1:     equ       0C1h      ;  'A'+128  -63
B_04:     equ       04h       ;  4
B_08:     equ       08h       ;  8
B_02:     equ       02h       ;  2
B_06:     equ       06h       ;  6
B_D0:     equ       0D0h      ;  'P'+128  -48
B_03:     equ       03h       ;  3
B_0F:     equ       0Fh       ;  15
B_2F:     equ       2Fh       ;  '/'  47
B_24:     equ       24h       ;  '$'  36
B_0D:     equ       0DH       ;  13
B_1B:     equ       1Bh       ;  27
B_0A:     equ       0AH       ;  10
B_61:     equ       61h       ;  'a'  97
B_20:     equ       20h       ;  ' '  32
B_7F:     equ       7Fh       ;  127
B_F0:     equ       0F0h      ;  'p'+128  -16
B_A0:     equ       0A0h      ;  ' '+128  -96
B_41:     equ       41h       ;  'A'  65
B_07:     equ       07h       ;  7
B_10:     equ       10h       ;  16
B_88:     equ       88h       ;  -120
STAT:     equ       0D9h      ;  'Y'+128  -39
B_64:     equ       64h       ;  'd'  100
B_4E:     equ       4Eh       ;  'N'  78
B_1E:     equ       1Eh       ;  30
B_05:     equ       05h       ;  5
B_28:     equ       28h       ;  '('  40
B_29:     equ       29h       ;  ')'  41
B_2A:     equ       2Ah       ;  '*'  42
B_DA:     equ       0DAh      ;  'Z'+128  -38
B_2B:     equ       2Bh       ;  '+'  43
B_2C:     equ       2Ch       ;  ','  44
B_2E:     equ       2Eh       ;  '.'  46
B_32:     equ       32h       ;  '2'  50
B_90:     equ       90h       ;  -112
B_30:     equ       30h       ;  '0'  48
B_09:     equ       09h       ;  9
B_01:     equ       01h       ;  1
B_60:     equ       60h       ;  '`'  96
B_34:     equ       34h       ;  '4'  52
CONTR:    equ       0D8h      ;  'X'+128  -40
B_FD:     equ       0FDh      ;  '}'+128  -3
B_0B:     equ       0Bh       ;  11
B_17:     equ       17h       ;  23
B_4A:     equ       4Ah       ;  'J'  74
B_E9:     equ       0E9h      ;  'i'+128  -23
B_A2:     equ       0A2h      ;  '"'+128  -94
B_A3:     equ       0A3h      ;  '#'+128  -93
B_3F:     equ       3Fh       ;  '?'  63
B_18:     equ       18h       ;  24
OSELECT:  equ       0E2h      ;  'b'+128  -30
OSTATUS:  equ       0E1h      ;  'a'+128  -31
ODATA:    equ       0E0h      ;  '`'+128  -32
B_1F:     equ       1Fh       ;  31
B_0C:     equ       0Ch       ;  12
B_3E:     equ       3Eh       ;  '>'  62
B_59:     equ       59h       ;  'Y'  89
B_3A:     equ       3Ah       ;  ':'  58
B_2D:     equ       2Dh       ;  '-'  45
B_3D:     equ       3Dh       ;  '='  61
B_FE:     equ       0FEh      ;  '~'+128  -2
B_39:     equ       39h       ;  '9'  57
B_47:     equ       47h       ;  'G'  71
B_50:     equ       50h       ;  'P'  80
B_54:     equ       54h       ;  'T'  84
B_48:     equ       48h       ;  'H'  72
B_68:     equ       68h       ;  'h'  104
B_F9:     equ       0F9h      ;  'y'+128  -7
B_45:     equ       45h       ;  'E'  69
B_0E:     equ       0Eh       ;  14
B_13:     equ       13h       ;  19
B_73:     equ       73h       ;  's'  115
B_43:     equ       43h       ;  'C'  67
B_4D:     equ       4Dh       ;  'M'  77
B_57:     equ       57h       ;  'W'  87
B_55:     equ       55h       ;  'U'  85
B_49:     equ       49h       ;  'I'  73
B_FC:     equ       0FCh      ;  '|'+128  -4
B_DF:     equ       0DFh      ;  '_'+128  -33
B_CF:     equ       0CFh      ;  'O'+128  -49
B_38:     equ       38h       ;  '8'  56
B_53:     equ       53h       ;  'S'  83
B_83:     equ       83h       ;  -125
B_36:     equ       36h       ;  '6'  54
B_4B:     equ       4Bh       ;  'K'  75
B_25:     equ       25h       ;  '%'  37
B_70:     equ       70h       ;  'p'  112
B_15:     equ       15h       ;  21
B_CB:     equ       0CBh      ;  'K'+128  -53

; DiSPlacement References


; Word References

UNIT:     equ       0FF19h    ;  -231
W_0000:     equ   0H
W_FF50:   equ       0FF50h    ;  -176
TEST_MSEK:          equ       0FF40h    ;  -192
EOT:      equ       0FF1Eh    ;  -226
TEST_TYPE:          equ       0FF3Fh    ;  -193
CMDTAB:   equ       0FF18h    ;  -232
SECSZ:    equ       0FF1Dh    ;  -227
DTLL:     equ       0FF20h    ;  -224
GAPLL:    equ       0FF1Fh    ;  -225
CLKFLG:   equ       0FF4Fh    ;  -177
SYSTEMPAGE:         equ       0FF00h    ;  -256
W_FF47:   equ       0FF47h    ;  -185
W_0303:   equ       0303h     ;  771
DISKFLG:  equ       0FF37h    ;  -201
ALT_TRACK:          equ       0FF31h    ;  -207
ALT_UNIT: equ       0FF30h    ;  -208
W_0207:   equ       0207h     ;  519
READY_BYTE:         equ       0FF08h    ;  -248
W_FF0A:   equ       0FF0AH    ;  -246
RWCMD:    equ       0FF34h    ;  -204
W_FF09:   equ       0FF09h    ;  -247
TRACK:    equ       0FF1Ah    ;  -230
W_030F:   equ       030Fh     ;  783
SEEKNR:   equ       0FF0Bh    ;  -245
REST:     equ       0FF21h    ;  -223
W_0040:   equ       0040h     ;  64
ERMSG:    equ       0FF35h    ;  -203
SECTCNT:  equ       0FF46h    ;  -186
W_FF2E:   equ       0FF2Eh    ;  -210
W_FF44:   equ       0FF44h    ;  -188
W_FF43:   equ       0FF43h    ;  -189

HEAD:     equ       0FF1Bh    ;  -229
TEST_TRACK:         equ       0FF42h    ;  -190

W_FF41:   equ       0FF41h    ;  -191
W_FF27:   equ       0FF27h    ;  -217

W_020A:   equ       020AH     ;  522
W_FF0F:   equ       0FF0Fh    ;  -241
W_FF55:   equ       0FF55h    ;  -171
W_FF5A:    equ  0FF5Ah
W_FF5C:    equ  0FF5Ch
W_FF59:    equ  0FF59h
W_FF2F:   equ       0FF2Fh    ;  -209
DERMSG:   equ       0FF2Dh    ;  -211

W_3207:   equ       3207h     ;  12807
PCF_CMD_BUF:        equ       0FED0h    ;  -304
W_0005:   equ       0005h     ;  5
W_3E01:   equ       3E01h     ;  15873
OMTI_OK:  equ       0FF78h    ;  -136
W_FF6F:   equ       0FF6Fh    ;  -145
W_FEE0:   equ       0FEE0h    ;  -288
W_FEE6:   equ       0FEE6h    ;  -282
W_FEE4:   equ       0FEE4h    ;  -284
;TRACK:   equ       0FF5Ah    ;  -166
W_FEE3:   equ       0FEE3h    ;  -285
SECTOR:   equ       0FF5Dh    ;  -163
;HEAD:    equ       0FF5Ch    ;  -164
W_FEE2:   equ       0FEE2h    ;  -286
W_FEE1:   equ       0FEE1h    ;  -287
W_FF77:   equ       0FF77h    ;  -137
W_FEE5:   equ       0FEE5h    ;  -283
W_FC00:   equ       0FC00h    ;  -1024
W_FDF5:   equ       0FDF5h    ;  -523
W_FDDB:   equ       0FDDBh    ;  -549
W_FF5E:   equ       0FF5Eh    ;  -162
W_001A:   equ       001Ah     ;  26
W_FFFF:   equ       0FFFFh    ;  -1
W_6177:   equ       6177h     ;  24951
UATAB:    equ       0C32h     ;  3122
SIOBBAUD: equ       0FF33h    ;  -205
IO_JUMPERBYTE:      equ       0FF32h    ;  -206
W_FF51:   equ       0FF51h    ;  -175
W_FF0E:   equ       0FF0Eh    ;  -242
W_FF52:   equ       0FF52h    ;  -174
W_CDFF:   equ       0CDFFh    ;  -12801
W_6C46:   equ       6C46h     ;  27718
W_6148:   equ       6148h     ;  24904
;DISKFLG: equ       0FF59h    ;  -167
W_0003:   equ       0003h     ;  3

PHYS_TIME:          equ       0FF38h    ;  -200 Sek
W_D8F0:   equ       0D8F0h    ;  -10000
DISPADR:  equ       0FF28h    ;  -216
TEMP:     equ       0FF49h    ;  -183
W_FF71:   equ       0FF71h    ;  -143
W_FF72:   equ       0FF72h    ;  -142
W_FF74:   equ       0FF74h    ;  -140
W_FF76:   equ       0FF76h    ;  -138
W_6F6E:   equ       6F6Eh     ;  28526
W_7473:   equ       7473h     ;  29811
W_4345:   equ       4345h     ;  17221
W_6F63:   equ       6F63h     ;  28515
W_6573:   equ       6573h     ;  25971
W_6964:   equ       6964h     ;  26980
W_7774:   equ       7774h     ;  30580
W_6564:   equ       6564h     ;  25956
W_6966:   equ       6966h     ;  26982
W_616C:   equ       616Ch     ;  24940
W_6568:   equ       6568h     ;  25960
W_6572:   equ       6572h     ;  25970
W_3832:   equ       3832h     ;  14386
W_3635:   equ       3635h     ;  13877
W_3230:   equ       3230h     ;  12848
W_FF1C:   equ       0FF1Ch    ;  -228
W_7254:   equ       7254h     ;  29268
W_6548:   equ       6548h     ;  25928
W_6553:   equ       6553h     ;  25939
W_FA00:   equ       0FA00h    ;  -1536
W_FD80:   equ       0FD80h    ;  -640
W_0080:   equ       0080h     ;  128
W_FA06:   equ       0FA06h    ;  -1530
W_FF57:   equ       0FF57h    ;  -169
W_3038:   equ       3038h     ;  12344
W_FF56:   equ       0FF56h    ;  -170
W_D18D:   equ       0D18Dh    ;  -11891
W_4D4D:   equ       4D4Dh     ;  19789
W_5353:   equ       5353h     ;  21331
CHK_SUM:  equ       0FF4Dh    ;  -179
W_FF0C:   equ       0FF0Ch    ;  -244
W_FF0D:   equ       0FF0DH    ;  -243
W_FF11:   equ       0FF11h    ;  -239
W_FF13:   equ       0FF13h    ;  -237
W_FF14:   equ       0FF14h    ;  -236
W_FF15:   equ       0FF15h    ;  -235
W_FF16:   equ       0FF16h    ;  -234
W_FF10:   equ       0FF10h    ;  -240
W_322C:   equ       322Ch     ;  12844
W_6F64:   equ       6F64h     ;  28516
W_6162:   equ       6162h     ;  24930
W_6170:   equ       6170h     ;  24944
W_7264:   equ       7264h     ;  29284
W_7574:   equ       7574h     ;  30068
W_6F6D:   equ       6F6Dh     ;  28525
W_7773:   equ       7773h     ;  30579
W_5045:   equ       5045h     ;  20549
W_5443:   equ       5443h     ;  21571
W_2E2E:   equ       2E2Eh     ;  11822
W_4454:   equ       4454h     ;  17492
W_2F49:   equ       2F49h     ;  12105
W_656D:   equ       656Dh     ;  25965
W_7962:   equ       7962h     ;  31074
W_FEE7:   equ       0FEE7h    ;  -281
W_FEE8:   equ       0FEE8h    ;  -280
W_FEE9:   equ       0FEE9h    ;  -279
W_FEEA:   equ       0FEEAh    ;  -278
W_FEEB:   equ       0FEEBh    ;  -277
W_FEEC:   equ       0FEECh    ;  -276
W_FEED:   equ       0FEEDh    ;  -275
W_FEEE:   equ       0FEEEh    ;  -274
W_FEEF:   equ       0FEEFh    ;  -273
W_FEF7:   equ       0FEF7h    ;  -265
W_0009:   equ       0009h     ;  9
W_FEF3:   equ       0FEF3h    ;  -269
W_0100:   equ       0100h     ;  256
W_FEF4:   equ       0FEF4h    ;  -268
W_FEF5:   equ       0FEF5h    ;  -267
W_FEF0:   equ       0FEF0h    ;  -272
W_FEF6:   equ       0FEF6h    ;  -266
W_FEF2:   equ       0FEF2h    ;  -270
W_FEF1:   equ       0FEF1h    ;  -271
W_616D:   equ       616Dh     ;  24941
W_6973:   equ       6973h     ;  26995
W_7274:   equ       7274h     ;  29300
W_6F66:   equ       6F66h     ;  28518
W_F000:   equ       0F000h    ;  -4096
W_4000:   equ       4000h     ;  16384
W_00E8:   equ       000E8h    ;  232
W_0FA0:   equ       0FA0h     ;  4000
W_0008:   equ       0008h     ;  8
MON_VERS: equ       0FF48h    ;  -184
W_0010:   equ       0010h     ;  16
W_500A:   equ       500AH     ;  20490
W_3434:   equ       3434h     ;  13364
W_2E32:   equ       2E32h     ;  11826
W_3838:   equ       3838h     ;  14392
W_2E38:   equ       2E38h     ;  11832
W_2E34:   equ       2E34h     ;  11828
W_7073:   equ       7073h     ;  28787
W_3031:   equ       3031h     ;  12337
W_2E00:   equ       2E00h     ;  11776
W_0020:   equ       0020h     ;  32
W_0809:   equ       0809h     ;  2057
W_6C66:   equ       6C66h     ;  27750
W_2036:     equ   2036H
W_BF61:   equ       0BF61h    ;  -16543
W_C358:   equ       0C358h    ;  -15528
W_C159:   equ       0C159h    ;  -16039
W_B749:   equ       0B749h    ;  -18615
W_6C24:   equ       6C24h     ;  27684

; Unclassified Symbols (read from file)
;   (probably same value as another symbol; or, never used)


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

L_FFFF:   equ       0FFFFh    ; Undefined label
UMLEIT_GETCM:       equ       0FF2Ah    ; Undefined label
L_0434:   equ       0434h     ; Undefined label
L_0487:   equ       0487h     ; Undefined label
L_048E:   equ       048Eh     ; Undefined label
L_06D7:   equ       06D7h     ; Undefined label
L_E906:   equ       0E906h    ; Undefined label
L_0809:   equ       0809h     ; Undefined label
L_0805:   equ       0805h     ; Undefined label
L_081A:   equ       081Ah     ; Undefined label
L_0818:   equ       0818h     ; Undefined label
L_0815:   equ       0815h     ; Undefined label
L_082D:   equ       082Dh     ; Undefined label
L_083D:   equ       083Dh     ; Undefined label
L_07F5:   equ       07F5h     ; Undefined label
L_0851:   equ       0851h     ; Undefined label
L_0941:   equ       0941h     ; Undefined label
L_0B97:   equ       0B97h     ; Undefined label
L_0B87:   equ       0B87h     ; Undefined label
L_0BEF:   equ       0BEFh     ; Undefined label
L_0BE7:   equ       0BE7h     ; Undefined label
L_3A0C:   equ       3A0Ch     ; Undefined label
L_0E32:   equ       0E32h     ; Undefined label
L_0E2B:   equ       0E2Bh     ; Undefined label
L_0E66:   equ       0E66h     ; Undefined label
L_0E7A:   equ       0E7Ah     ; Undefined label
L_0EA2:   equ       0EA2h     ; Undefined label
L_0FBD:   equ       0FBDh     ; Undefined label
L_0FD0:   equ       0FD0h     ; Undefined label
L_0FB7:   equ       0FB7h     ; Undefined label
L_0FD4:   equ       0FD4h     ; Undefined label
L_103B:   equ       103Bh     ; Undefined label
L_FD80:   equ       0FD80h    ; Undefined label
L_FC00:   equ       0FC00h    ; Undefined label
L_0C3E:   equ       0C3Eh     ; Undefined label
L_28E8:   equ       28E8h     ; Undefined label
L_2922:    equ  2922H
L_2D06:   equ       2D06h     ; Undefined label
L_2CEF:   equ       2CEFh     ; Undefined label
L_DC10:   equ       0DC10h    ; Undefined label
L_4600:   equ       4600h     ; Undefined label
L_4D00:   equ       4D00h     ; Undefined label
L_5301:   equ       5301h     ; Undefined label



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


MONITOR:
                    ;SPRUNGVEKTOR FUER MONITOR SERVICE-ROUTINEN
                    ;

                        JP        INIT
CS:                     JP        CONST
CI:                     JP        CONIN
CO:                     JP        CONOUT
                        JP        BOOTERR
                        JP        SETCMDT
                        JP        RECAL
                        JP        READ
                        JP        WRITE
                        JP        TEST
                        JP        MOTO
                        JP        CMFD
                        JP        RESULT
                        JP        SEEK
                        JP        NEXT
GRAFIN:                 JP        GRAF_IN
GRAFOUT:                JP        GRAF_OUT
GRAFIST:                JP        GRAF_IST
SERNR:                  DEFW      9961               ; SERIEN NUMMER
RSTART7:                JP        RST_VERTEILER      ; RST 7 EINSPRUNG (MUSS 38H SEIN)
GRAFOST:                JP        GRAF_OST
SOFTIN:                 JP        SOFT_IN
SOFTOUT:                JP        SOFT_OUT
SOFTIST:                JP        SOFT_IST
SOFTOST:                JP        SOFT_OST
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
                        NOP
                        RET
VERSIONNR:              DEFB      015H               ;VERSIONS NUMMER
                        JP        RST_VERTEILER
                        JP        DISKERR
                        NOP
                        NOP
                        RET
                        LD        A,0
                        RET
                        JP        SET_PHYS_TIME
                        JP        READ_PHYS_TIME
                        JP        L_00E6
                        JP        L_00F3
                        JP        L_0208
                        JP        L_01A8
                        JP        USER_BYTES_WRITE
                        JP        MAXI_SET
                        JP        MINI_SET
                        JP        L_0635


W_0090:                 DEFW      L_17A0
PATCH:                  DEFW      W_0000
                        DEFW      W_0096
W_0096:                 DEFW      W_6C24

                                               ;---------------------------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


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


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


L_0100:               AND       0FH
                      LD        L,A
                      LD        H,0
                      LD        DE,W_010E
                      ADD       HL,DE
                      LD        A,(HL)
                      AND       2FH
                      LD        C,A
                      RET

W_010E:               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            ; STEUERCODES 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      L_01A8
                      ADD       A,'A'          ; WANDLE IN ASCII
                      LD        C,A
                      CALL      CO
                      LD        C,' '
                      CALL      CO
                      RET


L_01A8:               AND       B_03           ; Unit maskieren
                      JR        NZ,L_01B2
                      LD        A,(W_FF50)
                      AND       B_03
                      RET
L_01B2:
                      PUSH      BC
                      LD        C,A
                      LD        A,(W_FF50)
                      AND       B_03
                      CP        C
                      JR        NZ,L_01BE
                      LD        C,0
L_01BE:
                      LD        A,C
                      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


L_01F3:               LD        A,L            ; EINGANGSWERT -> A
                      OR        H              ; HL=0 ?
                      RET       Z              ; HL=0 -> RÜCKSPRUNG

                      PUSH      HL
                      LD        A,(CLKFLG)     ; TAKTKENNUNG
                      LD        L,A
                      LD        H,07H
                      MLT       HL             ; 7*EINGANGSWERT
L_01FF:               DEC       HL
                      LD        A,L
                      OR        H              ; HL=0 ?
                      JR        NZ,L_01FF
                      POP       HL
                      DEC       HL
                      JR        L_01F3


L_0208:               LD        HL,(UNIT)
                      PUSH      HL
                      LD        A,L
                      AND       03H
                      LD        L,A
                      LD        H,0
                      ADD       HL,HL
                      LD        DE,SYSTEMPAGE
                      ADD       HL,DE
                      LD        A,(HL)
                      INC       HL
                      LD        H,(HL)
                      LD        L,A
                      LD        A,(W_FF47)
                      OR        A
                      JR        NZ,L_022D
                      SRL       H
                      INC       H
                      SCF
                      RR        L
                      RES       3,L
                      LD        A,0
                      ADC       A,L
                      LD        L,A
L_022D:               RES       0,H
                      LD        BC,W_0303
                      LD        (UNIT),HL
                      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      SET_TIMER      ; TIMEOUT SETZEN
                      CALL      L_0208

                      XOR       A
                      LD        (ALT_TRACK),A
                      LD        A,(UNIT)
                      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 vorgewählt
                      AND       00000011B
                      INC       A
                      LD        B,A
                      LD        A,88H
UNIMASK:              RLCA
                      DJNZ      UNIMASK
                      LD        B,A
                      RET



SEEK:     CALL      SET_TIMER
          LD        HL,(UNIT)
          LD        BC,(ALT_UNIT)
          LD        A,c
          CP        l
          JR        Z,SEEK4
          CALL      L_0208
          JR        L_02AA

SEEK4:    LD        A,b
          CP        h
          RET       z

L_02AA:   LD        HL,(UNIT)
          LD        (ALT_UNIT),HL
          XOR       a
          IN        A,(STAT)
          AND       B_80
          JR        Z,L_02CC
          LD        A,(W_FF0A)
          OR        a
          JR        Z,L_02CC
          PUSH      AF
          IN        A,(FDC)
          CALL      SET_TIMER
          POP       AF
          LD        L,A
          LD        h,B_64
          MLT       HL
          CALL      L_01F3

L_02CC:   LD        A,(RWCMD)
          CP        B_06
          JR        Z,SEEK5
          LD        A,(W_FF09)
          OR        a
          JR        Z,SEEK5
          LD        L,A
          LD        h,0
          CALL      L_01F3

SEEK5:
                      CALL      SEEK3
                      JR        Z,SEEK1
                      LD        A,(TRACK)
                      PUSH      AF
                      ADD       A,A
                      LD        (TRACK),A
SEEK1:
                      LD        BC,030FH       ; SEEK TRACK
                      CALL      MOTO
                      CALL      SEEK3
                      JR        Z,SEEK2
                      POP       AF
                      LD        (TRACK),A
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      SET_TIMER
                      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
                      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
                      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
                      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
                      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
                      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,CLKFLG      ; 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

                      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




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
                      RET


WRITE:
                      LD        A,5            ; 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.


RWCOM:    CALL      SET_TIMER






L_0467:

          LD        (RWCMD),A
          LD        (ERMSG),HL
          LD        A,(SECTCNT)
          OR        a
          RET       z
          CALL      SEEK
          CALL      SETHEAD
          CALL      L_0626
          LD        A,(W_FF2E)
          LD        B,A
L_047F:   PUSH      BC
          LD        HL,(W_FF44)
          OUT0      (28H),L     ; DMA Memory Address Register Ch 1L
          OUT0      (29H),H     ; DMA Memory Address Register Ch 1H
          LD        A,(W_FF43)
          OUT0      (2AH),A     ; DMA Memory Address Register Ch 1B
          LD        A,B_DA
          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)
          LD        B,A
          INC       b
          XOR       a
          SCF
L_049F:   rla
          DJNZ      L_049F
          LD        L,A
          LD        A,(SECTCNT)
          LD        h,A
          MLT       HL
          LD        B,07H
L_04AB:   ADD       HL,HL
          DJNZ      L_04AB
          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
          LD        C,A
          LD        A,(RWCMD)
          CP        06H
          LD        A,B_0A
          JR        Z,L_04C5
          LD        A,08H
L_04C5:   OR        c
          OUT0      (32H),A     ; DMA/WAIT Control Register
          LD        A,90H
          OUT0      (30H),A     ; DMA Status Register
          LD        B,09H
          LD        A,(RWCMD)
          LD        C,A
          LD        A,(CMDTAB)
          AND       40H
          OR        c
          LD        C,A
          CALL      MOTO
          CALL      RESULT
          LD        A,(REST+1)
          LD        C,A
          LD        A,(REST+2)
          OR        c
          POP       BC
          JR        Z,L_04EE
          DJNZ      L_047F
L_04EE:   OR        a
          PUSH      AF
          CALL      NZ,DISKERR

          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 TEST1 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          ; RECALIBRIERE
;                      LD        A,(UNIT)       ; SEITE 0 WAEHLEN
;                      AND       03H
;                      LD        (UNIT),A
;                      LD        A,(TEST_TRACK) ; POSITIONIERE AUF DIE SPUR
;                      LD        (TRACK),A      ; DEREN FORMAT ERKANNT WERDEN SOLL
;                      CALL      SEEK

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

;                      LD        A,40H          ; TESTE OB DD,MAXI
;                      LD        (TEST_TYPE),A
;                      CALL      READ_ID
;                      JP        Z,TEST1        ; SPRUNG WENN DD,MAXI

;                      LD        A,20H          ; TESTE OB SD,MINI
;                      LD        (TEST_TYPE),A
;                      CALL      MINI_SET
;                      CALL      READ_ID
;                      JP        Z,TEST1        ; SPRUNG WENN SD,MINI

;                      LD        A,60H          ; TESTE OB DD,MINI
;                      LD        (TEST_TYPE),A
;                      CALL      READ_ID
;                      JP        Z,TEST1        ; SPRUNG WENN DD,MINI

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



TEST:     CALL      RECAL
          LD        A,(UNIT)
          AND       B_07
          LD        (UNIT),A
          LD        A,(TEST_TRACK)
          LD        (TRACK),A
          CALL      SEEK

          LD        A,B_60
          LD        (TEST_TYPE),A
          CALL      MINI_SET
          CALL      READ_ID
          JR        Z,TEST1

          LD        A,B_40
          LD        (TEST_TYPE),A
          CALL      MAXI_SET
          CALL      READ_ID
          JR        Z,TEST1

          LD        A,0
          LD        (TEST_TYPE),A
          CALL      MAXI_SET
          CALL      READ_ID
          JR        Z,TEST1

          LD        A,B_20
          LD        (TEST_TYPE),A
          CALL      MINI_SET
          CALL      READ_ID
          JR        Z,TEST1

TEST2:    LD        A,0FFH
           RET


TEST1:    CALL      L_0208
          LD        A,(REST+5)
          LD        d,A
          LD        C,A
          LD        E,A
          LD        B,B_34
TEST3:    PUSH      BC
          PUSH      DE
          CALL      READ_ID
          POP       DE
          POP       BC
          JR        NZ,TEST2
          LD        A,(REST+5)
          CP        d
          JR        Z,L_0581
          CP        c
          JR        C,L_0579
          LD        C,A
L_0579:   CP        e
          JR        nC,L_057D
          LD        E,A
L_057D:   DJNZ      TEST3
          JR        TEST2
L_0581:   LD        A,c
          LD        (TEST_MSEK),A
          LD        A,E
          LD        (W_FF41),A
          LD        A,(W_FF27)
          AND       B_07
          LD        C,A
          LD        A,(TEST_TYPE)
          OR        c
          LD        C,A
          LD        A,(REST+4)
          RLCA
          RLCA
          RLCA
          RLCA
          AND       B_10
          OR        c
          LD        (TEST_TYPE),A
          LD        A,(UNIT)
          CPl
          AND       B_03
          LD        B,A
          OR        a
          LD        A,(SEEKNR)
          JR        Z,L_05B1
L_05AE:   RLCA
          DJNZ      L_05AE
L_05B1:   AND       B_80
          JR        NZ,L_05BE
          CALL      SENSD
          RLCA
          RLCA
          RLCA
          RLCA
          AND       B_80
L_05BE:   LD        C,A
          LD        A,(TEST_TYPE)
          OR        c
          LD        (TEST_TYPE),A
          LD        A,0
          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    ; LÖSCHE SIGNAL MINI
;                      OUT       (P_LS259),A
;                      POP       AF
;                      RET




          PUSH      AF
          LD        A,B_06
          OUT       (P_LS259),A
          LD        A,(W_FF0F)
          OR        a
          LD        A,0FFH
          CALL      NZ,L_0601
          LD        (W_FF47),A
          POP       AF
          RET


MINI_SET:
          PUSH      AF
          LD        A,B_07
          OUT       (P_LS259),A
          LD        A,(W_FF0F)
          OR        a
          LD        A,0
          CALL      NZ,L_0601
          LD        (W_FF47),A
          POP       AF
          RET


L_0601:   PUSH      BC
          PUSH      DE
          PUSH      HL
          PUSH      AF
          LD        C,A
          LD        A,(W_FF47)
          CP        c
          JR        Z,L_0617
          LD        A,(W_FF0F)
          LD        L,A
          LD        h,B_64
          MLT       HL
          CALL      L_01F3
L_0617:   POP       AF
          POP       HL
          POP       DE
          POP       BC
          RET

SENSD:                LD        BC,0204H
                      CALL      CMFD
                      CALL      NEXT
                      RET


L_0626:   LD        A,(W_FF55)
          LD        C,A
          LD        A,(TRACK)
          CP        c
          LD        A,0
          JR        C,L_0635
          LD        A,(W_FF2F)
L_0635:   LD        C,A
          AND       B_01
          OR        B_02
          OUT       (P_LS259),A
          LD        A,c
          RRCA
          AND       B_01
          OR        B_04
          OUT       (P_LS259),A
          LD        A,c
          RRCA
          RRCA
          AND       B_01
          OR        0
          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          L_01A8
                      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
                      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,PHYS_TIME
                      LD        BC,0005H
                      LDIR
                      LD        A,(PCF_CMD_BUF+0FH)  ; JAHRESKORREKTUR
                      LD        (PHYS_TIME+6),A
                      LD        A,(PCF_CMD_BUF)
                      AND       02H
                      JP        Z,READ_PHYS_T1
                      LD        A,(PHYS_TIME+6)
                      INC       A
                      DAA
                      LD        (PHYS_TIME+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,PHYS_TIME         ; 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,(PHYS_TIME+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


SET_TIMER:            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


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       B_10                     ; 
                   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,W_FF6F
          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






READ_BUFFER:
                                            ; 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,READ_BUFFER
LD        BC,00E0H
          INIR
          INIR
          DEC       e
          JR        NZ,READ_BUFFER
          RET


L_0A23:   LD        A,(W_FEE4)
          LD        E,A
L_0A27:   IN        A,(OSTATUS)
          AND       B_3F
          CP        B_0F
          RET       z
          CP        B_09
          JR        NZ,L_0A27
          LD        BC,00E0H
          OTIR
          OTIR
          DEC       e
          JR        NZ,L_0A27
          RET


L_0A3D:   LD        HL,(W_FF5A)
          LD        A,l
          LD        (W_FEE3),A
          LD        A,(SECTOR)
          AND       B_3F
          LD        B,A
          LD        A,(W_FF5C)
          AND       B_1F
          LD        C,A
          RRC       h
          RRC       h
          LD        A,H
          AND       B_C0
          OR        b
          LD        (W_FEE2),A
          RRC       h
          LD        A,H
          AND       B_80
          OR        c
          LD        (W_FEE1),A
          RET


L_0A65:   LD        A,B_0A
          LD        (W_FEE0),A
          JR        L_0A71
L_0A6C:   LD        A,B_08
          LD        (W_FEE0),A
L_0A71:   CALL      L_0A3D
          LD        A,(SECTCNT)
          LD        (W_FEE4),A
          LD        A,(W_FF77)
          LD        (W_FEE5),A
          CALL      L_09E3
          LD        HL,(W_FF44)
          LD        A,(W_FEE0)
          CP        B_08
          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      L_0DDF
          CALL      WAIT_HD_READY
          JR        Z,L_0ACD
          LD        HL,W_0B31
          CALL      SOUT
          JP        GETCOM
L_0ACD:   LD        HL,0
          LD        (W_FF5A),HL
          LD        (W_FF5C),HL
          LD        HL,W_FC00
          LD        (W_FF44),HL
          LD        A,B_01
          LD        (SECTCNT),A
          CALL      L_0A6C
          JP        NZ,GETCM
          LD        HL,W_FDF5
          LD        DE,W_0B3F
          LD        B,B_0B
L_0AEF:   LD        A,(DE)
          CP        (HL)
          JR        NZ,L_0B08
          INC       HL
L_0AF4:   INC       DE
          DJNZ      L_0AEF
          LD        HL,W_FDDB
          LD        DE,W_FF5E
          LD        BC,W_001A
          LDIR
          CALL      L_09A8
          JR        NZ,L_0A9D
          RET


L_0B08:   LD        HL,W_0B12
          CALL      SOUT
          LD        A,0FFH
          OR        a
          RET


W_0B12:               DEFM      0DH,0AH,BELL,' error, no valid bootsector$'
W_0B31:               DEFM      ' => not ready$'
W_0B3F:               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. STROBE UND INIT FUER UNIO-CENTRONICS
                                               ; WURDEN VON INIT SCHON AUF HIGH GESETZT.
                                               ; UNIOINIT LIEST DIE BEIDEN SIO-BAUDRATEN-JUMPER EIN
                                               ; UND INITIALISIERT BEIDE SIO- UND DEN STI KANAL.

;                      LD        HL,UATAB       ; LESE UNIO BAUD JUMPER
;                      LD        BC,UDTAB
;                      LD        E,CONTR
;                      LD        D,STAT
;                      CALL      JUMPIN
;                      LD        (SIOBBAUD),A
;                      LD        A,D
;                      LD        (SIOABAUD),A

;                      LD        A,(STIBAUD)    ; INITIALISIERE STI
;                      CALL      STINIT
;                      LD        A,(SIOABAUD)
;                      CALL      SAINIT
;                      LD        A,(SIOBBAUD)
;                      CALL      SBINIT
;                      RET



UNIOINIT: LD        HL,UATAB
          LD        BC,UDTAB
          LD        E,CONTR
          LD        d,STAT
          CALL      JUMPIN
          LD        (SIOBBAUD),A
          LD        A,d
          LD        (IO_JUMPERBYTE),A
          LD        A,(SIOBBAUD)
          LD        E,A
          LD        d,0
          LD        HL,W_0C39
          ADD       HL,DE
          LD        A,(HL)
          LD        (SIOBBAUD),A
          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=JUMPER 1, 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
                      IN        A,(C)          ; LESE ERSTES BITPAAR EIN
                      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
                      LD        D,A
                      LD        B,0FFH
                      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
                      LD        D,A
                      LD        B,2            ; DRITTES BITMUSTER AUSGEBEN
                      OTIR
                      LD        A,C            ; TAUSCHE PORTADRESSE
                      LD        C,D
                      LD        D,A
                      LD        B,0FFH
                      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
                      LD        C,A
                      ADD       HL,BC
                      LD        D,(HL)
                      POP       HL             ; HOLE DECODER TABELLE
                      LD        A,E
                      AND       00000111B
                      LD        C,A
                      ADD       HL,BC
                      LD        A,(HL)
                      RET

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

UDTAB:    nop
          nop
          nop
          LD        (BC),A
          nop
          INC       BC
          INC       b
          LD        BC,0201H

          INC       b
          nop
          INC       BC
          LD        (BC),A
          DEC       b
W_0C39:   RRCA
          LD        C,B_0A
          ex        AF,AF'
          LD        B,B_3E
          nop
          OUT0      (04H),A     ; ASCI Status Register Ch 0
          LD        A,(W_FF51)
          RRCA
          RRCA
          RRCA
          LD        B,A
          RRCA
          AND       B_07
          OR        B_60
          OUT0      (00H),A     ; ASCI Control Register A Ch 0
          LD        A,b
          AND       B_10
          OUT0      (02H),A     ; ASCI Control B Ch 0 Register Ch 0
          LD        A,(W_FF51)
          CALL      L_00E6
          LD        A,(W_FF0E)
          AND       B_04
          OUT0      (05H),A     ; ASCI Status Register Ch 1
          LD        A,(W_FF52)
          RRCA
          RRCA
          RRCA
          LD        B,A
          RRCA
          AND       B_07
          LD        C,A
          LD        A,(W_FF0E)
          RLCA
          AND       B_10
          OR        B_60
          OR        c
          OUT0      (01H),A     ; ASCI Control Register A Ch 1
          LD        A,b
          AND       B_10
          OUT0      (03H),A     ; ASCI Control Register B Ch 1
          LD        A,(W_FF52)
          CALL      L_00F3

; 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 NEUEN WERT EINLESEN (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          ;Neuen Wert einlesen
                      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) BFRAGEN

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 ANZEIGEN
                      JR        NZ,JA_NEIN_2
                      LD        HL,N_TXT        ; TEXT N ANZEIGEN
JA_NEIN_2:            CALL      SOUT

JA_NEIN_3:            CALL      GETCH1
                      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-$'




L_0DDF:   LD        A,(OMTI_OK)
          LD        HL,TX_HD
          JR        L_0DED


DISKDA:
                                               ; GIBT MELDUNG AUS, WENN DISKZUGRIF OHNE KONTROLLER VERSUCHT WIRD
                                               ; UND KEHRT AUF DIE EINGABEEBENE ZURUECK
                      LD        A,(DISKFLG)    ; LADE FLAG
                      LD        HL,TX_FLOPPY   ; TEXT 'FLOPPY' VORBEREITEN
L_0DED:               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:            DEFB      001h
                      DEFM      'Floppy$'
NODISK:               DEFM      ' access not possible',BELL,'$'

TX_HD:                DEFB      001h
                      DEFM      'Harddisk$'




L_0E23:               LD        A,(W_FF59)
                      AND       06H
                      JR        NZ,L_0E33
                      LD        HL,NO_DRIVE_TXT  ; FEHLERMELDUNG
                      CALL      SOUT
                      JP        GETCOM

L_0E33:               CP        04H
                      RET


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

REGDS:                CALL      CROUT          ; NEUE ZEILE
                      LD        HL,RTAB
L_0E05:
                      LD        C,(HL)
                      LD        A,C
                      OR        A
                      JP        NZ,L_0E5A
                      CALL      CROUT
                      RET
L_0E5A:
                      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,L_0E80
                      DEC       DE
                      LD        A,(DE)
                      CALL      NMOUT
L_0E80:
                      LD        C,' '
                      CALL      CECHO
                      INC       HL
                      JP        L_0E05



RGADR:
                      LD        HL,RTAB
                      LD        DE,3           ; LAENGE DER TABELLEN EINTRAEGE
L_0E8F:
                      LD        A,(HL)
                      OR        A
                      JP        Z,CERROR
                      CP        C
                      JP        Z,L_0E9C
                      ADD       HL,DE
                      JP        L_0E8F
L_0E9C:
                      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,(PHYS_TIME+4); MONAT
                      CALL      NMOUT
                      LD        C,'/'
                      CALL      CECHO
                      LD        A,(PHYS_TIME+3)
                      CALL      NMOUT
                      LD        C,'/'
                      CALL      CECHO
                      LD        A,(PHYS_TIME+6)
                      CALL      NMOUT
                      LD        HL,TIMTXT2     ; GEBE TIME AUS
                      CALL      SP_OUT
                      LD        A,(PHYS_TIME+2); STUNDE
                      CALL      NMOUT
                      LD        C,':'
                      CALL      CECHO
                      LD        A,(PHYS_TIME+1); MINUTE
                      CALL      NMOUT
                      LD        C,':'
                      CALL      CECHO
                      LD        A,(PHYS_TIME)  ; 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,(PHYS_TIME+2)
                      ADD       A,20H
                      LD        C,A
                      CALL      CECHO
                      LD        A,(PHYS_TIME+1)
                      ADD       A,20H
                      LD        C,A
                      CALL      CECHO
                      LD        A,(PHYS_TIME)
                      ADD       A,20H
                      LD        C,A
                      CALL      CECHO
                      RET

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


          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



; LESE HEX-ADRESSEN EIN

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

                      LD        H,A               ; SCHLEIFE FÜR ANZAHL ADRESSEN
GETNM1:
                      CALL      GETHX
                      JP        NC,CERROR
                      PUSH      BC
                      DEC       L
                      DEC       H
                      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,W_FFFF
                      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
                      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,L_1012
                      INC       HL
                      LD        A,H
                      OR        L
                      JP        Z,L_1012
                      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


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


          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
          sBC       A,H
          rst       38h
          OR        0FFH
          rst       38h
          rst       38h
          nop
          nop
L_1047:   CALL      GETHX
          JP        nC,CERROR
          LD        A,d
          CP        B_0D
          JP        Z,CERROR
          LD        (W_FF44),BC
          CALL      GETHX
          JP        nC,CERROR
          LD        A,d
          CP        B_0D
          JP        NZ,CERROR
          LD        A,c
          LD        (SECTCNT),A
          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        H
                      JR        NZ,RST_V01     ; KEINE UEBEREINSTIMMUNG
                      LD        A,(IY+1)
                      CP        L
                      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)



DCMD:
                      CALL      GETHX          ; LESE STARTADRESSE
                      LD        H,B
                      LD        L,C
                      LD        A,D
                      JR        C,DCM30
                      CP        0DH
                      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



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



SCMD:
                      CALL      GETHX
                      PUSH      BC
                      POP       HL
SCM05:
                      LD        A,D
                      CP        ' '
                      JP        Z,SCM10
                      CP        ','
                      JP        NZ,GETCM
SCM10:
                      LD        A,(HL)
                      CALL      NMOUT
                      LD        C,CNGPRMT
                      CALL      CECHO
                      CALL      GETHX
                      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,L_135C       ; -> HARDDISK
                      CP        'h'
                      JP        Z,L_135C       ; -> 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      L_01A8
                      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
          CALL      SP_OUT
          LD        A,(TEST_TYPE)
          AND       B_20
          LD        HL,CTXT11
          JR        Z,CCMD3
          LD        HL,CTXT12

CCMD3:    CALL      SOUT
          LD        HL,CTXT2
          CALL      SP_OUT
          LD        A,(TEST_TYPE)
          RLCA
          AND       B_01
          LD        HL,CTXT22
          JR        Z,L_12E1
          LD        HL,CTXT21
L_12E1:   CALL      SOUT
          LD        HL,CTXT3
          CALL      SP_OUT
          LD        A,(TEST_TYPE)
          LD        HL,CTXT31
          AND       B_40
          JR        Z,L_12F7
          LD        HL,CTXT32
L_12F7:   CALL      SOUT
          LD        HL,CTXT4
          CALL      SP_OUT
          LD        A,(TEST_TYPE)
          AND       B_03
          LD        h,0
          LD        L,A
          ADD       HL,HL
          ADD       HL,HL
          ADD       HL,HL
          LD        DE,SEKTXT
          ADD       HL,DE
          CALL      SOUT
          LD        HL,CTXT7
          CALL      SP_OUT
          LD        A,(W_FF41)
          CALL      DEZOUT
          LD        HL,CTXT8
          CALL      SP_OUT
          LD        A,(TEST_MSEK)
          CALL      DEZOUT
          LD        HL,CTXT9
          CALL      SP_OUT
          LD        A,(REST+4)
          CALL      NMOUT
          LD        HL,CTXT6
          CALL      SP_OUT
          CALL      READY_MASK
          AND       B_0F
          LD        HL,CTXT62
          JR        NZ,L_1349
          LD        HL,CTXT61
L_1349:   CALL      SOUT
          LD        A,(W_FF59)
          AND       B_F9
          OR        B_02
          LD        (W_FF59),A
          CALL      SETCMDT
          JP        GETCOM


; HARDDISK
L_135C:   CALL      L_0ABC
          JR        NZ,L_13BD
          LD        HL,W_13D0
          CALL      SP_OUT
          LD        HL,(W_FF6F)
          CALL      L_13CA
          LD        HL,W_13EA
          CALL      SP_OUT
          LD        A,(W_FF71)
          CALL      NMOUT
          LD        HL,W_1406
          CALL      SP_OUT
          LD        HL,(W_FF72)
          CALL      L_13CA
          LD        HL,W_1420
          CALL      SP_OUT
          LD        HL,(W_FF74)
          CALL      L_13CA
          LD        HL,W_143A
          CALL      SP_OUT
          LD        A,(W_FF76)
          CALL      NMOUT
          LD        HL,W_1456
          CALL      SP_OUT
          LD        A,(W_FF77)
          CALL      NMOUT
          LD        HL,W_1472
          CALL      SP_OUT
          LD        HL,(W_FF5E)
          srl       h
          rr        l
          srl       h
          rr        l
          CALL      HLOUT
L_13BD:   LD        A,(W_FF59)
          AND       B_F9
          OR        B_04
          LD        (W_FF59),A
          JP        GETCOM

L_13CA:   LD        A,l
          LD        l,h
          LD        h,A
          JP        HLOUT

W_13D0:               DEFM      01H,'no. of cylinders......: $'
W_13EA:               DEFM      01H,'no. of heads..........:   $'
W_1406:               DEFM      01H,'start RWC cylinder....: $'
W_1420:               DEFM      01H,'start precom. cylinder: $'
W_143A:               DEFM      01H,'ECC byte .............:   $'
W_1456:               DEFM      01H,'control byte .........:   $'
W_1472:               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:

                      CALL      L_0E23
                      JR        Z,L_15AD
                      CALL      PRINT_DRIVE
                      CALL      L_1047
                      CALL      READ
                      JP        GETCM

L_15AD:               CALL      H_BLANK
                      CALL      L_1047
                      CALL      L_0A6C
                      JP        GETCM

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

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







;WCMD:
;                      CALL      DISKDA
;                      CALL      PRINT_DRIVE
;                      CALL      RWINP
;                      CALL      WRITE
;                      JP        GETCM




WCMD:     CALL      L_0E23
          JR        Z,L_15CA
          CALL      PRINT_DRIVE
          CALL      L_1047
          CALL      WRITE
          JP        GETCM




L_15CA:   CALL      H_BLANK
          CALL      L_1047
          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:

          CALL      L_0E23
          JR        Z,L_1637
          CALL      PRINT_DRIVE
          LD        HL,ATXT1
          CALL      SP_OUT
          LD        A,(TRACK)
          CALL      NEU_WRT
          LD        (TRACK),A
          JP        Z,GETCM
          LD        HL,ATXT2
          CALL      SP_OUT
          LD        A,(HEAD)
          CALL      NEU_WRT
          LD        (HEAD),A
          JP        Z,GETCM
          LD        HL,ATXT3
          CALL      SP_OUT
          LD        A,(W_FF1C)
          CALL      NEU_WRT
          LD        (W_FF1C),A
          JP        Z,GETCM
          JP        GETCOM
L_1637:   LD        C,B_48
          CALL      CO
          LD        HL,ATXT1
          CALL      SP_OUT
          LD        HL,(W_FF5A)
          CALL      HL_NEU_WRT
          LD        (W_FF5A),HL
          JP        Z,GETCM
          LD        HL,ATXT2
          CALL      SP_OUT
          LD        HL,ATXT4
          CALL      SOUT
          LD        A,(W_FF5C)
          CALL      NEU_WRT
          LD        (W_FF5C),A
          JP        Z,GETCM
          LD        HL,ATXT3
          CALL      SP_OUT
          LD        HL,ATXT4
          CALL      SOUT
          LD        A,(SECTOR)
          CALL      NEU_WRT
          LD        (SECTOR),A
          JP        Z,GETCM
          JP        GETCOM

ATXT1:    DEFB      001h
          DEFB      'T','r','a','c','k','.','.'
          DEFB      ':',' ','$'
ATXT2:    DEFB      001h
          DEFB      'H','e','a','d','.','.','.'
          DEFB      ':',' ','$'
ATXT3:    DEFB      001h
          DEFB      'S','e','c','t','o','r','.'
          DEFB      ':',' ','$'
ATXT4:    DEFB      ' ',' ','$'


BCMD:
          CALL      GETCH1
          CALL      CECHO
          CP        B_0D
          JR        Z,L_16D5
          LD        C,B_10
          CP        B_45
          JR        Z,L_16CC
          LD        C,B_20
          CP        B_48
          JR        Z,L_16CC
L_16BB:   CP        B_30
          JP        C,CERROR
          CP        B_34
          JP        nC,CERROR
          AND       B_03
          LD        (W_FF50),A
          JR        L_16D5
L_16CC:   LD        A,(W_FF50)
          AND       B_03
          OR        c
          LD        (W_FF50),A
L_16D5:   LD        A,(W_FF50)
          LD        C,A
          AND       B_10
          JP        NZ,L_176C
          LD        A,c
          AND       B_20
          JP        NZ,L_17C1
          CALL      DISKDA
          XOR       a
          LD        (TEST_TRACK),A
          CALL      L_01A8
          LD        (UNIT),A
          LD        B,B_02
L_16F3:   PUSH      BC
          CALL      TEST
          POP       BC
          OR        a
          JR        Z,L_1700
          DJNZ      L_16F3
          JP        CCMD5
L_1700:   CALL      SETCMDT
          XOR       a
          LD        (TRACK),A
          LD        (HEAD),A
          LD        A,(W_FF41)
          LD        (W_FF1C),A
          LD        HL,W_FA00
          LD        (W_FF44),HL
          LD        A,B_01
          LD        (SECTCNT),A
          CALL      READ
          OR        a
          JP        NZ,BOOTERR
          LD        HL,W_FA00
          LD        DE,W_FD80
          LD        BC,W_0080
          LDIR
          LD        HL,W_FA06
          LD        DE,W_1756
          LD        B,B_09
L_1735:   LD        A,(DE)
          CP        (HL)
          JR        NZ,L_1746
          INC       HL
          INC       DE
          DJNZ      L_1735
          LD        HL,0
          LD        (W_FF57),HL
          JP        L_FD80
L_1746:   LD        HL,W_174F
          CALL      SOUT
          JP        GETCOM
W_174F:   DEFB      00DH,00AH,007h
          DEFB      ' ','N','o',' '
W_1756:   DEFB      'P','R','O','F','-','1','8'
          DEFB      '0','X',' ','b','o','o','t'
          DEFB      ' ','d','i','s','k',00DH,00AH
          DEFB      '$'

L_176C:   LD        HL,(PATCH)
          LD        A,H
          OR        l
          JR        Z,L_17A0
          LD        A,(W_FF56)
          OR        a
          JR        Z,L_17A0
          LD        (W_FF57),HL
          LD        A,B_F0
          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,W_D18D
          LDIR
          LD        A,B_0F
          OUT       (P_LS259),A
          LD        A,(READY_BYTE)
          AND       B_F0
          OUT0      (32H),A     ; DMA/WAIT Control Register
          LD        HL,(W_0090)
          JP        (HL)
L_17A0:   LD        HL,W_17A9
          CALL      SOUT
          JP        GETCOM

W_17A9:   DEFB      00DH,00AH,007h
          DEFB      'E','P','R','O','M',' ','b'
          DEFB      'o','o','t',' ','f','a','i'
          DEFB      'l','u','r','e'
          DEFB      00DH,00AH
          DEFB      '$'

L_17C1:   CALL      L_0ABC
          JP        NZ,GETCOM
          LD        HL,W_FFFF
L_17CA:   LD        (W_FF57),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        (PHYS_TIME+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        (PHYS_TIME+3),A; TAG WEG

                      CALL      GETDEZ         ; JAHR
                      CP        0DH
                      JP        NZ,CERROR
                      LD        A,L
                      LD        (PHYS_TIME+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        (PHYS_TIME+2),A ; STUNDE WEG

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

                      CALL      GETDEZ         ; SEKUNDE
                      CP        0DH
                      JP        NZ,CERROR
                      LD        A,L
                      CP        60H            ; SEKUNDE MAX: 60
                      JP        NC,CERROR
                      LD        (PHYS_TIME),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,(CHK_SUM)
                      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

; 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       B_30           ; Umrechnung Laufwerksnummer
                      LD        (TEMP),A       ; Rette Laufwerknummer
                      LD        L,A
                      LD        H,0
                      ADD       HL,HL          ; Laufwerk * 2
                      LD        DE,SYSTEMPAGE  ; 
                      ADD       HL,DE          ; + 0FF00H
                      LD        (ERMSG),HL     ; 

                      LD        HL,UCMTX3      ;steprate?
                      CALL      SP_OUT
                      LD        HL,(ERMSG)     ;
                      LD        A,(HL)         ;
                      RLCA
                      RLCA
                      RLCA
                      RLCA
                      CPL
                      AND       0FH
                      INC       A
                      CALL      NEU_WRT        ; Neuer Wert?
                      PUSH      AF
                      DEC       A
                      CPL
                      RRCA
                      RRCA
                      RRCA
                      RRCA
                      AND       0F0H
                      LD        B,A
                      LD        HL,(ERMSG)
                      LD        A,(HL)
                      AND       0FH
                      OR        B
                      LD        (HL),A
                      POP       AF
                      JP        Z,L_1DB8

                      LD        HL,UCMTX4      ; head unload time?
                      CALL      SP_OUT
                      LD        HL,(ERMSG)
                      LD        A,(HL)
                      RRCA
                      RRCA
                      RRCA
                      RRCA
                      AND       0F0H
                      CALL      NEU_WRT
                      PUSH      AF
                      RLCA
                      RLCA
                      RLCA
                      RLCA
                      AND       0FH
                      LD        B,A
                      LD        HL,(ERMSG)
                      LD        A,(HL)
                      AND       0F0H
                      OR        B
                      LD        (HL),A
                      POP       AF
                      JP        Z,L_1DB8

                      INC       HL
                      LD        (ERMSG),HL

                      LD        HL,UCMTX5      ; head load time?
                      CALL      SP_OUT
                      LD        HL,(ERMSG)
                      LD        A,(HL)
                      AND       0FEH
                      CALL      NEU_WRT
                      PUSH      AF
                      AND       0FEH
                      LD        HL,(ERMSG)
                      LD        (HL),A
                      POP       AF
                      JP        Z,L_1DB8

                      LD        HL,UCMTX6      ; ready signal?
                      CALL      SP_OUT
                      LD        A,(TEMP)
                      CALL      UNIT_MSK_A
                      AND       0FH
                      LD        E,A
                      LD        D,0FFH
                      LD        HL,READY_BYTE
                      CALL      L_1DBE
                      JP        Z,L_1DB8

                      LD        HL,UCMTX7      ; 80 track?
                      CALL      SP_OUT
                      LD        A,(TEMP)
                      CALL      UNIT_MSK_A
                      AND       B_F0
                      LD        E,A
                      LD        D,0
                      LD        HL,SEEKNR
                      CALL      L_1DBE
                      JP        Z,L_1DB8
                      LD        HL,UCMTX8
                      CALL      SP_OUT
                      LD        A,(TEMP)
                      CALL      UNIT_MSK_A
                      AND       B_0F
                      LD        E,A
                      LD        D,0
                      LD        HL,SEEKNR
                      CALL      L_1DBE
                      JP        L_1DB8

UCM_B:    
                      LD        HL,W_FF0C
                      CP        'A'
                      JR        Z,L_1B74
                      LD        HL,W_FF0D

;      Schnittstellenkonfiguration (Befehl A oder B)

L_1B74:               LD       (ERMSG),HL
                      PUSH    AF
                      LD      HL,UCMT10
                      CALL    SOUT
                      POP     AF
                      CALL    UCMD90
                      LD      HL,UCMT11
                      CALL    SP_OUT
                      LD      HL,(ERMSG)
                      LD      A,(HL)
                      AND     B_0F
                      CALL    NEU_WRT
                      PUSH    AF
                      LD      HL,(ERMSG)
                      AND     B_0F
                      LD      C,A
                      LD      A,(HL)
                      AND     B_F0
                      OR      c
                      LD      (HL),A
                      POP     AF
                      JP      Z,L_1DB8
                      LD      HL,UCMT12
                      CALL    SP_OUT
                      LD      HL,(ERMSG)
                      LD      E,B_40
                      LD      d,0
                      CALL    L_1DBE
                      JP      Z,L_1DB8
                      LD      HL,UCMT13
                      CALL    SP_OUT
                      LD      HL,(ERMSG)
                      LD      E,B_10
                      LD      d,0
                      CALL    L_1DBE
                      JP      Z,L_1DB8
                      LD      HL,UCMT14
                      CALL    SP_OUT
                      LD      HL,(ERMSG)
                      LD      E,B_20
                      LD      d,0
                      CALL    L_1DBE
                      JP      Z,L_1DB8
                      LD      HL,(ERMSG)
                      LD      A,(HL)
                      AND     B_20
                      JP      Z,L_1DB8
                      LD      HL,UCMT15
                      CALL    SP_OUT
                      LD      HL,(ERMSG)
                      LD      E,B_80
                      LD      d,0FFH
                      CALL    L_1DBE
                      JP      L_1DB8

UCM_C:    
                      LD      HL,UCMT20
                      CALL    SOUT
                      LD      HL,UCMT21
                      CALL    SP_OUT
                      LD      A,(W_FF0E)
                      AND     B_03
                      CALL    NEU_WRT
                      PUSH    AF
                      AND     B_03
                      LD      C,A
                      LD      A,(W_FF0E)
                      AND     B_FC
                      OR      c
                      LD      (W_FF0E),A
                      LD      (W_FF50),A
                      POP     AF
                      JP      Z,L_1DB8
                      LD      HL,UCMT22
                      CALL    SP_OUT
                      LD      A,(W_FF09)
                      CALL    NEU_WRT
                      LD      (W_FF09),A
                      JP      Z,L_1DB8
                      LD      HL,UCMT23
                      CALL    SP_OUT
                      LD      A,(W_FF0A)
                      CALL    NEU_WRT
                      LD      (W_FF0A),A
                      JP      Z,L_1DB8
                      LD      HL,UCMT24
                      CALL    SP_OUT
                      LD      A,(W_FF0F)
                      CALL    NEU_WRT
                      LD      (W_FF0F),A
                      JP      Z,L_1DB8
                      LD      HL,UCMT25
                      CALL    SP_OUT
                      LD      A,(W_FF11)
                      CALL    NEU_WRT
                      LD      (W_FF11),A
                      JP      Z,L_1DB8
                      LD      HL,UCMT26
                      CALL    SP_OUT
                      LD      HL,W_FF0E
                      LD      E,B_10
                      LD      d,0
                      CALL    L_1DBE
                      LD      A,(W_FF0E)
                      LD      (W_FF50),A
                      JP      Z,L_1DB8
                      LD      A,(W_FF0E)
                      LD      C,A
                      AND     B_10
                      JR      Z,L_1C96
                      LD      A,c
                      AND     B_DF
                      LD      (W_FF0E),A
                      LD      (W_FF50),A
                      CALL    CROUT
                      JP      L_1DB8

L_1C96:   LD        HL,UCMT27
                      CALL    SP_OUT
                      LD      HL,W_FF0E
                      LD      E,B_20
                      LD      d,0
                      CALL    L_1DBE
                      LD      A,(W_FF0E)
                      LD      (W_FF50),A
                      JP      L_1DB8

UCM_M:
                      LD                      HL,UCMT30
                      CALL    SOUT
                      LD      HL,UCMT31
                      CALL    SP_OUT
                      LD      HL,W_FF0E
                      LD      E,B_04
                      LD      d,0
                      CALL    L_1DBE
                      JP      Z,L_1DB8
                      LD      HL,UCMT32
                      CALL    SP_OUT
                      LD      HL,W_FF0E
                      LD      E,B_08
                      LD      d,0
                      CALL    L_1DBE
                      JP      L_1DB8

UCM_W:    
                      LD      HL,UCMT40
                      CALL    SOUT
                      LD      HL,UCMT41
                      CALL    SP_OUT
                      LD      A,(READY_BYTE)
                      RRCA
                      RRCA
                      RRCA
                      RRCA
                      AND     B_03
                      CALL    NEU_WRT
                      PUSH    AF
                      RLCA
                      RLCA
                      RLCA
                      RLCA
                      AND     B_30
                      LD      C,A
                      LD      A,(READY_BYTE)
                      AND     B_CF
                      OR      c
                      LD      (READY_BYTE),A
                      POP     AF
                      JP      Z,L_1DB8
                      LD      HL,UCMT42
                      CALL    SP_OUT
                      LD      A,(READY_BYTE)
                      RLCA
                      RLCA
                      AND     B_03
                      CALL    NEU_WRT
                      PUSH    AF
                      RRCA
                      RRCA
                      AND     B_C0
                      LD      C,A
                      LD      A,(READY_BYTE)
                      AND     B_3F
                      OR      c
                      LD      (READY_BYTE),A
                      POP     AF
                      JP      L_1DB8

UCM_U:    
                      LD      HL,UCMT50
                      CALL    SOUT
                      LD      HL,UCMT51
                      CALL    SP_OUT
                      LD      A,(W_FF13)
                      CALL    NEU_WRT
                      LD      (W_FF13),A
                      JP      Z,L_1DB8
                      LD      HL,UCMT52
                      CALL    SP_OUT
                      LD      A,(W_FF14)
                      CALL    NEU_WRT
                      LD      (W_FF14),A
                      JP      Z,L_1DB8
                      LD      HL,UCMT53
                      CALL    SP_OUT
                      LD      A,(W_FF15)
                      CALL    NEU_WRT
                      LD      (W_FF15),A
                      JP      Z,L_1DB8
                      LD      HL,UCMT54
                      CALL    SP_OUT
                      LD      A,(W_FF16)
                      CALL    NEU_WRT
                      LD      (W_FF16),A
                      JP      L_1DB8

; INITIALISATION STRINGS AUSGEBEN

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

L_1D91:               LD        E,(HL)
                      INC       HL
                      LD        D,(HL)
                      INC       HL
                      INC       DE
                      LD        A,D
                      OR        E
                      JR        Z,L_1DB1
                      PUSH      HL
                      PUSH      BC
                      EX        DE,HL
                      DEC       HL
                      CALL      SP_OUT
                      LD        HL,W_FF10
                      POP       DE
                      PUSH      DE
                      LD        D,0
                      CALL      L_1DBE
                      POP       BC
                      POP       HL
                      JR        NZ,L_1DB1
                      LD        B,B_01
L_1DB1:               RRC       C
                      DJNZ      L_1D91
                      JP        L_1DB8

L_1DB8:               CALL      L_204C
                      JP        UCMD

L_1DBE:               LD        A,D
                      OR        A
                      PUSH      AF
                      LD        A,E
                      AND       (HL)
                      LD        C,A
                      POP       AF
                      LD        A,C
                      PUSH      HL
                      PUSH      DE
                      JR        Z,L_1DCF
                      CALL      NEG_JA_NEIN
                      JR        L_1DD2

L_1DCF:               CALL      JA_NEIN
L_1DD2:               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


L_204C:   XOR       a
          LD        HL,SYSTEMPAGE
L_2050:   LD        B,B_17
L_2052:   ADD       A,(HL)
          INC       HL
          DJNZ      L_2052
          CPl
          INC       a
          LD        (HL),A
          CALL      USER_BYTES_WRITE
          RET




YCMD:
          LD        HL,W_2255
          CALL      SP_OUT
          LD        A,(W_FEE7)
L_2066:   CALL      NEU_WRT
          LD        (W_FEE7),A
          JP        Z,GETCOM
          LD        HL,W_2268
          CALL      SP_OUT
          LD        A,(W_FEE8)
          CALL      JA_NEIN
          LD        (W_FEE8),A
          JP        Z,GETCOM
          LD        HL,W_227B
          CALL      SP_OUT
          LD        A,(W_FEE9)
          CALL      JA_NEIN
          LD        (W_FEE9),A
          JP        Z,GETCOM
          LD        HL,W_228E
          CALL      SP_OUT
          LD        A,(W_FEEA)
          CALL      JA_NEIN
          LD        (W_FEEA),A
          JP        Z,GETCOM
          LD        HL,W_22A1
          CALL      SP_OUT
          LD        A,(W_FEEB)
          AND       B_03
          CALL      NEU_WRT
          PUSH      AF
          AND       B_03
L_20B6:   LD        (W_FEEB),A
          POP       AF
          JP        Z,GETCOM
L_20BD:   LD        HL,W_22B4
          CALL      SP_OUT
          LD        A,(W_FEEC)
          CALL      NEU_WRT
          LD        (W_FEEC),A
          JP        Z,GETCOM
          LD        HL,W_22C7
          CALL      SP_OUT
          LD        A,(W_FEED)
          CALL      NEU_WRT
          LD        (W_FEED),A
          JP        Z,GETCOM
          LD        HL,W_22DA
          CALL      SP_OUT
          LD        A,(W_FEEE)
          CALL      NEU_WRT
          LD        (W_FEEE),A
          JP        Z,GETCOM
          LD        HL,W_22ED
          CALL      SP_OUT
          LD        A,(W_FEEF)
          CALL      NEU_WRT
          LD        (W_FEEF),A
          JP        Z,GETCOM
          LD        HL,W_2300
          CALL      SP_OUT
          XOR       a
          CALL      JA_NEIN
          OR        a
          JP        Z,GETCOM
          LD        A,(W_FEEE)
          OR        a
          JP        Z,GETCOM
          LD        HL,CMDTAB
          LD        DE,W_FEF7
          LD        BC,W_0009
          LDIR
          CALL      SET_TIMER
          CALL      CROUT
          CALL      CROUT
          LD        A,(W_FEE7)
          AND       B_03
          LD        (UNIT),A
          LD        BC,0204H
          CALL      MOTO
          CALL      NEXT
          bit       6,A
          JR        Z,L_214C
          LD        HL,W_2325
          CALL      SOUT
          JP        L_21BD
L_214C:   LD        A,(W_FEE8)
          OR        a
          JR        Z,L_2157
          CALL      MAXI_SET
          JR        L_215A
L_2157:   CALL      MINI_SET
L_215A:   XOR       a
          LD        (W_FEF3),A
          LD        (TRACK),A
          CALL      RECAL
          LD        HL,W_2335
          CALL      SP_OUT
L_216A:   LD        HL,(UNIT)
          PUSH      HL
          LD        HL,W_0100
          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,(W_FEEA)
          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,(W_FEEE)
          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,W_0009
          LDIR
          JP        GETCOM
L_21CB:   CALL      L_2242
          LD        HL,W_2313
          CALL      SOUT
          LD        A,(W_FEF3)
          CALL      DEZOUT
          LD        HL,W_231D
          CALL      SOUT
          LD        A,(UNIT)
          RRCA
          RRCA
          AND       B_01
          ADD       A,B_30
          LD        C,A
          CALL      CECHO
          LD        A,(W_FEEC)
          LD        (W_FEF5),A
          LD        C,A
          LD        A,(W_FEED)
          SUB       c
          INC       a
          LD        (HEAD),A
          LD        A,(W_FEF0)
          LD        (SECSZ),A
          LD        A,(W_FEEB)
          LD        (TRACK),A
          LD        (W_FEF6),A
          LD        A,(W_FEEF)
          LD        (W_FF1C),A
          LD        A,(W_FEE9)
          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      L_0635
          RET


W_2255:               DEFM      01H,"drive..........: $"
W_2268:               DEFM      01H,"maxi disk......: $"
W_227B:               DEFM      01H,"single density.: $"
W_228E:               DEFM      01H,"single side....: $"
W_22A1:               DEFM      01H,"sector size....: $"
W_22B4:               DEFM      01H,"first sector...: $"
W_22C7:               DEFM      01H,"last sector....: $"
W_22DA:               DEFM      01H,"track number...: $"
W_22ED:               DEFM      01H,"format gap.....: $"
W_2300:               DEFM      01H,"start format...: $"
W_2313:               DEFM      0DH," track #$"
W_231D:               DEFM      " head #$"
W_2325:               DEFM      " Write protect",BELL,"$"
W_2335:               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
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 ZUM SPEICHERPRUEFEN
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,B_53          ; AUSGANGSPRUEFBYTE 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 KOPIEREN VON
                      LD        DE,0            ; NACH
                      LD        BC,4000H        ; 4000 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
                      LD        DE,0
                      LD        BC,0
INIT5:                LD        A,(BC)
                      LD        E,A
                      ADD       HL,DE
                      INC       BC
                      CP        40H
                      JR        NZ,INIT5

                      LD        (W_2736),HL
                      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)          ; SIND USERBTES GESETZT?
                      INC       HL
                      DJNZ      INIT6           ; ALLE USERBYTES ADDIEREN 

                      LD        HL,W_26E9       ; DATEN VON 26E9H NACH  !!!!!!!!!!!!!!!!! DISKPAGE???
                      LD        DE,SYSTEMPAGE   ;   SYSTEMPAGE KOPIEREN
                      LD        BC,0100H        ; 100H BYTES (INCL. USERBYTES)
                      OR        A
                      PUSH      AF
                      JR        NZ,INIT7
                      LD        HL,W_2701       ; DATEN VON 2701H NACH   !!!!!!!!!!!!!!!!  DISKPAGE???
                      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,(PHYS_TIME)   ; 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,(PHYS_TIME)   ; 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,(PHYS_TIME)   ; 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        (CLKFLG),A      ; TAKTFREQUENZKENNUNG

                      LD        A,(READY_BYTE)
                      AND       0F0H

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

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

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

                      LD        A,(W_FF0E)
                      LD        (W_FF50),A

                  LD         A,(SIOBBAUD)
                  LD         C,A
                  LD         A,(W_FF0C)
                  LD         B,A
                  AND        0FH
                  JR         NZ,INIT21
                  LD         A,C

INIT21:           LD         C,A
                  LD         A,B
                  AND        0F0H
                  OR         C
                  LD         (W_FF51),A
                  LD         A,(SIOBBAUD)
                  LD         C,A
                  LD         A,(W_FF0D)
                  LD         B,A
                  AND        0FH
                  JR         NZ,INIT22
                  LD         A,C

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

INIT23:           LD         L,C
                  LD         H,0
                  ADD        HL,HL
                  ADD        HL,HL
                  ADD        HL,HL
                  ADD        HL,HL
                  LD         DE,W_28B1
                  ADD        HL,DE
                  LD         DE,W_010E
                  LD         BC,W_0010
                  LDIR

                  CALL       L_0C3E
                  CALL       USERINIT

                  LD         HL,W_26AD
                  LD         DE,W_FEE7
                  LD         BC,000CH
                  LDIR

                  LD         A,(IO_JUMPERBYTE)
                  AND        03H
                  LD         L,A
                  LD         H,10H
                  MLT        HL
                  LD         DE,GRIP_ST_TXT
                  ADD        HL,DE
                  LD         A,(W_FF10)
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,B_0C              ; 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,(W_FF0E)
                  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,(W_FF0E)
                  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,(W_FF0E)
                  AND        30H                 ; MASKIEREN
                  JR         Z,INIT36
                  CP         10H
                  JR         Z,INIT37
                  CP         20H
                  JR         Z,INIT38
                  JP         RST_VERTEILER
; ----------------------
; hier bin ich
;-----------------------

INIT36:           LD         A,(DISKFLG)
                  OR         A
                  JP         Z,RST_VERTEILER
                  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
                  CALL       SP_OUT
                  CALL       GETCH1
                  PUSH       AF
                  CALL       CROUT
                  POP        AF
                  CP         0DH
                  JP         NZ,L_16D5
                  JP         RST_VERTEILER



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,(W_F000)          ; RAM DEFEKT, LED BLINKEN LASSEN, 
                  LD         (W_F000),A          ; SPEICHER LESEN / SCHREIBEN COMMON 1
                  LD         (W_4000),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 CLKFLG (TAKT/1536MHz) KENNUNG AUS SPD_TAB ERMITTELN

CHK_TAKT:         PUSH       HL                  ; REGISTER RETTEN
                  PUSH       DE
                  LD         A,(CLKFLG)          ; 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

W_26AD:   nop
          nop
          nop
          nop
          LD        (BC),A
          LD        BC,W_500A
          DEC       DE
          PUSH      HL
          nop
          rst       38h

; 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

W_26E9:   RET       nc
          LD        (BC),A
          RET       nc
          LD        (BC),A
          RET       nc
          LD        (BC),A
          RET       nc
          LD        (BC),A
          JR        nC,L_26F3
L_26F3:   nop
          RET       p
          LD        B,b


          LD        C,(HL)
          INC       c
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
W_2701:   nop
          nop
          LD        BC,W_0100
          nop
          LD        A,(DE)
          RLCA
          ADD       A,b
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          JP        GETCM
          nop
          LD        A,(BC)
          nop
          rst       38h
          rst       38h
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          LD        BC,W_0000
          nop
          nop
          rst       38h
          nop
          nop
          nop
          nop
          nop
W_2736:   nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          rst       38h
          rst       38h
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop

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.......: $",04,01BH,01BH,'5','0'
TXT_STL_OFF:      DEFM    01H,"status line off..: $",04,01BH,01BH,'S','0'
TXT_SCRN_8_8:     DEFM    01H,"max. screen 8*8..: $",05,01BH,01BH,'8','@',7FH
TXT_SCRN_8_10:    DEFM    01H,"max. screen 8*10.: $",09,01BH,01BH,'6',':',01BH,01BH,'8','9',7FH
TXT_NO_ASCII:     DEFM    01H,"non ASCII........: $",04,01BH,01BH,37H,32H

W_28B1:   DEFB      000h
          LD        l,B_2D
          LD        C,B_0E
          INC       l
L_28B7:   DEC       HL
L_28B8:   LD        HL,(W_0429)
          JR        Z,L_28C0
          LD        HL,UCMT51
L_28C0:   JR        NZ,L_28C2
L_28C2:   LD        l,0
          DEC       l
          LD        C,B_0E
          DEC       c
          INC       c
          DEC       BC
          ADD       HL,HL
          LD        A,(BC)
          JR        Z,L_28D7
          LD        HL,0108H
          nop
          LD        l,B_2E
          DEC       l
          DEC       l
          DEC       l
L_28D7:   INC       l
          DEC       HL
          LD        HL,(W_290B)
          LD        A,(BC)
          JR        Z,L_28E8
          LD        HL,W_0020
          LD        BC,W_2E2E
          LD        l,B_2E
          LD        C,B_0D
          INC       c
          INC       h
          DEC       BC
          INC       HL
          LD        A,(BC)
          LD        (W_0809),HL
          nop
          JR        NZ,L_2922
          LD        l,B_2E
          LD        l,B_2D
          INC       l
          DEC       HL
          INC       c
          LD        HL,(W_290B)
          LD        A,(BC)
          JR        Z,L_2922
          nop
          LD        (BC),A
          LD        l,B_2E
          LD        l,B_2E
          DEC       l
          LD        C,B_0D
          DEC       h
W_290B:   INC       c
          INC       h
          DEC       BC
          INC       HL
          LD        A,(BC)
          ADD       HL,BC

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

;
DISKPAGE:
; 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
                                        ;
                                        ; DIE NACHFOLGENDEN SPEICHERZELLEN MUESSEN
                                        ; MIT DER DISKPAGE GEMISCHT WERDEN KOENNEN
                                        ;
;SYSTEMPAGE:                            ; 
          
                      END


