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: 4C AF C5 JMP $C5AF Zum Patch springen
* Old ROM:
C160: 6C 48 00 JMP ($0048) Job aufrufen
Previous Page / Next Page