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