Floppy-Programmierung für Profis
Bevor wir loslegen möchte ich mich kurz vorstellen: Ich heiße Frank Boldewin und besitze bin seit 1985 Besitzer meines C64'ers! Seit etwa zwei Jahren versuche ich die letzten Geheimnisse der Floppy zu ergründen und bin auch heute noch be- geistert bei der Sache! Da sie das erforderliche Basiswissen be- reits von meinen Kollegen Uli Baster und seinem überaus ausführlichen Floppy-Kurs vermittelt bekommen haben, möchte ich, um lästige Wiederholungen zu vermeiden, mit meinem Kurs ganz andere Schwerpunkte setzen. Wie werden uns in erster Linie auf die Programmierung von Routinen kon- zentrieren,die allgemein als kompliziert angesehen werden,wie z.B.ein Fast-Loader oder ein Kopierschutz. Sie brauchen keine Angst zu haben, daß dieser Kurs nur für Profis gemacht ist, die soweit fortgeschritten sind, daß man ihnen kaum noch etwas beibringen kann. Jede Routinen die ich ihnen im Laufe dieses Kurses vorstelle, wird genaustens erklärt,so daß sie gegen Ende des Kurses ganz allein in der Lage sein werden ihren eigenen Fast-Loader zu schreiben. Floppy Programmierer werden sich schwer- tun, um in den Besitz geeigneter Lektüre zu gelangen. Verglichen mit dem geradezu üppigen Literatur Angebot, daß für den C64 vorzufinden ist,kann man das derzeit für die Floppy vorliegende Angebot nur als mager bezeichnen. Deshalb werde ich in dieser und den nächsten Ausgaben ver- suchen, Ihnen die Kunst des Floppypro- grammierens von Grund auf zu vermitteln! Anhand von vielen Beispielen, deteilier- ten Erklärungen und unter Vermeidung langatmiger theoretischer Beschreibungen dürfte es eigentlich kein Problem sein ans gewünschte Ziel zu gelangen. Zunächst aber eine kleine Übersicht über den Inhalt des gesamten Kurses. Inhalt:
Teil 1: 1.Block Befehle 2.User Befehle 3.Memory Befehle 4.der VIA 6522 Teil 2: 1.die BAM 2.Aufbau von Files 3.Laden+Speichern von Files 4.Zero-Page Adressen Teil 3: 1.Fehlerkanal lesen 2.Lesen+Schreiben eines Blocks 3.Jobspeicher 4.Jobcodes Teil 4: 1.die Floppy Zero-Page 2.SYNC Markierungen 3.Pruefsummen 4.Aufbau einer formatierten Disk Teil 5: 1.Whole Load+Save 2.DIR Routine 3.Kopierschutz Teil 6: 1.Diskcontroller 2.Buscontroller 3.Fastload
Soweit zum Kursinhalt. In diesem Teil wollen noch einmal sämtliche Floppy- Befehle zusammenfassen und anhand von Basic Routinen kurz erläutern. In dem Nächsten un allen weiteren Kursen muß ich leider zum besseren Verständnis der abgedruckten Programme, etwas Er- fahrung im Umgang mit einem Assembler oder einem Monitor voraussetzen, denn die Floppy lediglich in Basic zu pro- grammieren ist für ein Vorhaben, wie das Unsere praktisch unmöglich. In diesem Teil des Kurses kommt es lediglich da- rauf an, den Sinn in die Anwendungsmög- lichkeiten, der Floppy Kommandos zu ver- deutlichen, da wir nicht noch einmal auf jede Einzelheit eingehen können. Die Profis unter Ihnen werden erst, in den nächsten Teilen auf Ihre Kosten kommen, wenn wir mit einem (extra für diesen Kurs entwickelten) Machinensprachmonitor der Floppy auf den Leib rücken. Nach dieser Vorrede, möchten wir nun endlich mit dem eigentlichen Kurs be- ginnen.
Die BLOCK-Befehle: ------------------
Voraussetzung für die sachgemäße Anwen- dung dieser Befehle ist die Kenntnis des Diskettenaufbaus. Dieser wurde bereits in dem Anfängerkurs deteilliert be- sprochen.
Der BLOCK-READ Befehl (B-R) ---------------------------
Angenommen Sie möchten gerne einen einzelnen Block von der Diskette lesen! Kein Problem, denn Abhilfe schafft der BLOCK-READ Befehl! Er bewirkt, daß in einen vorher definierten Puffer der ge- wünschte Track+Sektor geschrieben wird! Syntax: print# Fn,"b-r";Cn;Dn;T;S Erklaerung der Abkuerzungen:
Fn (Filenumber 1-127) Cn (Channelnumber 2-14) Dn (Drivenumber 0) T+S(Track+Sektor)
Wollen wir also Track 18,Sektor 0 lesen, dann tippen Sie bitte folgende Befehle ein:
OPEN1,8,2,"#" OPEN15,8,15 PRINT#15,"B-R 2 0 18 0" CLOSE1 CLOSE15
Nachdem dieser Befehl ausgeführt wurde, fragen Sie sich sicher, weshalb die 'OPEN' Befehle am Anfang. OPEN1,8,2,"#" Ist notwendig,da vor jedem Direktzugriff ein Puffe r reserviert werden muß. Wir haben uns einen beliebigen gewählt, weil es in dem Fall egal war! Wollen wir aber einen bestimmten Puffer ansprechen, z.B. Puffer 1, dann geben sie bitte folgendes ein: OPEN1,8,2,"#1" Syntax: open Fn,Dr,Cn,"#" Bedeutungen der Abkuerzungen:
Fn (Filenumber 1-127) Dr (Devicenumber 8-11) Cn (Channelnumber 2-14) Fehlt also nur noch der andere 'OPEN' Befehl. OPEN15,8,15
Ist notwendig, um den Kommandokanal zu öffnen, da alle BLOCK- MEMORY- und USER- Befehle Kommandos sind. Zum B-R selbst muß man sagen, daß sich leider damit das erste Byte eines Blocks nicht lesen läßt. Im Laufe dieses Kurs werden wir aber noch einen anderen Be- fehl kennenlernen, der auch dieses Byte lesen kan. Ich möchte jedoch noch mal kurz auf die Kanäle der Floppy zurückgreifen, da dort dort sicherlich noch einige Fragen offen geblieben sind. Wahrscheinlich haben sie sich schon ge- fragt, warum man erst ab Kanal 2 mit dem Block-Befehl arbeiten kann. Dies liegt daran, weil die Kanäle 0+1 für das Laden und Speichern schon verwendet werden. Der Kanal 15 wird benötigt um bestimmte Kommandos auszuführen,wie z.B. format, scratch, init usw.! Das gilt natürlich auch für alle anderen Befehle! Schauen wir uns als nächstes doch mal den BLOCK-WRITE Befehl an.
Der BLOCK-WRITE Befehl (B-W) ----------------------------
Dieser Befehl ist das entsprechende Ge- genstück zum B-R. Hierbei wird der In- halt eines Buffers auf Diskette zurück- geschrieben. Syntax: print# Fn,"b-w";Cn;Dn;;T;S Beispiel:
OPEN1,8,2,"#" OPEN15,8,15 PRINT#15,"B-W 2 0 18 0" CLOSE1 CLOSE15
Man sieht schon das er in der Befehls- folge fast identisch mit dem B-R Befehl ist. Eine ausführliche Erläuterung der Befehlsfolge erübrigt sich daher.
der BUFFER-POINTER (B-P) ------------------------
Nehmen wir einmal an Sie möchten anstatt eines ganzen Blocks, nur ein einzelnes Byte aus der Floppy heraus lesen. Kein Problem, den Abhilfe schafft der B-P Befehl. Dazu muß man wissen,daß ein jeder Buffer einen bestimmten Pointer besitzt. In diesen Pointer kann man nun eine Zahl zwischen 0 und 255 schreiben. Diese Zahl sagt der Floppy welches Byte sie aus der Floppy holen soll. Natürlich muß die Floppy auch wissen aus welchem Track und Sektor. Zum besseren Verständnis nun wieder ein kleines Beispiel mit der ent- sprechenden Syntax dazu! Syntax: Print# Fn,"b-p";Cn;Position Beispiel:
OPEN1,8,2,"#0" OPEN15,8,15 PRINT#15,"B-R 2 0 18 0" PRINT#15,"B-P 2 2" GET#1,A$ A=ASC(A$+CHR$(0)) PRINT A CLOSE1 CLOSE15
Wie Sie sehen lesen wir den Directory- Block in den Floppy-Puffer und holen uns das zweite Byte dieses Sektors mit dem B-P Befehl. Anschliessend holen wir uns durch den 'GET'-Befehl das Byte über den Kommando-Kanal ab. Nun kann das Byte auf dem Bildschirm ausgegeben werden! Dies geschieht mit Hilfe von 'PRINT A'. Dieses gelesene Byte hat eine besondere Funktion auf die ich später im Kurs noch zu sprechen komme!
Der BLOCK-EXECUTE Befehl (M-E)
------------------------------ Der B-E Befehl hat die selbe Syntax wie der B-R Befehl. Seine zusätzliche Eigenschaft ist aber, daß er den geladenen Block im Puffer der Floppy als Maschinenprogramm ausführt. Es er- übrigt sich deshalb die Syntax zu diesem Befehl zu erläutern, da er sich wie der B-R Befehl verhält!
B-A(Block Allocate) und B-F(Block-Free):
Stellen sie sich vor Sie haben ein Pro- gramm geschrieben, daß bestimmte Daten verwaltet. Für diese Daten möchten Sie jedoch nicht extra Files anlegen und schreiben die Daten auf einen einzelnen Sektor, mithilfe des Direktzugriffs. Alles schön und gut, aber was passiert, wenn man jetzt noch zusätzlich ein Pro- gramm auf die selbe Diskette speichern möchte? Sehr warscheinlich werden unsere Daten überschrieben, da sie nicht ent- sprechend gekennzeichnet sind! Um sie nun zu kennzeichnen muss man also den B-A Befehl verwenden! Wir wollen nun T 23, S 1 kennzeichnen! Syntax: print# Fn,"b-a";Dn;T;S Beispiel: print# Fn,"b-a 0 23 1" Wollen wir den Sektor wieder freigeben, so benutzen wir den B-F Befehl! Die Syntax zum diesem Befehl ist die selbe wie beim B-A Befehl.
Die MEMORY-BEFEHLE ------------------
Als nächstes möchte ich mich nun den MEMORY-Befehlen zuwenden. Diese Befehle haben eine ähnliche Bedeutung wie der 'PEEK' und 'POKE' Befehl in Basic, nur mit dem wesentlichen Unterschied, daß nicht die Bytes im Computerspeicher, sondern die im Floppyspeicher gelesen und beschrieben werden können.
Der MEMORY-READ Befehl (M-R) ----------------------------
Mit diesem Befehl kann jede beliebige Speicherstelle der Floppy ausgelesen werden.Verglichen mit den Block-Befehlen sind die Memory-Befehle etwas einfacher zu handhaben, wie Ihnen das folgen Bei- spiel geleich zeigen wird. Syntax: print#Fn,"M-R" Chr$(LB) Chr$(HB) chr$(B)
LB=Low Byte Adresse HB=Hi " " B =Anzahl der Bytes
Beispiel:
OPEN 15,8,15 PRINT#15,"M-R" chr$(18) chr$(0) chr$(2) GET#15,a$,b$ PRINT a$;b$ CLOSE1
Mit diesem Befehl wurden die 'ID' Bytes des letzten Lesevorgangs herausgelesen. Diese stehen in der Zeropage in den Speicherstellen 18 und 19. Wir sehen schon, daß auch hier die entsprechenden Werte mit 'get' abgeholt werden.
Der MEMORY-WRITE Befehl (M-W) -----------------------------
Der M-W Befehl ist das entsprechenden Gegenstück zum M-R Befehl. Mit ihm kann theoretisch jede beliebige Speicher- stelle beschrieben werden. Theoretisch deshalb, weil immer nur der Speicherbe- reich eines Rechners beschrieben werden kann, in dem sich auch tatsächlich RAM befindet. Wie der Speicher der Floppy im einzelnen aufgebaut ist, wird am Schluß des Kursteils erläutert. Auf die folgende Weise, können sie eine oder mehrere Daten in den Floppy-Puffer schreiben. Syntax: print#Fn,"M-W" Chr$(LB) Chr$(HB) Chr$(B) Chr$(Data1) Chr$(Data2).........
open 15,8,15 print#15,"M-R" chr$(18) chr$(0) chr$(2) get#15,a$,b$ print a$;b$ close1
Der MEMORY-EXECUTE Befehl (M-E) -------------------------------
Der M-E Befehl entspricht dem SYS-Befehl in Basic. Mit ihm lassen sich Maschinen- programme im Speicher der Floppy starten Man benutzt den 'M-E' sehr häufig im Zu- sammenhang mit dem 'M-W' Befehl, wobei der 'M-W' die Bytefolge einer spezielle Maschinenroutine (Fast-Loader oder Ko- pierschutz)in den Floopy-Puffer schreibt von wo aus, sie mit einem 'M-E' Befehl gestartet oder initialisiert wird. Die Syntax zum Starten einer Maschinen- routine lautet: Syntax: print#Fn,"M-E" Chr$(LB) Chr$(HB)