Magic Disk 64

home to index to html: MD9304-KURSE-FLOPPY_INTERN_2.html
               FLOPPY INTERN            
                  (Teil 2)              
 Willkommen  zum  zweiten  Teil  unseres
Floppykurses!                           
Da im ersten Teil dieses Kurses so ziem-
lich alle Möglichkeiten angesprochen und
abgehandelt  wurden  die bei der Floppy-
programmierung  von  BASIC aus zu reali-
sieren sind,wollen wir ab diesem Kurs in
Assembler weiterprogrammieren,    da die
Routinen, die wir im Laufe der Zeit ent-
wickeln wollen,  in Höchstgeschwindlich-
keit 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 Beher-
schung  der Maschinensprache sind erfor-
derlich.                                
Zur Programmierung der Floppy ist außer-
dem  noch  ein  ausgereifter Diskmonitor
erforderlich.Weil alle vorhandenen Disk-
monitore unseren  Ansprüchen  nicht ent-
sprachen,  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 weiterbe-
nutzen.                                 
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 an-
schauen wollen, können sie dies problem-
los  mit  dem  bereits  erwähnten "DISK-
PATCHER" tun, der ihnen Einblick in alle
Tracks und Sektoren der  Diskette gebie-
tet.                                    
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)Dis-
kette 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 Auf-
bau  eines   Directory-Blocks   vertraut
machen!                                 
In den einzelnen Directory-Blocks befin-
den sich  die  Filenamen,  die  sie beim
"Listen"  (LOAD"$",8)  der Directory er-
halten.  Sämtliche  Directory-Blocks be-
finden sich auf TRACK 18.      Der erste
Directory-Block befindet sich  auf TRACK
18 + SECTOR 1. Dieser Sector ist forgen-
dermaß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 X- und Y-
Register die  Adresse als LO+HI Byte an-
gegeben 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 $f49e 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 LO- und 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 $f34a geöffnet
wurde,wird durch  LDX#$01 + JSR$f20e die
Floppy auf Empfang geschaltet!    Danach
liest  man  durch  die  'IECIN'  Routine
JSR $ee13 die  Startadresse  ein und be-
ginnt  dann das File  Byteweise zu Über-
tragen!                                 
 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$f49e
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 spei-
chern 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$f5dd 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!