FLOAD
Dieser Artikel beschreibt den Software-Schnelllader FLOAD. |
FLOAD | |
---|---|
Plattform(en) | C64 |
Genre | Schnelllader |
Medien | |
Sprache(n) |
FLOAD ist ein integrierter Software-Schnelllader für den C64, der bei einigen Cracks der Gruppe Excess zum Einsatz kommt. Er beschleunigt das Nachladen von Programmteilen durch ein eigenes Kommunikationsprotokoll für die Datenübertragung zum C64 sowie — beim Einsatz eines Diskettenlaufwerks VC-1541 — durch eine optimierte Routine für das Einlesen der Programmblöcke auf die 3- bis 4-fache Geschwindigkeit der Originalroutinen. Interessant an diesem Schnelllader ist insbesondere seine Unterstützung für unterschiedliche Laufwerkstypen durch maßgeschneiderte, floppy-seitige Routinen sowie die Berücksichtigung unterschiedlicher C64-Varianten (PAL/NTSC, C128 im C64-Modus). FLOAD beinhaltet zudem eine Dekompressionsroutine, die allerdings das Thema dieses Artikels sprengen würde und daher hier nicht vorgestellt wird.
Die genaue Funktionsweise dieses Schnellladers ist aus dem kommentierten Assemblerlisting von FLOAD 2.2 ersichtlich. Die floppy-seitigen Teile des Schnellladers sind für alle in der nachfolgenden Übersicht genannten Versionen identisch.
Einsatzbeispiele[Bearbeiten | Quelltext bearbeiten]
Funktionsweise[Bearbeiten | Quelltext bearbeiten]
- Im Rahmen der Initialisierung stellt FLOAD zunächst den Typ des angeschlossenen Diskettenlaufwerks fest, indem es charakteristische Stellen des Floppy-ROM mittels "Memory-Read"- ("M-R"-) Befehlen ausliest. Ein erster Lesezugriff auf Adresse
$FEA0
erlaubt dabei eine Erkennung von 5.25"-Laufwerken (gelesenes Byte$0D
); eine VC-1581 liefert dagegen den Wert$FF
. Ein weiterer, gezielter Lesezugriff auf zwei zusätzliche Bytes liefert schließlich den genauen Typ: Bei 5.25"-Laufwerken findet sich an Adresse$E5C6
das Bytepaar$34 $B1
("41" für VC-1541),$37 $B0
("70" für VC-1570) oder$37 $B1
("71" für VC-1571), bei einer VC-1581 das Bytepaar$38 $B1
("81") an Adresse$A6E9
. - Da das Kommunikationsprotokoll auf einer zyklenexakten Übertragung basiert, wird in dieser Phase ein eventuell mit 2 MHz betriebener C128 im C64-Modus auf eine Taktfrequenz von 1 MHz heruntergeschaltet. Wird die NTSC-Variante des C64 erkannt, so wird zudem in der Übertragungsroutine eine zusätzliche Verzögerung von 1 Systemtakt aktiviert (Maschinenbefehl
LDA #$EA
ersetzt durchLDA *$EA
; Inhalt von A wird im nachfolgenden Programmcode ignoriert). - Bei jedem Nachladen eines Programmteils wird zunächst die gewünschte Datei mit Hilfe der üblichen ROM-Routinen geöffnet und sofort wieder geschlossen. Diesem Schritt hinterlässt die Spur- und Sektornummer des ersten Programmblocks im RAM der Floppy (bei 5.25"-Diskettenlaufwerken an Adresse
$18/$19
, im Fall der VC-1581 dagegen in den Speicherzellen$004C/$0288
). - Anschließend wird eine für das jeweiligen Diskettenlaufwerk passende, floppy-seitige Routine mit einer Reihe von "Memory-Write"- ("M-W"-) Befehlen in das RAM der Floppy übertragen und dort mittels "Memory-Execute" ("M-E") gestartet.
- Diese Routine liest nun blockweise die nachzuladende Datei, indem sie den Verkettungszeigern in den ersten beiden Bytes jedes Blocks folgt. Im Fall der VC-1541 geschieht dies mit dem Jobcode
$E0
(Programm in Jobschleife einbinden, das anschließend explizit die Umwandlung von GCR- in Binärbytes vornimmt), bei allen anderen Floppytypen einfach mit dem Jobcode$80
(Sektor lesen). Der Inhalt jedes Blocks (ohne die Verkettungszeiger in den ersten beiden Bytes, aber einschließlich eventueller Füllbytes am Programmende) wird mit einem auf Geschwindigkeit optimierten Übertragungsprotokoll zum C64 übertragen, dort zunächst gepuffert und anschließend byteweise entpackt. - Falls die Erkennung des Diskettenlaufwerkstyps im ersten Schritt gescheitert ist, so wird der gewünschte Programmteil stattdessen mit Hilfe der ROM-Routinen des KERNAL byteweise gelesen und anschließend entpackt. FLOAD kommt auf diese Weise auch mit unbekannten Diskettenlaufwerkstypen zurecht, wobei sich die Ladezeiten hierbei um den Faktor 3-4 erhöhen.
Übertragungsprotokoll[Bearbeiten | Quelltext bearbeiten]
- Unmittelbar nach dem Start signalisiert die floppy-seitige Schnelllade-Routine zunächst, dass momentan keine Daten bereitstehen, indem sie die CLOCK-Leitung auf Low zieht.
- Ist dann ein Programmblock in einen Puffer der Floppy eingelesen und steht zur Übertragung bereit, so teilt die Floppy dies mit einem High-Pegel auf CLOCK mit. Der C64 fordert nun jeweils mit einem kurzen, 8 Systemtakte dauernden Low-Puls auf DATA ein Datenbyte an. Die Floppy überträgt daraufhin ein Byte in Form von 4 Bitpaaren, die für jeweils 8 μs auf die DATA- und CLOCK-Leitung gelegt werden. Damit dies zyklenexakt stattfinden kann, enthalten die floppy-seitigen Schnelllader eine große Anzahl von
NOPs
, falls die CPU der Floppy mit einer Taktfrequenz von 2 MHz betrieben wird (alle Laufwerkstypen mit Ausnahme der VC-1541). - Nach jedem Transfer eines Programmblocks hält die floppy-seitige Routine mit einem Low-Pegel auf CLOCK die Übertragung so lange an, bis der nächste Block von Diskette gelesen ist und bereitsteht.
- Das Dateiende des nachzuladenden Programms wird von der Floppy nicht explizit signalisiert, sondern auf Seiten des C64 beim Entpacken der übermittelten Datenbytes erkannt. Die Floppy kehrt daher beim Erreichen des Dateiendes einfach in den normalen Betriebsmodus zurück und steht dann für das Nachladen weiterer Programmteile bereit.
Weblinks[Bearbeiten | Quelltext bearbeiten]
- All about your 1541 (Kommentiertes ROM-Listing der Floppy VC-1541)
- All about your 1581 (Kommentiertes ROM-Listing der Floppy VC-1581)