Magic Disk 64

home to index to html: MD9301-KURSE-FLOPPY-KURS_8.2.html
          Teil 2 Floppy Kurs 8          
Kommen wir also zu unserem Programm:    
main    lda #00       ;Bildschirm-      
        sta 53280     ; farben          
        lda #11       ; ein-            
        sta 53281     ; stellen         
        lda #<(text1) ;Text für Anzeige 
        ldy #>(text1) ; auf Bildschirm  
        jsr strout    ; ausgeben        
mloop5  lda #00       ;Filename setzen  
        jsr setnam    ; (0='Kein Name') 
        lda #01       ;Parameter: LFN 1 
        ldx #08       ; Ger.Adr 8       
        ldy #$6f      ; Sek.Adr 15      
        jsr setpar    ; setzen          
        jsr open      ;Bef.kan. öffnen  
        lda #01       ;Filename "#"     
        ldx #<(bufnam); (für 'Puffer    
        ldy #>(bufnam); reservieren')   
        jsr setnam    ; setzen          
        lda #02       ;Fileparameter    
        ldx #08       ; setzen          
        ldy #$62      ; (Sek.Adr=2)     
        jsr setpar                      
        jsr open      ;Puff.kan. öffnen 
Bis hier sollte wohl  alles  klar  sein.
Wir  haben  in den obigen Zeilen den Be-
fehlskanal und einen Pufferkanal mit der
Sekundäradresse 2 geöffnet (bitte denken
Sie daran, daß beim Üffnen und beim  Be-
nutzen  der  Routinen  SECTLK und SECLST
diese Adresse plus $60 übergeben  werden
muß).                                   
Als  nächstes  können  wir  die   beiden
Floppybefehle  zum Lesen des Blocks 18/0
und zum Positionieren auf Byte 4 senden:
        lda #<(com1)  ;Befehl 'Block    
        ldy #>(com1)  ; 18/0 lesen'     
        jsr sendcom   ; senden.         
        lda #<(com2)  ;Befehl 'Puffer-  
        ldy #>(com2)  ; zeiger auf      
        jsr sendcom   ; Byte 4' senden. 
Wie  Sie  sehen,  benutze  ich hier eine
eigene Routine, um die Befehle  zu  sen-
den.  Sie  heisst "SENDCOM" und benötigt
einen Zeiger auf den Befehlstext in Akku
und  Y-Register.  Zur  Beschreibung  der
Routine kommen wir später. Hier noch die
Syntax  beiden Befehle, die oben gesandt
werden. Sie finden Sie ganz am Ende  des
Quelltextes:                            
com1    .tx "u1 2 0 18 0"               
        .by 13,0                        
com2    .tx "b-p 2 4"                   
        .by 13,0                        
Wie Sie sehen benutzen wir  die  Befehle
"U1" (die bessere Version von "B-R") und
"B-P". Die  einzelnen  Parameter  werden
dabei  als  ASCII-Werte  übertragen. Wie
Sie auch bemerken, so wird bei  den  Be-
fehlen die tatsächliche Sekundäradresse,
nämlich  2  und nicht etwa $62, benutzt.
Der Wert 13 am Ende jedes  Befehls  wird
benötigt,  um  der  Floppy  das Ende des
Befehlsstrigs zu  signalisieren.  Die  0
wird  nicht  mitgesandt.  Sie  dient als
Endmarkierung für die SENDCOM-Routine.  
Machen wir nun jedoch weiter  im  Quell-
text des Hauptprogramms. Die nun folgen-
den Zeilen versetzen die Floppy  in  den
Sendestatus   und   bereiten  die  Bild-
schirmausgabe der  Tracks  vor.  Hierbei
wird  ein Zeiger auf den Bildschirmspei-
cher in $FB/$FC abgelegt, der  nach  der
Ausgabe eines Sektors um 40 erhöht wird.
So  erreichen wir eine vertikale Ausgabe
des Tracks. Für den nächsten  Schleifen-
durchlauf wird der Zeiger wieder auf den
Startwert+1  (nächste  Spalte) zurückge-
setzt:                                  
        lda #08       ;Floppy Nr. 8 zum 
        jsr talk      ;Senden auffordern
        lda #$62      ;Und zwar auf     
        jsr sectlk    ; Sek.Adr 2       
        lda #34       ;Trackzähler      
        sta $03       ; initialisieren  
        lda #163      ;Grundwert Zeiger 
        sta mloop3+1  ; einstellen      
mloop3  ldx #163      ;Bildschirmpo-    
        ldy #04       ; sitionszeiger   
        stx $fb       ; initialisieren  
        sty $fc                         
        inc mloop3+1  ;Spalte für näch- 
                       sten Track um 1  
                       erhöhen          
