Magic Disk 64

home to index to html: MD9306-KURSE-FLOPPY_INTERN_3.html
              FLOPPY-INTERN             
                 (Teil 3)               
 Willkommen  zur  dritten  Runde unseres
Floppykurses.                           
 Nachdem wir im letzten Teil das Status-
Flag  und  seine  Belegung  angesprochen
haben,  möchten  wir  Ihnen  diesmal ein
Programm vorstellen, daß den Fehlerkanal
ausließt.                               
    lda  #$00   ;Status-Flag            
    sta  $90    ;auf 0 setzen           
    lda  #$01   ;Filenummer             
    ldx  #$08   ;Geräteadresse          
    ldy  #$6f   ;Sekundäradresse        
    jsr  $fe00  ;Fileparameterjump      
    lda  #$00   ;Länge des              
    jsr  $fdf9  ;Filenamens=0           
    jsr  $f34a  ;Open                   
    lda  #$08   ;Geräteadresse          
    jsr  $ed09  ;auf Senden einstellen  
    lda  #$6f   ;Sekundäradresse        
    jsr  $edc7  ;übertragen             
m01 jsr  $ee13   ;Byte empfangen        
    jsr  $f1ca   ;ausgeben              
    bit  $90     ;wenn Bit6=0           
    bvc  $m01    ;dann nächstes Byte    
    lda  #$08   ;Senden durch           
    jsr  $edef  ;Untalk beenden         
    lda  #$01   ;Filenummer auf 1       
    jsr  $f291  ;und Close              
    rts                                 
 Beim Starten dieser Routine, gibt Ihnen
die  Floppy  entweder den entsprechenden
Fehler  aus  oder meldet, daß alles 'ok'
ist.Über die Subroutine "JSR $EE13" wird
der die Fehlermeldung Byte für Byte von 
der Floppy zum  Computer  übertragen und
auf dem Bildschirm ausgegeben.          
 Über Bit 6 kann geprüft werden,wann das
Ende der Fehlermeldung erreicht ist. Ist
Bit 6 = 0,  so bedeutet dies,  daß  noch
nicht alle Bytes der Fehlermeldung über-
tragen wurden.  Es  wird also solange zu
"JSR $EE31"  zurückgesprungen,  bis  die
die Floppy mit einem gesetzten Bit 6 das
Ende der Übertragung signalisiert.      
      Interne-Programmausführung        
      --------------------------        
 In dem  folgenden Abschnitt  wollen wir
uns mit der  ganz  besonderen  Fähigkeit
der Floopy befassen,  kleinere  Routinen
"intern" auszuführen.                   
 In den vorangegangenen Beispielen haben
wir  immer  nur einfache Floppy-Routinen
vom  C64  aus gestartet. Doch damit sind
die Möglichkeiten der Floppy noch  lange
nicht erschöpft.  Man kann zB auch ganze
Programme in die  Floppy transportieren,
die diese dann selbständig ausführt.Dies
ist  besonders  dann  wichtig,  wenn man
einen eigenen Schnellader oder einen Ko-
pierschutz schreiben will               
 Wie sie  vieleicht wissen,  handelt  es
sich bei der VC1541 um ein intelligentes
Diskettenlaufwerk mit eigenem  Prozessor
(6502), Speicherplatz (RAM und ROM)  und
Betriebsystem (DOS).   Dadurch wird kein
Speicherplatz und keine  Rechenzeit  vom
angeschlossenen  C64  benötigt.  Der C64
braucht der  Floppy lediglich Befehle zu
übermitteln,  die diese dann selbständig
ausführt.  Im Grunde genommen,  ist ihre
VC1541 nichts weiter  als  eine  zweiter
Computer neben ihrem C64. Sie haben also
nicht nur einen sondern gleich zwei Com-
puter auf ihrem  Schreibtisch  stehen.  
 Im  Normalbetrieb  muß  die Floppy drei
verschiedenen Aufgaben  gleichzeitig er-
ledigen. Dazu gehören:                  
1-Durchführung der  Datenübertragung von
  und zum C64.                          
2-die Interpretation der Befehle und die
  Verwaltung von Dateinen,der zugeordne-
  ten  Übertragungskanäle und der Block-
  buffer.                               
3-die  hardwaremäßige  Ansteuerung  der 
  Diskette.                             
Mit Hilfe einer ausgereiften IRQ-Technik
kann  die  Floppy  diese  drei  Aufgaben
praktisch gleichzeitig ausführen.       
 Nachdem wir bereits in den letzten bei-
