Hypra-Load
Hypra-Load | |
---|---|
Entwickler | Boris Schneider und Karsten Schramm |
Firma | Tribar |
Verleger | Markt & Technik Verlag |
Release | 1984, 1985 |
Lizenz | keine (Listing zum Abtippen) |
Plattform(en) | C64 |
Genre | Schnelllader |
Steuerung | |
Medien | |
Information | letzte Version 2.1 * 64'er Ausgabe 10/1984 (Listing des Monats) |
Hypra-Load ist ein Floppy-Schnelllader für den C64 mit 1541. Das Programm wurde erstmals als Listing des Monats in der 64'er Ausgabe 10/1984 veröffentlicht. [1] Eine komplett neu geschriebene verbesserte Version 2.1 wurde im 64'er Sonderheft 6/1985 als Listing abgedruckt. [2] Beide Versionen waren auch auf den jeweiligen 64'er Programmservicedisketten erhältlich. [3]
Das in Maschinensprache geschriebene Programm erhöht die Ladegeschwindigkeit um den Faktor 5 und gilt als erste reine Softwarelösung zur Beschleunigung. Die wird erreicht mit modifizierten Bus-Routinen, die im Computer und in der Floppy abgelegt werden. Es belegt keinen zusätzlichen BASIC-Speicher, verwendet aber den RAM-Speicher unterhalb des BASIC-ROMs und des KERNALs. Die genaue Funktionsweise und die Aufteilung der Speicherbereiche ist aus dem per Disassembler erzeugten und kommentierten Assemblerlisting ersichtlich.
Beschleunigt wird nur das Laden, nicht jedoch andere Diskettenoperationen und -zugriffe per PRINT# oder INPUT# oder GET#. Die Schreibgeschwindigkeit wird nicht erhöht. Als Laufwerke sind die 1541, 1570 und die 1571 verwendbar.
Programmiert wurde Hypra-Load im Jahr 1984/1985 von Boris Schneider und Karsten Schramm, die sich unter dem Namen Tribar zusammentaten.
Performance[Bearbeiten | Quelltext bearbeiten]
Ein 150 Blöcke großes Programm wird ohne Schnelllader in 100 Sekunden geladen. Hypra-Load lädt diese Datei in 20 Sekunden, also 5× schneller. Wird das Laden von Hypra-Load (6 Sekunden) und das zusätzliche Eingeben des zweiten Load-Befehls mit eingerechnet, liegt die tatsächliche Beschleunigung bei Faktor 3. Mit der Autoload-Funktion der Version 2.1 beträgt der gesamte Ladevorgang 25 Sekunden, der einer tatsächlichen Beschleunigung mit Faktor 4 entspricht.
Hypra-Load[Bearbeiten | Quelltext bearbeiten]
Bedienung[Bearbeiten | Quelltext bearbeiten]
Zuerst wird das 6 Blöcke große Hypra-Load geladen und gestartet. Es erscheint ein angepasster Startscreen.
Nun kann das eigentliche Programm mit LOAD beschleunigt geladen werden und mit RUN gestartet werden.
Schwächen[Bearbeiten | Quelltext bearbeiten]
- Ungeeignet ist Hypra-Load, wenn das Programm selbst über einen integrierten Schnelllader verfügt.
- Hypra-Load verhindert, dass das geladene Programm die im RAM befindliche angepasste Kopie des BASIC-ROMs überschreiben kann, indem es nach dem Laden ins ROM zurückspringt. Das Nachladen von Programmen wird deshalb nur mit normaler Geschwindigkeit ausgeführt.
- Überschreiben Programme den Bereich ab $E000, was beim Nachladen vorkommen kann, stürzt der Computer ab.
- Die Geräteadresse der Floppy muss auf #8 eingestellt sein, da das Programm teilweise direkt auf der 1541 ausgeführt und auch in deren Speicher abgelegt wird. Das Listing aus der Zeitschrift 64'er (zu finden im ZIP-Archiv Datei:Hypra-Load Listing.zip) lässt sich allerdings mit den im Heft angegebenen Änderungen der DATA-Zeilen für eine andere Laufwerksnummer modifizieren:
- Betreiben Sie ein Floppy-Laufwerk zum Beispiel unter der Geräteadresse 9, so müssen folgende Änderungen durchge- führt werden: Die DATAs in den Zeilen 104, 114 und 239; dort müssen die entsprechenden Zahlen (008) auf die neue Geräteadresse umgestellt werden. Natürlich ist auch ein Angleichen der Checksummen erforderlich. Es sind dies die 1., die 2. und die 12. Checksumme.
Funktionsweise[Bearbeiten | Quelltext bearbeiten]
Hypra-Load übernimmt während des Ladevorgangs die Kontrolle, sobald die ersten beiden Bytes eines Programms übertragen worden sind und damit die Ladeadresse an den Zeropage-Adressen $AE/$AF vorliegt. In diesem Moment kopiert Hypra-Load ein ca. 500 Byte langes Maschinenspracheprogramm in das RAM der Floppy und führt es dort aus. Die Floppy liest daraufhin nacheinander alle Sektoren des zu ladenden Programms und überträgt diese vollständig — einschließlich der Verkettungszeiger in den ersten Bytes jedes Datenblocks — über den IEC-Bus zum Commodore 64. Der letzte Sektor dieses Programms wird sowohl vom C64 als auch von der Floppy an einem Nullbyte am Anfang eines Datenblocks erkannt. Der C64 beendet daraufhin den Ladevorgang und kehrt zur normalen LOAD-Routine zurück; die Floppy führt eine Reinitialisierung durch und steht damit für den Normalbetrieb wieder zur Verfügung.
Übertragungsprotokoll[Bearbeiten | Quelltext bearbeiten]
Hypra-Load verzichtet auf das Handshaking, das üblicherweise während der Übertragung einzelner Bits mit Hilfe der CLOCK-Leitung erfolgt. Stattdessen missbraucht Hypra-Load vor jedem Datenbyte die ATN-Leitung zu einer Synchronisation von C64 und Floppy, und überträgt anschließend jedes Byte in Form von 4 aufeinanderfolgenden Bitpaaren auf der DATA- und der auf diese Weise freigewordenen CLOCK-Leitung. Jedes Bitpaar liegt dabei für 24 Systemtakte auf den Leitungen des IEC-Bus; mit dieser Vorgehensweise erreicht Hypra-Load kurzzeitig eine Übertragungsgeschwindigkeit von rund 6120 Bytes/s (161 Systemtakte pro Byte). Damit die DMA-Zugriffe des VIC auf das Video-RAM (aufgrund von Badlines) dieses Timing nicht stören, wird während der Datenübertragung die Bildschirmausgabe abgeschaltet.
Zur Überprüfung der Synchronisation sendet die Floppy vor jedem Datenblock ein einzelnes Byte mit dem Wert $55, und bei Fehlern ein Byte mit dem Wert $FF. Seitens des C64 wird dieses Byte überprüft und im Fehlerfall das Laden mit einem ?LOAD ERROR abgebrochen.
Weil die ATN-Leitung periodisch zu Synchronisationszwecken missbraucht wird, muss die Floppy das einzige Peripheriegerät am IEC-Bus sein. Ansonsten würden weitere Geräte auf das ATN-Signal reagieren, indem sie die DATA-Leitung auf Low-Pegel ziehen und damit das Hypra-Load-Protokoll stören.
Fehler im Programmcode[Bearbeiten | Quelltext bearbeiten]
Bei der Durchsicht des kommentierten Assemblerlistings fallen die folgenden Punkte auf:
- Während der Initialisierung wird beim Umkopieren des BASIC- und KERNAL-ROM in das darunterliegende RAM wird der komplette Adressbereich $A000...$FFFF, also auch der I/O-Bereich, gelesen und sofort zurückgeschrieben. Insbesondere wird hierbei der aktuelle Stand des Timers A von CIA 1 an Adresse $DC04/$DC05 gelesen als neuer Startwert zurückgeschrieben, wodurch die Frequenz des Systeminterrupts erhöht wird. Ein Kaltstart am Ende der Routine
P_AR
, der die I/O-Bausteine reinitialisiert, kaschiert diesen Fehler. - Als Überprüfung, ob neben der Floppy #8 noch weitere IEC-Geräte am IEC-Bus angeschlossen sind, wird an die Geräteadressen 1...15 testweise ein LISTEN-Kommando versandt (Routine
P_AQ
). Korrekterweise müssten hierbei aber die Adressen 4...30 gescannt werden, da dies der für IEC-Geräte reservierte Adressbereich ist. - Das Umkopieren der Floppy-seitigen Schnellladeroutinen in das RAM des Diskettenlaufwerks geschieht mit 19 einzelnen "Memory-Write"-Kommandos, von denen jedes einzelne 30 Bytes überträgt (insgesamt also 19 * 30 = 570 Bytes). Da diese Routinen aber insgesamt nur 506 Bytes lang sind, würden 17 Kommandos für die Übertragung ausreichen (17 * 30 = 510 Bytes) — und das Weglassen der letzten beiden "M-W"-Kommandos würde jeden Ladevorgang um rund 90 ms beschleunigen.
- Nach dem Aufruf der Schnellladeroutine im RAM der Floppy beendet Hypra-Load diesen Kommunikationsschritt mit einem UNTALK-Kommando (am Ende der Routine
P_AA
). Da die Floppy zuvor jedoch die Rolle des Listener innehatte, müsste korrekterweise das Kommando UNLISTEN versandt werden. - An zahlreichen Stellen findet sich unnötiger und meist unerreichbarer Code. Hierzu gehören Reste der von Hypra-Load überschriebenen ROM-Routinen für RS232 (Routinen
P_AG
,P_AH
undP_AI
), Relikte von DATA-Zeilen am Ende des Programms, ein unerreichbarer Unterprogrammaufruf am Ende des BASIC-Starters, und mit NOPs überschriebene Codeteile am Ende der RoutinenP_AA
undP_AK
sowie am Anfang und am Ende vonP_AN
. Am Ende von RoutineP_AQ
ist zudem ein Codeteil nur unvollständig durch NOPs ersetzt, so dass dort fälschlicherweise durch einen teilweise überschriebenen Maschinensprachebefehl ein Parameter der Tastaturabfrage hochgezählt wird. - Die Synchronisationsbytes $55 bzw. $FF vor dem Beginn jedes Datenblocks werden nicht mit den üblichen Kommunikationsroutinen (Floppy-seitig ab
AK09
, C64-seitig abAC03
) versandt, sondern besitzen eigene, geringfügig langsamere Übertragungsroutinen (Floppy-seitig abAL02
, C64-seitig abAB02
). Durch die Wahl der Synchronisationsbytes (binär %01010101 bzw. %11111111) ist dieser Aufwand allerdings überflüssig, da jedes dieser Bytes aus vier gleichen Bitpaaren besteht und somit durch ein einmaliges Ansteuern der Leitungen DATA und CLOCK übertragen werden kann.
Hypra-Load 2.1[Bearbeiten | Quelltext bearbeiten]
Bedienung ohne Auto-Load[Bearbeiten | Quelltext bearbeiten]
In der normalen Betriebsart wird Hypra-Load mit
LOAD"*",8,1
geladen. Es muss also das erste Programm auf der Diskette sein. Es installiert sich automatisch, RUN muss nicht eingegeben werden. Wenn die Meldung mit den Namen der Autoren auf dem Schirm erscheint, ist der Schnelllader aktiv. Der Zusatz ",8,1" hinter dem LOAD-Befehl ist schon fest vorgegeben, so dass LOAD immer von Diskette lädt.
Bedienung mit Auto-Load[Bearbeiten | Quelltext bearbeiten]
Eine Grundvoraussetzung ist, dass der erste Buchstabe des Dateinamens von Hypra-Load ein Aufwärtspfeil ist:
LOAD "↑*PROGAMM",8,1
- Zuerst wird das 5 Blöcke große Hypra-Load 2.1 geladen und automatisch gestartet.
- Danach wird automatisch die Datei mit dem Namen ab dem dritten Zeichen des LOAD-Parameters, also "PROGRAMM" beschleunigt geladen, abschließend Hypra-Load abgeschaltet und das Programm automatisch gestartet.
Ein späteres Nachladen erfolgt in Normalgeschwindigkeit. Dies ist die effektivste Einsatzmöglichkeit eines Softwareschnellladers.
Schwächen[Bearbeiten | Quelltext bearbeiten]
Hier gilt im Wesentlichen das für Hypra-Load Gesagte. Die Gerätenummer des Laufwerks lässt sich hier allerdings nicht mehr durch Änderungen von DATA-Zeilen in einem Listing anpassen. Stattdessen muss der Binärcode an den Stellen, an denen die Gerätenummer steht, modifiziert werden. Dies kann mit Hilfe des folgenden kleinen BASIC-Programms geschehen. Dieses liest die Datei "HYPRA-LOAD V2.1" von Diskette, trägt wo nötig die Geräteadresse 9 ein (konfigurierbar in Zeile 10) und speichert das Ergebnis unter dem Namen "HYPRA-LOAD V2.1 U 9":
10 A=9:REM NEUE GERAETENUMMER 20 OPEN2,8,2,"HYPRA LOAD V2.1,P,R" 30 OPEN3,8,3,"HYPRA V2.1 U"+STR$(A)+",P,W" 40 FORN=0TO1214:GET#2,B$:B=ASC(B$+CHR$(0)) 50 IF (N=80) OR (N=163) OR (N=1034) THEN B=A 60 PRINT#3,CHR$(B);:NEXTN:CLOSE2:CLOSE3
Übertragungsprotokoll[Bearbeiten | Quelltext bearbeiten]
Die Übertragung der einzelnen Datenbytes geschieht wie schon bei Hypra-Load 1.0 parallel auf den Leitungen DATA und CLOCK, über die wieder alle 24 Systemtakte ein Bitpaar übertragen wird. Die empfangenen Bytes werden allerdings nicht mehr zunächst in einem Puffer zwischengespeichert, sondern direkt an die endgültige Ladeadresse im Speicher geschrieben. Dies erspart das spätere Umkopieren der Daten, jedoch wird nur noch alle 183 Systemtakte ein Byte eingelesen (entsprechend einer Datenrate von 5384 Bytes/s).
Die wichtigste Neuerung gegenüber Hypra-Load 1.0 ist allerdings, dass für die Synchronisation vor jedem Datenbyte nicht mehr die ATN-Leitung missbraucht wird. Stattdessen bringt die Floppy unmittelbar nach dem Starten der Schnelllade-Routine die CLOCK-Leitung auf Low-Pegel. Möchte der C64 nun Daten empfangen, so meldet er dies durch DATA=Low. Durch CLOCK=High signalisiert daraufhin die Floppy ihre Sendebereitschaft, was der C64 mit DATA=High quittiert - und anschließend wird sofort ein Datenbyte mit voller Geschwindigkeit übertragen. Abschließend kehrt die Floppy in den Ausgangszustand zurück, indem sie wieder die CLOCK-Leitung auf Low bringt. Durch diese Neuerung brauchen weitere, am IEC-Bus angeschlossene Geräte nicht mehr abgeschaltet zu werden, da sie Übertragung nicht mehr stören.
Fehler im Programmcode[Bearbeiten | Quelltext bearbeiten]
Die meisten der bei Hypra-Load 1.0 aufgefallenen Fehler sind mit Version 2.1 korrigiert. Im kommentierten Assemblerlisting zeigen sich noch die folgenden Punkte:
- Falls die Synchronisation am Anfang eines Datenblocks scheitert, so wird in Routine
P_AB
aufgrund des Fehlercodes $FF zum LabelAB13
verzweigt. Von dort springt Hypra-Load nach wenigen Maschinenbefehlen weiter zur noch nicht initialisierten Routine an AdresseTARGET2=$0061
, stößt dort üblicherweise auf einen BRK-Befehl und endet mit einem Warmstart. Korrekterweise sollte aufgrund des Fehlercodes zum LabelAB11
verzweigt werden, wo Hypra-Load einen ?LOAD ERROR meldet. - Obwohl der Code für den Abschluss des Ladevorgangs in der Zeropage ab Adresse
TARGET2=$0061
liegt, kommen beim Initialisieren dieses Adressbereichs Schreibzugriffe mit absoluter Adressierung zum Einsatz (ab LabelAD03
). Das Programm ist dadurch geringfügig länger und langsamer als nötig.
Aktivierung und Deaktivierung[Bearbeiten | Quelltext bearbeiten]
Mit POKE 1,55
wird Hypra-Load nach dem Programmstart deaktiviert, beziehungsweise mit POKE 1,53
wieder aktiviert.
Quellen[Bearbeiten | Quelltext bearbeiten]
Weblinks[Bearbeiten | Quelltext bearbeiten]
Wikipedia: Hypra Load |