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 begeistert bei der Sache!
Da sie das erforderliche Basiswissen bereits 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 konzentrieren, 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 schwertun, 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 versuchen, Ihnen die Kunst des Floppyprogrammierens von Grund auf zu vermitteln!
Anhand von vielen Beispielen, deteilierten 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 Erfahrung im Umgang mit einem Assembler
oder einem Monitor voraussetzen, denn
die Floppy lediglich in Basic zu programmieren ist für ein Vorhaben, wie das
Unsere praktisch unmöglich. In diesem
Teil des Kurses kommt es lediglich darauf an, den Sinn in die Anwendungsmöglichkeiten, der Floppy Kommandos zu verdeutlichen, 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 beginnen.
Die BLOCK-Befehle:
Voraussetzung für die sachgemäße Anwendung dieser Befehle ist die Kenntnis des
Diskettenaufbaus. Dieser wurde bereits
in dem Anfängerkurs deteilliert besprochen.
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 gewünschte Track+ Sektor geschrieben wird!
Syntax:
print# Fn," br" ; 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 Befehl 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 gefragt, 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 Gegenstück zum B-R. Hierbei wird der Inhalt eines Buffers auf Diskette zurückgeschrieben.
Syntax:
print# Fn," bw" ; 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 Befehlsfolge 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 entsprechenden Syntax dazu!
Syntax:
Print# Fn," bp" ; 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 Programm 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 Programm 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," ba" ; Dn; T; S
Beispiel:
print# Fn," ba 0231"
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 Beispiel 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 Speicherstelle beschrieben werden. Theoretisch
deshalb, weil immer nur der Speicherbereich 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 Maschinenprogramme im Speicher der Floppy starten
Man benutzt den ' M-E' sehr häufig im Zusammenhang mit dem ' M-W' Befehl, wobei
der ' M-W' die Bytefolge einer spezielle
Maschinenroutine ( Fast-Loader oder Kopierschutz) in den Floopy-Puffer schreibt
von wo aus, sie mit einem ' M-E' Befehl
gestartet oder initialisiert wird.
Die Syntax zum Starten einer Maschinenroutine lautet:
Syntax:
print# Fn," M-E" Chr$( LB) Chr$( HB)