den Kursen  auf  den Aufbau der Diskette
eingegangen sind,  wollen wir uns einmal
ansehen,  wie das DOS seine Aufgaben er-
ledigt.                                 
Selbverstündlich darf man beim Schreiben
von  eigenen  Routinen  im  Floppybuffer
auch  die  vorhandenen  Betetriebsystem-
routinen verwenden.  Ganz so einfach wie
im C64,  geht  es  bei der Floppy jedoch
nicht.                                  
  Das Betriebssystem der Floppy kann man
in zwei Teile unterteilen.Der erste Teil
ist das Hauptprogramm, das in einer End-
losschleife läuft.   Von diesem Teil aus
wird Hauptsächlich der serielle Bus ver-
waltet.   Fast alle Unterprogrammaufrufe
werden mit absoluten Sprüngen ausgeführt
und  müssen  somit  mit einem JMP-Befehl
zurück ins  Hauptprogramm  abgeschlossen
werden. Diese  Routinen  können nicht in
eigenen Programmen verwendet werden.    
 Der zweite Teil des Betriebsystems, ist
daher um so besser für eigene  Programme
zu verwenden, denn es handelt sich dabei
um ein  IRQ-Programm,  welches  auch als
"Jobschleife" bezeichnet wird.          
 Dieses Programm übernimmt die Lese- und
Schreiboperationen auf und von Diskette.
Bei jedem Interrupt werden die Speicher-
stellen $0 bis $5 der  (Floopy)Zeropage,
die  die   Schnittstelle,  zwischen  dem
Hauptprogramm herstellen, auf ihre Werte
überprüft.  Alle Werte,  die gleich oder
größer $80 sind werden als Befehle(Jobs)
behandelt und ausgeführt.   Jede  dieser
Speicherstellen  (Job-Speicher)  bezieht
sich auf  einen  bestimmten  Speicherbe-
reich.  Zusätzlich gehören zu jedem Job-
Speicher noch zwei Speicherstellen,  die
den  Track  und  den Sektor angeben, auf
die sich der Job(Befehl) bezieht.       
 Die  nachfolgende Tabelle, verdeutlicht
den Zusammenhang  zwischen  Job(Adresse)
Track-Sektorangabe und Speicherbereich. 
-----+-------+--------+-----------------
 JOB | TRACK | SEKTOR | SPEICHERBEREICH 
     |       |        |    (Buffer)     
 $00 |  $06  |  $07   |   $0300-$03ff   
 $01 |  $08  |  $09   |   $0400-$04ff   
 $02 |  $0a  |  $0b   |   $0500-$05ff   
 $03 |  $0c  |  $0d   |   $0600-$06ff   
 $04 |  $0e  |  $0f   |   $0700-$07ff   
 $05 |  $10  |  $11   |     kein RAM    
-----+-------+--------+-----------------
 Die nächste Tabelle zeigt die Bedeutung
der einzelnen Job-Codes.                
--------+-------------------------------
JOB-CODE|      AUFGABE                  
   $80  |Sektor lesen                   
   $90  |Sektor schreiben               
   $a0  |Sektor verifizieren            
   $b0  |Sektor suchen                  
   $c0  |Kopfanschlag                   
   $d0  |Programm im Puffer ausführen   
   $e0  |Programm im Puffer ausführen,  
        |vorher Laufwerksmotor ein-     
        |schalten und Kopf positionieren
--------+-------------------------------
 Was  man  mit  den  Job-Codes anfangen,
wollen  wir  anhand  von  einem Beispiel
zeigen.                                 
 Das  nachfolgende  Floppyprogramm  soll
Sektor $00 von Track $12 in den Buffer 0
laden.                                  
FLOPPYCODE: lda #$12     ;Tracknummer   
            sta $06      ;übergeben)    
            lda #$00     ;Sektornummer  
            sta $07      ;übergeben)    
            lda #$80     ;Jobcode lesen 
            sta $00      ;in Jobspeicher
EndSignal:  lda $00      ;Rückmeldung   
            bmi EndSignal;abwarten)     
            rts                         
 Dieses  Programm  muß natürlich erst in
die Floppy transportiert werden,damit es
ausgeführt  werden  kann.  Diese Aufgabe
erledigt unser nächstes Programm.       
       lda #$01  ;FLOOPY INITIALISIEREN 
       ldx #$08                         
       ldy #$6f                         
       jsr $fe00 (Filparmeter übergeben)
       lda #$00                         
       jsr $fdf9 (Filename=0)           
       jsr $f34a (Open)                 
       lda #$08                         
       jsr $ed0c (Listen)               
       lda #$6f                         
       jsr $edb9 (Seclst)               
       lda #"I"                         
       jsr $eddd (Init Floppy)          
       lda #$08                         
       jsr $edfe (Unlisten)             
