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)