Magic Disk 64

home to index to html: MD9207-KURSE-FLOPPY-KURS_3-B.html
MD9207-KURSE-FLOPPY-KURS_3-B.hires.png
Daraus ergibt sich nun die folgende Sek-
torenverteilung:                        
Spuren  Sektoren-pro-Spur               
-------------------------               
  1-17         21                       
 18-24         19                       
 25-30         18                       
 30-35         17                       
Wichtig ist, daß  Sie  wissen,  wieviele
Sektoren  ein  bestimmter  Track hat, da
wir diese Information bei den  Direktzu-
griffsbefehlen  benötigen, um einen spe-
ziellen  Block  anzusprechen.  Versuchen
Sie  nun  aber  Sektor 19 von Spur 35 zu
lesen, so erhalten  Sie  natürlich  eine
Fehlermeldung von der Floppy zurück (ob-
wohl es einen Sektor 19 bei  den  Tracks
1-24 gibt!).                            
DIE FLOPPY - EIN EIGENSTÄNDIGER COMPUTER
Wie ich vielleicht schon einmal erwähnte
stellt  die  1541  einen   vollblütigen,
unabhängen  Computer  dar.  Sie  verfügt
über einen eigenen 8-Bit-Prozessor  (den
6502,  der  Vorgänger  des  6510 aus dem
64er, der auch im VC20 Verwendung fand),
zwei I/O Bausteine,  die  man  auch  VIA
nennt (Typ 6522, das Vorläufermodell des
6526-CIA-Chips,  wie  er auch zweimal im
C64 vorhanden ist, und ebenfalls im VC20
eingesetzt war), einem 16-KB-ROM mit dem
Betriebssystem (DOS)  und  2KB  RAM  als
Arbeitsspeicher  für  letzeres  und Zwi-
schenspeicher für  Diskettenblocks.  Die
VIA-Bausteine  übernehmen  dabei den Da-
tentransfer mit dem 64er, sowie die  Be-
dienung  der  Floppymechanik.  Natürlich
können Sie dem Floppyprozessor auch  ein
Programm  geben, das er abarbeiten soll.
Dieses muß in Maschinensprache geschrie-
ben sein, wobei der Befehlssatz des 6502
identisch  mit  dem  des  6510  (aus dem
64er) ist.  Die  Speicheraufteilung  der
Floppy sieht folgendermaßen aus:        
Adresse       Belegung                  
----------------------------------------
$0000-$0800   2KB RAM                   
ab $1800      VIA1 (serieller Bus)      
ab $1C00      VIA2 (Laufwerkssteuerung) 
$C000-$FFFF   Betriebssystem-ROM (16 KB)
Alle übrigen Bereiche sind unbelegt. Wie
beim C64 auch, können Sie mit einem Pro-
gramm,  daß  sich im Floppy-RAM befindet
die  Betriebssystemroutinen  der  Floppy
aufrufen  (so  funktionieren z.B. einige
Software-Floppyspeeder).                
Kommen wir nun zum RAM der Floppy,  denn
das  soll  uns eigentlich interessieren.
Ein Datenblock auf einer  Diskette  ist,
wie  Sie  wissen  256  Bytes lang. Diese
Datenlänge wird auch als Einheit für das
Floppy-RAM benutzt: 256 Byte entsprechen
einer sogenannten "Page" (engl.  "Seite"
-  den Assemblerprogrammierern unter Ih-
nen sicherlich ein geläufiger  Begriff).
Das  Floppy-RAM  wird  nun in acht Pages
unterteilt, die von 0 bis 7  durchnumme-
riert sind. Die Pages 0, 1 und 2 sollten
wir  dabei außer Acht lassen, da sie für
die Zeropage,  den  Stack  und  den  Be-
fehls-puffer  der  Floppy  vorreserviert
sind. Die Pages 3-7 sind Datenpuffer für
Diskettenblöcke. Wir werden sie von  nun
an "Puffer" nennen.                     
DIE DIREKTZUGRIFFSBEFEHLE               
Kommen wir nun endlich zu  den  Blockbe-
fehlen  selbst.  Eigentlich gibt es drei
Gruppen, von  Befehlen,  mit  denen  wir
Abläufe innerhalb des "Floppy-Computers"
steuern  können:  die  Blockbefehle  zum
lesen, schreiben, belegen und  freigeben
von Blocks, die Memorybefehle, mit denen
wir   den  Floppy-Speicher  manipulieren
können und die  User-Befehle,  die  eine
Verkürzung von Block- und Memorybefehlen
darstellen.                             
Bevor  wir  nun einen dieser Befehle be-
nutzen können, müssen wir natürlich  den
Floppybefehlskanal  öffnen.  Da wir aber
immer  auch   einen   Arbeitspuffer   im
Floppy-RAM  benötigen,  um die Direktzu-
griffsbefehle (einige  Blockbefehle  und
zwei  Userbefehle)  anwenden  zu können,
müssen wir gleichzeitig auch einen  Puf-
fer  für  uns  vorreservieren.  Entweder
überlassen wir dabei die Wahl  des  Puf-
fers der Floppy, oder aber wir bestimmen
die  Puffernummer  selbst.  Letztes wird
wohl  nur  in  ganz  besonderen   Fällen
vonnöten  sein,  weshalb wir uns auf die
erste Methode festlegen wollen. Das Üff-
nen  des Befehlskanals mit der Zuweisung
eines Arbeitspuffers geschieht über  das
Üffnen  eines  eigenen  Datenkanals, der
für den  Datentransfer  mit  dem  Puffer
herangezogen  wird.  Dies geschieht fol-
gendermaßen:                            
OPEN 1,8,15     :REM Befehlskanal öffnen
OPEN 2,8,2,"#"  :REM Pufferkanal öffnen 
Hier öffnen wir  also  wie  gewohnt  den
Befehlskanal, dem wir die logische File-
nummer  1  zuordnen.  Der  zweite  OPEN-
Befehl  öffnet  einen  Kanal zur Floppy,
den wir zum Auslesen und Schreiben unse-
res  Datenpuffers  verwenden werden. Das
Doppelkreuz ("#") zeigt der  Floppy  an,
daß  wir  mit einem Datenpuffer arbeiten
möchten. Welche Nummer dieser  hat,  sei
der  Floppy  überlassen.  Sie  sucht nun
einfach einen  freien  Puffer  aus,  und
ordnet ihm unserem Kanal zu. Möchten wir
wissen, welcher Puffer ausgewählt wurde,
so  können  wir seine Nummer direkt nach
dem Üffnen durch Lesen des  Pufferkanals
erfahren:                               
GET#2,PN$                               
PRINT ASC(PN$)                          
Hierbei ist  es  wichtig,  daß  Sie  den
GET-Befehl   innerhalb  eines  Programms
benutzen,  da  er  vom  Direktmodus  aus
nicht verwendbar ist.                   
Wenn wir gleich einen bestimmten  Puffer
für  uns  reservieren möchten, so müssen
wir beim OPEN-Befehl einfach die Puffer-
nummer  mit  übergeben. Folgender Befehl
reserviert den Puffer Nummer 3  (Floppy-
Adressbereich $0300-$03FF) für uns:     
OPEN 2,8,2,"#3"                         
Wichtig  ist, daß wir uns die Sekundära-
dresse merken, mit der wir den Pufferka-
nal  geöffnet  hatten.  Sie  wird später
dazu verwendet, um der Floppy  mitzutei-
len auf welchem Datenkanal Sie Daten für
uns  bereitzustellen  hat,  bzw. von uns
empfangen wird (ähnlich den Befehlen für
die   RELative   Dateiverwaltung).   Wie
üblich wählen wir bei der Sekundäradres-
se eine der freien Nummern von 2-14.    
DIE BLOCKBEFEHLE                        
Nachdem wir nun einen Datenpuffer reser-
viert haben und einen Filekanal für die-
sen Puffer offen halten, können wir  uns
jetzt mit den Befehlen beschäftigen, die
wir  der  Floppy geben können. Die erste
Gruppe dieser Befehle sind die  Blockbe-
fehle.  Mit ihnen können wir die einzel-
nen Blocks einer  Diskette  "hardwaremä-
ßig" ansprechen. Aufgrund eines Blockbe-
fehls wird physisch auf den Block  zuge-
griffen  und  in  den Puffer eingelesen,
bzw. aus ihm heraus geschrieben. Für die
Beispiele innerhalb der Befehlsbeschrei-
bungen gelten die obig definierten logi-
schen Filenummern (Befehlskanal=1,  Puf-
ferkanal=2),  sowie die Sekundärdresse 2
für den Pufferkanal.                    
1) BLOCK-READ ("B-R")                   
Mit  diesem  Blockbefehl lesen wir einen
Diskettenblock  in  unseren  Datenpuffer
ein.  Hierbei  müssen wir die Sekundära-
dresse unseres Pufferkanals, die  Drive-
nummer (immer 0), den Track und den Sek-
tor als Parameter  übergeben.  Hier  die
allgemeine Syntax:                      
PRINT#BFN,"B-R";SA;DN;TR;SE             
Hierbei gilt:                           
BFN = logische Filenummer des Befehlska-
      nals                              
 SA = Sekundäradresse des Pufferkanals  
 DN = Drivenummer (immer 0)             
 TR = Tacknummer                        
 SE = Sektornummer                      