**************************************  
       lda #$08  ;FCODE IN FBUFFER      
       jsr $ed0c (Listen)               
       lda #$6f                         
       jsr $edb9 (Seclst)               
       lda #"M"                         
       jsr $eddd                        
       lda #"-"                         
       jsr $eddd                        
       lda #"W"                         
       jsr $eddd                        
       lda #$00  ;ADRESSE LO            
       jsr $eddd                        
       lda #$05  ;ADRESSE HI            
       jsr $eddd                        
       lda #$11  ;$11 Bytes kpieren     
       jsr $eddd (m-w,nach $0500        
       ldy #$00                         
m01    lda FCODE,y                      
       jsr $eddd                        
       iny                              
       cpy #$11                         
       bne $m01 (Floppyrout.in def. Puff
       lda #$08                         
       jsr $edfe (Unlisten)             
;***************************************
       lda #$08                         
       jsr $ed0c (Listen)               
       lda #$6f                         
       jsr $edb9 (Seclst)               
       lda #"M"                         
       jsr $eddd                        
       lda #"-"                         
       jsr $eddd                        
       lda #"E"                         
       jsr $eddd                        
       lda #$00  ;STARTADRESSE LO       
       jsr $eddd                        
       lda #$05  ;SRARTADRESSE HI       
       jsr $eddd (m-e,start $0500)      
       lda #$08                         
       jsr $edfe (Unlisten)             
;***************************************
       lda #$08                         
       jsr $ed0c (Listen)               
       lda #$6f                         
       jsr $edb9 (Seclst)               
       lda #"M"                         
       jsr $eddd                        
       lda #"-"                         
       jsr $eddd                        
       lda #"R"                         
       jsr $eddd                        
       lda #$00  ;BUFFER ADRESSE        
       jsr $eddd                        
       lda #$03  ;BUFFER ADRESSE        
       jsr $eddd                        
       lda #$00  ;$00 = $0100           
       jsr $eddd (M-R,nach$0300         
       lda #$08                         
       jsr $edfe (Unlisten)             
       lda #$08                         
       jsr $ed09 (Talk)                 
       lda #$6f                         
       jsr $edc7 (Sectlk)               
       ldy #$00                         
m02    jsr $ee13                        
       sta $0400,y                      
       iny                              
       bne $m02 (Sektor a.Screen ausgebe
       lda #$08                         
       jsr $edef (Untalk)               
       lda #$01                         
       jsr $f291 (Close)                
       rts                              
FCode: lda #$12                         
       sta $06                          
       lda #$00                         
       sta $07                          
       lda #$80                         
       sta $00                          
m03:   lda $00                          
       bmi $m03                         
       rts                              
 Was noch zu beachten wäre,  ist daß Sie
immer nur $20 Hex-Bytes mit einem Schlag
in die Floppy übertragen können. Ist ihr
Floppyprogramm also länger,müssen sie es
schrittweise hineinschreiben.           
 Der Buffer für den Programmcode und der
Buffer für die Daten, dürfen nie  gleich
sein, weil der Programmcode  sich wärend
der  Ausführung  selbst  überschreiben  
würde.  Die  Folge  wäre ein Absturz der
Floppy.                                 
 Um die  Routine nun noch besser zu ver-
stehen, erkläre ich Ihnen kurz noch ein-
mal wie ich vorgegangen bin.            
1. initialisieren der Floppy.           
2. in Puffer 2 ($0500),wird die Floppy- 
   routine zum Lesen eines Blocks       
   geschrieben.                         
3. Start des Progamms in der Floppy.    
4. Einlesen des Blocks in P.0 ($0300).  
   Von dort aus abholen und auf dem     
   Bildschirm ausgeben.                 
Sie werden sich sicherlich gefragt haben
warum ich beim M-R  $00  als  Anzahl der
zu lesenden  Bytes angegeben habe.  Weil
die Angabe null Bytes zu lesen praktisch
gesehen einen sinnlose Aufgabe ist, wird
der Wert $00 intern in $100 umgewandelt.
Es  werden  also  $0100  Bytes  aus  dem
Floppybuffer geladen.                   
Da mit diesem Beispiel die Grundstein zu
Job-Code  Programmierung  gelegt  wurde,
dürfte auch der Direktzugriff in Assemb-
ler für Sie kein Problem mehr darstellen
Mit diesen Grundlagen müßten Sie eigent-
lich auch mit den anderen Job-Codes  zu-
recht kommen.                           
 Beim  Tüfteln  wünsche  ich  Ihnen viel
Spass  und  verabschiede  mich  bis  zum
nächsten Mal!                       (FB)
Valid HTML 4.0 Transitional Valid CSS!