    JLCC: Controller-Routine
    [Zuerst werden alle Jobspeicher getestet (Job8 zuerst), ob Jobauftraege
     vorliegen. Bei den entsprechenden Jobs werden ggf. die T&S in das phy.
     Format umgewandelt. Jobs, die sich mit den aktuellen Cachedaten bearbeiten
     lassen, werden sofort bearbeitet.
     Anschliessend wird der Job mit der niedrigsten Nummer bearbeitet:
     ggf. werden der Motor eingeschaltet, der Kopf positioniert, u.s.w. Wenn
     eine neue Spur in den Cache geladen worden ist, beginnt anschliessend die
     Jobauswertung wieder von Vorne (mit den neuen Cache-Daten).
     Schliesslich wird die eigentliche Job-Routine aufgerufen.
     Wenn kein aktiver Job mehr anliegt, oder der Schreib-/Lesekopf bewegt
     werden muss, wird in die Hauptsteuer-Routine verzweigt, die fuer die Motor-
     und LED-Steuerung zustaendig ist.
     Im Gegensatz zu frueheren Commodore-Laufwerken uebergibt das Controller-
     programm die Regie nicht an das DOS, solange der Schreib-/Lesekopf
     positioniert wird. Damit koennen Bloecke (bei der 1581 Spuren) nicht mehr
     'im Hintergrund' eingelesen werden.
     Achtung: Wenn die Jobroutine mehrere Jobs 'gleichzeitig' bekommt, kann sie
     sich in der Seitenauswahl irren, da fuer alle Jobs zusammen nur ein
     Seitenregister ($96) existiert und dieses bei mehreren Jobs gnadenlos
     ueberschrieben wird !!!]

    C0BE: BA        TSX              Stackpointer retten fuer Funktionsabbruch
    C0BF: 86 2C     STX $2C          und fuer Break-Flag pruefen

    Jobspeicher pruefen

    C0C1: A9 80     LDA #$80         Flag fuer 'kein Job aktiv' setzen
    C0C3: 85 83     STA $83
    C0C5: A0 08     LDY #$08         mit Jobpuffer 8 beginnen

    Einsprung von $C0D5, $CDFD:

    C0C7: B9 02 00  LDA $0002,Y      <--  Jobspeicher pruefen
    C0CA: 30 12     BMI $C0DE        liegt Job an, dann ==>
    C0CC: B9 9F 00  LDA $009F,Y      Zeiger in Cachepuffer (Hi)
    C0CF: 29 7F     AND #$7F         b7=0: Flag: 'T&S wurden noch nicht ins
    C0D1: 99 9F 00  STA $009F,Y      phy. Format umgewandelt' setzen

    Einsprung von $C101:

    C0D4: 88        DEY              naechsten Jobspeicher pruefen
    C0D5: 10 F0     BPL $C0C7
    C0D7: A4 83     LDY $83          b7=0: aktiven Job gefunden ?
    C0D9: 10 29     BPL $C104        ja, ==>
    C0DB: 4C 00 CE  JMP $CE00        Zur Hauptsteuer-Routine ==>

    Jobcode analysieren und ggf. Job mit Cachedaten durchfuehren

    Einsprung von $C0CA:

    C0DE: 84 83     STY $83          Aktuelle Jobnummer merken
    C0E0: AA        TAX              Jobcode merken
    C0E1: 98        TYA              Index fuer 2-Byte Puffer berechnen
    C0E2: 0A        ASL
    C0E3: 85 99     STA $99
    C0E5: BD E7 C1  LDA $C1E7,X      Nummer der Jobroutine nach $84
    C0E8: 85 84     STA $84
    C0EA: AA        TAX
    C0EB: BD 63 C1  LDA $C163,X      Job-Kommandobits holen
    C0EE: 85 85     STA $85
    C0F0: BD 84 C1  LDA $C184,X
    C0F3: 85 86     STA $86
    C0F5: 20 3C FF  JSR $FF3C        logisches in physikalisches Format wandeln
    C0F8: 06 85     ASL $85          b6=1: Cachedaten verwenden ?
    C0FA: 90 03     BCC $C0FF        nein, ==>
    C0FC: 20 51 CF  JSR $CF51        Wenn moeglich, Cache verwenden

    Einsprung von $C0FA:

    C0FF: A4 83     LDY $83          aktuelle Jobnummer zurueckholen
    C101: 4C D4 C0  JMP $C0D4        naechsten Jobspeicher testen
    Der Job kann nicht mit Cachedaten durchgefuehrt werden

    Einsprung von $C0D9:

    C104: 06 85     ASL $85          b5=1: Motor einschalten ?
    C106: 90 03     BCC $C10B        nein, ==>
    C108: 20 63 CD  JSR $CD63        Motor einschalten

    Einsprung von $C106:

    C10B: 06 85     ASL $85          b4=1: Anlaufzeit abwarten ?
    C10D: 90 03     BCC $C112        nein, ==>
    C10F: 20 7B CD  JSR $CD7B        Motor-Anlaufzeit abwarten

    Einsprung von $C10D:

    C112: 06 85     ASL $85          b3=1: Diskettenformat abfragen ?
    C114: 90 03     BCC $C119        nein, ==>
    C116: 20 A6 CF  JSR $CFA6        Diskettenformat abfragen

    Einsprung von $C114:

    C119: 06 85     ASL $85          b2=1: Cache ggf. schreiben ?
    C11B: 90 14     BCC $C131        nein, ==>
    C11D: A5 87     LDA $87          b7=1: wurde Cache veraendert ?
    C11F: 10 10     BPL $C131        nein, ==>
    C121: A5 95     LDA $95          aktueller Track im Cache
    C123: 85 88     STA $88          = Solltrack bei Kopfbewegung
    C125: C5 27     CMP $27          steht Kopf schon auf der richtigen Spur ?
    C127: D0 17     BNE $C140        nein, (Spur anfahren) ==>
    C129: A5 97     LDA $97          Seitennummer der aktuellen Cachedaten holen
    C12B: 20 C0 CF  JSR $CFC0        Seite anwaehlen
    C12E: 4C 00 C6  JMP $C600        Cache auf Diskette schreiben

    Einsprung von $C11B, $C11F:

    C131: 06 85     ASL $85          b1=1: Kopf ggf. positionieren ?
    C133: 90 14     BCC $C149        nein, ==>
    C135: A4 99     LDY $99          Jobnummer*2 holen
    C137: B9 BC 01  LDA $01BC,Y      physikalische Spurnummer holen (HDRS2)
    C13A: 85 88     STA $88          und als Sollspur merken
    C13C: C5 27     CMP $27          = aktuelle Spurnummer ?
    C13E: F0 09     BEQ $C149        ja, ==>

    Einsprung von $C127:

    C140: A5 26     LDA $26          b6=1: 'Schrittmotor ist aktiv'
    C142: 09 40     ORA #$40         im Drivestatus setzen
    C144: 85 26     STA $26
    C146: 4C 00 CE  JMP $CE00        Zur Hauptsteuer-Routine ==>

    Einsprung von $C133, $C13E:

    C149: 06 85     ASL $85          b0=1: Seite anwaehlen ?
    C14B: 90 05     BCC $C152        nein, ==>
    C14D: A5 96     LDA $96          aktuelle Diskettenseite holen
    C14F: 20 C0 CF  JSR $CFC0        und anwaehlen

    Einsprung von $C14B:

    C152: A5 84     LDA $84          Befehlsnummer
    C154: 0A        ASL              als Index auf eine 2-Byte-Tabelle
    C155: AA        TAX
    C156: BD A5 C1  LDA $C1A5,X      Adresse der Jobroutine holen
    C159: 85 48     STA $48
    C15B: BD A6 C1  LDA $C1A6,X
    C15E: 85 49     STA $49
    C160: 6C 48 00  JMP ($0048)       Job aufrufen

        Previous Page / Next Page