(Diese  Variablennamen  und  Abkürzungen
werde  ich  auch im Folgenden weiterver-
wenden.)                                
Mit der folgenden  Anweisung  wird  also
Sektor  1 von Track 18 in unseren Puffer
eingelesen. Von dort aus können Sie  Ihn
nun mittels einer GET-Schleife auslesen:
...                                     
100 PRINT#1,"B-R 2 0 18 1"              
110 FOR I=0 TO255                       
120 GET#2,a$: PRINT ASC(a$)             
130 NEXT                                
...                                     
2) BLOCK-WRITE ("B-W")                  
Mit  diesem  Blockbefehl  schreiben  wir
einen Block aus unserem Datenpuffer  auf
die  Diskette.  Seine  Syntax ist analog
der von "B-R", nur daß diesmal der Block
geschrieben wird:                       
PRINT#BFN,"B-W";SA;DN;TR;SE             
3) BUFFER-POINTER ("B-P")               
Für  jeden  Datenpuffer  der Floppy exi-
stiert ein Zeiger, der auf das  aktuelle
Byte im Puffer zeigt. Möchte man nun ein
ganz spezielles Byte aus dem Puffer aus-
lesen, so muß nicht unbedingt der  ganze
Puffer gelesen werden, um das gewünschte
Byte  zu  erhalten.  Sie  können mit dem
"B-P"-Befehl den Pointer  auf  selbiges 
positionieren und anschließend auslesen.
Als  Parameter benutzen Sie ganz einfach
die Sekundäradresse des Pufferkanals und
die Nummer des gewünschten  Bytes  minus
1. Möchten Sie z.B. das 200. Byte ausle-
sen, so gehen Sie bitte wiefolgt vor:   
PRINT#1,"B-P 2 199"                     
GET#2,A$: A=ASC(A$)                     
Die  zweite, oben angeführte Zeile liest
nun das 200. Byte in eine Stringvariable
und speichert es als Zahl in der  Varia-
blen "A".                               
4) BLOCK-ALLOCATE ("B-A")               
Mit  diesem  Floppybefehl können Sie ge-
zielt einzelne Disketten-Blocks als "be-
legt" kennzeichnen. Das ist dann notwen-
dig, wenn Sie Daten  mittels  "B-W"  auf
einer   Diskette  speichern,  zusätzlich
aber noch normale DOS-Files darauf able-
gen wollen. Wird ein Block nämlich nicht
als  belegt  gekennzeichnet,  so wird er
beim  Speichern  eines  DOS-Files  unter
Umständen  überschrieben.  Die  belegten
Blocks sind  in  der  "Block-Allocation-
Map"  (BAM)  einer Diskette gespeichert,
die sich in Block 18,0 befindet. Mit dem
Block-Allocate-Befehl wird hier dann der
entsprechende Block als belegt eingetra-
gen.  Mehr zum Aufbau der BAM werden wir
im nächsten Teil des Floppy-Kurses  ler-
nen.  Die  allgemeine  Syntax des "B-A"-
Befehls lautet:                         
PRINT#BFN,"B-A"; DN; TR; SE             
Möchten Sie also z.B. den  Block  5  von
Spur 34 als belegt kennzeichnen, so müs-
sen Sie folgenden Befehl benutzen:      
PRINT#1,"B-A 0 34 5"                    
5) BLOCK-FREE ("B-F")                   
Dieser  Befehl  ist  das  Gegenstück  zu
Block-Allocate.  Mit ihm geben Sie einen
belegten  Block  wieder  zur   Benutzung
frei.  Die Syntax ist dabei identisch zu
"B-A":                                  
PRINT#BFN,"B-F"; DN; TR; SE             
Um  den obig belegten Block wieder frei-
zugeben senden Sie den folgenden  Befehl
an die Floppy:                          
PRINT#1,"B-F 0 34 5"                    
6) BLOCK-EXECUTE (B-E)                  
Dieser  Befehl  ist identisch mit Block-
Read. Er beinhaltet  jedoch  zusätzlich,
daß  der Diskettenblock, der in den Puf-
fer geladen werden soll, ein  ausführba-
res  Floppy-Programm  ist,  das nach dem
Laden direkt angesprungen wird.         
DIE MEMORYBEFEHLE                       
Diese  Floppybefehle  beziehen  sich auf
die Floppy selbst und haben mit dem  Di-
rektzugriff  nur indirekt zu tun. Trotz-
dem sind sie nützlich zum Auswerten  von
Daten, weshalb sie hier aufgeführt sind:
1) MEMORY-READ ("M-R")                  
Dieser  Befehl  enstspricht  dem   PEEK-
Befehl  von  BASIC.  Mit  ihm können Sie
gezielt einzelne, oder mehrere Speicher-
adressen der Floppy auslesen. Die allge-
meine Syntax lautet dabei wiefolgt:     
PRINT#BFN,"M-R"; CHR$(LO); CHR$(HI);    
CHR$(N)                                 
Hierbei stehen "LO" und  "HI"  für  Low-
und  Highbyte  der  Adresse  die gelesen
werden soll und "N" für die Anzahl Bytes
(0-255), die ab dort  übertragen  werden
sollen.  Das  Low-  und  Highbyte  einer
Adresse ermitteln Sie mit folgenden For-
meln:                                   
HI=INT(Adresse/256)                     
LO=Adresse-256*HI                       
Alle Parameter  müssen  als  CHR$-Codes,
also dirket, übertragen werden, und dür-
fen nicht als ASCII-Codes  (wie  in  den
bisherigen  Befehlen) erscheinen. Die zu
lesenden Bytes werden ebenfalls als  ab-
soluter  CHR$-Code  auf dem BEFEHLSKANAL
(!) bereitgestellt (nicht etwa  auf  dem
Pufferkanal,  da der interne Floppyspei-
cher nichts mit Datenblocks zu tun hat).
Als Beispiel  für   die  Verwendung  von
"M-R" sei folgendes Programm aufgeführt.
Es  liest  den ASCII-Code der ID der zu-
letzt initialisierten Diskette  aus  dem
Floppyspeicher   aus.  Dieser  wird  vom
Floppy-Betriebssystem automatisch in den
Speicherstellen 18  und  19  gespeichert
(LO=18; HI=0; N=2):                     
10 OPEN 1,8,15                          
20 PRINT#1,"M-R"; CHR$(18);  CHR$(0);   
CHR$(2)                                 
30 GET#1,I1$: GET#1,I2$                 
40 CLOSE 1                              
50 PRINT "ID DER ZULETZT BENUTZTEN DIS  
KETTE: ";I1$;I2$                        
2) MEMORY-WRITE                         
Mit diesem Befehl schreiben Sie Daten in
den Floppy-Speicher.  Er  entpricht  dem
POKE-Befehl  von  BASIC. Auch hier über-
tragen Sie zunächst die Adresse in  Low-
und  Highbytedarstellung,  sowie die An-
zahl der zu schreibenden Bytes. Letztere
hieraufhin gesandt. Hier die  allgemeine
Syntax:                                 
PRINT#BFN,"M-W";   CHR$(LO);   CHR$(HI);
CHR$(N);    CHR$(W1);   CHR$(W2);   ...;
CHR$(Wn-1); CHR$(Wn)                    
3) MEMORY-EXECUTE                       
Dieser  Befehl dient dem Ausführen eines
Assembler-Programms    innerhalb     der
Floppy. Damit hat auch er einen Verwand-
ten in BASIC: den SYS-Befehl. Als  Para-
meter übergeben Sie hier einfach nur die
Startadresse  des  aufzurufenden  Assem-
bler-Programms:                         
PRINT#BFN,"M-E"; CHR$(LO); CHR$(HI)     
DIE USERBEFEHLE                         
Die  dritte  Gruppe  der  Floppy-Direkt-
Befehle sind die Userbefehle. Sie  stel-
len  eine Abkürzung von einigen Befehlen
aus den anderen beiden Gruppen dar.  Die
Userbefehle beginnen alle mit einem "U",
gefolgt von einer Zahl zwischen 1 und 9.
Die  ersten beiden Userbefehle sind wohl
die wichtigsten:                        
1) "U1"                                 
Der  U1-Befehl  ersetzt  den Block-Read-
Befehl. In der Praxis wird er öfter ver-
wendet, da er gegenüber "B-R" einen Vor-
teil bietet. Wird mit  "B-R"  ein  Block
eingelesen  und  anschließend der Inhalt
des Puffers vom 64er aus ausgelesen,  so
wird  das  erste  Byte nicht mitgesandt.
Möchten wir dieses nun aber auch  lesen,
so  müssen wir den "U1"-Befehl benutzen.
Er sendet es zusätzlich mit - im Prinzip
ist der U1-Befehl also besser als "B-R".
Die Syntax ist  identisch  mit  der  von
"B-R":                                  
PRINT#BFN,"U1"; SA; DN; TR; SE          
Ansonsten  verhält  sich  alles  so, wie
auch bei "B-R".                         
2) "U2"                                 
Der  zweite Userbefehl ist der U2-Befehl
(Ähnlichkeiten mit dem Namen  einer  be-
kannten  Rock-Band  sind rein zufällig).
Er ersetzt den "B-W" Befehl.  Auch  hier
ist  der  Vorteil des ersten Bytes gege-
ben. Sie benutzen den U2-Befehl, wie den
"B-W"-Befehl:                           
PRINT#LFB,"U2"; SA; DN; TR; SE          
3) "U3-U8"                              
Diese  sechs  Userbefehle  ersetzen ganz
bestimmte  "M-E"-Kommandos.  Wird  einer
dieser  Befehle  gesandt, so springt die
Floppy in eine Sprungtabelle ab  Adresse
$0500  und  führt das dort stehende Pro-
gramm aus. In der Regel besteht selbiges
aus  einer  Reihe   von   "JMP   $XXXX"-
Anweisungen,  mit denen Sie nun auf ein-
fache Weise, vom 64er  aus,  selbstdefi-
nierte  Programme in der Floppy aktivie-
ren können. Die Userbefehle 3-8  benöti-
gen  keine  Parameter. Bei Benutzung der
Befehle werden folgende Adressen jeweils
angesprungen:                           
Befehl  Springt an Adresse              
--------------------------              
   U3       $0500                       
   U4       $0503                       
   U5       $0506                       
   U6       $0509                       
   U7       $050C                       
   U8       $050F                       
