Magic Disk 64

home to index to html: MD9303-KURSE-FLOPPY_INTERN_1A.html
          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)        
Valid HTML 4.0 Transitional Valid CSS!