Nun erfolgt das  eigentliche  Lesen  und
Ausgeben  der  BAM-Bytes. Hierbei müssen
wir immer das jeweils erste Byte überle-
sen,  da  es  ja keine Blockbelegung an-
sich, sondern nur die Anzahl der  freien
Blocks enthält. Die folgenden zwei Bytes
können  normal ausgegeben werden. Da das
letzte Byte immer eine  unterschiedliche
Anzahl  an unbelegten Bits enthält, müs-
sen wir hier aufpassen, daß nur  soviele
Bits  ausgegeben werden, wie tatsächlich
benutzt werden. Dies geschieht über  die
Tabelle  "SECTAB",  die  die  Anzahl der
benutzen Blocks des letzten Bytes  eines
jeden  Tracks  beinhaltet.  Hier  jedoch
erst einmal wieder das Listing:         
        jsr iecin     ;1. Byte überlesen
        jsr iecin     ;2. Byte lesen    
        jsr byteout1  ; und ausgeben    
        jsr iecin     ;3. Byte lesen    
        jsr byteout1  ; und ausgeben    
        jsr iecin     ;4. Byte lesen    
        ldy $03       ;Tracknr. als Zei-
                       ger holen        
        ldx sectab,y  ;Anzahl benutzte  
                       Bits des Tracks  
                       holen.           
        jsr byteout2  ;Und Byte ausgeben
        dec $03       ;Trackzähler-1    
        bpl mloop3    ;Nochmal, wenn >0 
Wie  Sie  sehen, benutze ich eine eigene
Routine zur Ausgabe eines BAM-Bytes. Sie
heisst "BYTEOUT1" und gibt die Bits  0-7
des  BAM-Bytes  vertikal  auf  dem Bild-
schirm aus. Hierbei  wird  ein  "o"  ge-
schrieben,  wenn  der  Block belegt ist,
und ein ".", wenn er unbelegt  ist.  Die
Routine  "BYTEOUT2"  ist im Prinzip die-
selbe, wie BYTEOUT1. Der einzige  Unter-
schied  ist,  daß die zweite Version die
Anzahl  der  auszugebenden  Bits  im  X-
Register  verlangt.  Diese wird nun über
die  SECTAB-Tabelle  eingelesen.  Achten
Sie  darauf, daß die Liste rückwärts ge-
lesen wird, und somit der Reihe nach die
Blockanzahlen der Tracks  35-1  (jeweils
nur  für das letzte Byte und minus 1) in
der Liste verzeichnet sind.  Sie  finden
die Liste ebenfalls am Ende des Quellco-
des.                                    
Fahren  wir nun weiter im Hauptprogramm.
Nachdem alle BAM-Bytes gelesen und  aus-
gegeben  wurden, können wir Befehls- und
Pufferkanal wieder schließen. Vorher muß
die Floppy allerdings wieder in den War-
tezustand zurückversetzt werden. Hierauf
folgt  noch  eine Tastenabfrage, die das
Programm bei Tastendruck wiederholt  und
bei  der Taste '<' den Bildschirm löscht
und zurückspringt:                      
        lda #08       ;Floppy wieder    
        jsr untalk    ; zurücksetzen.   
        lda #02       ;Pufferkanal      
        jsr close     ; schließen       
        lda #01       ;Befehlskanal     
        jsr close     ; schließen       
mloop4  jsr inkey     ;Taste holen      
        beq mloop4    ; Keine --> weiter
        cmp #95       ;= '<' ?          
        beq end       ;Ja, also ENDE.   
        jmp mloop5    ;Nein,also nochmal
end     jmp $e544                       
Wollen wir uns nun die  Routine  SENDCOM
anschauen.  Im  Prinzip  ist  sie nichts
anderes als eine STROUT-Routine, nur daß
die Ausgabe nicht  auf  dem  Bildschirm,
sondern  an die Floppy erfolgt. Sie fin-
den  sie  in  den  Zeilen  990-1070  des
Quelltextes:                            
sendcom   sta $fb     ;Zeiger auf String
          sty $fc     ; ablegen         
          lda #08     ;Floppy Nr.8 zum  
          jsr listen  ; Empfang auffor- 
                        dern            
          lda #$6f    ;Und zwar von Sek.
          jsr seclst  ; Adr. 15         
          ldy #00     ;Offset=0         
scloop1   lda ($fb),y ;Zeichen lesen    
          beq s1      ;Wenn 0 --> fertig
          jsr iecout  ;Zeichen senden   
          iny         ;Zeiger um 1      
          bne scloop1 ; erhöhen und     
          inc $fc     ; Schleife wieder-
          jmp scloop1 ; holen           
s1        lda #08     ;Ende. Floppy Nr. 
          jmp unlist  ; 8 zurücksetzen  
Das soll es dann wieder einmal für  die-
sen  Monat  gewesen  sein.  Sie sind nun
komplett in  die  Bedienung  der  Floppy
1541  eingeführt  und sollten eigentlich
auch schon  eigene  Programme  schreiben
können.  Trotzdem wird es nächsten Monat
noch  einen  Teil  dieses  Floppy-Kurses
geben,  in  dem  wir ein ganz besonderes
Beispielprogramm besprechen werden  wol-
len.                                    
                                    (ub)



Valid HTML 4.0 Transitional Valid CSS!