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 |