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