Magic Disk 64

home to index to text: MD9304-KURSE-FLOPPY_INTERN_2.txt
               FLOPPY INTERN            
                  (Teil 2)              

Willkommen zum zweiten Teil unseres Floppykurses!
Da im ersten Teil dieses Kurses so ziemlich alle Möglichkeiten angesprochen und abgehandelt wurden die bei der Floppyprogrammierung von BASIC aus zu realisieren sind, wollen wir ab diesem Kurs in Assembler weiterprogrammieren, da die Routinen, die wir im Laufe der Zeit entwickeln wollen, in Höchstgeschwindlichkeit ablaufen sollen.
Damit dürfte bereits gesagt sein, daß dies kein reiner Einsteigerkurs sein kann und soll. Erfahrungen im Ungang mit einem Monitor oder Assembler und Beherschung der Maschinensprache sind erforderlich.
Zur Programmierung der Floppy ist außerdem noch ein ausgereifter Diskmonitor erforderlich. Weil alle vorhandenen Diskmonitore unseren Ansprüchen nicht entsprachen, hatten wir keine andere Wahl, als uns hinzusetzen und einen eigenen zu schreiben. Das Ergebnis unserer Arbeit finden sie auf SEITE-1 dieser Ausgabe. Es trägt die Bezeichnung " DISKPATCHER" . Da er bereits in diesem Kursteil eingesetz wird, sollten sie sich möglichsr schnell mit seinen Funktionen vertraut machen.
Die Funktionen werden im Laufe dieses Kurses erklärt.
Sollten sie bereits einen Diskmonitor besitzen, mit dem sie gut zurechtskommen, können sie selbstverstänstlich weiterbenutzen.
Doch nun zum eigentlichen Kurs.

               Die BAM                  
               

Gleich zu beginn wollen wir uns mit der " BAM" der 1541 auseinandersetzen!
Die BAM ist der Sektorbelegungsplan der Floppy und ist zu finden in Track 18 und Sektor 0 ! Aufbau der BAM:
Byte: Bedeutung:

000     Tracknum.  fuer Directorybeginn 
001     Sektornum. "     "              
002     Formatkennzeichen (A)           
003     nur fuer 1571                   
004     Freie Sektoren TRACk 1          
005-007 Bitmuster Track 1               
        Bit=1 Sektor frei               
        Bit=0 Sektor belegt             
        Byte 005 - Belegung Sektor 0-7  
        "    006 - "        "      8-16 
        "    007 - "        "     17-23 
008-011 genauso wie Byte 4-7 nur Track 2
...                                     
140-166 HEADER (Diskname+ID)            
167-255 von der 1541 unbenutzt          

Falls sie sich die BAM einmal näher anschauen wollen, können sie dies problemlos mit dem bereits erwähnten " DISK-PATCHER" tun, der ihnen Einblick in alle Tracks und Sektoren der Diskette gebietet.
Bei der Benutung vom DISKPATCHER sollten sie immer Bedenken, das wirkürliches Ändern der Daten auf einer Diskette die Vernichtng aller Daten nach sich ziehen kann.
Legen Sie sich daher zunaechst einmal eine neu formatierte( Experiementier) Diskette zu, da wir in nächster Zeit, viel mit Direktzugriffen zu tun haben werden.
Das dabei auch mal was schiefgehen kann ist auch verständlich!
Der DISKPATCHER bietet 4 Funktionen!
1 . Patchen der Diskette 2 . Directory anzeigen 3 . Floppykommandos senden ( s; n; i; r; etc.)4 . Verlassen des Menues Da die Funktionen 2-4 sich praktisch von selbst erklären, wollen wir uns einmal den Patcher selbst zur Brust nehmen!
Drückt man die Taste 1, dann gelangt man ins Patchermenue!
Über die Tasten ' T' und ' S' lassen sich TRACK und SEKTOR einstellen! Sie werden Hexadezimal dargestellt! Wollen wir uns nun Track 18, Sektor 0 anschauen, müssen wir den Track auf $12=#18 einstellen!
Drücken Sie nun ' R' um den Sektor zu lesen! Es erscheint der Sektor auf dem Bildschirm, den man nun mit Taste ' E' editieren kann, den Sektor beliebig verändern.
Durch die Tasten CRSR-UP + CRSR-DOWN können Sie den Sektor hoch und runter scrollen!
Durch drücken der RETURN-Taste, kommen wir aus dem Editmenue wieder raus.
Die Funktion ' W' schreibt den gepatchten ( veraenderten) Sektor auf die Diskette zurück! Durch ' Q' kommen Sie dann wieder ins Hauptmenü!

       Der Aufbau der Directory         
       

