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 Befehlskanal und einen Pufferkanal mit der
Sekundäradresse 2 geöffnet ( bitte denken
Sie daran, daß beim Üffnen und beim Benutzen 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 senden. 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 Quelltext des Hauptprogramms. Die nun folgenden Zeilen versetzen die Floppy in den
Sendestatus und bereiten die Bildschirmausgabe der Tracks vor. Hierbei
wird ein Zeiger auf den Bildschirmspeicher 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 Schleifendurchlauf wird der Zeiger wieder auf den
Startwert+1( nächste Spalte) zurückgesetzt:
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 überlesen, da es ja keine Blockbelegung ansich, 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 Bildschirm aus. Hierbei wird ein " o" geschrieben, wenn der Block belegt ist, und ein " .", wenn er unbelegt ist. Die
Routine " BYTEOUT2" ist im Prinzip dieselbe, wie BYTEOUT1 . Der einzige Unterschied 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 gelesen 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 Quellcodes.
Fahren wir nun weiter im Hauptprogramm.
Nachdem alle BAM-Bytes gelesen und ausgegeben wurden, können wir Befehlsund
Pufferkanal wieder schließen. Vorher muß die Floppy allerdings wieder in den Wartezustand 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 finden 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 diesen 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 wollen.
(ub)