Magic Disk 64

home to index to text: MD9303-KURSE-FLOPPY_INTERN_1A.txt
          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)

Valid HTML 4.0 Transitional Valid CSS!