Als nächstes möchte ich Sie mit dem Aufbau eines Directory-Blocks vertraut machen!
In den einzelnen Directory-Blocks befinden sich die Filenamen, die sie beim " Listen"( LOAD"$",8) der Directory erhalten. Sämtliche Directory-Blocks befinden sich auf TRACK 18 . Der erste Directory-Block befindet sich auf TRACK 18+ SECTOR 1 . Dieser Sector ist forgendermaßen belegt.
Byte: Bedeutung:
000-001 T+ S fuer naechsten Dir-Block 002-031 Eintrag File 1( siehe unten)032-033 nicht benutzt . . .
. . .
. . .

...                                     
226-255 8.Eintrag                       

Natürlich möchten Sie nun wissen wie wohl so ein Directoryeintrag aussieht!
Byte: Bedeutung:
000 Filetyp ( PRG; REL; SEQ; USR; DEL;)001-002 T+ S des Startsektors 003-018 Filename 019-020 Start erster Side-Sektor ( REL)021 Datensatzlaenge ( REL)022-025 nicht benutzt 026-027 Zwischenspeicher fuer DEL T+ S 028-029 Blocklaenge des Files Die naechste Tabelle stellt den Aufbau eines Filetyp-Bytes dar:
BIT: Bedeutung:

0    0                                  
1    0=DEL  0=SEQ  1=PRG  1=USR  0=REL  
2    0      0      0      0      1      
3    nicht benutzt                      
4    "                                  
5    "                                  
6    0=Normal  1=kein Scratch moeglich  
7    0=File noch offen                  
     1=File geschlossen                 
   Das Laden eines Files in Assembler   
   

Nachdem wir uns nun allerhand Tabellen zu Gemüte geführt haben und wir die grundlegenden Dinge kennen, schauen wir uns nun die ROM-Routinen an, mit denen wir den Direktzugriff auf die Floppy machen wollen!
Nehmen wir einmal an, wir möchten ein Programm laden! Kein Problem, werden Sie jetzt sagen! Man tippt einfach, LOAD" NAME",8,1 :
ein und schon wird das Programm geladen!
Wir wollen nun aber erkunden, was hinter dem ' LOAD' Befehl steckt und schauen uns die Assemblerroutine dazu an!
Sie brauchen hierzu einen SMON oder einen ähnlichen Maschinensprachemonitor.
Hier also die Laderoutine:

lda#$01  (Filenumer)                    
ldx#$08  (Geraeteadresse)               
ldy#$00  (Sekundaeradresse)             
jsr$fe00 (Fileparameter setzen)         
lda#$    (Laenge,max $10 Bytes)         
ldx#$    (LO-Byte Filename)             
ldy#$    (HI-Byte Filename)             
jsr$fdf9 (Filenamen setzen)             
lda#$00  (Load-Flag/1=Verify-Flag)      
ldx#$    (LO-Byte Startadresse)         
ldy#$    (HI-Byte Startadresse)         
jsr$f49e (Load)                         
rts                                     

Durch jsr $ fe00 werden die Fileparameter gesetzt, damit die Floppy weiß von welchem Gerät Sie laden soll und wohin!
Ist die Sekundäradresse nähmlich '0', wird das Progamm an eine Adresse geladen die Sie angeben! Ist Sie '1', dann werden die Informationen nach $0801 geladen wo sich der Basicstart befindet, um die Programme mit ' RUN' auszuführen!
Dieses ist natürlich nur dann möglich, wenn Sie eine Ansprungsadresse gepoked haben!
Der Filename des zu ladenden Files kann sich irgenwo im Speicher ihres Rechners abgelegt sein. Um das entsprechende File zu laden, muß der Laderoutine im Akku die Länge des Filenames und im Xund Y-Register die Adresse als LO+ HI Byte angegeben werden haben.

               lda #$10                 
               ldx #$80                 
               ldy #$30                 
               jsr $fdf9                