Damit  ersetzen  diese  Userbefehle also
"M-E"-Befehle wie z.B.:                 
PRINT#BFN,"M-E";CHR$(9);CHR$(5);        
Wenn Sie den obigen Befehl abkürzen wol-
len, so genügt auch ein einfaches:      
PRINT#BFN,"U6"                          
4) "U9"                                 
Der "U9"-Befehl wurde eingebaut, um  die
Kompatibilität  der  1541  zum VC20, dem
Vorgänger des C64, zu  wahren.  Mit  ihm
können  Sie  die Floppy in den Modus des
entsprechenden Rechners  schalten.  Dies
geschieht  über  folgende  Kombinationen
des "U9"-Befehls:                       
PRINT#BFN,"U9+"; schaltet in C64-Modus  
PRINT#BFN,"U9-"; schaltet in VC20-Modus 
5) "U:"                                 
Mit  diesem  Userbefehl  lösen Sie einen
RESET in der Floppy aus.  Das  Floppysy-
stem  wird dann wieder in den Einschalt-
zustand zurückversetzt. Der  "U:"-Befehl
entspricht  einem  "SYS 64738" beim C64.
Auch er benötigt keine Parameter.       
Das war es dann wieder für diese  Ausga-
be.  In  der  nächsten Magic-Disk werden
wir uns dann mit dem Aufbau von  Files, 
der BAM und des Directorys beschäftigen.
In  diesem  Zusammenhang werden wir dann
die  hier  erlernten  Floppy-Befehle  in
praktische Beispiele umsetzen.          
                                    (ub)



Valid HTML 4.0 Transitional Valid CSS!