Das bedeutet, daß der Filename $10 Bytes lang ist und bei der Adresse $3080 zu finden ist.
Durch jsr $ f49 e wird dann das Programm geladen! Um zu testen, ob das File ' OK' ist, macht man ganz einfach ein ' verify' .
Man muss nur ' lda#$01' durch ' lda#$00' ersetzen und schon wird geprüft, ob ein File ok oder defekt ist!
Um dieses herauszufinden koennen Sie das sogenannte Statusbyte abfragen!
Es befindet sich in der Zeropage, bei der Adresse $90 und hat folgende Belegung:
Bit: Bedeutung:
1 Zeitueberschreitung bei IEC-Eingabe 2"""- Ausgabe 3-5 nur fuer die Datasette 6 Uebertragung ist beendet und OK 7 Geraet meldet sich nicht Soll ein File an eine bestimmte Adresse geladen werden, dann müssen sie folgendes eingeben:

               lda #$00                 
               ldx #$40                 
               ldy #$10                 
               jsr $f49e                

Das File wird nun an die Adresse $1040 geladen, da in ' X' die LOund in ' Y' die HI-Adresse angegeben werden muß!
Die folgende Routine bietet eine andere Möglichkeit ein File zu laden:

    lda#$01                             
    ldx#$08                             
    ldy#$00                             
    jsr$fe00                            
    lda#$                               
    ldx#$                               
    ldy#$                               
    jsr$fdf9                            
    jsr$f34a   (open)                   
    ldx#$01    (chkin=auf               
    jsr$f20e    Empfang schalten)       
    jsr$ee13   (Startadresse            
    sta$ae      LO+HI                   
    jsr$ee13    holen und               
    sta$af      speichern)              
    ldy#$00     (Solange Bytes          
m02 jsr$ee13     vom Bus                
    sta($ae),y   holen                  
    inc$ae       bis die                
    bne$m01      Uebertragung           
    inc$af       komplett               
m01 bit$90       beendet                
    bvc$m02      ist)                   
    lda#$01      (close                 
    jsr$f291      File)                 
    jsr$f333     (clrchk)               
    rts                                 

Nachdem das File mit jsr $ f34 a geöffnet wurde, wird durch LDX#$01+ JSR$ f20 e die Floppy auf Empfang geschaltet! Danach liest man durch die ' IECIN' Routine JSR $ ee13 die Startadresse ein und beginnt dann das File Byteweise zu Übertragen!
Zum Schluss wird das File noch durch LDA#$01+ JSR$ f291 geschlossen, wobei die '1' das zuerst geöffnete File schließt.
Wenn man also zwei Files öffnet muß man darauf achten, welches File man schließen möchte! Die Routine JSR$ f333 verursacht einen CLRCHK und schaltet die Floppy wieder zurÜck! Durch JSR$ f49 e wird praktisch die Routine ab dem ' open' Befehl ersetzt!

 Das Speichern eines Files in Assembler 
 -------------------------------------- 

Als nächstes wollen wir uns einmal eine Routine ansehen, die ein File speichert.
Sie werden bemerken, daß der Aufbau der Speicherroutine große Ähnlichkeit mit dem der Laderoutine hat.

lda#$01                                 
ldx#$08                                 
ldy#$00                                 
jsr$fe00                                
lda#$                                   
ldx#$                                   
ldy#$                                   
jsr$fdf9                                
ldx#$    (LO-Startadresse)              
ldy#$    (HI-Startadresse)              
stx$fb   (zwischen-                     
sty$fc    speichern)                    
lda#$fb (Pointer zeigt zur Startadresse)
ldx#$    (LO-Endadresse)                
ldy#$    (HI-Endadresse)                
jsr$f5dd (Save)                         
rts                                     

Nachdem die Fileparameter und der Name übergeben wurden, wird in x und y die Startadresse angegeben, um zu wissen ab wo die Routine Speichern soll, und speichern diese in $ fb +$ fc zwischen.
Danach wird im Akku ein Zeiger auf die Startadresse gelegt und in X und X wird die Endadresse übergeben.
Ist das geschafft wird die Saveroutine durch JSR$ f5 dd angesprungen.
Achten Sie beim angeben der Endadresse darauf, daß Sie 1 Byte mehr angeben, da sonst das letzte Byte nicht gespeichert wird!
Zum Schluss dieses Kursteiles noch schnell eine Tabelle mit Zero-Page- Adr.
unter denen die Fileparameter und der Name gespeichert werden:
Adresse: Bedeutung:

$90      Status-Flag                    
$93      Flag fuer Load/Verify          
$98      Anzahl der offenen Files       
$99      Eingabegeraet fuer $ffcf       
$9a      Ausgabegeraet fuer $ffd2       
$ae/$af  Zaehler Filebytes-$Start       
$b7      Laenge Filename                
$b8      Aktive Filenummer              
$b9      Sekundaeradresse               
$ba      Geraeteadresse                 
$bb/$bc  Zeiger auf Filenamen           

So, nun haben wir es für heute wieder einmal geschafft. Ich hoffe es hat ihnen Spass gemacht neue Erkenntnis über die Floppy zu sammeln.
Ich würde mich freuen, Sie auch beim nächsten Mal wieder begrüßen zu dürfen!

Bis dahin, Ihr                          
              Frank Boldewin            

Valid HTML 4.0 Transitional Valid CSS!